OSDN Git Service

102929d1e20f1a495e19333fbc3392657c79dd95
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*@@ This file should be rewritten to use an arbitrary precision
23   @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24   @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25   @@ The routines that translate from the ap rep should
26   @@ warn if precision et. al. is lost.
27   @@ This would also make life easier when this technology is used
28   @@ for cross-compilers.  */
29
30 /* The entry points in this file are fold, size_int_wide, size_binop
31    and force_fit_type_double.
32
33    fold takes a tree as argument and returns a simplified tree.
34
35    size_binop takes a tree code for an arithmetic operation
36    and two operands that are trees, and produces a tree for the
37    result, assuming the type comes from `sizetype'.
38
39    size_int takes an integer value, and creates a tree constant
40    with type from `sizetype'.
41
42    force_fit_type_double takes a constant, an overflowable flag and a
43    prior overflow indicator.  It forces the value to fit the type and
44    sets TREE_OVERFLOW.
45
46    Note: Since the folders get called on non-gimple code as well as
47    gimple code, we need to handle GIMPLE tuples as well as their
48    corresponding tree equivalents.  */
49
50 #include "config.h"
51 #include "system.h"
52 #include "coretypes.h"
53 #include "tm.h"
54 #include "flags.h"
55 #include "tree.h"
56 #include "real.h"
57 #include "fixed-value.h"
58 #include "rtl.h"
59 #include "expr.h"
60 #include "tm_p.h"
61 #include "target.h"
62 #include "toplev.h"
63 #include "intl.h"
64 #include "ggc.h"
65 #include "hashtab.h"
66 #include "langhooks.h"
67 #include "md5.h"
68 #include "gimple.h"
69
70 /* Nonzero if we are folding constants inside an initializer; zero
71    otherwise.  */
72 int folding_initializer = 0;
73
74 /* The following constants represent a bit based encoding of GCC's
75    comparison operators.  This encoding simplifies transformations
76    on relational comparison operators, such as AND and OR.  */
77 enum comparison_code {
78   COMPCODE_FALSE = 0,
79   COMPCODE_LT = 1,
80   COMPCODE_EQ = 2,
81   COMPCODE_LE = 3,
82   COMPCODE_GT = 4,
83   COMPCODE_LTGT = 5,
84   COMPCODE_GE = 6,
85   COMPCODE_ORD = 7,
86   COMPCODE_UNORD = 8,
87   COMPCODE_UNLT = 9,
88   COMPCODE_UNEQ = 10,
89   COMPCODE_UNLE = 11,
90   COMPCODE_UNGT = 12,
91   COMPCODE_NE = 13,
92   COMPCODE_UNGE = 14,
93   COMPCODE_TRUE = 15
94 };
95
96 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
97 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
98 static bool negate_mathfn_p (enum built_in_function);
99 static bool negate_expr_p (tree);
100 static tree negate_expr (tree);
101 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
102 static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
103 static tree const_binop (enum tree_code, tree, tree, int);
104 static enum comparison_code comparison_to_compcode (enum tree_code);
105 static enum tree_code compcode_to_comparison (enum comparison_code);
106 static int operand_equal_for_comparison_p (tree, tree, tree);
107 static int twoval_comparison_p (tree, tree *, tree *, int *);
108 static tree eval_subst (location_t, tree, tree, tree, tree, tree);
109 static tree pedantic_omit_one_operand_loc (location_t, tree, tree, tree);
110 static tree distribute_bit_expr (location_t, enum tree_code, tree, tree, tree);
111 static tree make_bit_field_ref (location_t, tree, tree,
112                                 HOST_WIDE_INT, HOST_WIDE_INT, int);
113 static tree optimize_bit_field_compare (location_t, enum tree_code,
114                                         tree, tree, tree);
115 static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *,
116                                     HOST_WIDE_INT *,
117                                     enum machine_mode *, int *, int *,
118                                     tree *, tree *);
119 static int all_ones_mask_p (const_tree, int);
120 static tree sign_bit_p (tree, const_tree);
121 static int simple_operand_p (const_tree);
122 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
123 static tree range_predecessor (tree);
124 static tree range_successor (tree);
125 extern tree make_range (tree, int *, tree *, tree *, bool *);
126 extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int,
127                           tree, tree);
128 static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
129 static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree);
130 static tree unextend (tree, int, int, tree);
131 static tree fold_truthop (location_t, enum tree_code, tree, tree, tree);
132 static tree optimize_minmax_comparison (location_t, enum tree_code,
133                                         tree, tree, tree);
134 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
135 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
136 static tree fold_binary_op_with_conditional_arg (location_t,
137                                                  enum tree_code, tree,
138                                                  tree, tree,
139                                                  tree, tree, int);
140 static tree fold_mathfn_compare (location_t,
141                                  enum built_in_function, enum tree_code,
142                                  tree, tree, tree);
143 static tree fold_inf_compare (location_t, enum tree_code, tree, tree, tree);
144 static tree fold_div_compare (location_t, enum tree_code, tree, tree, tree);
145 static bool reorder_operands_p (const_tree, const_tree);
146 static tree fold_negate_const (tree, tree);
147 static tree fold_not_const (tree, tree);
148 static tree fold_relational_const (enum tree_code, tree, tree, tree);
149 static tree fold_convert_const (enum tree_code, tree, tree);
150
151
152 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
153    overflow.  Suppose A, B and SUM have the same respective signs as A1, B1,
154    and SUM1.  Then this yields nonzero if overflow occurred during the
155    addition.
156
157    Overflow occurs if A and B have the same sign, but A and SUM differ in
158    sign.  Use `^' to test whether signs differ, and `< 0' to isolate the
159    sign.  */
160 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
161 \f
162 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
163    We do that by representing the two-word integer in 4 words, with only
164    HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
165    number.  The value of the word is LOWPART + HIGHPART * BASE.  */
166
167 #define LOWPART(x) \
168   ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
169 #define HIGHPART(x) \
170   ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
171 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
172
173 /* Unpack a two-word integer into 4 words.
174    LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
175    WORDS points to the array of HOST_WIDE_INTs.  */
176
177 static void
178 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
179 {
180   words[0] = LOWPART (low);
181   words[1] = HIGHPART (low);
182   words[2] = LOWPART (hi);
183   words[3] = HIGHPART (hi);
184 }
185
186 /* Pack an array of 4 words into a two-word integer.
187    WORDS points to the array of words.
188    The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.  */
189
190 static void
191 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
192         HOST_WIDE_INT *hi)
193 {
194   *low = words[0] + words[1] * BASE;
195   *hi = words[2] + words[3] * BASE;
196 }
197 \f
198 /* Force the double-word integer L1, H1 to be within the range of the
199    integer type TYPE.  Stores the properly truncated and sign-extended
200    double-word integer in *LV, *HV.  Returns true if the operation
201    overflows, that is, argument and result are different.  */
202
203 int
204 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
205                  unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
206 {
207   unsigned HOST_WIDE_INT low0 = l1;
208   HOST_WIDE_INT high0 = h1;
209   unsigned int prec = int_or_pointer_precision (type);
210   int sign_extended_type;
211
212   /* Size types *are* sign extended.  */
213   sign_extended_type = (!TYPE_UNSIGNED (type)
214                         || (TREE_CODE (type) == INTEGER_TYPE
215                             && TYPE_IS_SIZETYPE (type)));
216
217   /* First clear all bits that are beyond the type's precision.  */
218   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
219     ;
220   else if (prec > HOST_BITS_PER_WIDE_INT)
221     h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
222   else
223     {
224       h1 = 0;
225       if (prec < HOST_BITS_PER_WIDE_INT)
226         l1 &= ~((HOST_WIDE_INT) (-1) << prec);
227     }
228
229   /* Then do sign extension if necessary.  */
230   if (!sign_extended_type)
231     /* No sign extension */;
232   else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
233     /* Correct width already.  */;
234   else if (prec > HOST_BITS_PER_WIDE_INT)
235     {
236       /* Sign extend top half? */
237       if (h1 & ((unsigned HOST_WIDE_INT)1
238                 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
239         h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
240     }
241   else if (prec == HOST_BITS_PER_WIDE_INT)
242     {
243       if ((HOST_WIDE_INT)l1 < 0)
244         h1 = -1;
245     }
246   else
247     {
248       /* Sign extend bottom half? */
249       if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
250         {
251           h1 = -1;
252           l1 |= (HOST_WIDE_INT)(-1) << prec;
253         }
254     }
255
256   *lv = l1;
257   *hv = h1;
258
259   /* If the value didn't fit, signal overflow.  */
260   return l1 != low0 || h1 != high0;
261 }
262
263 /* We force the double-int HIGH:LOW to the range of the type TYPE by
264    sign or zero extending it.
265    OVERFLOWABLE indicates if we are interested
266    in overflow of the value, when >0 we are only interested in signed
267    overflow, for <0 we are interested in any overflow.  OVERFLOWED
268    indicates whether overflow has already occurred.  CONST_OVERFLOWED
269    indicates whether constant overflow has already occurred.  We force
270    T's value to be within range of T's type (by setting to 0 or 1 all
271    the bits outside the type's range).  We set TREE_OVERFLOWED if,
272         OVERFLOWED is nonzero,
273         or OVERFLOWABLE is >0 and signed overflow occurs
274         or OVERFLOWABLE is <0 and any overflow occurs
275    We return a new tree node for the extended double-int.  The node
276    is shared if no overflow flags are set.  */
277
278 tree
279 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
280                        HOST_WIDE_INT high, int overflowable,
281                        bool overflowed)
282 {
283   int sign_extended_type;
284   bool overflow;
285
286   /* Size types *are* sign extended.  */
287   sign_extended_type = (!TYPE_UNSIGNED (type)
288                         || (TREE_CODE (type) == INTEGER_TYPE
289                             && TYPE_IS_SIZETYPE (type)));
290
291   overflow = fit_double_type (low, high, &low, &high, type);
292
293   /* If we need to set overflow flags, return a new unshared node.  */
294   if (overflowed || overflow)
295     {
296       if (overflowed
297           || overflowable < 0
298           || (overflowable > 0 && sign_extended_type))
299         {
300           tree t = make_node (INTEGER_CST);
301           TREE_INT_CST_LOW (t) = low;
302           TREE_INT_CST_HIGH (t) = high;
303           TREE_TYPE (t) = type;
304           TREE_OVERFLOW (t) = 1;
305           return t;
306         }
307     }
308
309   /* Else build a shared node.  */
310   return build_int_cst_wide (type, low, high);
311 }
312 \f
313 /* Add two doubleword integers with doubleword result.
314    Return nonzero if the operation overflows according to UNSIGNED_P.
315    Each argument is given as two `HOST_WIDE_INT' pieces.
316    One argument is L1 and H1; the other, L2 and H2.
317    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
318
319 int
320 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
321                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
322                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
323                       bool unsigned_p)
324 {
325   unsigned HOST_WIDE_INT l;
326   HOST_WIDE_INT h;
327
328   l = l1 + l2;
329   h = h1 + h2 + (l < l1);
330
331   *lv = l;
332   *hv = h;
333
334   if (unsigned_p)
335     return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
336   else
337     return OVERFLOW_SUM_SIGN (h1, h2, h);
338 }
339
340 /* Negate a doubleword integer with doubleword result.
341    Return nonzero if the operation overflows, assuming it's signed.
342    The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
343    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
344
345 int
346 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
347             unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
348 {
349   if (l1 == 0)
350     {
351       *lv = 0;
352       *hv = - h1;
353       return (*hv & h1) < 0;
354     }
355   else
356     {
357       *lv = -l1;
358       *hv = ~h1;
359       return 0;
360     }
361 }
362 \f
363 /* Multiply two doubleword integers with doubleword result.
364    Return nonzero if the operation overflows according to UNSIGNED_P.
365    Each argument is given as two `HOST_WIDE_INT' pieces.
366    One argument is L1 and H1; the other, L2 and H2.
367    The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
368
369 int
370 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
371                       unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
372                       unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
373                       bool unsigned_p)
374 {
375   HOST_WIDE_INT arg1[4];
376   HOST_WIDE_INT arg2[4];
377   HOST_WIDE_INT prod[4 * 2];
378   unsigned HOST_WIDE_INT carry;
379   int i, j, k;
380   unsigned HOST_WIDE_INT toplow, neglow;
381   HOST_WIDE_INT tophigh, neghigh;
382
383   encode (arg1, l1, h1);
384   encode (arg2, l2, h2);
385
386   memset (prod, 0, sizeof prod);
387
388   for (i = 0; i < 4; i++)
389     {
390       carry = 0;
391       for (j = 0; j < 4; j++)
392         {
393           k = i + j;
394           /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000.  */
395           carry += arg1[i] * arg2[j];
396           /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF.  */
397           carry += prod[k];
398           prod[k] = LOWPART (carry);
399           carry = HIGHPART (carry);
400         }
401       prod[i + 4] = carry;
402     }
403
404   decode (prod, lv, hv);
405   decode (prod + 4, &toplow, &tophigh);
406
407   /* Unsigned overflow is immediate.  */
408   if (unsigned_p)
409     return (toplow | tophigh) != 0;
410
411   /* Check for signed overflow by calculating the signed representation of the
412      top half of the result; it should agree with the low half's sign bit.  */
413   if (h1 < 0)
414     {
415       neg_double (l2, h2, &neglow, &neghigh);
416       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
417     }
418   if (h2 < 0)
419     {
420       neg_double (l1, h1, &neglow, &neghigh);
421       add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
422     }
423   return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
424 }
425 \f
426 /* Shift the doubleword integer in L1, H1 left by COUNT places
427    keeping only PREC bits of result.
428    Shift right if COUNT is negative.
429    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
430    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
431
432 void
433 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
434                HOST_WIDE_INT count, unsigned int prec,
435                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
436 {
437   unsigned HOST_WIDE_INT signmask;
438
439   if (count < 0)
440     {
441       rshift_double (l1, h1, -count, prec, lv, hv, arith);
442       return;
443     }
444
445   if (SHIFT_COUNT_TRUNCATED)
446     count %= prec;
447
448   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
449     {
450       /* Shifting by the host word size is undefined according to the
451          ANSI standard, so we must handle this as a special case.  */
452       *hv = 0;
453       *lv = 0;
454     }
455   else if (count >= HOST_BITS_PER_WIDE_INT)
456     {
457       *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
458       *lv = 0;
459     }
460   else
461     {
462       *hv = (((unsigned HOST_WIDE_INT) h1 << count)
463              | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
464       *lv = l1 << count;
465     }
466
467   /* Sign extend all bits that are beyond the precision.  */
468
469   signmask = -((prec > HOST_BITS_PER_WIDE_INT
470                 ? ((unsigned HOST_WIDE_INT) *hv
471                    >> (prec - HOST_BITS_PER_WIDE_INT - 1))
472                 : (*lv >> (prec - 1))) & 1);
473
474   if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
475     ;
476   else if (prec >= HOST_BITS_PER_WIDE_INT)
477     {
478       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
479       *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
480     }
481   else
482     {
483       *hv = signmask;
484       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
485       *lv |= signmask << prec;
486     }
487 }
488
489 /* Shift the doubleword integer in L1, H1 right by COUNT places
490    keeping only PREC bits of result.  COUNT must be positive.
491    ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
492    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
493
494 void
495 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
496                HOST_WIDE_INT count, unsigned int prec,
497                unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
498                int arith)
499 {
500   unsigned HOST_WIDE_INT signmask;
501
502   signmask = (arith
503               ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
504               : 0);
505
506   if (SHIFT_COUNT_TRUNCATED)
507     count %= prec;
508
509   if (count >= 2 * HOST_BITS_PER_WIDE_INT)
510     {
511       /* Shifting by the host word size is undefined according to the
512          ANSI standard, so we must handle this as a special case.  */
513       *hv = 0;
514       *lv = 0;
515     }
516   else if (count >= HOST_BITS_PER_WIDE_INT)
517     {
518       *hv = 0;
519       *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
520     }
521   else
522     {
523       *hv = (unsigned HOST_WIDE_INT) h1 >> count;
524       *lv = ((l1 >> count)
525              | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
526     }
527
528   /* Zero / sign extend all bits that are beyond the precision.  */
529
530   if (count >= (HOST_WIDE_INT)prec)
531     {
532       *hv = signmask;
533       *lv = signmask;
534     }
535   else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
536     ;
537   else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
538     {
539       *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
540       *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
541     }
542   else
543     {
544       *hv = signmask;
545       *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
546       *lv |= signmask << (prec - count);
547     }
548 }
549 \f
550 /* Rotate the doubleword integer in L1, H1 left by COUNT places
551    keeping only PREC bits of result.
552    Rotate right if COUNT is negative.
553    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
554
555 void
556 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
557                 HOST_WIDE_INT count, unsigned int prec,
558                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
559 {
560   unsigned HOST_WIDE_INT s1l, s2l;
561   HOST_WIDE_INT s1h, s2h;
562
563   count %= prec;
564   if (count < 0)
565     count += prec;
566
567   lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
568   rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
569   *lv = s1l | s2l;
570   *hv = s1h | s2h;
571 }
572
573 /* Rotate the doubleword integer in L1, H1 left by COUNT places
574    keeping only PREC bits of result.  COUNT must be positive.
575    Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.  */
576
577 void
578 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
579                 HOST_WIDE_INT count, unsigned int prec,
580                 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
581 {
582   unsigned HOST_WIDE_INT s1l, s2l;
583   HOST_WIDE_INT s1h, s2h;
584
585   count %= prec;
586   if (count < 0)
587     count += prec;
588
589   rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
590   lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
591   *lv = s1l | s2l;
592   *hv = s1h | s2h;
593 }
594 \f
595 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
596    for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
597    CODE is a tree code for a kind of division, one of
598    TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
599    or EXACT_DIV_EXPR
600    It controls how the quotient is rounded to an integer.
601    Return nonzero if the operation overflows.
602    UNS nonzero says do unsigned division.  */
603
604 int
605 div_and_round_double (enum tree_code code, int uns,
606                       unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
607                       HOST_WIDE_INT hnum_orig,
608                       unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
609                       HOST_WIDE_INT hden_orig,
610                       unsigned HOST_WIDE_INT *lquo,
611                       HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
612                       HOST_WIDE_INT *hrem)
613 {
614   int quo_neg = 0;
615   HOST_WIDE_INT num[4 + 1];     /* extra element for scaling.  */
616   HOST_WIDE_INT den[4], quo[4];
617   int i, j;
618   unsigned HOST_WIDE_INT work;
619   unsigned HOST_WIDE_INT carry = 0;
620   unsigned HOST_WIDE_INT lnum = lnum_orig;
621   HOST_WIDE_INT hnum = hnum_orig;
622   unsigned HOST_WIDE_INT lden = lden_orig;
623   HOST_WIDE_INT hden = hden_orig;
624   int overflow = 0;
625
626   if (hden == 0 && lden == 0)
627     overflow = 1, lden = 1;
628
629   /* Calculate quotient sign and convert operands to unsigned.  */
630   if (!uns)
631     {
632       if (hnum < 0)
633         {
634           quo_neg = ~ quo_neg;
635           /* (minimum integer) / (-1) is the only overflow case.  */
636           if (neg_double (lnum, hnum, &lnum, &hnum)
637               && ((HOST_WIDE_INT) lden & hden) == -1)
638             overflow = 1;
639         }
640       if (hden < 0)
641         {
642           quo_neg = ~ quo_neg;
643           neg_double (lden, hden, &lden, &hden);
644         }
645     }
646
647   if (hnum == 0 && hden == 0)
648     {                           /* single precision */
649       *hquo = *hrem = 0;
650       /* This unsigned division rounds toward zero.  */
651       *lquo = lnum / lden;
652       goto finish_up;
653     }
654
655   if (hnum == 0)
656     {                           /* trivial case: dividend < divisor */
657       /* hden != 0 already checked.  */
658       *hquo = *lquo = 0;
659       *hrem = hnum;
660       *lrem = lnum;
661       goto finish_up;
662     }
663
664   memset (quo, 0, sizeof quo);
665
666   memset (num, 0, sizeof num);  /* to zero 9th element */
667   memset (den, 0, sizeof den);
668
669   encode (num, lnum, hnum);
670   encode (den, lden, hden);
671
672   /* Special code for when the divisor < BASE.  */
673   if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
674     {
675       /* hnum != 0 already checked.  */
676       for (i = 4 - 1; i >= 0; i--)
677         {
678           work = num[i] + carry * BASE;
679           quo[i] = work / lden;
680           carry = work % lden;
681         }
682     }
683   else
684     {
685       /* Full double precision division,
686          with thanks to Don Knuth's "Seminumerical Algorithms".  */
687       int num_hi_sig, den_hi_sig;
688       unsigned HOST_WIDE_INT quo_est, scale;
689
690       /* Find the highest nonzero divisor digit.  */
691       for (i = 4 - 1;; i--)
692         if (den[i] != 0)
693           {
694             den_hi_sig = i;
695             break;
696           }
697
698       /* Insure that the first digit of the divisor is at least BASE/2.
699          This is required by the quotient digit estimation algorithm.  */
700
701       scale = BASE / (den[den_hi_sig] + 1);
702       if (scale > 1)
703         {               /* scale divisor and dividend */
704           carry = 0;
705           for (i = 0; i <= 4 - 1; i++)
706             {
707               work = (num[i] * scale) + carry;
708               num[i] = LOWPART (work);
709               carry = HIGHPART (work);
710             }
711
712           num[4] = carry;
713           carry = 0;
714           for (i = 0; i <= 4 - 1; i++)
715             {
716               work = (den[i] * scale) + carry;
717               den[i] = LOWPART (work);
718               carry = HIGHPART (work);
719               if (den[i] != 0) den_hi_sig = i;
720             }
721         }
722
723       num_hi_sig = 4;
724
725       /* Main loop */
726       for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
727         {
728           /* Guess the next quotient digit, quo_est, by dividing the first
729              two remaining dividend digits by the high order quotient digit.
730              quo_est is never low and is at most 2 high.  */
731           unsigned HOST_WIDE_INT tmp;
732
733           num_hi_sig = i + den_hi_sig + 1;
734           work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
735           if (num[num_hi_sig] != den[den_hi_sig])
736             quo_est = work / den[den_hi_sig];
737           else
738             quo_est = BASE - 1;
739
740           /* Refine quo_est so it's usually correct, and at most one high.  */
741           tmp = work - quo_est * den[den_hi_sig];
742           if (tmp < BASE
743               && (den[den_hi_sig - 1] * quo_est
744                   > (tmp * BASE + num[num_hi_sig - 2])))
745             quo_est--;
746
747           /* Try QUO_EST as the quotient digit, by multiplying the
748              divisor by QUO_EST and subtracting from the remaining dividend.
749              Keep in mind that QUO_EST is the I - 1st digit.  */
750
751           carry = 0;
752           for (j = 0; j <= den_hi_sig; j++)
753             {
754               work = quo_est * den[j] + carry;
755               carry = HIGHPART (work);
756               work = num[i + j] - LOWPART (work);
757               num[i + j] = LOWPART (work);
758               carry += HIGHPART (work) != 0;
759             }
760
761           /* If quo_est was high by one, then num[i] went negative and
762              we need to correct things.  */
763           if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
764             {
765               quo_est--;
766               carry = 0;                /* add divisor back in */
767               for (j = 0; j <= den_hi_sig; j++)
768                 {
769                   work = num[i + j] + den[j] + carry;
770                   carry = HIGHPART (work);
771                   num[i + j] = LOWPART (work);
772                 }
773
774               num [num_hi_sig] += carry;
775             }
776
777           /* Store the quotient digit.  */
778           quo[i] = quo_est;
779         }
780     }
781
782   decode (quo, lquo, hquo);
783
784  finish_up:
785   /* If result is negative, make it so.  */
786   if (quo_neg)
787     neg_double (*lquo, *hquo, lquo, hquo);
788
789   /* Compute trial remainder:  rem = num - (quo * den)  */
790   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
791   neg_double (*lrem, *hrem, lrem, hrem);
792   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
793
794   switch (code)
795     {
796     case TRUNC_DIV_EXPR:
797     case TRUNC_MOD_EXPR:        /* round toward zero */
798     case EXACT_DIV_EXPR:        /* for this one, it shouldn't matter */
799       return overflow;
800
801     case FLOOR_DIV_EXPR:
802     case FLOOR_MOD_EXPR:        /* round toward negative infinity */
803       if (quo_neg && (*lrem != 0 || *hrem != 0))   /* ratio < 0 && rem != 0 */
804         {
805           /* quo = quo - 1;  */
806           add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT)  -1,
807                       lquo, hquo);
808         }
809       else
810         return overflow;
811       break;
812
813     case CEIL_DIV_EXPR:
814     case CEIL_MOD_EXPR:         /* round toward positive infinity */
815       if (!quo_neg && (*lrem != 0 || *hrem != 0))  /* ratio > 0 && rem != 0 */
816         {
817           add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
818                       lquo, hquo);
819         }
820       else
821         return overflow;
822       break;
823
824     case ROUND_DIV_EXPR:
825     case ROUND_MOD_EXPR:        /* round to closest integer */
826       {
827         unsigned HOST_WIDE_INT labs_rem = *lrem;
828         HOST_WIDE_INT habs_rem = *hrem;
829         unsigned HOST_WIDE_INT labs_den = lden, ltwice;
830         HOST_WIDE_INT habs_den = hden, htwice;
831
832         /* Get absolute values.  */
833         if (*hrem < 0)
834           neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
835         if (hden < 0)
836           neg_double (lden, hden, &labs_den, &habs_den);
837
838         /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient.  */
839         mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
840                     labs_rem, habs_rem, &ltwice, &htwice);
841
842         if (((unsigned HOST_WIDE_INT) habs_den
843              < (unsigned HOST_WIDE_INT) htwice)
844             || (((unsigned HOST_WIDE_INT) habs_den
845                  == (unsigned HOST_WIDE_INT) htwice)
846                 && (labs_den <= ltwice)))
847           {
848             if (*hquo < 0)
849               /* quo = quo - 1;  */
850               add_double (*lquo, *hquo,
851                           (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
852             else
853               /* quo = quo + 1; */
854               add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
855                           lquo, hquo);
856           }
857         else
858           return overflow;
859       }
860       break;
861
862     default:
863       gcc_unreachable ();
864     }
865
866   /* Compute true remainder:  rem = num - (quo * den)  */
867   mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
868   neg_double (*lrem, *hrem, lrem, hrem);
869   add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
870   return overflow;
871 }
872
873 /* If ARG2 divides ARG1 with zero remainder, carries out the division
874    of type CODE and returns the quotient.
875    Otherwise returns NULL_TREE.  */
876
877 tree
878 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
879 {
880   unsigned HOST_WIDE_INT int1l, int2l;
881   HOST_WIDE_INT int1h, int2h;
882   unsigned HOST_WIDE_INT quol, reml;
883   HOST_WIDE_INT quoh, remh;
884   tree type = TREE_TYPE (arg1);
885   int uns = TYPE_UNSIGNED (type);
886
887   int1l = TREE_INT_CST_LOW (arg1);
888   int1h = TREE_INT_CST_HIGH (arg1);
889   /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
890      &obj[some_exotic_number].  */
891   if (POINTER_TYPE_P (type))
892     {
893       uns = false;
894       type = signed_type_for (type);
895       fit_double_type (int1l, int1h, &int1l, &int1h,
896                        type);
897     }
898   else
899     fit_double_type (int1l, int1h, &int1l, &int1h, type);
900   int2l = TREE_INT_CST_LOW (arg2);
901   int2h = TREE_INT_CST_HIGH (arg2);
902
903   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
904                         &quol, &quoh, &reml, &remh);
905   if (remh != 0 || reml != 0)
906     return NULL_TREE;
907
908   return build_int_cst_wide (type, quol, quoh);
909 }
910 \f
911 /* This is nonzero if we should defer warnings about undefined
912    overflow.  This facility exists because these warnings are a
913    special case.  The code to estimate loop iterations does not want
914    to issue any warnings, since it works with expressions which do not
915    occur in user code.  Various bits of cleanup code call fold(), but
916    only use the result if it has certain characteristics (e.g., is a
917    constant); that code only wants to issue a warning if the result is
918    used.  */
919
920 static int fold_deferring_overflow_warnings;
921
922 /* If a warning about undefined overflow is deferred, this is the
923    warning.  Note that this may cause us to turn two warnings into
924    one, but that is fine since it is sufficient to only give one
925    warning per expression.  */
926
927 static const char* fold_deferred_overflow_warning;
928
929 /* If a warning about undefined overflow is deferred, this is the
930    level at which the warning should be emitted.  */
931
932 static enum warn_strict_overflow_code fold_deferred_overflow_code;
933
934 /* Start deferring overflow warnings.  We could use a stack here to
935    permit nested calls, but at present it is not necessary.  */
936
937 void
938 fold_defer_overflow_warnings (void)
939 {
940   ++fold_deferring_overflow_warnings;
941 }
942
943 /* Stop deferring overflow warnings.  If there is a pending warning,
944    and ISSUE is true, then issue the warning if appropriate.  STMT is
945    the statement with which the warning should be associated (used for
946    location information); STMT may be NULL.  CODE is the level of the
947    warning--a warn_strict_overflow_code value.  This function will use
948    the smaller of CODE and the deferred code when deciding whether to
949    issue the warning.  CODE may be zero to mean to always use the
950    deferred code.  */
951
952 void
953 fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
954 {
955   const char *warnmsg;
956   location_t locus;
957
958   gcc_assert (fold_deferring_overflow_warnings > 0);
959   --fold_deferring_overflow_warnings;
960   if (fold_deferring_overflow_warnings > 0)
961     {
962       if (fold_deferred_overflow_warning != NULL
963           && code != 0
964           && code < (int) fold_deferred_overflow_code)
965         fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
966       return;
967     }
968
969   warnmsg = fold_deferred_overflow_warning;
970   fold_deferred_overflow_warning = NULL;
971
972   if (!issue || warnmsg == NULL)
973     return;
974
975   if (gimple_no_warning_p (stmt))
976     return;
977
978   /* Use the smallest code level when deciding to issue the
979      warning.  */
980   if (code == 0 || code > (int) fold_deferred_overflow_code)
981     code = fold_deferred_overflow_code;
982
983   if (!issue_strict_overflow_warning (code))
984     return;
985
986   if (stmt == NULL)
987     locus = input_location;
988   else
989     locus = gimple_location (stmt);
990   warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
991 }
992
993 /* Stop deferring overflow warnings, ignoring any deferred
994    warnings.  */
995
996 void
997 fold_undefer_and_ignore_overflow_warnings (void)
998 {
999   fold_undefer_overflow_warnings (false, NULL, 0);
1000 }
1001
1002 /* Whether we are deferring overflow warnings.  */
1003
1004 bool
1005 fold_deferring_overflow_warnings_p (void)
1006 {
1007   return fold_deferring_overflow_warnings > 0;
1008 }
1009
1010 /* This is called when we fold something based on the fact that signed
1011    overflow is undefined.  */
1012
1013 static void
1014 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1015 {
1016   if (fold_deferring_overflow_warnings > 0)
1017     {
1018       if (fold_deferred_overflow_warning == NULL
1019           || wc < fold_deferred_overflow_code)
1020         {
1021           fold_deferred_overflow_warning = gmsgid;
1022           fold_deferred_overflow_code = wc;
1023         }
1024     }
1025   else if (issue_strict_overflow_warning (wc))
1026     warning (OPT_Wstrict_overflow, gmsgid);
1027 }
1028 \f
1029 /* Return true if the built-in mathematical function specified by CODE
1030    is odd, i.e. -f(x) == f(-x).  */
1031
1032 static bool
1033 negate_mathfn_p (enum built_in_function code)
1034 {
1035   switch (code)
1036     {
1037     CASE_FLT_FN (BUILT_IN_ASIN):
1038     CASE_FLT_FN (BUILT_IN_ASINH):
1039     CASE_FLT_FN (BUILT_IN_ATAN):
1040     CASE_FLT_FN (BUILT_IN_ATANH):
1041     CASE_FLT_FN (BUILT_IN_CASIN):
1042     CASE_FLT_FN (BUILT_IN_CASINH):
1043     CASE_FLT_FN (BUILT_IN_CATAN):
1044     CASE_FLT_FN (BUILT_IN_CATANH):
1045     CASE_FLT_FN (BUILT_IN_CBRT):
1046     CASE_FLT_FN (BUILT_IN_CPROJ):
1047     CASE_FLT_FN (BUILT_IN_CSIN):
1048     CASE_FLT_FN (BUILT_IN_CSINH):
1049     CASE_FLT_FN (BUILT_IN_CTAN):
1050     CASE_FLT_FN (BUILT_IN_CTANH):
1051     CASE_FLT_FN (BUILT_IN_ERF):
1052     CASE_FLT_FN (BUILT_IN_LLROUND):
1053     CASE_FLT_FN (BUILT_IN_LROUND):
1054     CASE_FLT_FN (BUILT_IN_ROUND):
1055     CASE_FLT_FN (BUILT_IN_SIN):
1056     CASE_FLT_FN (BUILT_IN_SINH):
1057     CASE_FLT_FN (BUILT_IN_TAN):
1058     CASE_FLT_FN (BUILT_IN_TANH):
1059     CASE_FLT_FN (BUILT_IN_TRUNC):
1060       return true;
1061
1062     CASE_FLT_FN (BUILT_IN_LLRINT):
1063     CASE_FLT_FN (BUILT_IN_LRINT):
1064     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1065     CASE_FLT_FN (BUILT_IN_RINT):
1066       return !flag_rounding_math;
1067     
1068     default:
1069       break;
1070     }
1071   return false;
1072 }
1073
1074 /* Check whether we may negate an integer constant T without causing
1075    overflow.  */
1076
1077 bool
1078 may_negate_without_overflow_p (const_tree t)
1079 {
1080   unsigned HOST_WIDE_INT val;
1081   unsigned int prec;
1082   tree type;
1083
1084   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1085
1086   type = TREE_TYPE (t);
1087   if (TYPE_UNSIGNED (type))
1088     return false;
1089
1090   prec = TYPE_PRECISION (type);
1091   if (prec > HOST_BITS_PER_WIDE_INT)
1092     {
1093       if (TREE_INT_CST_LOW (t) != 0)
1094         return true;
1095       prec -= HOST_BITS_PER_WIDE_INT;
1096       val = TREE_INT_CST_HIGH (t);
1097     }
1098   else
1099     val = TREE_INT_CST_LOW (t);
1100   if (prec < HOST_BITS_PER_WIDE_INT)
1101     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1102   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1103 }
1104
1105 /* Determine whether an expression T can be cheaply negated using
1106    the function negate_expr without introducing undefined overflow.  */
1107
1108 static bool
1109 negate_expr_p (tree t)
1110 {
1111   tree type;
1112
1113   if (t == 0)
1114     return false;
1115
1116   type = TREE_TYPE (t);
1117
1118   STRIP_SIGN_NOPS (t);
1119   switch (TREE_CODE (t))
1120     {
1121     case INTEGER_CST:
1122       if (TYPE_OVERFLOW_WRAPS (type))
1123         return true;
1124
1125       /* Check that -CST will not overflow type.  */
1126       return may_negate_without_overflow_p (t);
1127     case BIT_NOT_EXPR:
1128       return (INTEGRAL_TYPE_P (type)
1129               && TYPE_OVERFLOW_WRAPS (type));
1130
1131     case FIXED_CST:
1132     case REAL_CST:
1133     case NEGATE_EXPR:
1134       return true;
1135
1136     case COMPLEX_CST:
1137       return negate_expr_p (TREE_REALPART (t))
1138              && negate_expr_p (TREE_IMAGPART (t));
1139
1140     case COMPLEX_EXPR:
1141       return negate_expr_p (TREE_OPERAND (t, 0))
1142              && negate_expr_p (TREE_OPERAND (t, 1));
1143
1144     case CONJ_EXPR:
1145       return negate_expr_p (TREE_OPERAND (t, 0));
1146
1147     case PLUS_EXPR:
1148       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1149           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1150         return false;
1151       /* -(A + B) -> (-B) - A.  */
1152       if (negate_expr_p (TREE_OPERAND (t, 1))
1153           && reorder_operands_p (TREE_OPERAND (t, 0),
1154                                  TREE_OPERAND (t, 1)))
1155         return true;
1156       /* -(A + B) -> (-A) - B.  */
1157       return negate_expr_p (TREE_OPERAND (t, 0));
1158
1159     case MINUS_EXPR:
1160       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1161       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1162              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1163              && reorder_operands_p (TREE_OPERAND (t, 0),
1164                                     TREE_OPERAND (t, 1));
1165
1166     case MULT_EXPR:
1167       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1168         break;
1169
1170       /* Fall through.  */
1171
1172     case RDIV_EXPR:
1173       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1174         return negate_expr_p (TREE_OPERAND (t, 1))
1175                || negate_expr_p (TREE_OPERAND (t, 0));
1176       break;
1177
1178     case TRUNC_DIV_EXPR:
1179     case ROUND_DIV_EXPR:
1180     case FLOOR_DIV_EXPR:
1181     case CEIL_DIV_EXPR:
1182     case EXACT_DIV_EXPR:
1183       /* In general we can't negate A / B, because if A is INT_MIN and
1184          B is 1, we may turn this into INT_MIN / -1 which is undefined
1185          and actually traps on some architectures.  But if overflow is
1186          undefined, we can negate, because - (INT_MIN / 1) is an
1187          overflow.  */
1188       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1189           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1190         break;
1191       return negate_expr_p (TREE_OPERAND (t, 1))
1192              || negate_expr_p (TREE_OPERAND (t, 0));
1193
1194     case NOP_EXPR:
1195       /* Negate -((double)float) as (double)(-float).  */
1196       if (TREE_CODE (type) == REAL_TYPE)
1197         {
1198           tree tem = strip_float_extensions (t);
1199           if (tem != t)
1200             return negate_expr_p (tem);
1201         }
1202       break;
1203
1204     case CALL_EXPR:
1205       /* Negate -f(x) as f(-x).  */
1206       if (negate_mathfn_p (builtin_mathfn_code (t)))
1207         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1208       break;
1209
1210     case RSHIFT_EXPR:
1211       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1212       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1213         {
1214           tree op1 = TREE_OPERAND (t, 1);
1215           if (TREE_INT_CST_HIGH (op1) == 0
1216               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1217                  == TREE_INT_CST_LOW (op1))
1218             return true;
1219         }
1220       break;
1221
1222     default:
1223       break;
1224     }
1225   return false;
1226 }
1227
1228 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1229    simplification is possible.
1230    If negate_expr_p would return true for T, NULL_TREE will never be
1231    returned.  */
1232
1233 static tree
1234 fold_negate_expr (location_t loc, tree t)
1235 {
1236   tree type = TREE_TYPE (t);
1237   tree tem;
1238
1239   switch (TREE_CODE (t))
1240     {
1241     /* Convert - (~A) to A + 1.  */
1242     case BIT_NOT_EXPR:
1243       if (INTEGRAL_TYPE_P (type))
1244         return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
1245                             build_int_cst (type, 1));
1246       break;
1247       
1248     case INTEGER_CST:
1249       tem = fold_negate_const (t, type);
1250       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1251           || !TYPE_OVERFLOW_TRAPS (type))
1252         return tem;
1253       break;
1254
1255     case REAL_CST:
1256       tem = fold_negate_const (t, type);
1257       /* Two's complement FP formats, such as c4x, may overflow.  */
1258       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1259         return tem;
1260       break;
1261
1262     case FIXED_CST:
1263       tem = fold_negate_const (t, type);
1264       return tem;
1265
1266     case COMPLEX_CST:
1267       {
1268         tree rpart = negate_expr (TREE_REALPART (t));
1269         tree ipart = negate_expr (TREE_IMAGPART (t));
1270
1271         if ((TREE_CODE (rpart) == REAL_CST
1272              && TREE_CODE (ipart) == REAL_CST)
1273             || (TREE_CODE (rpart) == INTEGER_CST
1274                 && TREE_CODE (ipart) == INTEGER_CST))
1275           return build_complex (type, rpart, ipart);
1276       }
1277       break;
1278
1279     case COMPLEX_EXPR:
1280       if (negate_expr_p (t))
1281         return fold_build2_loc (loc, COMPLEX_EXPR, type,
1282                             fold_negate_expr (loc, TREE_OPERAND (t, 0)),
1283                             fold_negate_expr (loc, TREE_OPERAND (t, 1)));
1284       break;
1285       
1286     case CONJ_EXPR:
1287       if (negate_expr_p (t))
1288         return fold_build1_loc (loc, CONJ_EXPR, type,
1289                             fold_negate_expr (loc, TREE_OPERAND (t, 0)));
1290       break;
1291
1292     case NEGATE_EXPR:
1293       return TREE_OPERAND (t, 0);
1294
1295     case PLUS_EXPR:
1296       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1297           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1298         {
1299           /* -(A + B) -> (-B) - A.  */
1300           if (negate_expr_p (TREE_OPERAND (t, 1))
1301               && reorder_operands_p (TREE_OPERAND (t, 0),
1302                                      TREE_OPERAND (t, 1)))
1303             {
1304               tem = negate_expr (TREE_OPERAND (t, 1));
1305               return fold_build2_loc (loc, MINUS_EXPR, type,
1306                                   tem, TREE_OPERAND (t, 0));
1307             }
1308
1309           /* -(A + B) -> (-A) - B.  */
1310           if (negate_expr_p (TREE_OPERAND (t, 0)))
1311             {
1312               tem = negate_expr (TREE_OPERAND (t, 0));
1313               return fold_build2_loc (loc, MINUS_EXPR, type,
1314                                   tem, TREE_OPERAND (t, 1));
1315             }
1316         }
1317       break;
1318
1319     case MINUS_EXPR:
1320       /* - (A - B) -> B - A  */
1321       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1322           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1323           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1324         return fold_build2_loc (loc, MINUS_EXPR, type,
1325                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1326       break;
1327
1328     case MULT_EXPR:
1329       if (TYPE_UNSIGNED (type))
1330         break;
1331
1332       /* Fall through.  */
1333
1334     case RDIV_EXPR:
1335       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1336         {
1337           tem = TREE_OPERAND (t, 1);
1338           if (negate_expr_p (tem))
1339             return fold_build2_loc (loc, TREE_CODE (t), type,
1340                                 TREE_OPERAND (t, 0), negate_expr (tem));
1341           tem = TREE_OPERAND (t, 0);
1342           if (negate_expr_p (tem))
1343             return fold_build2_loc (loc, TREE_CODE (t), type,
1344                                 negate_expr (tem), TREE_OPERAND (t, 1));
1345         }
1346       break;
1347
1348     case TRUNC_DIV_EXPR:
1349     case ROUND_DIV_EXPR:
1350     case FLOOR_DIV_EXPR:
1351     case CEIL_DIV_EXPR:
1352     case EXACT_DIV_EXPR:
1353       /* In general we can't negate A / B, because if A is INT_MIN and
1354          B is 1, we may turn this into INT_MIN / -1 which is undefined
1355          and actually traps on some architectures.  But if overflow is
1356          undefined, we can negate, because - (INT_MIN / 1) is an
1357          overflow.  */
1358       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1359         {
1360           const char * const warnmsg = G_("assuming signed overflow does not "
1361                                           "occur when negating a division");
1362           tem = TREE_OPERAND (t, 1);
1363           if (negate_expr_p (tem))
1364             {
1365               if (INTEGRAL_TYPE_P (type)
1366                   && (TREE_CODE (tem) != INTEGER_CST
1367                       || integer_onep (tem)))
1368                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1369               return fold_build2_loc (loc, TREE_CODE (t), type,
1370                                   TREE_OPERAND (t, 0), negate_expr (tem));
1371             }
1372           tem = TREE_OPERAND (t, 0);
1373           if (negate_expr_p (tem))
1374             {
1375               if (INTEGRAL_TYPE_P (type)
1376                   && (TREE_CODE (tem) != INTEGER_CST
1377                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1378                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1379               return fold_build2_loc (loc, TREE_CODE (t), type,
1380                                   negate_expr (tem), TREE_OPERAND (t, 1));
1381             }
1382         }
1383       break;
1384
1385     case NOP_EXPR:
1386       /* Convert -((double)float) into (double)(-float).  */
1387       if (TREE_CODE (type) == REAL_TYPE)
1388         {
1389           tem = strip_float_extensions (t);
1390           if (tem != t && negate_expr_p (tem))
1391             return fold_convert_loc (loc, type, negate_expr (tem));
1392         }
1393       break;
1394
1395     case CALL_EXPR:
1396       /* Negate -f(x) as f(-x).  */
1397       if (negate_mathfn_p (builtin_mathfn_code (t))
1398           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1399         {
1400           tree fndecl, arg;
1401
1402           fndecl = get_callee_fndecl (t);
1403           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1404           return build_call_expr_loc (loc, fndecl, 1, arg);
1405         }
1406       break;
1407
1408     case RSHIFT_EXPR:
1409       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1410       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1411         {
1412           tree op1 = TREE_OPERAND (t, 1);
1413           if (TREE_INT_CST_HIGH (op1) == 0
1414               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1415                  == TREE_INT_CST_LOW (op1))
1416             {
1417               tree ntype = TYPE_UNSIGNED (type)
1418                            ? signed_type_for (type)
1419                            : unsigned_type_for (type);
1420               tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0));
1421               temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1);
1422               return fold_convert_loc (loc, type, temp);
1423             }
1424         }
1425       break;
1426
1427     default:
1428       break;
1429     }
1430
1431   return NULL_TREE;
1432 }
1433
1434 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1435    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1436    return NULL_TREE. */
1437
1438 static tree
1439 negate_expr (tree t)
1440 {
1441   tree type, tem;
1442   location_t loc;
1443
1444   if (t == NULL_TREE)
1445     return NULL_TREE;
1446
1447   loc = EXPR_LOCATION (t);
1448   type = TREE_TYPE (t);
1449   STRIP_SIGN_NOPS (t);
1450
1451   tem = fold_negate_expr (loc, t);
1452   if (!tem)
1453     {
1454       tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1455       SET_EXPR_LOCATION (tem, loc);
1456     }
1457   return fold_convert_loc (loc, type, tem);
1458 }
1459 \f
1460 /* Split a tree IN into a constant, literal and variable parts that could be
1461    combined with CODE to make IN.  "constant" means an expression with
1462    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1463    commutative arithmetic operation.  Store the constant part into *CONP,
1464    the literal in *LITP and return the variable part.  If a part isn't
1465    present, set it to null.  If the tree does not decompose in this way,
1466    return the entire tree as the variable part and the other parts as null.
1467
1468    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1469    case, we negate an operand that was subtracted.  Except if it is a
1470    literal for which we use *MINUS_LITP instead.
1471
1472    If NEGATE_P is true, we are negating all of IN, again except a literal
1473    for which we use *MINUS_LITP instead.
1474
1475    If IN is itself a literal or constant, return it as appropriate.
1476
1477    Note that we do not guarantee that any of the three values will be the
1478    same type as IN, but they will have the same signedness and mode.  */
1479
1480 static tree
1481 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1482             tree *minus_litp, int negate_p)
1483 {
1484   tree var = 0;
1485
1486   *conp = 0;
1487   *litp = 0;
1488   *minus_litp = 0;
1489
1490   /* Strip any conversions that don't change the machine mode or signedness.  */
1491   STRIP_SIGN_NOPS (in);
1492
1493   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1494       || TREE_CODE (in) == FIXED_CST)
1495     *litp = in;
1496   else if (TREE_CODE (in) == code
1497            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1498                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1499                /* We can associate addition and subtraction together (even
1500                   though the C standard doesn't say so) for integers because
1501                   the value is not affected.  For reals, the value might be
1502                   affected, so we can't.  */
1503                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1504                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1505     {
1506       tree op0 = TREE_OPERAND (in, 0);
1507       tree op1 = TREE_OPERAND (in, 1);
1508       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1509       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1510
1511       /* First see if either of the operands is a literal, then a constant.  */
1512       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1513           || TREE_CODE (op0) == FIXED_CST)
1514         *litp = op0, op0 = 0;
1515       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1516                || TREE_CODE (op1) == FIXED_CST)
1517         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1518
1519       if (op0 != 0 && TREE_CONSTANT (op0))
1520         *conp = op0, op0 = 0;
1521       else if (op1 != 0 && TREE_CONSTANT (op1))
1522         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1523
1524       /* If we haven't dealt with either operand, this is not a case we can
1525          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1526       if (op0 != 0 && op1 != 0)
1527         var = in;
1528       else if (op0 != 0)
1529         var = op0;
1530       else
1531         var = op1, neg_var_p = neg1_p;
1532
1533       /* Now do any needed negations.  */
1534       if (neg_litp_p)
1535         *minus_litp = *litp, *litp = 0;
1536       if (neg_conp_p)
1537         *conp = negate_expr (*conp);
1538       if (neg_var_p)
1539         var = negate_expr (var);
1540     }
1541   else if (TREE_CONSTANT (in))
1542     *conp = in;
1543   else
1544     var = in;
1545
1546   if (negate_p)
1547     {
1548       if (*litp)
1549         *minus_litp = *litp, *litp = 0;
1550       else if (*minus_litp)
1551         *litp = *minus_litp, *minus_litp = 0;
1552       *conp = negate_expr (*conp);
1553       var = negate_expr (var);
1554     }
1555
1556   return var;
1557 }
1558
1559 /* Re-associate trees split by the above function.  T1 and T2 are
1560    either expressions to associate or null.  Return the new
1561    expression, if any.  LOC is the location of the new expression.  If
1562    we build an operation, do it in TYPE and with CODE.  */
1563
1564 static tree
1565 associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type)
1566 {
1567   tree tem;
1568
1569   if (t1 == 0)
1570     return t2;
1571   else if (t2 == 0)
1572     return t1;
1573
1574   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1575      try to fold this since we will have infinite recursion.  But do
1576      deal with any NEGATE_EXPRs.  */
1577   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1578       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1579     {
1580       if (code == PLUS_EXPR)
1581         {
1582           if (TREE_CODE (t1) == NEGATE_EXPR)
1583             tem = build2 (MINUS_EXPR, type, fold_convert_loc (loc, type, t2),
1584                           fold_convert_loc (loc, type, TREE_OPERAND (t1, 0)));
1585           else if (TREE_CODE (t2) == NEGATE_EXPR)
1586             tem = build2 (MINUS_EXPR, type, fold_convert_loc (loc, type, t1),
1587                           fold_convert_loc (loc, type, TREE_OPERAND (t2, 0)));
1588           else if (integer_zerop (t2))
1589             return fold_convert_loc (loc, type, t1);
1590         }
1591       else if (code == MINUS_EXPR)
1592         {
1593           if (integer_zerop (t2))
1594             return fold_convert_loc (loc, type, t1);
1595         }
1596
1597       tem = build2 (code, type, fold_convert_loc (loc, type, t1),
1598                     fold_convert_loc (loc, type, t2));
1599       goto associate_trees_exit;
1600     }
1601
1602   return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
1603                       fold_convert_loc (loc, type, t2));
1604  associate_trees_exit:
1605   protected_set_expr_location (tem, loc);
1606   return tem;
1607 }
1608 \f
1609 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1610    for use in int_const_binop, size_binop and size_diffop.  */
1611
1612 static bool
1613 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1614 {
1615   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1616     return false;
1617   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1618     return false;
1619
1620   switch (code)
1621     {
1622     case LSHIFT_EXPR:
1623     case RSHIFT_EXPR:
1624     case LROTATE_EXPR:
1625     case RROTATE_EXPR:
1626       return true;
1627
1628     default:
1629       break;
1630     }
1631
1632   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1633          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1634          && TYPE_MODE (type1) == TYPE_MODE (type2);
1635 }
1636
1637
1638 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1639    to produce a new constant.  Return NULL_TREE if we don't know how
1640    to evaluate CODE at compile-time.
1641
1642    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1643
1644 tree
1645 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1646 {
1647   unsigned HOST_WIDE_INT int1l, int2l;
1648   HOST_WIDE_INT int1h, int2h;
1649   unsigned HOST_WIDE_INT low;
1650   HOST_WIDE_INT hi;
1651   unsigned HOST_WIDE_INT garbagel;
1652   HOST_WIDE_INT garbageh;
1653   tree t;
1654   tree type = TREE_TYPE (arg1);
1655   int uns = TYPE_UNSIGNED (type);
1656   int is_sizetype
1657     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1658   int overflow = 0;
1659
1660   int1l = TREE_INT_CST_LOW (arg1);
1661   int1h = TREE_INT_CST_HIGH (arg1);
1662   int2l = TREE_INT_CST_LOW (arg2);
1663   int2h = TREE_INT_CST_HIGH (arg2);
1664
1665   switch (code)
1666     {
1667     case BIT_IOR_EXPR:
1668       low = int1l | int2l, hi = int1h | int2h;
1669       break;
1670
1671     case BIT_XOR_EXPR:
1672       low = int1l ^ int2l, hi = int1h ^ int2h;
1673       break;
1674
1675     case BIT_AND_EXPR:
1676       low = int1l & int2l, hi = int1h & int2h;
1677       break;
1678
1679     case RSHIFT_EXPR:
1680       int2l = -int2l;
1681     case LSHIFT_EXPR:
1682       /* It's unclear from the C standard whether shifts can overflow.
1683          The following code ignores overflow; perhaps a C standard
1684          interpretation ruling is needed.  */
1685       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1686                      &low, &hi, !uns);
1687       break;
1688
1689     case RROTATE_EXPR:
1690       int2l = - int2l;
1691     case LROTATE_EXPR:
1692       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1693                       &low, &hi);
1694       break;
1695
1696     case PLUS_EXPR:
1697       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1698       break;
1699
1700     case MINUS_EXPR:
1701       neg_double (int2l, int2h, &low, &hi);
1702       add_double (int1l, int1h, low, hi, &low, &hi);
1703       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1704       break;
1705
1706     case MULT_EXPR:
1707       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1708       break;
1709
1710     case TRUNC_DIV_EXPR:
1711     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1712     case EXACT_DIV_EXPR:
1713       /* This is a shortcut for a common special case.  */
1714       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1715           && !TREE_OVERFLOW (arg1)
1716           && !TREE_OVERFLOW (arg2)
1717           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1718         {
1719           if (code == CEIL_DIV_EXPR)
1720             int1l += int2l - 1;
1721
1722           low = int1l / int2l, hi = 0;
1723           break;
1724         }
1725
1726       /* ... fall through ...  */
1727
1728     case ROUND_DIV_EXPR:
1729       if (int2h == 0 && int2l == 0)
1730         return NULL_TREE;
1731       if (int2h == 0 && int2l == 1)
1732         {
1733           low = int1l, hi = int1h;
1734           break;
1735         }
1736       if (int1l == int2l && int1h == int2h
1737           && ! (int1l == 0 && int1h == 0))
1738         {
1739           low = 1, hi = 0;
1740           break;
1741         }
1742       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1743                                        &low, &hi, &garbagel, &garbageh);
1744       break;
1745
1746     case TRUNC_MOD_EXPR:
1747     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1748       /* This is a shortcut for a common special case.  */
1749       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1750           && !TREE_OVERFLOW (arg1)
1751           && !TREE_OVERFLOW (arg2)
1752           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1753         {
1754           if (code == CEIL_MOD_EXPR)
1755             int1l += int2l - 1;
1756           low = int1l % int2l, hi = 0;
1757           break;
1758         }
1759
1760       /* ... fall through ...  */
1761
1762     case ROUND_MOD_EXPR:
1763       if (int2h == 0 && int2l == 0)
1764         return NULL_TREE;
1765       overflow = div_and_round_double (code, uns,
1766                                        int1l, int1h, int2l, int2h,
1767                                        &garbagel, &garbageh, &low, &hi);
1768       break;
1769
1770     case MIN_EXPR:
1771     case MAX_EXPR:
1772       if (uns)
1773         low = (((unsigned HOST_WIDE_INT) int1h
1774                 < (unsigned HOST_WIDE_INT) int2h)
1775                || (((unsigned HOST_WIDE_INT) int1h
1776                     == (unsigned HOST_WIDE_INT) int2h)
1777                    && int1l < int2l));
1778       else
1779         low = (int1h < int2h
1780                || (int1h == int2h && int1l < int2l));
1781
1782       if (low == (code == MIN_EXPR))
1783         low = int1l, hi = int1h;
1784       else
1785         low = int2l, hi = int2h;
1786       break;
1787
1788     default:
1789       return NULL_TREE;
1790     }
1791
1792   if (notrunc)
1793     {
1794       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1795
1796       /* Propagate overflow flags ourselves.  */
1797       if (((!uns || is_sizetype) && overflow)
1798           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1799         {
1800           t = copy_node (t);
1801           TREE_OVERFLOW (t) = 1;
1802         }
1803     }
1804   else
1805     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1806                                ((!uns || is_sizetype) && overflow)
1807                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1808
1809   return t;
1810 }
1811
1812 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1813    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1814    are the same kind of constant and the same machine mode.  Return zero if
1815    combining the constants is not allowed in the current operating mode.
1816
1817    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1818
1819 static tree
1820 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1821 {
1822   /* Sanity check for the recursive cases.  */
1823   if (!arg1 || !arg2)
1824     return NULL_TREE;
1825
1826   STRIP_NOPS (arg1);
1827   STRIP_NOPS (arg2);
1828
1829   if (TREE_CODE (arg1) == INTEGER_CST)
1830     return int_const_binop (code, arg1, arg2, notrunc);
1831
1832   if (TREE_CODE (arg1) == REAL_CST)
1833     {
1834       enum machine_mode mode;
1835       REAL_VALUE_TYPE d1;
1836       REAL_VALUE_TYPE d2;
1837       REAL_VALUE_TYPE value;
1838       REAL_VALUE_TYPE result;
1839       bool inexact;
1840       tree t, type;
1841
1842       /* The following codes are handled by real_arithmetic.  */
1843       switch (code)
1844         {
1845         case PLUS_EXPR:
1846         case MINUS_EXPR:
1847         case MULT_EXPR:
1848         case RDIV_EXPR:
1849         case MIN_EXPR:
1850         case MAX_EXPR:
1851           break;
1852
1853         default:
1854           return NULL_TREE;
1855         }
1856
1857       d1 = TREE_REAL_CST (arg1);
1858       d2 = TREE_REAL_CST (arg2);
1859
1860       type = TREE_TYPE (arg1);
1861       mode = TYPE_MODE (type);
1862
1863       /* Don't perform operation if we honor signaling NaNs and
1864          either operand is a NaN.  */
1865       if (HONOR_SNANS (mode)
1866           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1867         return NULL_TREE;
1868
1869       /* Don't perform operation if it would raise a division
1870          by zero exception.  */
1871       if (code == RDIV_EXPR
1872           && REAL_VALUES_EQUAL (d2, dconst0)
1873           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1874         return NULL_TREE;
1875
1876       /* If either operand is a NaN, just return it.  Otherwise, set up
1877          for floating-point trap; we return an overflow.  */
1878       if (REAL_VALUE_ISNAN (d1))
1879         return arg1;
1880       else if (REAL_VALUE_ISNAN (d2))
1881         return arg2;
1882
1883       inexact = real_arithmetic (&value, code, &d1, &d2);
1884       real_convert (&result, mode, &value);
1885
1886       /* Don't constant fold this floating point operation if
1887          the result has overflowed and flag_trapping_math.  */
1888       if (flag_trapping_math
1889           && MODE_HAS_INFINITIES (mode)
1890           && REAL_VALUE_ISINF (result)
1891           && !REAL_VALUE_ISINF (d1)
1892           && !REAL_VALUE_ISINF (d2))
1893         return NULL_TREE;
1894
1895       /* Don't constant fold this floating point operation if the
1896          result may dependent upon the run-time rounding mode and
1897          flag_rounding_math is set, or if GCC's software emulation
1898          is unable to accurately represent the result.  */
1899       if ((flag_rounding_math
1900            || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1901           && (inexact || !real_identical (&result, &value)))
1902         return NULL_TREE;
1903
1904       t = build_real (type, result);
1905
1906       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1907       return t;
1908     }
1909
1910   if (TREE_CODE (arg1) == FIXED_CST)
1911     {
1912       FIXED_VALUE_TYPE f1;
1913       FIXED_VALUE_TYPE f2;
1914       FIXED_VALUE_TYPE result;
1915       tree t, type;
1916       int sat_p;
1917       bool overflow_p;
1918
1919       /* The following codes are handled by fixed_arithmetic.  */
1920       switch (code)
1921         {
1922         case PLUS_EXPR:
1923         case MINUS_EXPR:
1924         case MULT_EXPR:
1925         case TRUNC_DIV_EXPR:
1926           f2 = TREE_FIXED_CST (arg2);
1927           break;
1928
1929         case LSHIFT_EXPR:
1930         case RSHIFT_EXPR:
1931           f2.data.high = TREE_INT_CST_HIGH (arg2);
1932           f2.data.low = TREE_INT_CST_LOW (arg2);
1933           f2.mode = SImode;
1934           break;
1935
1936         default:
1937           return NULL_TREE;
1938         }
1939
1940       f1 = TREE_FIXED_CST (arg1);
1941       type = TREE_TYPE (arg1);
1942       sat_p = TYPE_SATURATING (type);
1943       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1944       t = build_fixed (type, result);
1945       /* Propagate overflow flags.  */
1946       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1947         TREE_OVERFLOW (t) = 1;
1948       return t;
1949     }
1950
1951   if (TREE_CODE (arg1) == COMPLEX_CST)
1952     {
1953       tree type = TREE_TYPE (arg1);
1954       tree r1 = TREE_REALPART (arg1);
1955       tree i1 = TREE_IMAGPART (arg1);
1956       tree r2 = TREE_REALPART (arg2);
1957       tree i2 = TREE_IMAGPART (arg2);
1958       tree real, imag;
1959
1960       switch (code)
1961         {
1962         case PLUS_EXPR:
1963         case MINUS_EXPR:
1964           real = const_binop (code, r1, r2, notrunc);
1965           imag = const_binop (code, i1, i2, notrunc);
1966           break;
1967
1968         case MULT_EXPR:
1969 #ifdef HAVE_mpc
1970           if (COMPLEX_FLOAT_TYPE_P (type))
1971             return do_mpc_arg2 (arg1, arg2, type,
1972                                 /* do_nonfinite= */ folding_initializer,
1973                                 mpc_mul);
1974 #endif
1975
1976           real = const_binop (MINUS_EXPR,
1977                               const_binop (MULT_EXPR, r1, r2, notrunc),
1978                               const_binop (MULT_EXPR, i1, i2, notrunc),
1979                               notrunc);
1980           imag = const_binop (PLUS_EXPR,
1981                               const_binop (MULT_EXPR, r1, i2, notrunc),
1982                               const_binop (MULT_EXPR, i1, r2, notrunc),
1983                               notrunc);
1984           break;
1985
1986         case RDIV_EXPR:
1987 #ifdef HAVE_mpc
1988           if (COMPLEX_FLOAT_TYPE_P (type))
1989             return do_mpc_arg2 (arg1, arg2, type,
1990                                 /* do_nonfinite= */ folding_initializer,
1991                                 mpc_div);
1992           /* Fallthru ... */
1993 #endif
1994
1995         case TRUNC_DIV_EXPR:
1996         case CEIL_DIV_EXPR:
1997         case FLOOR_DIV_EXPR:
1998         case ROUND_DIV_EXPR:
1999           if (flag_complex_method == 0)
2000           {
2001             /* Keep this algorithm in sync with
2002                tree-complex.c:expand_complex_div_straight().
2003
2004                Expand complex division to scalars, straightforward algorithm.
2005                a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
2006                t = br*br + bi*bi
2007             */
2008             tree magsquared
2009               = const_binop (PLUS_EXPR,
2010                              const_binop (MULT_EXPR, r2, r2, notrunc),
2011                              const_binop (MULT_EXPR, i2, i2, notrunc),
2012                              notrunc);
2013             tree t1
2014               = const_binop (PLUS_EXPR,
2015                              const_binop (MULT_EXPR, r1, r2, notrunc),
2016                              const_binop (MULT_EXPR, i1, i2, notrunc),
2017                              notrunc);
2018             tree t2
2019               = const_binop (MINUS_EXPR,
2020                              const_binop (MULT_EXPR, i1, r2, notrunc),
2021                              const_binop (MULT_EXPR, r1, i2, notrunc),
2022                              notrunc);
2023
2024             real = const_binop (code, t1, magsquared, notrunc);
2025             imag = const_binop (code, t2, magsquared, notrunc);
2026           }
2027           else
2028           {
2029             /* Keep this algorithm in sync with
2030                tree-complex.c:expand_complex_div_wide().
2031
2032                Expand complex division to scalars, modified algorithm to minimize
2033                overflow with wide input ranges.  */
2034             tree inner_type = TREE_TYPE (type);
2035             tree absr2 = fold_build1 (ABS_EXPR, inner_type, r2);
2036             tree absi2 = fold_build1 (ABS_EXPR, inner_type, i2);
2037             tree compare = fold_build2 (LT_EXPR, boolean_type_node, absr2, absi2);
2038             if (integer_nonzerop (compare))
2039               {
2040                 /* In the TRUE branch, we compute
2041                    ratio = br/bi;
2042                    div = (br * ratio) + bi;
2043                    tr = (ar * ratio) + ai;
2044                    ti = (ai * ratio) - ar;
2045                    tr = tr / div;
2046                    ti = ti / div;  */
2047                 tree ratio = fold_build2 (code, inner_type, r2, i2);
2048                 tree div = fold_build2 (PLUS_EXPR, inner_type, i2,
2049                                         fold_build2 (MULT_EXPR, inner_type,
2050                                                      r2, ratio));
2051                 real = fold_build2 (MULT_EXPR, inner_type, r1, ratio);
2052                 real = fold_build2 (PLUS_EXPR, inner_type, real, i1);
2053                 real = fold_build2 (code, inner_type, real, div);
2054
2055                 imag = fold_build2 (MULT_EXPR, inner_type, i1, ratio);
2056                 imag = fold_build2 (MINUS_EXPR, inner_type, imag, r1);
2057                 imag = fold_build2 (code, inner_type, imag, div);
2058               }
2059             else
2060               {
2061                 /* In the FALSE branch, we compute
2062                    ratio = d/c;
2063                    divisor = (d * ratio) + c;
2064                    tr = (b * ratio) + a;
2065                    ti = b - (a * ratio);
2066                    tr = tr / div;
2067                    ti = ti / div;  */
2068                 tree ratio = fold_build2 (code, inner_type, i2, r2);
2069                 tree div = fold_build2 (PLUS_EXPR, inner_type, r2,
2070                                         fold_build2 (MULT_EXPR, inner_type,
2071                                                      i2, ratio));
2072
2073                 real = fold_build2 (MULT_EXPR, inner_type, i1, ratio);
2074                 real = fold_build2 (PLUS_EXPR, inner_type, real, r1);
2075                 real = fold_build2 (code, inner_type, real, div);
2076
2077                 imag = fold_build2 (MULT_EXPR, inner_type, r1, ratio);
2078                 imag = fold_build2 (MINUS_EXPR, inner_type, i1, imag);
2079                 imag = fold_build2 (code, inner_type, imag, div);
2080               }
2081           }
2082           break;
2083
2084         default:
2085           return NULL_TREE;
2086         }
2087
2088       if (real && imag)
2089         return build_complex (type, real, imag);
2090     }
2091
2092   if (TREE_CODE (arg1) == VECTOR_CST)
2093     {
2094       tree type = TREE_TYPE(arg1);
2095       int count = TYPE_VECTOR_SUBPARTS (type), i;
2096       tree elements1, elements2, list = NULL_TREE;
2097       
2098       if(TREE_CODE(arg2) != VECTOR_CST)
2099         return NULL_TREE;
2100         
2101       elements1 = TREE_VECTOR_CST_ELTS (arg1);
2102       elements2 = TREE_VECTOR_CST_ELTS (arg2);
2103
2104       for (i = 0; i < count; i++)
2105         {
2106           tree elem1, elem2, elem;
2107           
2108           /* The trailing elements can be empty and should be treated as 0 */
2109           if(!elements1)
2110             elem1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2111           else
2112             {
2113               elem1 = TREE_VALUE(elements1);
2114               elements1 = TREE_CHAIN (elements1);
2115             }  
2116             
2117           if(!elements2)
2118             elem2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2119           else
2120             {
2121               elem2 = TREE_VALUE(elements2);
2122               elements2 = TREE_CHAIN (elements2);
2123             }
2124               
2125           elem = const_binop (code, elem1, elem2, notrunc);
2126           
2127           /* It is possible that const_binop cannot handle the given
2128             code and return NULL_TREE */
2129           if(elem == NULL_TREE)
2130             return NULL_TREE;
2131           
2132           list = tree_cons (NULL_TREE, elem, list);
2133         }
2134       return build_vector(type, nreverse(list));  
2135     }
2136   return NULL_TREE;
2137 }
2138
2139 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2140    indicates which particular sizetype to create.  */
2141
2142 tree
2143 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2144 {
2145   return build_int_cst (sizetype_tab[(int) kind], number);
2146 }
2147 \f
2148 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2149    is a tree code.  The type of the result is taken from the operands.
2150    Both must be equivalent integer types, ala int_binop_types_match_p.
2151    If the operands are constant, so is the result.  */
2152
2153 tree
2154 size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1)
2155 {
2156   tree type = TREE_TYPE (arg0);
2157
2158   if (arg0 == error_mark_node || arg1 == error_mark_node)
2159     return error_mark_node;
2160
2161   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2162                                        TREE_TYPE (arg1)));
2163
2164   /* Handle the special case of two integer constants faster.  */
2165   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2166     {
2167       /* And some specific cases even faster than that.  */
2168       if (code == PLUS_EXPR)
2169         {
2170           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2171             return arg1;
2172           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2173             return arg0;
2174         }
2175       else if (code == MINUS_EXPR)
2176         {
2177           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2178             return arg0;
2179         }
2180       else if (code == MULT_EXPR)
2181         {
2182           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2183             return arg1;
2184         }
2185
2186       /* Handle general case of two integer constants.  */
2187       return int_const_binop (code, arg0, arg1, 0);
2188     }
2189
2190   return fold_build2_loc (loc, code, type, arg0, arg1);
2191 }
2192
2193 /* Given two values, either both of sizetype or both of bitsizetype,
2194    compute the difference between the two values.  Return the value
2195    in signed type corresponding to the type of the operands.  */
2196
2197 tree
2198 size_diffop_loc (location_t loc, tree arg0, tree arg1)
2199 {
2200   tree type = TREE_TYPE (arg0);
2201   tree ctype;
2202
2203   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2204                                        TREE_TYPE (arg1)));
2205
2206   /* If the type is already signed, just do the simple thing.  */
2207   if (!TYPE_UNSIGNED (type))
2208     return size_binop_loc (loc, MINUS_EXPR, arg0, arg1);
2209
2210   if (type == sizetype)
2211     ctype = ssizetype;
2212   else if (type == bitsizetype)
2213     ctype = sbitsizetype;
2214   else
2215     ctype = signed_type_for (type);
2216
2217   /* If either operand is not a constant, do the conversions to the signed
2218      type and subtract.  The hardware will do the right thing with any
2219      overflow in the subtraction.  */
2220   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2221     return size_binop_loc (loc, MINUS_EXPR,
2222                            fold_convert_loc (loc, ctype, arg0),
2223                            fold_convert_loc (loc, ctype, arg1));
2224
2225   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2226      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2227      overflow) and negate (which can't either).  Special-case a result
2228      of zero while we're here.  */
2229   if (tree_int_cst_equal (arg0, arg1))
2230     return build_int_cst (ctype, 0);
2231   else if (tree_int_cst_lt (arg1, arg0))
2232     return fold_convert_loc (loc, ctype,
2233                              size_binop_loc (loc, MINUS_EXPR, arg0, arg1));
2234   else
2235     return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0),
2236                            fold_convert_loc (loc, ctype,
2237                                              size_binop_loc (loc,
2238                                                              MINUS_EXPR,
2239                                                              arg1, arg0)));
2240 }
2241 \f
2242 /* A subroutine of fold_convert_const handling conversions of an
2243    INTEGER_CST to another integer type.  */
2244
2245 static tree
2246 fold_convert_const_int_from_int (tree type, const_tree arg1)
2247 {
2248   tree t;
2249
2250   /* Given an integer constant, make new constant with new type,
2251      appropriately sign-extended or truncated.  */
2252   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2253                              TREE_INT_CST_HIGH (arg1),
2254                              /* Don't set the overflow when
2255                                 converting from a pointer,  */
2256                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2257                              /* or to a sizetype with same signedness
2258                                 and the precision is unchanged.
2259                                 ???  sizetype is always sign-extended,
2260                                 but its signedness depends on the
2261                                 frontend.  Thus we see spurious overflows
2262                                 here if we do not check this.  */
2263                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2264                                    == TYPE_PRECISION (type))
2265                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2266                                       == TYPE_UNSIGNED (type))
2267                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2268                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2269                                       || (TREE_CODE (type) == INTEGER_TYPE
2270                                           && TYPE_IS_SIZETYPE (type)))),
2271                              (TREE_INT_CST_HIGH (arg1) < 0
2272                               && (TYPE_UNSIGNED (type)
2273                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2274                              | TREE_OVERFLOW (arg1));
2275
2276   return t;
2277 }
2278
2279 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2280    to an integer type.  */
2281
2282 static tree
2283 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2284 {
2285   int overflow = 0;
2286   tree t;
2287
2288   /* The following code implements the floating point to integer
2289      conversion rules required by the Java Language Specification,
2290      that IEEE NaNs are mapped to zero and values that overflow
2291      the target precision saturate, i.e. values greater than
2292      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2293      are mapped to INT_MIN.  These semantics are allowed by the
2294      C and C++ standards that simply state that the behavior of
2295      FP-to-integer conversion is unspecified upon overflow.  */
2296
2297   HOST_WIDE_INT high, low;
2298   REAL_VALUE_TYPE r;
2299   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2300
2301   switch (code)
2302     {
2303     case FIX_TRUNC_EXPR:
2304       real_trunc (&r, VOIDmode, &x);
2305       break;
2306
2307     default:
2308       gcc_unreachable ();
2309     }
2310
2311   /* If R is NaN, return zero and show we have an overflow.  */
2312   if (REAL_VALUE_ISNAN (r))
2313     {
2314       overflow = 1;
2315       high = 0;
2316       low = 0;
2317     }
2318
2319   /* See if R is less than the lower bound or greater than the
2320      upper bound.  */
2321
2322   if (! overflow)
2323     {
2324       tree lt = TYPE_MIN_VALUE (type);
2325       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2326       if (REAL_VALUES_LESS (r, l))
2327         {
2328           overflow = 1;
2329           high = TREE_INT_CST_HIGH (lt);
2330           low = TREE_INT_CST_LOW (lt);
2331         }
2332     }
2333
2334   if (! overflow)
2335     {
2336       tree ut = TYPE_MAX_VALUE (type);
2337       if (ut)
2338         {
2339           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2340           if (REAL_VALUES_LESS (u, r))
2341             {
2342               overflow = 1;
2343               high = TREE_INT_CST_HIGH (ut);
2344               low = TREE_INT_CST_LOW (ut);
2345             }
2346         }
2347     }
2348
2349   if (! overflow)
2350     REAL_VALUE_TO_INT (&low, &high, r);
2351
2352   t = force_fit_type_double (type, low, high, -1,
2353                              overflow | TREE_OVERFLOW (arg1));
2354   return t;
2355 }
2356
2357 /* A subroutine of fold_convert_const handling conversions of a
2358    FIXED_CST to an integer type.  */
2359
2360 static tree
2361 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2362 {
2363   tree t;
2364   double_int temp, temp_trunc;
2365   unsigned int mode;
2366
2367   /* Right shift FIXED_CST to temp by fbit.  */
2368   temp = TREE_FIXED_CST (arg1).data;
2369   mode = TREE_FIXED_CST (arg1).mode;
2370   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2371     {
2372       lshift_double (temp.low, temp.high,
2373                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2374                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2375
2376       /* Left shift temp to temp_trunc by fbit.  */
2377       lshift_double (temp.low, temp.high,
2378                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2379                      &temp_trunc.low, &temp_trunc.high,
2380                      SIGNED_FIXED_POINT_MODE_P (mode));
2381     }
2382   else
2383     {
2384       temp.low = 0;
2385       temp.high = 0;
2386       temp_trunc.low = 0;
2387       temp_trunc.high = 0;
2388     }
2389
2390   /* If FIXED_CST is negative, we need to round the value toward 0.
2391      By checking if the fractional bits are not zero to add 1 to temp.  */
2392   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2393       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2394     {
2395       double_int one;
2396       one.low = 1;
2397       one.high = 0;
2398       temp = double_int_add (temp, one);
2399     }
2400
2401   /* Given a fixed-point constant, make new constant with new type,
2402      appropriately sign-extended or truncated.  */
2403   t = force_fit_type_double (type, temp.low, temp.high, -1,
2404                              (temp.high < 0
2405                               && (TYPE_UNSIGNED (type)
2406                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2407                              | TREE_OVERFLOW (arg1));
2408
2409   return t;
2410 }
2411
2412 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2413    to another floating point type.  */
2414
2415 static tree
2416 fold_convert_const_real_from_real (tree type, const_tree arg1)
2417 {
2418   REAL_VALUE_TYPE value;
2419   tree t;
2420
2421   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2422   t = build_real (type, value);
2423
2424   /* If converting an infinity or NAN to a representation that doesn't
2425      have one, set the overflow bit so that we can produce some kind of
2426      error message at the appropriate point if necessary.  It's not the
2427      most user-friendly message, but it's better than nothing.  */
2428   if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
2429       && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
2430     TREE_OVERFLOW (t) = 1;
2431   else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
2432            && !MODE_HAS_NANS (TYPE_MODE (type)))
2433     TREE_OVERFLOW (t) = 1;
2434   /* Regular overflow, conversion produced an infinity in a mode that
2435      can't represent them.  */
2436   else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
2437            && REAL_VALUE_ISINF (value)
2438            && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
2439     TREE_OVERFLOW (t) = 1;
2440   else
2441     TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2442   return t;
2443 }
2444
2445 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2446    to a floating point type.  */
2447
2448 static tree
2449 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2450 {
2451   REAL_VALUE_TYPE value;
2452   tree t;
2453
2454   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2455   t = build_real (type, value);
2456
2457   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2458   return t;
2459 }
2460
2461 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2462    to another fixed-point type.  */
2463
2464 static tree
2465 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2466 {
2467   FIXED_VALUE_TYPE value;
2468   tree t;
2469   bool overflow_p;
2470
2471   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2472                               TYPE_SATURATING (type));
2473   t = build_fixed (type, value);
2474
2475   /* Propagate overflow flags.  */
2476   if (overflow_p | TREE_OVERFLOW (arg1))
2477     TREE_OVERFLOW (t) = 1;
2478   return t;
2479 }
2480
2481 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2482    to a fixed-point type.  */
2483
2484 static tree
2485 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2486 {
2487   FIXED_VALUE_TYPE value;
2488   tree t;
2489   bool overflow_p;
2490
2491   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2492                                        TREE_INT_CST (arg1),
2493                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2494                                        TYPE_SATURATING (type));
2495   t = build_fixed (type, value);
2496
2497   /* Propagate overflow flags.  */
2498   if (overflow_p | TREE_OVERFLOW (arg1))
2499     TREE_OVERFLOW (t) = 1;
2500   return t;
2501 }
2502
2503 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2504    to a fixed-point type.  */
2505
2506 static tree
2507 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2508 {
2509   FIXED_VALUE_TYPE value;
2510   tree t;
2511   bool overflow_p;
2512
2513   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2514                                         &TREE_REAL_CST (arg1),
2515                                         TYPE_SATURATING (type));
2516   t = build_fixed (type, value);
2517
2518   /* Propagate overflow flags.  */
2519   if (overflow_p | TREE_OVERFLOW (arg1))
2520     TREE_OVERFLOW (t) = 1;
2521   return t;
2522 }
2523
2524 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2525    type TYPE.  If no simplification can be done return NULL_TREE.  */
2526
2527 static tree
2528 fold_convert_const (enum tree_code code, tree type, tree arg1)
2529 {
2530   if (TREE_TYPE (arg1) == type)
2531     return arg1;
2532
2533   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
2534       || TREE_CODE (type) == OFFSET_TYPE)
2535     {
2536       if (TREE_CODE (arg1) == INTEGER_CST)
2537         return fold_convert_const_int_from_int (type, arg1);
2538       else if (TREE_CODE (arg1) == REAL_CST)
2539         return fold_convert_const_int_from_real (code, type, arg1);
2540       else if (TREE_CODE (arg1) == FIXED_CST)
2541         return fold_convert_const_int_from_fixed (type, arg1);
2542     }
2543   else if (TREE_CODE (type) == REAL_TYPE)
2544     {
2545       if (TREE_CODE (arg1) == INTEGER_CST)
2546         return build_real_from_int_cst (type, arg1);
2547       else if (TREE_CODE (arg1) == REAL_CST)
2548         return fold_convert_const_real_from_real (type, arg1);
2549       else if (TREE_CODE (arg1) == FIXED_CST)
2550         return fold_convert_const_real_from_fixed (type, arg1);
2551     }
2552   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2553     {
2554       if (TREE_CODE (arg1) == FIXED_CST)
2555         return fold_convert_const_fixed_from_fixed (type, arg1);
2556       else if (TREE_CODE (arg1) == INTEGER_CST)
2557         return fold_convert_const_fixed_from_int (type, arg1);
2558       else if (TREE_CODE (arg1) == REAL_CST)
2559         return fold_convert_const_fixed_from_real (type, arg1);
2560     }
2561   return NULL_TREE;
2562 }
2563
2564 /* Construct a vector of zero elements of vector type TYPE.  */
2565
2566 static tree
2567 build_zero_vector (tree type)
2568 {
2569   tree elem, list;
2570   int i, units;
2571
2572   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2573   units = TYPE_VECTOR_SUBPARTS (type);
2574   
2575   list = NULL_TREE;
2576   for (i = 0; i < units; i++)
2577     list = tree_cons (NULL_TREE, elem, list);
2578   return build_vector (type, list);
2579 }
2580
2581 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2582
2583 bool
2584 fold_convertible_p (const_tree type, const_tree arg)
2585 {
2586   tree orig = TREE_TYPE (arg);
2587
2588   if (type == orig)
2589     return true;
2590
2591   if (TREE_CODE (arg) == ERROR_MARK
2592       || TREE_CODE (type) == ERROR_MARK
2593       || TREE_CODE (orig) == ERROR_MARK)
2594     return false;
2595
2596   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2597     return true;
2598
2599   switch (TREE_CODE (type))
2600     {
2601     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2602     case POINTER_TYPE: case REFERENCE_TYPE:
2603     case OFFSET_TYPE:
2604       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2605           || TREE_CODE (orig) == OFFSET_TYPE)
2606         return true;
2607       return (TREE_CODE (orig) == VECTOR_TYPE
2608               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2609
2610     case REAL_TYPE:
2611     case FIXED_POINT_TYPE:
2612     case COMPLEX_TYPE:
2613     case VECTOR_TYPE:
2614     case VOID_TYPE:
2615       return TREE_CODE (type) == TREE_CODE (orig);
2616
2617     default:
2618       return false;
2619     }
2620 }
2621
2622 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2623    simple conversions in preference to calling the front-end's convert.  */
2624
2625 tree
2626 fold_convert_loc (location_t loc, tree type, tree arg)
2627 {
2628   tree orig = TREE_TYPE (arg);
2629   tree tem;
2630
2631   if (type == orig)
2632     return arg;
2633
2634   if (TREE_CODE (arg) == ERROR_MARK
2635       || TREE_CODE (type) == ERROR_MARK
2636       || TREE_CODE (orig) == ERROR_MARK)
2637     return error_mark_node;
2638
2639   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2640     return fold_build1_loc (loc, NOP_EXPR, type, arg);
2641
2642   switch (TREE_CODE (type))
2643     {
2644     case POINTER_TYPE:
2645     case REFERENCE_TYPE:
2646       /* Handle conversions between pointers to different address spaces.  */
2647       if (POINTER_TYPE_P (orig)
2648           && (TYPE_ADDR_SPACE (TREE_TYPE (type))
2649               != TYPE_ADDR_SPACE (TREE_TYPE (orig))))
2650         return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg);
2651       /* fall through */
2652
2653     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2654     case OFFSET_TYPE:
2655       if (TREE_CODE (arg) == INTEGER_CST)
2656         {
2657           tem = fold_convert_const (NOP_EXPR, type, arg);
2658           if (tem != NULL_TREE)
2659             return tem;
2660         }
2661       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2662           || TREE_CODE (orig) == OFFSET_TYPE)
2663         return fold_build1_loc (loc, NOP_EXPR, type, arg);
2664       if (TREE_CODE (orig) == COMPLEX_TYPE)
2665         return fold_convert_loc (loc, type,
2666                              fold_build1_loc (loc, REALPART_EXPR,
2667                                           TREE_TYPE (orig), arg));
2668       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2669                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2670       return fold_build1_loc (loc, NOP_EXPR, type, arg);
2671
2672     case REAL_TYPE:
2673       if (TREE_CODE (arg) == INTEGER_CST)
2674         {
2675           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2676           if (tem != NULL_TREE)
2677             return tem;
2678         }
2679       else if (TREE_CODE (arg) == REAL_CST)
2680         {
2681           tem = fold_convert_const (NOP_EXPR, type, arg);
2682           if (tem != NULL_TREE)
2683             return tem;
2684         }
2685       else if (TREE_CODE (arg) == FIXED_CST)
2686         {
2687           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2688           if (tem != NULL_TREE)
2689             return tem;
2690         }
2691
2692       switch (TREE_CODE (orig))
2693         {
2694         case INTEGER_TYPE:
2695         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2696         case POINTER_TYPE: case REFERENCE_TYPE:
2697           return fold_build1_loc (loc, FLOAT_EXPR, type, arg);
2698
2699         case REAL_TYPE:
2700           return fold_build1_loc (loc, NOP_EXPR, type, arg);
2701
2702         case FIXED_POINT_TYPE:
2703           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2704
2705         case COMPLEX_TYPE:
2706           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2707           return fold_convert_loc (loc, type, tem);
2708
2709         default:
2710           gcc_unreachable ();
2711         }
2712
2713     case FIXED_POINT_TYPE:
2714       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2715           || TREE_CODE (arg) == REAL_CST)
2716         {
2717           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2718           if (tem != NULL_TREE)
2719             goto fold_convert_exit;
2720         }
2721
2722       switch (TREE_CODE (orig))
2723         {
2724         case FIXED_POINT_TYPE:
2725         case INTEGER_TYPE:
2726         case ENUMERAL_TYPE:
2727         case BOOLEAN_TYPE:
2728         case REAL_TYPE:
2729           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2730
2731         case COMPLEX_TYPE:
2732           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2733           return fold_convert_loc (loc, type, tem);
2734
2735         default:
2736           gcc_unreachable ();
2737         }
2738
2739     case COMPLEX_TYPE:
2740       switch (TREE_CODE (orig))
2741         {
2742         case INTEGER_TYPE:
2743         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2744         case POINTER_TYPE: case REFERENCE_TYPE:
2745         case REAL_TYPE:
2746         case FIXED_POINT_TYPE:
2747           return fold_build2_loc (loc, COMPLEX_EXPR, type,
2748                               fold_convert_loc (loc, TREE_TYPE (type), arg),
2749                               fold_convert_loc (loc, TREE_TYPE (type),
2750                                             integer_zero_node));
2751         case COMPLEX_TYPE:
2752           {
2753             tree rpart, ipart;
2754
2755             if (TREE_CODE (arg) == COMPLEX_EXPR)
2756               {
2757                 rpart = fold_convert_loc (loc, TREE_TYPE (type),
2758                                       TREE_OPERAND (arg, 0));
2759                 ipart = fold_convert_loc (loc, TREE_TYPE (type),
2760                                       TREE_OPERAND (arg, 1));
2761                 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2762               }
2763
2764             arg = save_expr (arg);
2765             rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2766             ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg);
2767             rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart);
2768             ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart);
2769             return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2770           }
2771
2772         default:
2773           gcc_unreachable ();
2774         }
2775
2776     case VECTOR_TYPE:
2777       if (integer_zerop (arg))
2778         return build_zero_vector (type);
2779       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2780       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2781                   || TREE_CODE (orig) == VECTOR_TYPE);
2782       return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg);
2783
2784     case VOID_TYPE:
2785       tem = fold_ignored_result (arg);
2786       if (TREE_CODE (tem) == MODIFY_EXPR)
2787         goto fold_convert_exit;
2788       return fold_build1_loc (loc, NOP_EXPR, type, tem);
2789
2790     default:
2791       gcc_unreachable ();
2792     }
2793  fold_convert_exit:
2794   protected_set_expr_location (tem, loc);
2795   return tem;
2796 }
2797 \f
2798 /* Return false if expr can be assumed not to be an lvalue, true
2799    otherwise.  */
2800
2801 static bool
2802 maybe_lvalue_p (const_tree x)
2803 {
2804   /* We only need to wrap lvalue tree codes.  */
2805   switch (TREE_CODE (x))
2806   {
2807   case VAR_DECL:
2808   case PARM_DECL:
2809   case RESULT_DECL:
2810   case LABEL_DECL:
2811   case FUNCTION_DECL:
2812   case SSA_NAME:
2813
2814   case COMPONENT_REF:
2815   case INDIRECT_REF:
2816   case ALIGN_INDIRECT_REF:
2817   case MISALIGNED_INDIRECT_REF:
2818   case ARRAY_REF:
2819   case ARRAY_RANGE_REF:
2820   case BIT_FIELD_REF:
2821   case OBJ_TYPE_REF:
2822
2823   case REALPART_EXPR:
2824   case IMAGPART_EXPR:
2825   case PREINCREMENT_EXPR:
2826   case PREDECREMENT_EXPR:
2827   case SAVE_EXPR:
2828   case TRY_CATCH_EXPR:
2829   case WITH_CLEANUP_EXPR:
2830   case COMPOUND_EXPR:
2831   case MODIFY_EXPR:
2832   case TARGET_EXPR:
2833   case COND_EXPR:
2834   case BIND_EXPR:
2835     break;
2836
2837   default:
2838     /* Assume the worst for front-end tree codes.  */
2839     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2840       break;
2841     return false;
2842   }
2843
2844   return true;
2845 }
2846
2847 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2848
2849 tree
2850 non_lvalue_loc (location_t loc, tree x)
2851 {
2852   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2853      us.  */
2854   if (in_gimple_form)
2855     return x;
2856
2857   if (! maybe_lvalue_p (x))
2858     return x;
2859   x = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2860   SET_EXPR_LOCATION (x, loc);
2861   return x;
2862 }
2863
2864 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2865    Zero means allow extended lvalues.  */
2866
2867 int pedantic_lvalues;
2868
2869 /* When pedantic, return an expr equal to X but certainly not valid as a
2870    pedantic lvalue.  Otherwise, return X.  */
2871
2872 static tree
2873 pedantic_non_lvalue_loc (location_t loc, tree x)
2874 {
2875   if (pedantic_lvalues)
2876     return non_lvalue_loc (loc, x);
2877   protected_set_expr_location (x, loc);
2878   return x;
2879 }
2880 \f
2881 /* Given a tree comparison code, return the code that is the logical inverse
2882    of the given code.  It is not safe to do this for floating-point
2883    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2884    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2885
2886 enum tree_code
2887 invert_tree_comparison (enum tree_code code, bool honor_nans)
2888 {
2889   if (honor_nans && flag_trapping_math)
2890     return ERROR_MARK;
2891
2892   switch (code)
2893     {
2894     case EQ_EXPR:
2895       return NE_EXPR;
2896     case NE_EXPR:
2897       return EQ_EXPR;
2898     case GT_EXPR:
2899       return honor_nans ? UNLE_EXPR : LE_EXPR;
2900     case GE_EXPR:
2901       return honor_nans ? UNLT_EXPR : LT_EXPR;
2902     case LT_EXPR:
2903       return honor_nans ? UNGE_EXPR : GE_EXPR;
2904     case LE_EXPR:
2905       return honor_nans ? UNGT_EXPR : GT_EXPR;
2906     case LTGT_EXPR:
2907       return UNEQ_EXPR;
2908     case UNEQ_EXPR:
2909       return LTGT_EXPR;
2910     case UNGT_EXPR:
2911       return LE_EXPR;
2912     case UNGE_EXPR:
2913       return LT_EXPR;
2914     case UNLT_EXPR:
2915       return GE_EXPR;
2916     case UNLE_EXPR:
2917       return GT_EXPR;
2918     case ORDERED_EXPR:
2919       return UNORDERED_EXPR;
2920     case UNORDERED_EXPR:
2921       return ORDERED_EXPR;
2922     default:
2923       gcc_unreachable ();
2924     }
2925 }
2926
2927 /* Similar, but return the comparison that results if the operands are
2928    swapped.  This is safe for floating-point.  */
2929
2930 enum tree_code
2931 swap_tree_comparison (enum tree_code code)
2932 {
2933   switch (code)
2934     {
2935     case EQ_EXPR:
2936     case NE_EXPR:
2937     case ORDERED_EXPR:
2938     case UNORDERED_EXPR:
2939     case LTGT_EXPR:
2940     case UNEQ_EXPR:
2941       return code;
2942     case GT_EXPR:
2943       return LT_EXPR;
2944     case GE_EXPR:
2945       return LE_EXPR;
2946     case LT_EXPR:
2947       return GT_EXPR;
2948     case LE_EXPR:
2949       return GE_EXPR;
2950     case UNGT_EXPR:
2951       return UNLT_EXPR;
2952     case UNGE_EXPR:
2953       return UNLE_EXPR;
2954     case UNLT_EXPR:
2955       return UNGT_EXPR;
2956     case UNLE_EXPR:
2957       return UNGE_EXPR;
2958     default:
2959       gcc_unreachable ();
2960     }
2961 }
2962
2963
2964 /* Convert a comparison tree code from an enum tree_code representation
2965    into a compcode bit-based encoding.  This function is the inverse of
2966    compcode_to_comparison.  */
2967
2968 static enum comparison_code
2969 comparison_to_compcode (enum tree_code code)
2970 {
2971   switch (code)
2972     {
2973     case LT_EXPR:
2974       return COMPCODE_LT;
2975     case EQ_EXPR:
2976       return COMPCODE_EQ;
2977     case LE_EXPR:
2978       return COMPCODE_LE;
2979     case GT_EXPR:
2980       return COMPCODE_GT;
2981     case NE_EXPR:
2982       return COMPCODE_NE;
2983     case GE_EXPR:
2984       return COMPCODE_GE;
2985     case ORDERED_EXPR:
2986       return COMPCODE_ORD;
2987     case UNORDERED_EXPR:
2988       return COMPCODE_UNORD;
2989     case UNLT_EXPR:
2990       return COMPCODE_UNLT;
2991     case UNEQ_EXPR:
2992       return COMPCODE_UNEQ;
2993     case UNLE_EXPR:
2994       return COMPCODE_UNLE;
2995     case UNGT_EXPR:
2996       return COMPCODE_UNGT;
2997     case LTGT_EXPR:
2998       return COMPCODE_LTGT;
2999     case UNGE_EXPR:
3000       return COMPCODE_UNGE;
3001     default:
3002       gcc_unreachable ();
3003     }
3004 }
3005
3006 /* Convert a compcode bit-based encoding of a comparison operator back
3007    to GCC's enum tree_code representation.  This function is the
3008    inverse of comparison_to_compcode.  */
3009
3010 static enum tree_code
3011 compcode_to_comparison (enum comparison_code code)
3012 {
3013   switch (code)
3014     {
3015     case COMPCODE_LT:
3016       return LT_EXPR;
3017     case COMPCODE_EQ:
3018       return EQ_EXPR;
3019     case COMPCODE_LE:
3020       return LE_EXPR;
3021     case COMPCODE_GT:
3022       return GT_EXPR;
3023     case COMPCODE_NE:
3024       return NE_EXPR;
3025     case COMPCODE_GE:
3026       return GE_EXPR;
3027     case COMPCODE_ORD:
3028       return ORDERED_EXPR;
3029     case COMPCODE_UNORD:
3030       return UNORDERED_EXPR;
3031     case COMPCODE_UNLT:
3032       return UNLT_EXPR;
3033     case COMPCODE_UNEQ:
3034       return UNEQ_EXPR;
3035     case COMPCODE_UNLE:
3036       return UNLE_EXPR;
3037     case COMPCODE_UNGT:
3038       return UNGT_EXPR;
3039     case COMPCODE_LTGT:
3040       return LTGT_EXPR;
3041     case COMPCODE_UNGE:
3042       return UNGE_EXPR;
3043     default:
3044       gcc_unreachable ();
3045     }
3046 }
3047
3048 /* Return a tree for the comparison which is the combination of
3049    doing the AND or OR (depending on CODE) of the two operations LCODE
3050    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
3051    the possibility of trapping if the mode has NaNs, and return NULL_TREE
3052    if this makes the transformation invalid.  */
3053
3054 tree
3055 combine_comparisons (location_t loc,
3056                      enum tree_code code, enum tree_code lcode,
3057                      enum tree_code rcode, tree truth_type,
3058                      tree ll_arg, tree lr_arg)
3059 {
3060   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
3061   enum comparison_code lcompcode = comparison_to_compcode (lcode);
3062   enum comparison_code rcompcode = comparison_to_compcode (rcode);
3063   int compcode;
3064
3065   switch (code)
3066     {
3067     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
3068       compcode = lcompcode & rcompcode;
3069       break;
3070
3071     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
3072       compcode = lcompcode | rcompcode;
3073       break;
3074
3075     default:
3076       return NULL_TREE;
3077     }
3078
3079   if (!honor_nans)
3080     {
3081       /* Eliminate unordered comparisons, as well as LTGT and ORD
3082          which are not used unless the mode has NaNs.  */
3083       compcode &= ~COMPCODE_UNORD;
3084       if (compcode == COMPCODE_LTGT)
3085         compcode = COMPCODE_NE;
3086       else if (compcode == COMPCODE_ORD)
3087         compcode = COMPCODE_TRUE;
3088     }
3089    else if (flag_trapping_math)
3090      {
3091         /* Check that the original operation and the optimized ones will trap
3092            under the same condition.  */
3093         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
3094                      && (lcompcode != COMPCODE_EQ)
3095                      && (lcompcode != COMPCODE_ORD);
3096         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
3097                      && (rcompcode != COMPCODE_EQ)
3098                      && (rcompcode != COMPCODE_ORD);
3099         bool trap = (compcode & COMPCODE_UNORD) == 0
3100                     && (compcode != COMPCODE_EQ)
3101                     && (compcode != COMPCODE_ORD);
3102
3103         /* In a short-circuited boolean expression the LHS might be
3104            such that the RHS, if evaluated, will never trap.  For
3105            example, in ORD (x, y) && (x < y), we evaluate the RHS only
3106            if neither x nor y is NaN.  (This is a mixed blessing: for
3107            example, the expression above will never trap, hence
3108            optimizing it to x < y would be invalid).  */
3109         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
3110             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
3111           rtrap = false;
3112
3113         /* If the comparison was short-circuited, and only the RHS
3114            trapped, we may now generate a spurious trap.  */
3115         if (rtrap && !ltrap
3116             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3117           return NULL_TREE;
3118
3119         /* If we changed the conditions that cause a trap, we lose.  */
3120         if ((ltrap || rtrap) != trap)
3121           return NULL_TREE;
3122       }
3123
3124   if (compcode == COMPCODE_TRUE)
3125     return constant_boolean_node (true, truth_type);
3126   else if (compcode == COMPCODE_FALSE)
3127     return constant_boolean_node (false, truth_type);
3128   else
3129     {
3130       enum tree_code tcode;
3131
3132       tcode = compcode_to_comparison ((enum comparison_code) compcode);
3133       return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg);
3134     }
3135 }
3136 \f
3137 /* Return nonzero if two operands (typically of the same tree node)
3138    are necessarily equal.  If either argument has side-effects this
3139    function returns zero.  FLAGS modifies behavior as follows:
3140
3141    If OEP_ONLY_CONST is set, only return nonzero for constants.
3142    This function tests whether the operands are indistinguishable;
3143    it does not test whether they are equal using C's == operation.
3144    The distinction is important for IEEE floating point, because
3145    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3146    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3147
3148    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3149    even though it may hold multiple values during a function.
3150    This is because a GCC tree node guarantees that nothing else is
3151    executed between the evaluation of its "operands" (which may often
3152    be evaluated in arbitrary order).  Hence if the operands themselves
3153    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3154    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3155    unset means assuming isochronic (or instantaneous) tree equivalence.
3156    Unless comparing arbitrary expression trees, such as from different
3157    statements, this flag can usually be left unset.
3158
3159    If OEP_PURE_SAME is set, then pure functions with identical arguments
3160    are considered the same.  It is used when the caller has other ways
3161    to ensure that global memory is unchanged in between.  */
3162
3163 int
3164 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3165 {
3166   /* If either is ERROR_MARK, they aren't equal.  */
3167   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3168     return 0;
3169
3170   /* Check equality of integer constants before bailing out due to
3171      precision differences.  */
3172   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
3173     return tree_int_cst_equal (arg0, arg1);
3174
3175   /* If both types don't have the same signedness, then we can't consider
3176      them equal.  We must check this before the STRIP_NOPS calls
3177      because they may change the signedness of the arguments.  As pointers
3178      strictly don't have a signedness, require either two pointers or
3179      two non-pointers as well.  */
3180   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
3181       || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
3182     return 0;
3183
3184   /* We cannot consider pointers to different address space equal.  */
3185   if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1))
3186       && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))
3187           != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))))
3188     return 0;
3189
3190   /* If both types don't have the same precision, then it is not safe
3191      to strip NOPs.  */
3192   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3193     return 0;
3194
3195   STRIP_NOPS (arg0);
3196   STRIP_NOPS (arg1);
3197
3198   /* In case both args are comparisons but with different comparison
3199      code, try to swap the comparison operands of one arg to produce
3200      a match and compare that variant.  */
3201   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3202       && COMPARISON_CLASS_P (arg0)
3203       && COMPARISON_CLASS_P (arg1))
3204     {
3205       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3206
3207       if (TREE_CODE (arg0) == swap_code)
3208         return operand_equal_p (TREE_OPERAND (arg0, 0),
3209                                 TREE_OPERAND (arg1, 1), flags)
3210                && operand_equal_p (TREE_OPERAND (arg0, 1),
3211                                    TREE_OPERAND (arg1, 0), flags);
3212     }
3213
3214   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3215       /* This is needed for conversions and for COMPONENT_REF.
3216          Might as well play it safe and always test this.  */
3217       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3218       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3219       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3220     return 0;
3221
3222   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3223      We don't care about side effects in that case because the SAVE_EXPR
3224      takes care of that for us. In all other cases, two expressions are
3225      equal if they have no side effects.  If we have two identical
3226      expressions with side effects that should be treated the same due
3227      to the only side effects being identical SAVE_EXPR's, that will
3228      be detected in the recursive calls below.  */
3229   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3230       && (TREE_CODE (arg0) == SAVE_EXPR
3231           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3232     return 1;
3233
3234   /* Next handle constant cases, those for which we can return 1 even
3235      if ONLY_CONST is set.  */
3236   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3237     switch (TREE_CODE (arg0))
3238       {
3239       case INTEGER_CST:
3240         return tree_int_cst_equal (arg0, arg1);
3241
3242       case FIXED_CST:
3243         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3244                                        TREE_FIXED_CST (arg1));
3245
3246       case REAL_CST:
3247         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3248                                    TREE_REAL_CST (arg1)))
3249           return 1;
3250
3251         
3252         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3253           {
3254             /* If we do not distinguish between signed and unsigned zero,
3255                consider them equal.  */
3256             if (real_zerop (arg0) && real_zerop (arg1))
3257               return 1;
3258           }
3259         return 0;
3260
3261       case VECTOR_CST:
3262         {
3263           tree v1, v2;
3264
3265           v1 = TREE_VECTOR_CST_ELTS (arg0);
3266           v2 = TREE_VECTOR_CST_ELTS (arg1);
3267           while (v1 && v2)
3268             {
3269               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3270                                     flags))
3271                 return 0;
3272               v1 = TREE_CHAIN (v1);
3273               v2 = TREE_CHAIN (v2);
3274             }
3275
3276           return v1 == v2;
3277         }
3278
3279       case COMPLEX_CST:
3280         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3281                                  flags)
3282                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3283                                     flags));
3284
3285       case STRING_CST:
3286         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3287                 && ! memcmp (TREE_STRING_POINTER (arg0),
3288                               TREE_STRING_POINTER (arg1),
3289                               TREE_STRING_LENGTH (arg0)));
3290
3291       case ADDR_EXPR:
3292         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3293                                 0);
3294       default:
3295         break;
3296       }
3297
3298   if (flags & OEP_ONLY_CONST)
3299     return 0;
3300
3301 /* Define macros to test an operand from arg0 and arg1 for equality and a
3302    variant that allows null and views null as being different from any
3303    non-null value.  In the latter case, if either is null, the both
3304    must be; otherwise, do the normal comparison.  */
3305 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3306                                     TREE_OPERAND (arg1, N), flags)
3307
3308 #define OP_SAME_WITH_NULL(N)                            \
3309   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3310    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3311
3312   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3313     {
3314     case tcc_unary:
3315       /* Two conversions are equal only if signedness and modes match.  */
3316       switch (TREE_CODE (arg0))
3317         {
3318         CASE_CONVERT:
3319         case FIX_TRUNC_EXPR:
3320           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3321               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3322             return 0;
3323           break;
3324         default:
3325           break;
3326         }
3327
3328       return OP_SAME (0);
3329
3330
3331     case tcc_comparison:
3332     case tcc_binary:
3333       if (OP_SAME (0) && OP_SAME (1))
3334         return 1;
3335
3336       /* For commutative ops, allow the other order.  */
3337       return (commutative_tree_code (TREE_CODE (arg0))
3338               && operand_equal_p (TREE_OPERAND (arg0, 0),
3339                                   TREE_OPERAND (arg1, 1), flags)
3340               && operand_equal_p (TREE_OPERAND (arg0, 1),
3341                                   TREE_OPERAND (arg1, 0), flags));
3342
3343     case tcc_reference:
3344       /* If either of the pointer (or reference) expressions we are
3345          dereferencing contain a side effect, these cannot be equal.  */
3346       if (TREE_SIDE_EFFECTS (arg0)
3347           || TREE_SIDE_EFFECTS (arg1))
3348         return 0;
3349
3350       switch (TREE_CODE (arg0))
3351         {
3352         case INDIRECT_REF:
3353         case ALIGN_INDIRECT_REF:
3354         case MISALIGNED_INDIRECT_REF:
3355         case REALPART_EXPR:
3356         case IMAGPART_EXPR:
3357           return OP_SAME (0);
3358
3359         case ARRAY_REF:
3360         case ARRAY_RANGE_REF:
3361           /* Operands 2 and 3 may be null.
3362              Compare the array index by value if it is constant first as we
3363              may have different types but same value here.  */
3364           return (OP_SAME (0)
3365                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3366                                           TREE_OPERAND (arg1, 1))
3367                       || OP_SAME (1))
3368                   && OP_SAME_WITH_NULL (2)
3369                   && OP_SAME_WITH_NULL (3));
3370
3371         case COMPONENT_REF:
3372           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3373              may be NULL when we're called to compare MEM_EXPRs.  */
3374           return OP_SAME_WITH_NULL (0)
3375                  && OP_SAME (1)
3376                  && OP_SAME_WITH_NULL (2);
3377
3378         case BIT_FIELD_REF:
3379           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3380
3381         default:
3382           return 0;
3383         }
3384
3385     case tcc_expression:
3386       switch (TREE_CODE (arg0))
3387         {
3388         case ADDR_EXPR:
3389         case TRUTH_NOT_EXPR:
3390           return OP_SAME (0);
3391
3392         case TRUTH_ANDIF_EXPR:
3393         case TRUTH_ORIF_EXPR:
3394           return OP_SAME (0) && OP_SAME (1);
3395
3396         case TRUTH_AND_EXPR:
3397         case TRUTH_OR_EXPR:
3398         case TRUTH_XOR_EXPR:
3399           if (OP_SAME (0) && OP_SAME (1))
3400             return 1;
3401
3402           /* Otherwise take into account this is a commutative operation.  */
3403           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3404                                    TREE_OPERAND (arg1, 1), flags)
3405                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3406                                       TREE_OPERAND (arg1, 0), flags));
3407
3408         case COND_EXPR:
3409           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3410           
3411         default:
3412           return 0;
3413         }
3414
3415     case tcc_vl_exp:
3416       switch (TREE_CODE (arg0))
3417         {
3418         case CALL_EXPR:
3419           /* If the CALL_EXPRs call different functions, then they
3420              clearly can not be equal.  */
3421           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3422                                  flags))
3423             return 0;
3424
3425           {
3426             unsigned int cef = call_expr_flags (arg0);
3427             if (flags & OEP_PURE_SAME)
3428               cef &= ECF_CONST | ECF_PURE;
3429             else
3430               cef &= ECF_CONST;
3431             if (!cef)
3432               return 0;
3433           }
3434
3435           /* Now see if all the arguments are the same.  */
3436           {
3437             const_call_expr_arg_iterator iter0, iter1;
3438             const_tree a0, a1;
3439             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3440                    a1 = first_const_call_expr_arg (arg1, &iter1);
3441                  a0 && a1;
3442                  a0 = next_const_call_expr_arg (&iter0),
3443                    a1 = next_const_call_expr_arg (&iter1))
3444               if (! operand_equal_p (a0, a1, flags))
3445                 return 0;
3446
3447             /* If we get here and both argument lists are exhausted
3448                then the CALL_EXPRs are equal.  */
3449             return ! (a0 || a1);
3450           }
3451         default:
3452           return 0;
3453         }
3454
3455     case tcc_declaration:
3456       /* Consider __builtin_sqrt equal to sqrt.  */
3457       return (TREE_CODE (arg0) == FUNCTION_DECL
3458               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3459               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3460               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3461
3462     default:
3463       return 0;
3464     }
3465
3466 #undef OP_SAME
3467 #undef OP_SAME_WITH_NULL
3468 }
3469 \f
3470 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3471    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3472
3473    When in doubt, return 0.  */
3474
3475 static int
3476 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3477 {
3478   int unsignedp1, unsignedpo;
3479   tree primarg0, primarg1, primother;
3480   unsigned int correct_width;
3481
3482   if (operand_equal_p (arg0, arg1, 0))
3483     return 1;
3484
3485   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3486       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3487     return 0;
3488
3489   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3490      and see if the inner values are the same.  This removes any
3491      signedness comparison, which doesn't matter here.  */
3492   primarg0 = arg0, primarg1 = arg1;
3493   STRIP_NOPS (primarg0);
3494   STRIP_NOPS (primarg1);
3495   if (operand_equal_p (primarg0, primarg1, 0))
3496     return 1;
3497
3498   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3499      actual comparison operand, ARG0.
3500
3501      First throw away any conversions to wider types
3502      already present in the operands.  */
3503
3504   primarg1 = get_narrower (arg1, &unsignedp1);
3505   primother = get_narrower (other, &unsignedpo);
3506
3507   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3508   if (unsignedp1 == unsignedpo
3509       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3510       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3511     {
3512       tree type = TREE_TYPE (arg0);
3513
3514       /* Make sure shorter operand is extended the right way
3515          to match the longer operand.  */
3516       primarg1 = fold_convert (signed_or_unsigned_type_for
3517                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3518
3519       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3520         return 1;
3521     }
3522
3523   return 0;
3524 }
3525 \f
3526 /* See if ARG is an expression that is either a comparison or is performing
3527    arithmetic on comparisons.  The comparisons must only be comparing
3528    two different values, which will be stored in *CVAL1 and *CVAL2; if
3529    they are nonzero it means that some operands have already been found.
3530    No variables may be used anywhere else in the expression except in the
3531    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3532    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3533
3534    If this is true, return 1.  Otherwise, return zero.  */
3535
3536 static int
3537 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3538 {
3539   enum tree_code code = TREE_CODE (arg);
3540   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3541
3542   /* We can handle some of the tcc_expression cases here.  */
3543   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3544     tclass = tcc_unary;
3545   else if (tclass == tcc_expression
3546            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3547                || code == COMPOUND_EXPR))
3548     tclass = tcc_binary;
3549
3550   else if (tclass == tcc_expression && code == SAVE_EXPR
3551            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3552     {
3553       /* If we've already found a CVAL1 or CVAL2, this expression is
3554          two complex to handle.  */
3555       if (*cval1 || *cval2)
3556         return 0;
3557
3558       tclass = tcc_unary;
3559       *save_p = 1;
3560     }
3561
3562   switch (tclass)
3563     {
3564     case tcc_unary:
3565       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3566
3567     case tcc_binary:
3568       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3569               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3570                                       cval1, cval2, save_p));
3571
3572     case tcc_constant:
3573       return 1;
3574
3575     case tcc_expression:
3576       if (code == COND_EXPR)
3577         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3578                                      cval1, cval2, save_p)
3579                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3580                                         cval1, cval2, save_p)
3581                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3582                                         cval1, cval2, save_p));
3583       return 0;
3584
3585     case tcc_comparison:
3586       /* First see if we can handle the first operand, then the second.  For
3587          the second operand, we know *CVAL1 can't be zero.  It must be that
3588          one side of the comparison is each of the values; test for the
3589          case where this isn't true by failing if the two operands
3590          are the same.  */
3591
3592       if (operand_equal_p (TREE_OPERAND (arg, 0),
3593                            TREE_OPERAND (arg, 1), 0))
3594         return 0;
3595
3596       if (*cval1 == 0)
3597         *cval1 = TREE_OPERAND (arg, 0);
3598       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3599         ;
3600       else if (*cval2 == 0)
3601         *cval2 = TREE_OPERAND (arg, 0);
3602       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3603         ;
3604       else
3605         return 0;
3606
3607       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3608         ;
3609       else if (*cval2 == 0)
3610         *cval2 = TREE_OPERAND (arg, 1);
3611       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3612         ;
3613       else
3614         return 0;
3615
3616       return 1;
3617
3618     default:
3619       return 0;
3620     }
3621 }
3622 \f
3623 /* ARG is a tree that is known to contain just arithmetic operations and
3624    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3625    any occurrence of OLD0 as an operand of a comparison and likewise for
3626    NEW1 and OLD1.  */
3627
3628 static tree
3629 eval_subst (location_t loc, tree arg, tree old0, tree new0,
3630             tree old1, tree new1)
3631 {
3632   tree type = TREE_TYPE (arg);
3633   enum tree_code code = TREE_CODE (arg);
3634   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3635
3636   /* We can handle some of the tcc_expression cases here.  */
3637   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3638     tclass = tcc_unary;
3639   else if (tclass == tcc_expression
3640            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3641     tclass = tcc_binary;
3642
3643   switch (tclass)
3644     {
3645     case tcc_unary:
3646       return fold_build1_loc (loc, code, type,
3647                           eval_subst (loc, TREE_OPERAND (arg, 0),
3648                                       old0, new0, old1, new1));
3649
3650     case tcc_binary:
3651       return fold_build2_loc (loc, code, type,
3652                           eval_subst (loc, TREE_OPERAND (arg, 0),
3653                                       old0, new0, old1, new1),
3654                           eval_subst (loc, TREE_OPERAND (arg, 1),
3655                                       old0, new0, old1, new1));
3656
3657     case tcc_expression:
3658       switch (code)
3659         {
3660         case SAVE_EXPR:
3661           return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0,
3662                              old1, new1);
3663
3664         case COMPOUND_EXPR:
3665           return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0,
3666                              old1, new1);
3667
3668         case COND_EXPR:
3669           return fold_build3_loc (loc, code, type,
3670                               eval_subst (loc, TREE_OPERAND (arg, 0),
3671                                           old0, new0, old1, new1),
3672                               eval_subst (loc, TREE_OPERAND (arg, 1),
3673                                           old0, new0, old1, new1),
3674                               eval_subst (loc, TREE_OPERAND (arg, 2),
3675                                           old0, new0, old1, new1));
3676         default:
3677           break;
3678         }
3679       /* Fall through - ???  */
3680
3681     case tcc_comparison:
3682       {
3683         tree arg0 = TREE_OPERAND (arg, 0);
3684         tree arg1 = TREE_OPERAND (arg, 1);
3685
3686         /* We need to check both for exact equality and tree equality.  The
3687            former will be true if the operand has a side-effect.  In that
3688            case, we know the operand occurred exactly once.  */
3689
3690         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3691           arg0 = new0;
3692         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3693           arg0 = new1;
3694
3695         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3696           arg1 = new0;
3697         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3698           arg1 = new1;
3699
3700         return fold_build2_loc (loc, code, type, arg0, arg1);
3701       }
3702
3703     default:
3704       return arg;
3705     }
3706 }
3707 \f
3708 /* Return a tree for the case when the result of an expression is RESULT
3709    converted to TYPE and OMITTED was previously an operand of the expression
3710    but is now not needed (e.g., we folded OMITTED * 0).
3711
3712    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3713    the conversion of RESULT to TYPE.  */
3714
3715 tree
3716 omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted)
3717 {
3718   tree t = fold_convert_loc (loc, type, result);
3719
3720   /* If the resulting operand is an empty statement, just return the omitted
3721      statement casted to void. */
3722   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3723     {
3724       t = build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3725       goto omit_one_operand_exit;
3726     }
3727
3728   if (TREE_SIDE_EFFECTS (omitted))
3729     {
3730       t = build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3731       goto omit_one_operand_exit;
3732     }
3733
3734   return non_lvalue_loc (loc, t);
3735
3736  omit_one_operand_exit:
3737   protected_set_expr_location (t, loc);
3738   return t;
3739 }
3740
3741 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3742
3743 static tree
3744 pedantic_omit_one_operand_loc (location_t loc, tree type, tree result,
3745                                tree omitted)
3746 {
3747   tree t = fold_convert_loc (loc, type, result);
3748
3749   /* If the resulting operand is an empty statement, just return the omitted
3750      statement casted to void. */
3751   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3752     {
3753       t = build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3754       goto pedantic_omit_one_operand_exit;
3755     }
3756
3757   if (TREE_SIDE_EFFECTS (omitted))
3758     {
3759       t = build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3760       goto pedantic_omit_one_operand_exit;
3761     }
3762
3763   return pedantic_non_lvalue_loc (loc, t);
3764
3765  pedantic_omit_one_operand_exit:
3766   protected_set_expr_location (t, loc);
3767   return t;
3768 }
3769
3770 /* Return a tree for the case when the result of an expression is RESULT
3771    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3772    of the expression but are now not needed.
3773
3774    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3775    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3776    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3777    just do the conversion of RESULT to TYPE.  */
3778
3779 tree
3780 omit_two_operands_loc (location_t loc, tree type, tree result,
3781                    tree omitted1, tree omitted2)
3782 {
3783   tree t = fold_convert_loc (loc, type, result);
3784
3785   if (TREE_SIDE_EFFECTS (omitted2))
3786     {
3787       t = build2 (COMPOUND_EXPR, type, omitted2, t);
3788       SET_EXPR_LOCATION (t, loc);
3789     }
3790   if (TREE_SIDE_EFFECTS (omitted1))
3791     {
3792       t = build2 (COMPOUND_EXPR, type, omitted1, t);
3793       SET_EXPR_LOCATION (t, loc);
3794     }
3795
3796   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t;
3797 }
3798
3799 \f
3800 /* Return a simplified tree node for the truth-negation of ARG.  This
3801    never alters ARG itself.  We assume that ARG is an operation that
3802    returns a truth value (0 or 1).
3803
3804    FIXME: one would think we would fold the result, but it causes
3805    problems with the dominator optimizer.  */
3806
3807 tree
3808 fold_truth_not_expr (location_t loc, tree arg)
3809 {
3810   tree t, type = TREE_TYPE (arg);
3811   enum tree_code code = TREE_CODE (arg);
3812   location_t loc1, loc2;
3813
3814   /* If this is a comparison, we can simply invert it, except for
3815      floating-point non-equality comparisons, in which case we just
3816      enclose a TRUTH_NOT_EXPR around what we have.  */
3817
3818   if (TREE_CODE_CLASS (code) == tcc_comparison)
3819     {
3820       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3821       if (FLOAT_TYPE_P (op_type)
3822           && flag_trapping_math
3823           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3824           && code != NE_EXPR && code != EQ_EXPR)
3825         return NULL_TREE;
3826
3827       code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (op_type)));
3828       if (code == ERROR_MARK)
3829         return NULL_TREE;
3830
3831       t = build2 (code, type, TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3832       SET_EXPR_LOCATION (t, loc);
3833       return t;
3834     }
3835
3836   switch (code)
3837     {
3838     case INTEGER_CST:
3839       return constant_boolean_node (integer_zerop (arg), type);
3840
3841     case TRUTH_AND_EXPR:
3842       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3843       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3844       if (loc1 == UNKNOWN_LOCATION)
3845         loc1 = loc;
3846       if (loc2 == UNKNOWN_LOCATION)
3847         loc2 = loc;
3848       t = build2 (TRUTH_OR_EXPR, type,
3849                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3850                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3851       break;
3852
3853     case TRUTH_OR_EXPR:
3854       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3855       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3856       if (loc1 == UNKNOWN_LOCATION)
3857         loc1 = loc;
3858       if (loc2 == UNKNOWN_LOCATION)
3859         loc2 = loc;
3860       t = build2 (TRUTH_AND_EXPR, type,
3861                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3862                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3863       break;
3864
3865     case TRUTH_XOR_EXPR:
3866       /* Here we can invert either operand.  We invert the first operand
3867          unless the second operand is a TRUTH_NOT_EXPR in which case our
3868          result is the XOR of the first operand with the inside of the
3869          negation of the second operand.  */
3870
3871       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3872         t = build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3873                     TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3874       else
3875         t = build2 (TRUTH_XOR_EXPR, type,
3876                     invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)),
3877                     TREE_OPERAND (arg, 1));
3878       break;
3879
3880     case TRUTH_ANDIF_EXPR:
3881       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3882       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3883       if (loc1 == UNKNOWN_LOCATION)
3884         loc1 = loc;
3885       if (loc2 == UNKNOWN_LOCATION)
3886         loc2 = loc;
3887       t = build2 (TRUTH_ORIF_EXPR, type,
3888                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3889                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3890       break;
3891
3892     case TRUTH_ORIF_EXPR:
3893       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3894       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3895       if (loc1 == UNKNOWN_LOCATION)
3896         loc1 = loc;
3897       if (loc2 == UNKNOWN_LOCATION)
3898         loc2 = loc;
3899       t = build2 (TRUTH_ANDIF_EXPR, type,
3900                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3901                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3902       break;
3903
3904     case TRUTH_NOT_EXPR:
3905       return TREE_OPERAND (arg, 0);
3906
3907     case COND_EXPR:
3908       {
3909         tree arg1 = TREE_OPERAND (arg, 1);
3910         tree arg2 = TREE_OPERAND (arg, 2);
3911
3912         loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3913         loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 2));
3914         if (loc1 == UNKNOWN_LOCATION)
3915           loc1 = loc;
3916         if (loc2 == UNKNOWN_LOCATION)
3917           loc2 = loc;
3918
3919         /* A COND_EXPR may have a throw as one operand, which
3920            then has void type.  Just leave void operands
3921            as they are.  */
3922         t = build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3923                     VOID_TYPE_P (TREE_TYPE (arg1))
3924                     ? arg1 : invert_truthvalue_loc (loc1, arg1),
3925                     VOID_TYPE_P (TREE_TYPE (arg2))
3926                     ? arg2 : invert_truthvalue_loc (loc2, arg2));
3927         break;
3928       }
3929
3930     case COMPOUND_EXPR:
3931       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3932       if (loc1 == UNKNOWN_LOCATION)
3933         loc1 = loc;
3934       t = build2 (COMPOUND_EXPR, type,
3935                   TREE_OPERAND (arg, 0),
3936                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)));
3937       break;
3938
3939     case NON_LVALUE_EXPR:
3940       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3941       if (loc1 == UNKNOWN_LOCATION)
3942         loc1 = loc;
3943       return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0));
3944
3945     CASE_CONVERT:
3946       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3947         {
3948           t = build1 (TRUTH_NOT_EXPR, type, arg);
3949           break;
3950         }
3951
3952       /* ... fall through ...  */
3953
3954     case FLOAT_EXPR:
3955       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3956       if (loc1 == UNKNOWN_LOCATION)
3957         loc1 = loc;
3958       t = build1 (TREE_CODE (arg), type,
3959                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3960       break;
3961
3962     case BIT_AND_EXPR:
3963       if (!integer_onep (TREE_OPERAND (arg, 1)))
3964         return NULL_TREE;
3965       t = build2 (EQ_EXPR, type, arg, build_int_cst (type, 0));
3966       break;
3967
3968     case SAVE_EXPR:
3969       t = build1 (TRUTH_NOT_EXPR, type, arg);
3970       break;
3971
3972     case CLEANUP_POINT_EXPR:
3973       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3974       if (loc1 == UNKNOWN_LOCATION)
3975         loc1 = loc;
3976       t = build1 (CLEANUP_POINT_EXPR, type,
3977                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3978       break;
3979
3980     default:
3981       t = NULL_TREE;
3982       break;
3983     }
3984
3985   if (t)
3986     SET_EXPR_LOCATION (t, loc);
3987
3988   return t;
3989 }
3990
3991 /* Return a simplified tree node for the truth-negation of ARG.  This
3992    never alters ARG itself.  We assume that ARG is an operation that
3993    returns a truth value (0 or 1).
3994
3995    FIXME: one would think we would fold the result, but it causes
3996    problems with the dominator optimizer.  */
3997
3998 tree
3999 invert_truthvalue_loc (location_t loc, tree arg)
4000 {
4001   tree tem;
4002
4003   if (TREE_CODE (arg) == ERROR_MARK)
4004     return arg;
4005
4006   tem = fold_truth_not_expr (loc, arg);
4007   if (!tem)
4008     {
4009       tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
4010       SET_EXPR_LOCATION (tem, loc);
4011     }
4012
4013   return tem;
4014 }
4015
4016 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
4017    operands are another bit-wise operation with a common input.  If so,
4018    distribute the bit operations to save an operation and possibly two if
4019    constants are involved.  For example, convert
4020         (A | B) & (A | C) into A | (B & C)
4021    Further simplification will occur if B and C are constants.
4022
4023    If this optimization cannot be done, 0 will be returned.  */
4024
4025 static tree
4026 distribute_bit_expr (location_t loc, enum tree_code code, tree type,
4027                      tree arg0, tree arg1)
4028 {
4029   tree common;
4030   tree left, right;
4031
4032   if (TREE_CODE (arg0) != TREE_CODE (arg1)
4033       || TREE_CODE (arg0) == code
4034       || (TREE_CODE (arg0) != BIT_AND_EXPR
4035           && TREE_CODE (arg0) != BIT_IOR_EXPR))
4036     return 0;
4037
4038   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
4039     {
4040       common = TREE_OPERAND (arg0, 0);
4041       left = TREE_OPERAND (arg0, 1);
4042       right = TREE_OPERAND (arg1, 1);
4043     }
4044   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
4045     {
4046       common = TREE_OPERAND (arg0, 0);
4047       left = TREE_OPERAND (arg0, 1);
4048       right = TREE_OPERAND (arg1, 0);
4049     }
4050   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
4051     {
4052       common = TREE_OPERAND (arg0, 1);
4053       left = TREE_OPERAND (arg0, 0);
4054       right = TREE_OPERAND (arg1, 1);
4055     }
4056   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
4057     {
4058       common = TREE_OPERAND (arg0, 1);
4059       left = TREE_OPERAND (arg0, 0);
4060       right = TREE_OPERAND (arg1, 0);
4061     }
4062   else
4063     return 0;
4064
4065   common = fold_convert_loc (loc, type, common);
4066   left = fold_convert_loc (loc, type, left);
4067   right = fold_convert_loc (loc, type, right);
4068   return fold_build2_loc (loc, TREE_CODE (arg0), type, common,
4069                       fold_build2_loc (loc, code, type, left, right));
4070 }
4071
4072 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
4073    with code CODE.  This optimization is unsafe.  */
4074 static tree
4075 distribute_real_division (location_t loc, enum tree_code code, tree type,
4076                           tree arg0, tree arg1)
4077 {
4078   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
4079   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
4080
4081   /* (A / C) +- (B / C) -> (A +- B) / C.  */
4082   if (mul0 == mul1
4083       && operand_equal_p (TREE_OPERAND (arg0, 1),
4084                        TREE_OPERAND (arg1, 1), 0))
4085     return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type,
4086                         fold_build2_loc (loc, code, type,
4087                                      TREE_OPERAND (arg0, 0),
4088                                      TREE_OPERAND (arg1, 0)),
4089                         TREE_OPERAND (arg0, 1));
4090
4091   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
4092   if (operand_equal_p (TREE_OPERAND (arg0, 0),
4093                        TREE_OPERAND (arg1, 0), 0)
4094       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
4095       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
4096     {
4097       REAL_VALUE_TYPE r0, r1;
4098       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
4099       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
4100       if (!mul0)
4101         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
4102       if (!mul1)
4103         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
4104       real_arithmetic (&r0, code, &r0, &r1);
4105       return fold_build2_loc (loc, MULT_EXPR, type,
4106                           TREE_OPERAND (arg0, 0),
4107                           build_real (type, r0));
4108     }
4109
4110   return NULL_TREE;
4111 }
4112 \f
4113 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
4114    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
4115
4116 static tree
4117 make_bit_field_ref (location_t loc, tree inner, tree type,
4118                     HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp)
4119 {
4120   tree result, bftype;
4121
4122   if (bitpos == 0)
4123     {
4124       tree size = TYPE_SIZE (TREE_TYPE (inner));
4125       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
4126            || POINTER_TYPE_P (TREE_TYPE (inner)))
4127           && host_integerp (size, 0) 
4128           && tree_low_cst (size, 0) == bitsize)
4129         return fold_convert_loc (loc, type, inner);
4130     }
4131
4132   bftype = type;
4133   if (TYPE_PRECISION (bftype) != bitsize
4134       || TYPE_UNSIGNED (bftype) == !unsignedp)
4135     bftype = build_nonstandard_integer_type (bitsize, 0);
4136
4137   result = build3 (BIT_FIELD_REF, bftype, inner,
4138                    size_int (bitsize), bitsize_int (bitpos));
4139   SET_EXPR_LOCATION (result, loc);
4140
4141   if (bftype != type)
4142     result = fold_convert_loc (loc, type, result);
4143
4144   return result;
4145 }
4146
4147 /* Optimize a bit-field compare.
4148
4149    There are two cases:  First is a compare against a constant and the
4150    second is a comparison of two items where the fields are at the same
4151    bit position relative to the start of a chunk (byte, halfword, word)
4152    large enough to contain it.  In these cases we can avoid the shift
4153    implicit in bitfield extractions.
4154
4155    For constants, we emit a compare of the shifted constant with the
4156    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
4157    compared.  For two fields at the same position, we do the ANDs with the
4158    similar mask and compare the result of the ANDs.
4159
4160    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
4161    COMPARE_TYPE is the type of the comparison, and LHS and RHS
4162    are the left and right operands of the comparison, respectively.
4163
4164    If the optimization described above can be done, we return the resulting
4165    tree.  Otherwise we return zero.  */
4166
4167 static tree
4168 optimize_bit_field_compare (location_t loc, enum tree_code code,
4169                             tree compare_type, tree lhs, tree rhs)
4170 {
4171   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
4172   tree type = TREE_TYPE (lhs);
4173   tree signed_type, unsigned_type;
4174   int const_p = TREE_CODE (rhs) == INTEGER_CST;
4175   enum machine_mode lmode, rmode, nmode;
4176   int lunsignedp, runsignedp;
4177   int lvolatilep = 0, rvolatilep = 0;
4178   tree linner, rinner = NULL_TREE;
4179   tree mask;
4180   tree offset;
4181
4182   /* Get all the information about the extractions being done.  If the bit size
4183      if the same as the size of the underlying object, we aren't doing an
4184      extraction at all and so can do nothing.  We also don't want to
4185      do anything if the inner expression is a PLACEHOLDER_EXPR since we
4186      then will no longer be able to replace it.  */
4187   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
4188                                 &lunsignedp, &lvolatilep, false);
4189   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
4190       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
4191     return 0;
4192
4193  if (!const_p)
4194    {
4195      /* If this is not a constant, we can only do something if bit positions,
4196         sizes, and signedness are the same.  */
4197      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
4198                                    &runsignedp, &rvolatilep, false);
4199
4200      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
4201          || lunsignedp != runsignedp || offset != 0
4202          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
4203        return 0;
4204    }
4205
4206   /* See if we can find a mode to refer to this field.  We should be able to,
4207      but fail if we can't.  */
4208   nmode = get_best_mode (lbitsize, lbitpos,
4209                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
4210                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
4211                                 TYPE_ALIGN (TREE_TYPE (rinner))),
4212                          word_mode, lvolatilep || rvolatilep);
4213   if (nmode == VOIDmode)
4214     return 0;
4215
4216   /* Set signed and unsigned types of the precision of this mode for the
4217      shifts below.  */
4218   signed_type = lang_hooks.types.type_for_mode (nmode, 0);
4219   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
4220
4221   /* Compute the bit position and size for the new reference and our offset
4222      within it. If the new reference is the same size as the original, we
4223      won't optimize anything, so return zero.  */
4224   nbitsize = GET_MODE_BITSIZE (nmode);
4225   nbitpos = lbitpos & ~ (nbitsize - 1);
4226   lbitpos -= nbitpos;
4227   if (nbitsize == lbitsize)
4228     return 0;
4229
4230   if (BYTES_BIG_ENDIAN)
4231     lbitpos = nbitsize - lbitsize - lbitpos;
4232
4233   /* Make the mask to be used against the extracted field.  */
4234   mask = build_int_cst_type (unsigned_type, -1);
4235   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
4236   mask = const_binop (RSHIFT_EXPR, mask,
4237                       size_int (nbitsize - lbitsize - lbitpos), 0);
4238
4239   if (! const_p)
4240     /* If not comparing with constant, just rework the comparison
4241        and return.  */
4242     return fold_build2_loc (loc, code, compare_type,
4243                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4244                                      make_bit_field_ref (loc, linner,
4245                                                          unsigned_type,
4246                                                          nbitsize, nbitpos,
4247                                                          1),
4248                                      mask),
4249                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4250                                      make_bit_field_ref (loc, rinner,
4251                                                          unsigned_type,
4252                                                          nbitsize, nbitpos,
4253                                                          1),
4254                                      mask));
4255
4256   /* Otherwise, we are handling the constant case. See if the constant is too
4257      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
4258      this not only for its own sake, but to avoid having to test for this
4259      error case below.  If we didn't, we might generate wrong code.
4260
4261      For unsigned fields, the constant shifted right by the field length should
4262      be all zero.  For signed fields, the high-order bits should agree with
4263      the sign bit.  */
4264
4265   if (lunsignedp)
4266     {
4267       if (! integer_zerop (const_binop (RSHIFT_EXPR,
4268                                         fold_convert_loc (loc,
4269                                                           unsigned_type, rhs),
4270                                         size_int (lbitsize), 0)))
4271         {
4272           warning (0, "comparison is always %d due to width of bit-field",
4273                    code == NE_EXPR);
4274           return constant_boolean_node (code == NE_EXPR, compare_type);
4275         }
4276     }
4277   else
4278     {
4279       tree tem = const_binop (RSHIFT_EXPR,
4280                               fold_convert_loc (loc, signed_type, rhs),
4281                               size_int (lbitsize - 1), 0);
4282       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
4283         {
4284           warning (0, "comparison is always %d due to width of bit-field",
4285                    code == NE_EXPR);
4286           return constant_boolean_node (code == NE_EXPR, compare_type);
4287         }
4288     }
4289
4290   /* Single-bit compares should always be against zero.  */
4291   if (lbitsize == 1 && ! integer_zerop (rhs))
4292     {
4293       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
4294       rhs = build_int_cst (type, 0);
4295     }
4296
4297   /* Make a new bitfield reference, shift the constant over the
4298      appropriate number of bits and mask it with the computed mask
4299      (in case this was a signed field).  If we changed it, make a new one.  */
4300   lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1);
4301   if (lvolatilep)
4302     {
4303       TREE_SIDE_EFFECTS (lhs) = 1;
4304       TREE_THIS_VOLATILE (lhs) = 1;
4305     }
4306
4307   rhs = const_binop (BIT_AND_EXPR,
4308                      const_binop (LSHIFT_EXPR,
4309                                   fold_convert_loc (loc, unsigned_type, rhs),
4310                                   size_int (lbitpos), 0),
4311                      mask, 0);
4312
4313   lhs = build2 (code, compare_type,
4314                 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
4315                 rhs);
4316   SET_EXPR_LOCATION (lhs, loc);
4317   return lhs;
4318 }
4319 \f
4320 /* Subroutine for fold_truthop: decode a field reference.
4321
4322    If EXP is a comparison reference, we return the innermost reference.
4323
4324    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
4325    set to the starting bit number.
4326
4327    If the innermost field can be completely contained in a mode-sized
4328    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
4329
4330    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
4331    otherwise it is not changed.
4332
4333    *PUNSIGNEDP is set to the signedness of the field.
4334
4335    *PMASK is set to the mask used.  This is either contained in a
4336    BIT_AND_EXPR or derived from the width of the field.
4337
4338    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
4339
4340    Return 0 if this is not a component reference or is one that we can't
4341    do anything with.  */
4342
4343 static tree
4344 decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
4345                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
4346                         int *punsignedp, int *pvolatilep,
4347                         tree *pmask, tree *pand_mask)
4348 {
4349   tree outer_type = 0;
4350   tree and_mask = 0;
4351   tree mask, inner, offset;
4352   tree unsigned_type;
4353   unsigned int precision;
4354
4355   /* All the optimizations using this function assume integer fields.
4356      There are problems with FP fields since the type_for_size call
4357      below can fail for, e.g., XFmode.  */
4358   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
4359     return 0;
4360
4361   /* We are interested in the bare arrangement of bits, so strip everything
4362      that doesn't affect the machine mode.  However, record the type of the
4363      outermost expression if it may matter below.  */
4364   if (CONVERT_EXPR_P (exp)
4365       || TREE_CODE (exp) == NON_LVALUE_EXPR)
4366     outer_type = TREE_TYPE (exp);
4367   STRIP_NOPS (exp);
4368
4369   if (TREE_CODE (exp) == BIT_AND_EXPR)
4370     {
4371       and_mask = TREE_OPERAND (exp, 1);
4372       exp = TREE_OPERAND (exp, 0);
4373       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
4374       if (TREE_CODE (and_mask) != INTEGER_CST)
4375         return 0;
4376     }
4377
4378   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
4379                                punsignedp, pvolatilep, false);
4380   if ((inner == exp && and_mask == 0)
4381       || *pbitsize < 0 || offset != 0
4382       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
4383     return 0;
4384
4385   /* If the number of bits in the reference is the same as the bitsize of
4386      the outer type, then the outer type gives the signedness. Otherwise
4387      (in case of a small bitfield) the signedness is unchanged.  */
4388   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
4389     *punsignedp = TYPE_UNSIGNED (outer_type);
4390
4391   /* Compute the mask to access the bitfield.  */
4392   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
4393   precision = TYPE_PRECISION (unsigned_type);
4394
4395   mask = build_int_cst_type (unsigned_type, -1);
4396
4397   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4398   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4399
4400   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
4401   if (and_mask != 0)
4402     mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4403                         fold_convert_loc (loc, unsigned_type, and_mask), mask);
4404
4405   *pmask = mask;
4406   *pand_mask = and_mask;
4407   return inner;
4408 }
4409
4410 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
4411    bit positions.  */
4412
4413 static int
4414 all_ones_mask_p (const_tree mask, int size)
4415 {
4416   tree type = TREE_TYPE (mask);
4417   unsigned int precision = TYPE_PRECISION (type);
4418   tree tmask;
4419
4420   tmask = build_int_cst_type (signed_type_for (type), -1);
4421
4422   return
4423     tree_int_cst_equal (mask,
4424                         const_binop (RSHIFT_EXPR,
4425                                      const_binop (LSHIFT_EXPR, tmask,
4426                                                   size_int (precision - size),
4427                                                   0),
4428                                      size_int (precision - size), 0));
4429 }
4430
4431 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
4432    represents the sign bit of EXP's type.  If EXP represents a sign
4433    or zero extension, also test VAL against the unextended type.
4434    The return value is the (sub)expression whose sign bit is VAL,
4435    or NULL_TREE otherwise.  */
4436
4437 static tree
4438 sign_bit_p (tree exp, const_tree val)
4439 {
4440   unsigned HOST_WIDE_INT mask_lo, lo;
4441   HOST_WIDE_INT mask_hi, hi;
4442   int width;
4443   tree t;
4444
4445   /* Tree EXP must have an integral type.  */
4446   t = TREE_TYPE (exp);
4447   if (! INTEGRAL_TYPE_P (t))
4448     return NULL_TREE;
4449
4450   /* Tree VAL must be an integer constant.  */
4451   if (TREE_CODE (val) != INTEGER_CST
4452       || TREE_OVERFLOW (val))
4453     return NULL_TREE;
4454
4455   width = TYPE_PRECISION (t);
4456   if (width > HOST_BITS_PER_WIDE_INT)
4457     {
4458       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
4459       lo = 0;
4460
4461       mask_hi = ((unsigned HOST_WIDE_INT) -1
4462                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
4463       mask_lo = -1;
4464     }
4465   else
4466     {
4467       hi = 0;
4468       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
4469
4470       mask_hi = 0;
4471       mask_lo = ((unsigned HOST_WIDE_INT) -1
4472                  >> (HOST_BITS_PER_WIDE_INT - width));
4473     }
4474
4475   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
4476      treat VAL as if it were unsigned.  */
4477   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
4478       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
4479     return exp;
4480
4481   /* Handle extension from a narrower type.  */
4482   if (TREE_CODE (exp) == NOP_EXPR
4483       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4484     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4485
4486   return NULL_TREE;
4487 }
4488
4489 /* Subroutine for fold_truthop: determine if an operand is simple enough
4490    to be evaluated unconditionally.  */
4491
4492 static int
4493 simple_operand_p (const_tree exp)
4494 {
4495   /* Strip any conversions that don't change the machine mode.  */
4496   STRIP_NOPS (exp);
4497
4498   return (CONSTANT_CLASS_P (exp)
4499           || TREE_CODE (exp) == SSA_NAME
4500           || (DECL_P (exp)
4501               && ! TREE_ADDRESSABLE (exp)
4502               && ! TREE_THIS_VOLATILE (exp)
4503               && ! DECL_NONLOCAL (exp)
4504               /* Don't regard global variables as simple.  They may be
4505                  allocated in ways unknown to the compiler (shared memory,
4506                  #pragma weak, etc).  */
4507               && ! TREE_PUBLIC (exp)
4508               && ! DECL_EXTERNAL (exp)
4509               /* Loading a static variable is unduly expensive, but global
4510                  registers aren't expensive.  */
4511               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4512 }
4513 \f
4514 /* The following functions are subroutines to fold_range_test and allow it to
4515    try to change a logical combination of comparisons into a range test.
4516
4517    For example, both
4518         X == 2 || X == 3 || X == 4 || X == 5
4519    and
4520         X >= 2 && X <= 5
4521    are converted to
4522         (unsigned) (X - 2) <= 3
4523
4524    We describe each set of comparisons as being either inside or outside
4525    a range, using a variable named like IN_P, and then describe the
4526    range with a lower and upper bound.  If one of the bounds is omitted,
4527    it represents either the highest or lowest value of the type.
4528
4529    In the comments below, we represent a range by two numbers in brackets
4530    preceded by a "+" to designate being inside that range, or a "-" to
4531    designate being outside that range, so the condition can be inverted by
4532    flipping the prefix.  An omitted bound is represented by a "-".  For
4533    example, "- [-, 10]" means being outside the range starting at the lowest
4534    possible value and ending at 10, in other words, being greater than 10.
4535    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4536    always false.
4537
4538    We set up things so that the missing bounds are handled in a consistent
4539    manner so neither a missing bound nor "true" and "false" need to be
4540    handled using a special case.  */
4541
4542 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4543    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4544    and UPPER1_P are nonzero if the respective argument is an upper bound
4545    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4546    must be specified for a comparison.  ARG1 will be converted to ARG0's
4547    type if both are specified.  */
4548
4549 static tree
4550 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4551              tree arg1, int upper1_p)
4552 {
4553   tree tem;
4554   int result;
4555   int sgn0, sgn1;
4556
4557   /* If neither arg represents infinity, do the normal operation.
4558      Else, if not a comparison, return infinity.  Else handle the special
4559      comparison rules. Note that most of the cases below won't occur, but
4560      are handled for consistency.  */
4561
4562   if (arg0 != 0 && arg1 != 0)
4563     {
4564       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4565                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4566       STRIP_NOPS (tem);
4567       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4568     }
4569
4570   if (TREE_CODE_CLASS (code) != tcc_comparison)
4571     return 0;
4572
4573   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4574      for neither.  In real maths, we cannot assume open ended ranges are
4575      the same. But, this is computer arithmetic, where numbers are finite.
4576      We can therefore make the transformation of any unbounded range with
4577      the value Z, Z being greater than any representable number. This permits
4578      us to treat unbounded ranges as equal.  */
4579   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4580   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4581   switch (code)
4582     {
4583     case EQ_EXPR:
4584       result = sgn0 == sgn1;
4585       break;
4586     case NE_EXPR:
4587       result = sgn0 != sgn1;
4588       break;
4589     case LT_EXPR:
4590       result = sgn0 < sgn1;
4591       break;
4592     case LE_EXPR:
4593       result = sgn0 <= sgn1;
4594       break;
4595     case GT_EXPR:
4596       result = sgn0 > sgn1;
4597       break;
4598     case GE_EXPR:
4599       result = sgn0 >= sgn1;
4600       break;
4601     default:
4602       gcc_unreachable ();
4603     }
4604
4605   return constant_boolean_node (result, type);
4606 }
4607 \f
4608 /* Given EXP, a logical expression, set the range it is testing into
4609    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4610    actually being tested.  *PLOW and *PHIGH will be made of the same
4611    type as the returned expression.  If EXP is not a comparison, we
4612    will most likely not be returning a useful value and range.  Set
4613    *STRICT_OVERFLOW_P to true if the return value is only valid
4614    because signed overflow is undefined; otherwise, do not change
4615    *STRICT_OVERFLOW_P.  */
4616
4617 tree
4618 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4619             bool *strict_overflow_p)
4620 {
4621   enum tree_code code;
4622   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4623   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4624   int in_p, n_in_p;
4625   tree low, high, n_low, n_high;
4626   location_t loc = EXPR_LOCATION (exp);
4627
4628   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4629      and see if we can refine the range.  Some of the cases below may not
4630      happen, but it doesn't seem worth worrying about this.  We "continue"
4631      the outer loop when we've changed something; otherwise we "break"
4632      the switch, which will "break" the while.  */
4633
4634   in_p = 0;
4635   low = high = build_int_cst (TREE_TYPE (exp), 0);
4636
4637   while (1)
4638     {
4639       code = TREE_CODE (exp);
4640       exp_type = TREE_TYPE (exp);
4641
4642       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4643         {
4644           if (TREE_OPERAND_LENGTH (exp) > 0)
4645             arg0 = TREE_OPERAND (exp, 0);
4646           if (TREE_CODE_CLASS (code) == tcc_comparison
4647               || TREE_CODE_CLASS (code) == tcc_unary
4648               || TREE_CODE_CLASS (code) == tcc_binary)
4649             arg0_type = TREE_TYPE (arg0);
4650           if (TREE_CODE_CLASS (code) == tcc_binary
4651               || TREE_CODE_CLASS (code) == tcc_comparison
4652               || (TREE_CODE_CLASS (code) == tcc_expression
4653                   && TREE_OPERAND_LENGTH (exp) > 1))
4654             arg1 = TREE_OPERAND (exp, 1);
4655         }
4656
4657       switch (code)
4658         {
4659         case TRUTH_NOT_EXPR:
4660           in_p = ! in_p, exp = arg0;
4661           continue;
4662
4663         case EQ_EXPR: case NE_EXPR:
4664         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4665           /* We can only do something if the range is testing for zero
4666              and if the second operand is an integer constant.  Note that
4667              saying something is "in" the range we make is done by
4668              complementing IN_P since it will set in the initial case of
4669              being not equal to zero; "out" is leaving it alone.  */
4670           if (low == 0 || high == 0
4671               || ! integer_zerop (low) || ! integer_zerop (high)
4672               || TREE_CODE (arg1) != INTEGER_CST)
4673             break;
4674
4675           switch (code)
4676             {
4677             case NE_EXPR:  /* - [c, c]  */
4678               low = high = arg1;
4679               break;
4680             case EQ_EXPR:  /* + [c, c]  */
4681               in_p = ! in_p, low = high = arg1;
4682               break;
4683             case GT_EXPR:  /* - [-, c] */
4684               low = 0, high = arg1;
4685               break;
4686             case GE_EXPR:  /* + [c, -] */
4687               in_p = ! in_p, low = arg1, high = 0;
4688               break;
4689             case LT_EXPR:  /* - [c, -] */
4690               low = arg1, high = 0;
4691               break;
4692             case LE_EXPR:  /* + [-, c] */
4693               in_p = ! in_p, low = 0, high = arg1;
4694               break;
4695             default:
4696               gcc_unreachable ();
4697             }
4698
4699           /* If this is an unsigned comparison, we also know that EXP is
4700              greater than or equal to zero.  We base the range tests we make
4701              on that fact, so we record it here so we can parse existing
4702              range tests.  We test arg0_type since often the return type
4703              of, e.g. EQ_EXPR, is boolean.  */
4704           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4705             {
4706               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4707                                   in_p, low, high, 1,
4708                                   build_int_cst (arg0_type, 0),
4709                                   NULL_TREE))
4710                 break;
4711
4712               in_p = n_in_p, low = n_low, high = n_high;
4713
4714               /* If the high bound is missing, but we have a nonzero low
4715                  bound, reverse the range so it goes from zero to the low bound
4716                  minus 1.  */
4717               if (high == 0 && low && ! integer_zerop (low))
4718                 {
4719                   in_p = ! in_p;
4720                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4721                                       integer_one_node, 0);
4722                   low = build_int_cst (arg0_type, 0);
4723                 }
4724             }
4725
4726           exp = arg0;
4727           continue;
4728
4729         case NEGATE_EXPR:
4730           /* (-x) IN [a,b] -> x in [-b, -a]  */
4731           n_low = range_binop (MINUS_EXPR, exp_type,
4732                                build_int_cst (exp_type, 0),
4733                                0, high, 1);
4734           n_high = range_binop (MINUS_EXPR, exp_type,
4735                                 build_int_cst (exp_type, 0),
4736                                 0, low, 0);
4737           low = n_low, high = n_high;
4738           exp = arg0;
4739           continue;
4740
4741         case BIT_NOT_EXPR:
4742           /* ~ X -> -X - 1  */
4743           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4744                         build_int_cst (exp_type, 1));
4745           SET_EXPR_LOCATION (exp, loc);
4746           continue;
4747
4748         case PLUS_EXPR:  case MINUS_EXPR:
4749           if (TREE_CODE (arg1) != INTEGER_CST)
4750             break;
4751
4752           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4753              move a constant to the other side.  */
4754           if (!TYPE_UNSIGNED (arg0_type)
4755               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4756             break;
4757
4758           /* If EXP is signed, any overflow in the computation is undefined,
4759              so we don't worry about it so long as our computations on
4760              the bounds don't overflow.  For unsigned, overflow is defined
4761              and this is exactly the right thing.  */
4762           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4763                                arg0_type, low, 0, arg1, 0);
4764           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4765                                 arg0_type, high, 1, arg1, 0);
4766           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4767               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4768             break;
4769
4770           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4771             *strict_overflow_p = true;
4772
4773           /* Check for an unsigned range which has wrapped around the maximum
4774              value thus making n_high < n_low, and normalize it.  */
4775           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4776             {
4777               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4778                                  integer_one_node, 0);
4779               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4780                                   integer_one_node, 0);
4781
4782               /* If the range is of the form +/- [ x+1, x ], we won't
4783                  be able to normalize it.  But then, it represents the
4784                  whole range or the empty set, so make it
4785                  +/- [ -, - ].  */
4786               if (tree_int_cst_equal (n_low, low)
4787                   && tree_int_cst_equal (n_high, high))
4788                 low = high = 0;
4789               else
4790                 in_p = ! in_p;
4791             }
4792           else
4793             low = n_low, high = n_high;
4794
4795           exp = arg0;
4796           continue;
4797
4798         CASE_CONVERT: case NON_LVALUE_EXPR:
4799           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4800             break;
4801
4802           if (! INTEGRAL_TYPE_P (arg0_type)
4803               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4804               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4805             break;
4806
4807           n_low = low, n_high = high;
4808
4809           if (n_low != 0)
4810             n_low = fold_convert_loc (loc, arg0_type, n_low);
4811
4812           if (n_high != 0)
4813             n_high = fold_convert_loc (loc, arg0_type, n_high);
4814
4815
4816           /* If we're converting arg0 from an unsigned type, to exp,
4817              a signed type,  we will be doing the comparison as unsigned.
4818              The tests above have already verified that LOW and HIGH
4819              are both positive.
4820
4821              So we have to ensure that we will handle large unsigned
4822              values the same way that the current signed bounds treat
4823              negative values.  */
4824
4825           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4826             {
4827               tree high_positive;
4828               tree equiv_type;
4829               /* For fixed-point modes, we need to pass the saturating flag
4830                  as the 2nd parameter.  */
4831               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4832                 equiv_type = lang_hooks.types.type_for_mode
4833                              (TYPE_MODE (arg0_type),
4834                               TYPE_SATURATING (arg0_type));
4835               else
4836                 equiv_type = lang_hooks.types.type_for_mode
4837                              (TYPE_MODE (arg0_type), 1);
4838
4839               /* A range without an upper bound is, naturally, unbounded.
4840                  Since convert would have cropped a very large value, use
4841                  the max value for the destination type.  */
4842               high_positive
4843                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4844                 : TYPE_MAX_VALUE (arg0_type);
4845
4846               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4847                 high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type,
4848                                              fold_convert_loc (loc, arg0_type,
4849                                                                high_positive),
4850                                              build_int_cst (arg0_type, 1));
4851
4852               /* If the low bound is specified, "and" the range with the
4853                  range for which the original unsigned value will be
4854                  positive.  */
4855               if (low != 0)
4856                 {
4857                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4858                                       1, n_low, n_high, 1,
4859                                       fold_convert_loc (loc, arg0_type,
4860                                                         integer_zero_node),
4861                                       high_positive))
4862                     break;
4863
4864                   in_p = (n_in_p == in_p);
4865                 }
4866               else
4867                 {
4868                   /* Otherwise, "or" the range with the range of the input
4869                      that will be interpreted as negative.  */
4870                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4871                                       0, n_low, n_high, 1,
4872                                       fold_convert_loc (loc, arg0_type,
4873                                                         integer_zero_node),
4874                                       high_positive))
4875                     break;
4876
4877                   in_p = (in_p != n_in_p);
4878                 }
4879             }
4880
4881           exp = arg0;
4882           low = n_low, high = n_high;
4883           continue;
4884
4885         default:
4886           break;
4887         }
4888
4889       break;
4890     }
4891
4892   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4893   if (TREE_CODE (exp) == INTEGER_CST)
4894     {
4895       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4896                                                  exp, 0, low, 0))
4897                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4898                                                     exp, 1, high, 1)));
4899       low = high = 0;
4900       exp = 0;
4901     }
4902
4903   *pin_p = in_p, *plow = low, *phigh = high;
4904   return exp;
4905 }
4906 \f
4907 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4908    type, TYPE, return an expression to test if EXP is in (or out of, depending
4909    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4910
4911 tree
4912 build_range_check (location_t loc, tree type, tree exp, int in_p,
4913                    tree low, tree high)
4914 {
4915   tree etype = TREE_TYPE (exp), value;
4916
4917 #ifdef HAVE_canonicalize_funcptr_for_compare
4918   /* Disable this optimization for function pointer expressions
4919      on targets that require function pointer canonicalization.  */
4920   if (HAVE_canonicalize_funcptr_for_compare
4921       && TREE_CODE (etype) == POINTER_TYPE
4922       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4923     return NULL_TREE;
4924 #endif
4925
4926   if (! in_p)
4927     {
4928       value = build_range_check (loc, type, exp, 1, low, high);
4929       if (value != 0)
4930         return invert_truthvalue_loc (loc, value);
4931
4932       return 0;
4933     }
4934
4935   if (low == 0 && high == 0)
4936     return build_int_cst (type, 1);
4937
4938   if (low == 0)
4939     return fold_build2_loc (loc, LE_EXPR, type, exp,
4940                         fold_convert_loc (loc, etype, high));
4941
4942   if (high == 0)
4943     return fold_build2_loc (loc, GE_EXPR, type, exp,
4944                         fold_convert_loc (loc, etype, low));
4945
4946   if (operand_equal_p (low, high, 0))
4947     return fold_build2_loc (loc, EQ_EXPR, type, exp,
4948                         fold_convert_loc (loc, etype, low));
4949
4950   if (integer_zerop (low))
4951     {
4952       if (! TYPE_UNSIGNED (etype))
4953         {
4954           etype = unsigned_type_for (etype);
4955           high = fold_convert_loc (loc, etype, high);
4956           exp = fold_convert_loc (loc, etype, exp);
4957         }
4958       return build_range_check (loc, type, exp, 1, 0, high);
4959     }
4960
4961   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4962   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4963     {
4964       unsigned HOST_WIDE_INT lo;
4965       HOST_WIDE_INT hi;
4966       int prec;
4967
4968       prec = TYPE_PRECISION (etype);
4969       if (prec <= HOST_BITS_PER_WIDE_INT)
4970         {
4971           hi = 0;
4972           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4973         }
4974       else
4975         {
4976           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4977           lo = (unsigned HOST_WIDE_INT) -1;
4978         }
4979
4980       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4981         {
4982           if (TYPE_UNSIGNED (etype))
4983             {
4984               tree signed_etype = signed_type_for (etype);
4985               if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4986                 etype
4987                   = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4988               else
4989                 etype = signed_etype;
4990               exp = fold_convert_loc (loc, etype, exp);
4991             }
4992           return fold_build2_loc (loc, GT_EXPR, type, exp,
4993                               build_int_cst (etype, 0));
4994         }
4995     }
4996
4997   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4998      This requires wrap-around arithmetics for the type of the expression.
4999      First make sure that arithmetics in this type is valid, then make sure
5000      that it wraps around.  */
5001   if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE)
5002     etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
5003                                             TYPE_UNSIGNED (etype));
5004
5005   if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype))
5006     {
5007       tree utype, minv, maxv;
5008
5009       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
5010          for the type in question, as we rely on this here.  */
5011       utype = unsigned_type_for (etype);
5012       maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype));
5013       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
5014                           integer_one_node, 1);
5015       minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype));
5016
5017       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
5018                                       minv, 1, maxv, 1)))
5019         etype = utype;
5020       else
5021         return 0;
5022     }
5023
5024   high = fold_convert_loc (loc, etype, high);
5025   low = fold_convert_loc (loc, etype, low);
5026   exp = fold_convert_loc (loc, etype, exp);
5027
5028   value = const_binop (MINUS_EXPR, high, low, 0);
5029
5030
5031   if (POINTER_TYPE_P (etype))
5032     {
5033       if (value != 0 && !TREE_OVERFLOW (value))
5034         {
5035           low = fold_convert_loc (loc, sizetype, low);
5036           low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
5037           return build_range_check (loc, type,
5038                                     fold_build2_loc (loc, POINTER_PLUS_EXPR,
5039                                                  etype, exp, low),
5040                                     1, build_int_cst (etype, 0), value);
5041         }
5042       return 0;
5043     }
5044
5045   if (value != 0 && !TREE_OVERFLOW (value))
5046     return build_range_check (loc, type,
5047                               fold_build2_loc (loc, MINUS_EXPR, etype, exp, low),
5048                               1, build_int_cst (etype, 0), value);
5049
5050   return 0;
5051 }
5052 \f
5053 /* Return the predecessor of VAL in its type, handling the infinite case.  */
5054
5055 static tree
5056 range_predecessor (tree val)
5057 {
5058   tree type = TREE_TYPE (val);
5059
5060   if (INTEGRAL_TYPE_P (type)
5061       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
5062     return 0;
5063   else
5064     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
5065 }
5066
5067 /* Return the successor of VAL in its type, handling the infinite case.  */
5068
5069 static tree
5070 range_successor (tree val)
5071 {
5072   tree type = TREE_TYPE (val);
5073
5074   if (INTEGRAL_TYPE_P (type)
5075       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
5076     return 0;
5077   else
5078     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
5079 }
5080
5081 /* Given two ranges, see if we can merge them into one.  Return 1 if we
5082    can, 0 if we can't.  Set the output range into the specified parameters.  */
5083
5084 bool
5085 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
5086               tree high0, int in1_p, tree low1, tree high1)
5087 {
5088   int no_overlap;
5089   int subset;
5090   int temp;
5091   tree tem;
5092   int in_p;
5093   tree low, high;
5094   int lowequal = ((low0 == 0 && low1 == 0)
5095                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
5096                                                 low0, 0, low1, 0)));
5097   int highequal = ((high0 == 0 && high1 == 0)
5098                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
5099                                                  high0, 1, high1, 1)));
5100
5101   /* Make range 0 be the range that starts first, or ends last if they
5102      start at the same value.  Swap them if it isn't.  */
5103   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
5104                                  low0, 0, low1, 0))
5105       || (lowequal
5106           && integer_onep (range_binop (GT_EXPR, integer_type_node,
5107                                         high1, 1, high0, 1))))
5108     {
5109       temp = in0_p, in0_p = in1_p, in1_p = temp;
5110       tem = low0, low0 = low1, low1 = tem;
5111       tem = high0, high0 = high1, high1 = tem;
5112     }
5113
5114   /* Now flag two cases, whether the ranges are disjoint or whether the
5115      second range is totally subsumed in the first.  Note that the tests
5116      below are simplified by the ones above.  */
5117   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
5118                                           high0, 1, low1, 0));
5119   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
5120                                       high1, 1, high0, 1));
5121
5122   /* We now have four cases, depending on whether we are including or
5123      excluding the two ranges.  */
5124   if (in0_p && in1_p)
5125     {
5126       /* If they don't overlap, the result is false.  If the second range
5127          is a subset it is the result.  Otherwise, the range is from the start
5128          of the second to the end of the first.  */
5129       if (no_overlap)
5130         in_p = 0, low = high = 0;
5131       else if (subset)
5132         in_p = 1, low = low1, high = high1;
5133       else
5134         in_p = 1, low = low1, high = high0;
5135     }
5136
5137   else if (in0_p && ! in1_p)
5138     {
5139       /* If they don't overlap, the result is the first range.  If they are
5140          equal, the result is false.  If the second range is a subset of the
5141          first, and the ranges begin at the same place, we go from just after
5142          the end of the second range to the end of the first.  If the second
5143          range is not a subset of the first, or if it is a subset and both
5144          ranges end at the same place, the range starts at the start of the
5145          first range and ends just before the second range.
5146          Otherwise, we can't describe this as a single range.  */
5147       if (no_overlap)
5148         in_p = 1, low = low0, high = high0;
5149       else if (lowequal && highequal)
5150         in_p = 0, low = high = 0;
5151       else if (subset && lowequal)
5152         {
5153           low = range_successor (high1);
5154           high = high0;
5155           in_p = 1;
5156           if (low == 0)
5157             {
5158               /* We are in the weird situation where high0 > high1 but
5159                  high1 has no successor.  Punt.  */
5160               return 0;
5161             }
5162         }
5163       else if (! subset || highequal)
5164         {
5165           low = low0;
5166           high = range_predecessor (low1);
5167           in_p = 1;
5168           if (high == 0)
5169             {
5170               /* low0 < low1 but low1 has no predecessor.  Punt.  */
5171               return 0;
5172             }
5173         }
5174       else
5175         return 0;
5176     }
5177
5178   else if (! in0_p && in1_p)
5179     {
5180       /* If they don't overlap, the result is the second range.  If the second
5181          is a subset of the first, the result is false.  Otherwise,
5182          the range starts just after the first range and ends at the
5183          end of the second.  */
5184       if (no_overlap)
5185         in_p = 1, low = low1, high = high1;
5186       else if (subset || highequal)
5187         in_p = 0, low = high = 0;
5188       else
5189         {
5190           low = range_successor (high0);
5191           high = high1;
5192           in_p = 1;
5193           if (low == 0)
5194             {
5195               /* high1 > high0 but high0 has no successor.  Punt.  */
5196               return 0;
5197             }
5198         }
5199     }
5200
5201   else
5202     {
5203       /* The case where we are excluding both ranges.  Here the complex case
5204          is if they don't overlap.  In that case, the only time we have a
5205          range is if they are adjacent.  If the second is a subset of the
5206          first, the result is the first.  Otherwise, the range to exclude
5207          starts at the beginning of the first range and ends at the end of the
5208          second.  */
5209       if (no_overlap)
5210         {
5211           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
5212                                          range_successor (high0),
5213                                          1, low1, 0)))
5214             in_p = 0, low = low0, high = high1;
5215           else
5216             {
5217               /* Canonicalize - [min, x] into - [-, x].  */
5218               if (low0 && TREE_CODE (low0) == INTEGER_CST)
5219                 switch (TREE_CODE (TREE_TYPE (low0)))
5220                   {
5221                   case ENUMERAL_TYPE:
5222                     if (TYPE_PRECISION (TREE_TYPE (low0))
5223                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
5224                       break;
5225                     /* FALLTHROUGH */
5226                   case INTEGER_TYPE:
5227                     if (tree_int_cst_equal (low0,
5228                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
5229                       low0 = 0;
5230                     break;
5231                   case POINTER_TYPE:
5232                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
5233                         && integer_zerop (low0))
5234                       low0 = 0;
5235                     break;
5236                   default:
5237                     break;
5238                   }
5239
5240               /* Canonicalize - [x, max] into - [x, -].  */
5241               if (high1 && TREE_CODE (high1) == INTEGER_CST)
5242                 switch (TREE_CODE (TREE_TYPE (high1)))
5243                   {
5244                   case ENUMERAL_TYPE:
5245                     if (TYPE_PRECISION (TREE_TYPE (high1))
5246                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
5247                       break;
5248                     /* FALLTHROUGH */
5249                   case INTEGER_TYPE:
5250                     if (tree_int_cst_equal (high1,
5251                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
5252                       high1 = 0;
5253                     break;
5254                   case POINTER_TYPE:
5255                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
5256                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
5257                                                        high1, 1,
5258                                                        integer_one_node, 1)))
5259                       high1 = 0;
5260                     break;
5261                   default:
5262                     break;
5263                   }
5264
5265               /* The ranges might be also adjacent between the maximum and
5266                  minimum values of the given type.  For
5267                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
5268                  return + [x + 1, y - 1].  */
5269               if (low0 == 0 && high1 == 0)
5270                 {
5271                   low = range_successor (high0);
5272                   high = range_predecessor (low1);
5273                   if (low == 0 || high == 0)
5274                     return 0;
5275
5276                   in_p = 1;
5277                 }
5278               else
5279                 return 0;
5280             }
5281         }
5282       else if (subset)
5283         in_p = 0, low = low0, high = high0;
5284       else
5285         in_p = 0, low = low0, high = high1;
5286     }
5287
5288   *pin_p = in_p, *plow = low, *phigh = high;
5289   return 1;
5290 }
5291 \f
5292
5293 /* Subroutine of fold, looking inside expressions of the form
5294    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
5295    of the COND_EXPR.  This function is being used also to optimize
5296    A op B ? C : A, by reversing the comparison first.
5297
5298    Return a folded expression whose code is not a COND_EXPR
5299    anymore, or NULL_TREE if no folding opportunity is found.  */
5300
5301 static tree
5302 fold_cond_expr_with_comparison (location_t loc, tree type,
5303                                 tree arg0, tree arg1, tree arg2)
5304 {
5305   enum tree_code comp_code = TREE_CODE (arg0);
5306   tree arg00 = TREE_OPERAND (arg0, 0);
5307   tree arg01 = TREE_OPERAND (arg0, 1);
5308   tree arg1_type = TREE_TYPE (arg1);
5309   tree tem;
5310
5311   STRIP_NOPS (arg1);
5312   STRIP_NOPS (arg2);
5313
5314   /* If we have A op 0 ? A : -A, consider applying the following
5315      transformations:
5316
5317      A == 0? A : -A    same as -A
5318      A != 0? A : -A    same as A
5319      A >= 0? A : -A    same as abs (A)
5320      A > 0?  A : -A    same as abs (A)
5321      A <= 0? A : -A    same as -abs (A)
5322      A < 0?  A : -A    same as -abs (A)
5323
5324      None of these transformations work for modes with signed
5325      zeros.  If A is +/-0, the first two transformations will
5326      change the sign of the result (from +0 to -0, or vice
5327      versa).  The last four will fix the sign of the result,
5328      even though the original expressions could be positive or
5329      negative, depending on the sign of A.
5330
5331      Note that all these transformations are correct if A is
5332      NaN, since the two alternatives (A and -A) are also NaNs.  */
5333   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5334       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
5335           ? real_zerop (arg01)
5336           : integer_zerop (arg01))
5337       && ((TREE_CODE (arg2) == NEGATE_EXPR
5338            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
5339              /* In the case that A is of the form X-Y, '-A' (arg2) may
5340                 have already been folded to Y-X, check for that. */
5341           || (TREE_CODE (arg1) == MINUS_EXPR
5342               && TREE_CODE (arg2) == MINUS_EXPR
5343               && operand_equal_p (TREE_OPERAND (arg1, 0),
5344                                   TREE_OPERAND (arg2, 1), 0)
5345               && operand_equal_p (TREE_OPERAND (arg1, 1),
5346                                   TREE_OPERAND (arg2, 0), 0))))
5347     switch (comp_code)
5348       {
5349       case EQ_EXPR:
5350       case UNEQ_EXPR:
5351         tem = fold_convert_loc (loc, arg1_type, arg1);
5352         return pedantic_non_lvalue_loc (loc,
5353                                     fold_convert_loc (loc, type,
5354                                                   negate_expr (tem)));
5355       case NE_EXPR:
5356       case LTGT_EXPR:
5357         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5358       case UNGE_EXPR:
5359       case UNGT_EXPR:
5360         if (flag_trapping_math)
5361           break;
5362         /* Fall through.  */
5363       case GE_EXPR:
5364       case GT_EXPR:
5365         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5366           arg1 = fold_convert_loc (loc, signed_type_for
5367                                (TREE_TYPE (arg1)), arg1);
5368         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
5369         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5370       case UNLE_EXPR:
5371       case UNLT_EXPR:
5372         if (flag_trapping_math)
5373           break;
5374       case LE_EXPR:
5375       case LT_EXPR:
5376         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5377           arg1 = fold_convert_loc (loc, signed_type_for
5378                                (TREE_TYPE (arg1)), arg1);
5379         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
5380         return negate_expr (fold_convert_loc (loc, type, tem));
5381       default:
5382         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5383         break;
5384       }
5385
5386   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
5387      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
5388      both transformations are correct when A is NaN: A != 0
5389      is then true, and A == 0 is false.  */
5390
5391   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5392       && integer_zerop (arg01) && integer_zerop (arg2))
5393     {
5394       if (comp_code == NE_EXPR)
5395         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5396       else if (comp_code == EQ_EXPR)
5397         return build_int_cst (type, 0);
5398     }
5399
5400   /* Try some transformations of A op B ? A : B.
5401
5402      A == B? A : B    same as B
5403      A != B? A : B    same as A
5404      A >= B? A : B    same as max (A, B)
5405      A > B?  A : B    same as max (B, A)
5406      A <= B? A : B    same as min (A, B)
5407      A < B?  A : B    same as min (B, A)
5408
5409      As above, these transformations don't work in the presence
5410      of signed zeros.  For example, if A and B are zeros of
5411      opposite sign, the first two transformations will change
5412      the sign of the result.  In the last four, the original
5413      expressions give different results for (A=+0, B=-0) and
5414      (A=-0, B=+0), but the transformed expressions do not.
5415
5416      The first two transformations are correct if either A or B
5417      is a NaN.  In the first transformation, the condition will
5418      be false, and B will indeed be chosen.  In the case of the
5419      second transformation, the condition A != B will be true,
5420      and A will be chosen.
5421
5422      The conversions to max() and min() are not correct if B is
5423      a number and A is not.  The conditions in the original
5424      expressions will be false, so all four give B.  The min()
5425      and max() versions would give a NaN instead.  */
5426   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5427       && operand_equal_for_comparison_p (arg01, arg2, arg00)
5428       /* Avoid these transformations if the COND_EXPR may be used
5429          as an lvalue in the C++ front-end.  PR c++/19199.  */
5430       && (in_gimple_form
5431           || (strcmp (lang_hooks.name, "GNU C++") != 0
5432               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
5433           || ! maybe_lvalue_p (arg1)
5434           || ! maybe_lvalue_p (arg2)))
5435     {
5436       tree comp_op0 = arg00;
5437       tree comp_op1 = arg01;
5438       tree comp_type = TREE_TYPE (comp_op0);
5439
5440       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
5441       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
5442         {
5443           comp_type = type;
5444           comp_op0 = arg1;
5445           comp_op1 = arg2;
5446         }
5447
5448       switch (comp_code)
5449         {
5450         case EQ_EXPR:
5451           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2));
5452         case NE_EXPR:
5453           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5454         case LE_EXPR:
5455         case LT_EXPR:
5456         case UNLE_EXPR:
5457         case UNLT_EXPR:
5458           /* In C++ a ?: expression can be an lvalue, so put the
5459              operand which will be used if they are equal first
5460              so that we can convert this back to the
5461              corresponding COND_EXPR.  */
5462           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5463             {
5464               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5465               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5466               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
5467                     ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1)
5468                     : fold_build2_loc (loc, MIN_EXPR, comp_type,
5469                                    comp_op1, comp_op0);
5470               return pedantic_non_lvalue_loc (loc,
5471                                           fold_convert_loc (loc, type, tem));
5472             }
5473           break;
5474         case GE_EXPR:
5475         case GT_EXPR:
5476         case UNGE_EXPR:
5477         case UNGT_EXPR:
5478           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5479             {
5480               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5481               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5482               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5483                     ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1)
5484                     : fold_build2_loc (loc, MAX_EXPR, comp_type,
5485                                    comp_op1, comp_op0);
5486               return pedantic_non_lvalue_loc (loc,
5487                                           fold_convert_loc (loc, type, tem));
5488             }
5489           break;
5490         case UNEQ_EXPR:
5491           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5492             return pedantic_non_lvalue_loc (loc,
5493                                         fold_convert_loc (loc, type, arg2));
5494           break;
5495         case LTGT_EXPR:
5496           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5497             return pedantic_non_lvalue_loc (loc,
5498                                         fold_convert_loc (loc, type, arg1));
5499           break;
5500         default:
5501           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5502           break;
5503         }
5504     }
5505
5506   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5507      we might still be able to simplify this.  For example,
5508      if C1 is one less or one more than C2, this might have started
5509      out as a MIN or MAX and been transformed by this function.
5510      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5511
5512   if (INTEGRAL_TYPE_P (type)
5513       && TREE_CODE (arg01) == INTEGER_CST
5514       && TREE_CODE (arg2) == INTEGER_CST)
5515     switch (comp_code)
5516       {
5517       case EQ_EXPR:
5518         if (TREE_CODE (arg1) == INTEGER_CST)
5519           break;
5520         /* We can replace A with C1 in this case.  */
5521         arg1 = fold_convert_loc (loc, type, arg01);
5522         return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2);
5523
5524       case LT_EXPR:
5525         /* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for
5526            MIN_EXPR, to preserve the signedness of the comparison.  */
5527         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5528                                OEP_ONLY_CONST)
5529             && operand_equal_p (arg01,
5530                                 const_binop (PLUS_EXPR, arg2,
5531                                              build_int_cst (type, 1), 0),
5532                                 OEP_ONLY_CONST))
5533           {
5534             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5535                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5536                                                      arg2));
5537             return pedantic_non_lvalue_loc (loc, 
5538                                             fold_convert_loc (loc, type, tem));
5539           }
5540         break;
5541
5542       case LE_EXPR:
5543         /* If C1 is C2 - 1, this is min(A, C2), with the same care
5544            as above.  */
5545         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5546                                OEP_ONLY_CONST)
5547             && operand_equal_p (arg01,
5548                                 const_binop (MINUS_EXPR, arg2,
5549                                              build_int_cst (type, 1), 0),
5550                                 OEP_ONLY_CONST))
5551           {
5552             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5553                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5554                                                      arg2));
5555             return pedantic_non_lvalue_loc (loc,
5556                                             fold_convert_loc (loc, type, tem));
5557           }
5558         break;
5559
5560       case GT_EXPR:
5561         /* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
5562            MAX_EXPR, to preserve the signedness of the comparison.  */
5563         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5564                                OEP_ONLY_CONST)
5565             && operand_equal_p (arg01,
5566                                 const_binop (MINUS_EXPR, arg2,
5567                                              build_int_cst (type, 1), 0),
5568                                 OEP_ONLY_CONST))
5569           {
5570             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5571                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5572                                                      arg2));
5573             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5574           }
5575         break;
5576
5577       case GE_EXPR:
5578         /* If C1 is C2 + 1, this is max(A, C2), with the same care as above.  */
5579         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5580                                OEP_ONLY_CONST)
5581             && operand_equal_p (arg01,
5582                                 const_binop (PLUS_EXPR, arg2,
5583                                              build_int_cst (type, 1), 0),
5584                                 OEP_ONLY_CONST))
5585           {
5586             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5587                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5588                                                      arg2));
5589             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5590           }
5591         break;
5592       case NE_EXPR:
5593         break;
5594       default:
5595         gcc_unreachable ();
5596       }
5597
5598   return NULL_TREE;
5599 }
5600
5601
5602 \f
5603 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5604 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
5605   (BRANCH_COST (optimize_function_for_speed_p (cfun), \
5606                 false) >= 2)
5607 #endif
5608
5609 /* EXP is some logical combination of boolean tests.  See if we can
5610    merge it into some range test.  Return the new tree if so.  */
5611
5612 static tree
5613 fold_range_test (location_t loc, enum tree_code code, tree type,
5614                  tree op0, tree op1)
5615 {
5616   int or_op = (code == TRUTH_ORIF_EXPR
5617                || code == TRUTH_OR_EXPR);
5618   int in0_p, in1_p, in_p;
5619   tree low0, low1, low, high0, high1, high;
5620   bool strict_overflow_p = false;
5621   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5622   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5623   tree tem;
5624   const char * const warnmsg = G_("assuming signed overflow does not occur "
5625                                   "when simplifying range test");
5626
5627   /* If this is an OR operation, invert both sides; we will invert
5628      again at the end.  */
5629   if (or_op)
5630     in0_p = ! in0_p, in1_p = ! in1_p;
5631
5632   /* If both expressions are the same, if we can merge the ranges, and we
5633      can build the range test, return it or it inverted.  If one of the
5634      ranges is always true or always false, consider it to be the same
5635      expression as the other.  */
5636   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5637       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5638                        in1_p, low1, high1)
5639       && 0 != (tem = (build_range_check (UNKNOWN_LOCATION, type,
5640                                          lhs != 0 ? lhs
5641                                          : rhs != 0 ? rhs : integer_zero_node,
5642                                          in_p, low, high))))
5643     {
5644       if (strict_overflow_p)
5645         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5646       return or_op ? invert_truthvalue_loc (loc, tem) : tem;
5647     }
5648
5649   /* On machines where the branch cost is expensive, if this is a
5650      short-circuited branch and the underlying object on both sides
5651      is the same, make a non-short-circuit operation.  */
5652   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5653            && lhs != 0 && rhs != 0
5654            && (code == TRUTH_ANDIF_EXPR
5655                || code == TRUTH_ORIF_EXPR)
5656            && operand_equal_p (lhs, rhs, 0))
5657     {
5658       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5659          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5660          which cases we can't do this.  */
5661       if (simple_operand_p (lhs))
5662         {
5663           tem = build2 (code == TRUTH_ANDIF_EXPR
5664                         ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5665                         type, op0, op1);
5666           SET_EXPR_LOCATION (tem, loc);
5667           return tem;
5668         }
5669
5670       else if (lang_hooks.decls.global_bindings_p () == 0
5671                && ! CONTAINS_PLACEHOLDER_P (lhs))
5672         {
5673           tree common = save_expr (lhs);
5674
5675           if (0 != (lhs = build_range_check (loc, type, common,
5676                                              or_op ? ! in0_p : in0_p,
5677                                              low0, high0))
5678               && (0 != (rhs = build_range_check (loc, type, common,
5679                                                  or_op ? ! in1_p : in1_p,
5680                                                  low1, high1))))
5681             {
5682               if (strict_overflow_p)
5683                 fold_overflow_warning (warnmsg,
5684                                        WARN_STRICT_OVERFLOW_COMPARISON);
5685               tem = build2 (code == TRUTH_ANDIF_EXPR
5686                             ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5687                             type, lhs, rhs);
5688               SET_EXPR_LOCATION (tem, loc);
5689               return tem;
5690             }
5691         }
5692     }
5693
5694   return 0;
5695 }
5696 \f
5697 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5698    bit value.  Arrange things so the extra bits will be set to zero if and
5699    only if C is signed-extended to its full width.  If MASK is nonzero,
5700    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5701
5702 static tree
5703 unextend (tree c, int p, int unsignedp, tree mask)
5704 {
5705   tree type = TREE_TYPE (c);
5706   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5707   tree temp;
5708
5709   if (p == modesize || unsignedp)
5710     return c;
5711
5712   /* We work by getting just the sign bit into the low-order bit, then
5713      into the high-order bit, then sign-extend.  We then XOR that value
5714      with C.  */
5715   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5716   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5717
5718   /* We must use a signed type in order to get an arithmetic right shift.
5719      However, we must also avoid introducing accidental overflows, so that
5720      a subsequent call to integer_zerop will work.  Hence we must
5721      do the type conversion here.  At this point, the constant is either
5722      zero or one, and the conversion to a signed type can never overflow.
5723      We could get an overflow if this conversion is done anywhere else.  */
5724   if (TYPE_UNSIGNED (type))
5725     temp = fold_convert (signed_type_for (type), temp);
5726
5727   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5728   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5729   if (mask != 0)
5730     temp = const_binop (BIT_AND_EXPR, temp,
5731                         fold_convert (TREE_TYPE (c), mask),
5732                         0);
5733   /* If necessary, convert the type back to match the type of C.  */
5734   if (TYPE_UNSIGNED (type))
5735     temp = fold_convert (type, temp);
5736
5737   return fold_convert (type,
5738                        const_binop (BIT_XOR_EXPR, c, temp, 0));
5739 }
5740 \f
5741 /* Find ways of folding logical expressions of LHS and RHS:
5742    Try to merge two comparisons to the same innermost item.
5743    Look for range tests like "ch >= '0' && ch <= '9'".
5744    Look for combinations of simple terms on machines with expensive branches
5745    and evaluate the RHS unconditionally.
5746
5747    For example, if we have p->a == 2 && p->b == 4 and we can make an
5748    object large enough to span both A and B, we can do this with a comparison
5749    against the object ANDed with the a mask.
5750
5751    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5752    operations to do this with one comparison.
5753
5754    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5755    function and the one above.
5756
5757    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5758    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5759
5760    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5761    two operands.
5762
5763    We return the simplified tree or 0 if no optimization is possible.  */
5764
5765 static tree
5766 fold_truthop (location_t loc, enum tree_code code, tree truth_type,
5767               tree lhs, tree rhs)
5768 {
5769   /* If this is the "or" of two comparisons, we can do something if
5770      the comparisons are NE_EXPR.  If this is the "and", we can do something
5771      if the comparisons are EQ_EXPR.  I.e.,
5772         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5773
5774      WANTED_CODE is this operation code.  For single bit fields, we can
5775      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5776      comparison for one-bit fields.  */
5777
5778   enum tree_code wanted_code;
5779   enum tree_code lcode, rcode;
5780   tree ll_arg, lr_arg, rl_arg, rr_arg;
5781   tree ll_inner, lr_inner, rl_inner, rr_inner;
5782   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5783   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5784   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5785   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5786   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5787   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5788   enum machine_mode lnmode, rnmode;
5789   tree ll_mask, lr_mask, rl_mask, rr_mask;
5790   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5791   tree l_const, r_const;
5792   tree lntype, rntype, result;
5793   HOST_WIDE_INT first_bit, end_bit;
5794   int volatilep;
5795   tree orig_lhs = lhs, orig_rhs = rhs;
5796   enum tree_code orig_code = code;
5797
5798   /* Start by getting the comparison codes.  Fail if anything is volatile.
5799      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5800      it were surrounded with a NE_EXPR.  */
5801
5802   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5803     return 0;
5804
5805   lcode = TREE_CODE (lhs);
5806   rcode = TREE_CODE (rhs);
5807
5808   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5809     {
5810       lhs = build2 (NE_EXPR, truth_type, lhs,
5811                     build_int_cst (TREE_TYPE (lhs), 0));
5812       lcode = NE_EXPR;
5813     }
5814
5815   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5816     {
5817       rhs = build2 (NE_EXPR, truth_type, rhs,
5818                     build_int_cst (TREE_TYPE (rhs), 0));
5819       rcode = NE_EXPR;
5820     }
5821
5822   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5823       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5824     return 0;
5825
5826   ll_arg = TREE_OPERAND (lhs, 0);
5827   lr_arg = TREE_OPERAND (lhs, 1);
5828   rl_arg = TREE_OPERAND (rhs, 0);
5829   rr_arg = TREE_OPERAND (rhs, 1);
5830
5831   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5832   if (simple_operand_p (ll_arg)
5833       && simple_operand_p (lr_arg))
5834     {
5835       tree result;
5836       if (operand_equal_p (ll_arg, rl_arg, 0)
5837           && operand_equal_p (lr_arg, rr_arg, 0))
5838         {
5839           result = combine_comparisons (loc, code, lcode, rcode,
5840                                         truth_type, ll_arg, lr_arg);
5841           if (result)
5842             return result;
5843         }
5844       else if (operand_equal_p (ll_arg, rr_arg, 0)
5845                && operand_equal_p (lr_arg, rl_arg, 0))
5846         {
5847           result = combine_comparisons (loc, code, lcode,
5848                                         swap_tree_comparison (rcode),
5849                                         truth_type, ll_arg, lr_arg);
5850           if (result)
5851             return result;
5852         }
5853     }
5854
5855   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5856           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5857
5858   /* If the RHS can be evaluated unconditionally and its operands are
5859      simple, it wins to evaluate the RHS unconditionally on machines
5860      with expensive branches.  In this case, this isn't a comparison
5861      that can be merged.  Avoid doing this if the RHS is a floating-point
5862      comparison since those can trap.  */
5863
5864   if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5865                    false) >= 2
5866       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5867       && simple_operand_p (rl_arg)
5868       && simple_operand_p (rr_arg))
5869     {
5870       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5871       if (code == TRUTH_OR_EXPR
5872           && lcode == NE_EXPR && integer_zerop (lr_arg)
5873           && rcode == NE_EXPR && integer_zerop (rr_arg)
5874           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5875           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5876         {
5877           result = build2 (NE_EXPR, truth_type,
5878                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5879                                    ll_arg, rl_arg),
5880                            build_int_cst (TREE_TYPE (ll_arg), 0));
5881           goto fold_truthop_exit;
5882         }
5883
5884       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5885       if (code == TRUTH_AND_EXPR
5886           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5887           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5888           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5889           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5890         {
5891           result = build2 (EQ_EXPR, truth_type,
5892                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5893                                    ll_arg, rl_arg),
5894                            build_int_cst (TREE_TYPE (ll_arg), 0));
5895           goto fold_truthop_exit;
5896         }
5897
5898       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5899         {
5900           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5901             {
5902               result = build2 (code, truth_type, lhs, rhs);
5903               goto fold_truthop_exit;
5904             }
5905           return NULL_TREE;
5906         }
5907     }
5908
5909   /* See if the comparisons can be merged.  Then get all the parameters for
5910      each side.  */
5911
5912   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5913       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5914     return 0;
5915
5916   volatilep = 0;
5917   ll_inner = decode_field_reference (loc, ll_arg,
5918                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5919                                      &ll_unsignedp, &volatilep, &ll_mask,
5920                                      &ll_and_mask);
5921   lr_inner = decode_field_reference (loc, lr_arg,
5922                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5923                                      &lr_unsignedp, &volatilep, &lr_mask,
5924                                      &lr_and_mask);
5925   rl_inner = decode_field_reference (loc, rl_arg,
5926                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5927                                      &rl_unsignedp, &volatilep, &rl_mask,
5928                                      &rl_and_mask);
5929   rr_inner = decode_field_reference (loc, rr_arg,
5930                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5931                                      &rr_unsignedp, &volatilep, &rr_mask,
5932                                      &rr_and_mask);
5933
5934   /* It must be true that the inner operation on the lhs of each
5935      comparison must be the same if we are to be able to do anything.
5936      Then see if we have constants.  If not, the same must be true for
5937      the rhs's.  */
5938   if (volatilep || ll_inner == 0 || rl_inner == 0
5939       || ! operand_equal_p (ll_inner, rl_inner, 0))
5940     return 0;
5941
5942   if (TREE_CODE (lr_arg) == INTEGER_CST
5943       && TREE_CODE (rr_arg) == INTEGER_CST)
5944     l_const = lr_arg, r_const = rr_arg;
5945   else if (lr_inner == 0 || rr_inner == 0
5946            || ! operand_equal_p (lr_inner, rr_inner, 0))
5947     return 0;
5948   else
5949     l_const = r_const = 0;
5950
5951   /* If either comparison code is not correct for our logical operation,
5952      fail.  However, we can convert a one-bit comparison against zero into
5953      the opposite comparison against that bit being set in the field.  */
5954
5955   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5956   if (lcode != wanted_code)
5957     {
5958       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5959         {
5960           /* Make the left operand unsigned, since we are only interested
5961              in the value of one bit.  Otherwise we are doing the wrong
5962              thing below.  */
5963           ll_unsignedp = 1;
5964           l_const = ll_mask;
5965         }
5966       else
5967         return 0;
5968     }
5969
5970   /* This is analogous to the code for l_const above.  */
5971   if (rcode != wanted_code)
5972     {
5973       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5974         {
5975           rl_unsignedp = 1;
5976           r_const = rl_mask;
5977         }
5978       else
5979         return 0;
5980     }
5981
5982   /* See if we can find a mode that contains both fields being compared on
5983      the left.  If we can't, fail.  Otherwise, update all constants and masks
5984      to be relative to a field of that size.  */
5985   first_bit = MIN (ll_bitpos, rl_bitpos);
5986   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5987   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5988                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5989                           volatilep);
5990   if (lnmode == VOIDmode)
5991     return 0;
5992
5993   lnbitsize = GET_MODE_BITSIZE (lnmode);
5994   lnbitpos = first_bit & ~ (lnbitsize - 1);
5995   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5996   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5997
5998   if (BYTES_BIG_ENDIAN)
5999     {
6000       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
6001       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
6002     }
6003
6004   ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask),
6005                          size_int (xll_bitpos), 0);
6006   rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask),
6007                          size_int (xrl_bitpos), 0);
6008
6009   if (l_const)
6010     {
6011       l_const = fold_convert_loc (loc, lntype, l_const);
6012       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
6013       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
6014       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
6015                                         fold_build1_loc (loc, BIT_NOT_EXPR,
6016                                                      lntype, ll_mask),
6017                                         0)))
6018         {
6019           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
6020
6021           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
6022         }
6023     }
6024   if (r_const)
6025     {
6026       r_const = fold_convert_loc (loc, lntype, r_const);
6027       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
6028       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
6029       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
6030                                         fold_build1_loc (loc, BIT_NOT_EXPR,
6031                                                      lntype, rl_mask),
6032                                         0)))
6033         {
6034           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
6035
6036           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
6037         }
6038     }
6039
6040   /* If the right sides are not constant, do the same for it.  Also,
6041      disallow this optimization if a size or signedness mismatch occurs
6042      between the left and right sides.  */
6043   if (l_const == 0)
6044     {
6045       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
6046           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
6047           /* Make sure the two fields on the right
6048              correspond to the left without being swapped.  */
6049           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
6050         return 0;
6051
6052       first_bit = MIN (lr_bitpos, rr_bitpos);
6053       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
6054       rnmode = get_best_mode (end_bit - first_bit, first_bit,
6055                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
6056                               volatilep);
6057       if (rnmode == VOIDmode)
6058         return 0;
6059
6060       rnbitsize = GET_MODE_BITSIZE (rnmode);
6061       rnbitpos = first_bit & ~ (rnbitsize - 1);
6062       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
6063       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
6064
6065       if (BYTES_BIG_ENDIAN)
6066         {
6067           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
6068           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
6069         }
6070
6071       lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
6072                                                             rntype, lr_mask),
6073                              size_int (xlr_bitpos), 0);
6074       rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
6075                                                             rntype, rr_mask),
6076                              size_int (xrr_bitpos), 0);
6077
6078       /* Make a mask that corresponds to both fields being compared.
6079          Do this for both items being compared.  If the operands are the
6080          same size and the bits being compared are in the same position
6081          then we can do this by masking both and comparing the masked
6082          results.  */
6083       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
6084       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
6085       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
6086         {
6087           lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
6088                                     ll_unsignedp || rl_unsignedp);
6089           if (! all_ones_mask_p (ll_mask, lnbitsize))
6090             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
6091
6092           rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
6093                                     lr_unsignedp || rr_unsignedp);
6094           if (! all_ones_mask_p (lr_mask, rnbitsize))
6095             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
6096
6097           result = build2 (wanted_code, truth_type, lhs, rhs);
6098           goto fold_truthop_exit;
6099         }
6100
6101       /* There is still another way we can do something:  If both pairs of
6102          fields being compared are adjacent, we may be able to make a wider
6103          field containing them both.
6104
6105          Note that we still must mask the lhs/rhs expressions.  Furthermore,
6106          the mask must be shifted to account for the shift done by
6107          make_bit_field_ref.  */
6108       if ((ll_bitsize + ll_bitpos == rl_bitpos
6109            && lr_bitsize + lr_bitpos == rr_bitpos)
6110           || (ll_bitpos == rl_bitpos + rl_bitsize
6111               && lr_bitpos == rr_bitpos + rr_bitsize))
6112         {
6113           tree type;
6114
6115           lhs = make_bit_field_ref (loc, ll_inner, lntype,
6116                                     ll_bitsize + rl_bitsize,
6117                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
6118           rhs = make_bit_field_ref (loc, lr_inner, rntype,
6119                                     lr_bitsize + rr_bitsize,
6120                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
6121
6122           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
6123                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
6124           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
6125                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
6126
6127           /* Convert to the smaller type before masking out unwanted bits.  */
6128           type = lntype;
6129           if (lntype != rntype)
6130             {
6131               if (lnbitsize > rnbitsize)
6132                 {
6133                   lhs = fold_convert_loc (loc, rntype, lhs);
6134                   ll_mask = fold_convert_loc (loc, rntype, ll_mask);
6135                   type = rntype;
6136                 }
6137               else if (lnbitsize < rnbitsize)
6138                 {
6139                   rhs = fold_convert_loc (loc, lntype, rhs);
6140                   lr_mask = fold_convert_loc (loc, lntype, lr_mask);
6141                   type = lntype;
6142                 }
6143             }
6144
6145           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
6146             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
6147
6148           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
6149             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
6150
6151           result = build2 (wanted_code, truth_type, lhs, rhs);
6152           goto fold_truthop_exit;
6153         }
6154
6155       return 0;
6156     }
6157
6158   /* Handle the case of comparisons with constants.  If there is something in
6159      common between the masks, those bits of the constants must be the same.
6160      If not, the condition is always false.  Test for this to avoid generating
6161      incorrect code below.  */
6162   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
6163   if (! integer_zerop (result)
6164       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
6165                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
6166     {
6167       if (wanted_code == NE_EXPR)
6168         {
6169           warning (0, "%<or%> of unmatched not-equal tests is always 1");
6170           return constant_boolean_node (true, truth_type);
6171         }
6172       else
6173         {
6174           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
6175           return constant_boolean_node (false, truth_type);
6176         }
6177     }
6178
6179   /* Construct the expression we will return.  First get the component
6180      reference we will make.  Unless the mask is all ones the width of
6181      that field, perform the mask operation.  Then compare with the
6182      merged constant.  */
6183   result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
6184                                ll_unsignedp || rl_unsignedp);
6185
6186   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
6187   if (! all_ones_mask_p (ll_mask, lnbitsize))
6188     {
6189       result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
6190       SET_EXPR_LOCATION (result, loc);
6191     }
6192
6193   result = build2 (wanted_code, truth_type, result,
6194                    const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
6195
6196  fold_truthop_exit:
6197   SET_EXPR_LOCATION (result, loc);
6198   return result;
6199 }
6200 \f
6201 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
6202    constant.  */
6203
6204 static tree
6205 optimize_minmax_comparison (location_t loc, enum tree_code code, tree type,
6206                             tree op0, tree op1)
6207 {
6208   tree arg0 = op0;
6209   enum tree_code op_code;
6210   tree comp_const;
6211   tree minmax_const;
6212   int consts_equal, consts_lt;
6213   tree inner;
6214
6215   STRIP_SIGN_NOPS (arg0);
6216
6217   op_code = TREE_CODE (arg0);
6218   minmax_const = TREE_OPERAND (arg0, 1);
6219   comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1);
6220   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
6221   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
6222   inner = TREE_OPERAND (arg0, 0);
6223
6224   /* If something does not permit us to optimize, return the original tree.  */
6225   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
6226       || TREE_CODE (comp_const) != INTEGER_CST
6227       || TREE_OVERFLOW (comp_const)
6228       || TREE_CODE (minmax_const) != INTEGER_CST
6229       || TREE_OVERFLOW (minmax_const))
6230     return NULL_TREE;
6231
6232   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
6233      and GT_EXPR, doing the rest with recursive calls using logical
6234      simplifications.  */
6235   switch (code)
6236     {
6237     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
6238       {
6239         tree tem
6240           = optimize_minmax_comparison (loc,
6241                                         invert_tree_comparison (code, false),
6242                                         type, op0, op1);
6243         if (tem)
6244           return invert_truthvalue_loc (loc, tem);
6245         return NULL_TREE;
6246       }
6247
6248     case GE_EXPR:
6249       return
6250         fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
6251                      optimize_minmax_comparison
6252                      (loc, EQ_EXPR, type, arg0, comp_const),
6253                      optimize_minmax_comparison
6254                      (loc, GT_EXPR, type, arg0, comp_const));
6255
6256     case EQ_EXPR:
6257       if (op_code == MAX_EXPR && consts_equal)
6258         /* MAX (X, 0) == 0  ->  X <= 0  */
6259         return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const);
6260
6261       else if (op_code == MAX_EXPR && consts_lt)
6262         /* MAX (X, 0) == 5  ->  X == 5   */
6263         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
6264
6265       else if (op_code == MAX_EXPR)
6266         /* MAX (X, 0) == -1  ->  false  */
6267         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6268
6269       else if (consts_equal)
6270         /* MIN (X, 0) == 0  ->  X >= 0  */
6271         return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const);
6272
6273       else if (consts_lt)
6274         /* MIN (X, 0) == 5  ->  false  */
6275         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6276
6277       else
6278         /* MIN (X, 0) == -1  ->  X == -1  */
6279         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
6280
6281     case GT_EXPR:
6282       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
6283         /* MAX (X, 0) > 0  ->  X > 0
6284            MAX (X, 0) > 5  ->  X > 5  */
6285         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
6286
6287       else if (op_code == MAX_EXPR)
6288         /* MAX (X, 0) > -1  ->  true  */
6289         return omit_one_operand_loc (loc, type, integer_one_node, inner);
6290
6291       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
6292         /* MIN (X, 0) > 0  ->  false
6293            MIN (X, 0) > 5  ->  false  */
6294         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6295
6296       else
6297         /* MIN (X, 0) > -1  ->  X > -1  */
6298         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
6299
6300     default:
6301       return NULL_TREE;
6302     }
6303 }
6304 \f
6305 /* T is an integer expression that is being multiplied, divided, or taken a
6306    modulus (CODE says which and what kind of divide or modulus) by a
6307    constant C.  See if we can eliminate that operation by folding it with
6308    other operations already in T.  WIDE_TYPE, if non-null, is a type that
6309    should be used for the computation if wider than our type.
6310
6311    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
6312    (X * 2) + (Y * 4).  We must, however, be assured that either the original
6313    expression would not overflow or that overflow is undefined for the type
6314    in the language in question.
6315
6316    If we return a non-null expression, it is an equivalent form of the
6317    original computation, but need not be in the original type.
6318
6319    We set *STRICT_OVERFLOW_P to true if the return values depends on
6320    signed overflow being undefined.  Otherwise we do not change
6321    *STRICT_OVERFLOW_P.  */
6322
6323 static tree
6324 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
6325                 bool *strict_overflow_p)
6326 {
6327   /* To avoid exponential search depth, refuse to allow recursion past
6328      three levels.  Beyond that (1) it's highly unlikely that we'll find
6329      something interesting and (2) we've probably processed it before
6330      when we built the inner expression.  */
6331
6332   static int depth;
6333   tree ret;
6334
6335   if (depth > 3)
6336     return NULL;
6337
6338   depth++;
6339   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
6340   depth--;
6341
6342   return ret;
6343 }
6344
6345 static tree
6346 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
6347                   bool *strict_overflow_p)
6348 {
6349   tree type = TREE_TYPE (t);
6350   enum tree_code tcode = TREE_CODE (t);
6351   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
6352                                    > GET_MODE_SIZE (TYPE_MODE (type)))
6353                 ? wide_type : type);
6354   tree t1, t2;
6355   int same_p = tcode == code;
6356   tree op0 = NULL_TREE, op1 = NULL_TREE;
6357   bool sub_strict_overflow_p;
6358
6359   /* Don't deal with constants of zero here; they confuse the code below.  */
6360   if (integer_zerop (c))
6361     return NULL_TREE;
6362
6363   if (TREE_CODE_CLASS (tcode) == tcc_unary)
6364     op0 = TREE_OPERAND (t, 0);
6365
6366   if (TREE_CODE_CLASS (tcode) == tcc_binary)
6367     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
6368
6369   /* Note that we need not handle conditional operations here since fold
6370      already handles those cases.  So just do arithmetic here.  */
6371   switch (tcode)
6372     {
6373     case INTEGER_CST:
6374       /* For a constant, we can always simplify if we are a multiply
6375          or (for divide and modulus) if it is a multiple of our constant.  */
6376       if (code == MULT_EXPR
6377           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
6378         return const_binop (code, fold_convert (ctype, t),
6379                             fold_convert (ctype, c), 0);
6380       break;
6381
6382     CASE_CONVERT: case NON_LVALUE_EXPR:
6383       /* If op0 is an expression ...  */
6384       if ((COMPARISON_CLASS_P (op0)
6385            || UNARY_CLASS_P (op0)
6386            || BINARY_CLASS_P (op0)
6387            || VL_EXP_CLASS_P (op0)
6388            || EXPRESSION_CLASS_P (op0))
6389           /* ... and has wrapping overflow, and its type is smaller
6390              than ctype, then we cannot pass through as widening.  */
6391           && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0))
6392                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
6393                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
6394                && (TYPE_PRECISION (ctype)
6395                    > TYPE_PRECISION (TREE_TYPE (op0))))
6396               /* ... or this is a truncation (t is narrower than op0),
6397                  then we cannot pass through this narrowing.  */
6398               || (TYPE_PRECISION (type)
6399                   < TYPE_PRECISION (TREE_TYPE (op0)))
6400               /* ... or signedness changes for division or modulus,
6401                  then we cannot pass through this conversion.  */
6402               || (code != MULT_EXPR
6403                   && (TYPE_UNSIGNED (ctype)
6404                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
6405               /* ... or has undefined overflow while the converted to
6406                  type has not, we cannot do the operation in the inner type
6407                  as that would introduce undefined overflow.  */
6408               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
6409                   && !TYPE_OVERFLOW_UNDEFINED (type))))
6410         break;
6411
6412       /* Pass the constant down and see if we can make a simplification.  If
6413          we can, replace this expression with the inner simplification for
6414          possible later conversion to our or some other type.  */
6415       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
6416           && TREE_CODE (t2) == INTEGER_CST
6417           && !TREE_OVERFLOW (t2)
6418           && (0 != (t1 = extract_muldiv (op0, t2, code,
6419                                          code == MULT_EXPR
6420                                          ? ctype : NULL_TREE,
6421                                          strict_overflow_p))))
6422         return t1;
6423       break;
6424
6425     case ABS_EXPR:
6426       /* If widening the type changes it from signed to unsigned, then we
6427          must avoid building ABS_EXPR itself as unsigned.  */
6428       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
6429         {
6430           tree cstype = (*signed_type_for) (ctype);
6431           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
6432               != 0)
6433             {
6434               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
6435               return fold_convert (ctype, t1);
6436             }
6437           break;
6438         }
6439       /* If the constant is negative, we cannot simplify this.  */
6440       if (tree_int_cst_sgn (c) == -1)
6441         break;
6442       /* FALLTHROUGH */
6443     case NEGATE_EXPR:
6444       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
6445           != 0)
6446         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
6447       break;
6448
6449     case MIN_EXPR:  case MAX_EXPR:
6450       /* If widening the type changes the signedness, then we can't perform
6451          this optimization as that changes the result.  */
6452       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6453         break;
6454
6455       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
6456       sub_strict_overflow_p = false;
6457       if ((t1 = extract_muldiv (op0, c, code, wide_type,
6458                                 &sub_strict_overflow_p)) != 0
6459           && (t2 = extract_muldiv (op1, c, code, wide_type,
6460                                    &sub_strict_overflow_p)) != 0)
6461         {
6462           if (tree_int_cst_sgn (c) < 0)
6463             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
6464           if (sub_strict_overflow_p)
6465             *strict_overflow_p = true;
6466           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6467                               fold_convert (ctype, t2));
6468         }
6469       break;
6470
6471     case LSHIFT_EXPR:  case RSHIFT_EXPR:
6472       /* If the second operand is constant, this is a multiplication
6473          or floor division, by a power of two, so we can treat it that
6474          way unless the multiplier or divisor overflows.  Signed
6475          left-shift overflow is implementation-defined rather than
6476          undefined in C90, so do not convert signed left shift into
6477          multiplication.  */
6478       if (TREE_CODE (op1) == INTEGER_CST
6479           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
6480           /* const_binop may not detect overflow correctly,
6481              so check for it explicitly here.  */
6482           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
6483           && TREE_INT_CST_HIGH (op1) == 0
6484           && 0 != (t1 = fold_convert (ctype,
6485                                       const_binop (LSHIFT_EXPR,
6486                                                    size_one_node,
6487                                                    op1, 0)))
6488           && !TREE_OVERFLOW (t1))
6489         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
6490                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
6491                                        ctype,
6492                                        fold_convert (ctype, op0),
6493                                        t1),
6494                                c, code, wide_type, strict_overflow_p);
6495       break;
6496
6497     case PLUS_EXPR:  case MINUS_EXPR:
6498       /* See if we can eliminate the operation on both sides.  If we can, we
6499          can return a new PLUS or MINUS.  If we can't, the only remaining
6500          cases where we can do anything are if the second operand is a
6501          constant.  */
6502       sub_strict_overflow_p = false;
6503       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
6504       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
6505       if (t1 != 0 && t2 != 0
6506           && (code == MULT_EXPR
6507               /* If not multiplication, we can only do this if both operands
6508                  are divisible by c.  */
6509               || (multiple_of_p (ctype, op0, c)
6510                   && multiple_of_p (ctype, op1, c))))
6511         {
6512           if (sub_strict_overflow_p)
6513             *strict_overflow_p = true;
6514           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6515                               fold_convert (ctype, t2));
6516         }
6517
6518       /* If this was a subtraction, negate OP1 and set it to be an addition.
6519          This simplifies the logic below.  */
6520       if (tcode == MINUS_EXPR)
6521         {
6522           tcode = PLUS_EXPR, op1 = negate_expr (op1);
6523           /* If OP1 was not easily negatable, the constant may be OP0.  */
6524           if (TREE_CODE (op0) == INTEGER_CST)
6525             {
6526               tree tem = op0;
6527               op0 = op1;
6528               op1 = tem;
6529               tem = t1;
6530               t1 = t2;
6531               t2 = tem;
6532             }
6533         }
6534
6535       if (TREE_CODE (op1) != INTEGER_CST)
6536         break;
6537
6538       /* If either OP1 or C are negative, this optimization is not safe for
6539          some of the division and remainder types while for others we need
6540          to change the code.  */
6541       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
6542         {
6543           if (code == CEIL_DIV_EXPR)
6544             code = FLOOR_DIV_EXPR;
6545           else if (code == FLOOR_DIV_EXPR)
6546             code = CEIL_DIV_EXPR;
6547           else if (code != MULT_EXPR
6548                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
6549             break;
6550         }
6551
6552       /* If it's a multiply or a division/modulus operation of a multiple
6553          of our constant, do the operation and verify it doesn't overflow.  */
6554       if (code == MULT_EXPR
6555           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6556         {
6557           op1 = const_binop (code, fold_convert (ctype, op1),
6558                              fold_convert (ctype, c), 0);
6559           /* We allow the constant to overflow with wrapping semantics.  */
6560           if (op1 == 0
6561               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
6562             break;
6563         }
6564       else
6565         break;
6566
6567       /* If we have an unsigned type is not a sizetype, we cannot widen
6568          the operation since it will change the result if the original
6569          computation overflowed.  */
6570       if (TYPE_UNSIGNED (ctype)
6571           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
6572           && ctype != type)
6573         break;
6574
6575       /* If we were able to eliminate our operation from the first side,
6576          apply our operation to the second side and reform the PLUS.  */
6577       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
6578         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
6579
6580       /* The last case is if we are a multiply.  In that case, we can
6581          apply the distributive law to commute the multiply and addition
6582          if the multiplication of the constants doesn't overflow.  */
6583       if (code == MULT_EXPR)
6584         return fold_build2 (tcode, ctype,
6585                             fold_build2 (code, ctype,
6586                                          fold_convert (ctype, op0),
6587                                          fold_convert (ctype, c)),
6588                             op1);
6589
6590       break;
6591
6592     case MULT_EXPR:
6593       /* We have a special case here if we are doing something like
6594          (C * 8) % 4 since we know that's zero.  */
6595       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
6596            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
6597           /* If the multiplication can overflow we cannot optimize this.
6598              ???  Until we can properly mark individual operations as
6599              not overflowing we need to treat sizetype special here as
6600              stor-layout relies on this opimization to make
6601              DECL_FIELD_BIT_OFFSET always a constant.  */
6602           && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
6603               || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
6604                   && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
6605           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
6606           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6607         {
6608           *strict_overflow_p = true;
6609           return omit_one_operand (type, integer_zero_node, op0);
6610         }
6611
6612       /* ... fall through ...  */
6613
6614     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
6615     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
6616       /* If we can extract our operation from the LHS, do so and return a
6617          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
6618          do something only if the second operand is a constant.  */
6619       if (same_p
6620           && (t1 = extract_muldiv (op0, c, code, wide_type,
6621                                    strict_overflow_p)) != 0)
6622         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6623                             fold_convert (ctype, op1));
6624       else if (tcode == MULT_EXPR && code == MULT_EXPR
6625                && (t1 = extract_muldiv (op1, c, code, wide_type,
6626                                         strict_overflow_p)) != 0)
6627         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6628                             fold_convert (ctype, t1));
6629       else if (TREE_CODE (op1) != INTEGER_CST)
6630         return 0;
6631
6632       /* If these are the same operation types, we can associate them
6633          assuming no overflow.  */
6634       if (tcode == code
6635           && 0 != (t1 = int_const_binop (MULT_EXPR,
6636                                          fold_convert (ctype, op1),
6637                                          fold_convert (ctype, c), 1))
6638           && 0 != (t1 = force_fit_type_double (ctype, TREE_INT_CST_LOW (t1),
6639                                                TREE_INT_CST_HIGH (t1),
6640                                                (TYPE_UNSIGNED (ctype)
6641                                                 && tcode != MULT_EXPR) ? -1 : 1,
6642                                                TREE_OVERFLOW (t1)))
6643           && !TREE_OVERFLOW (t1))
6644         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
6645
6646       /* If these operations "cancel" each other, we have the main
6647          optimizations of this pass, which occur when either constant is a
6648          multiple of the other, in which case we replace this with either an
6649          operation or CODE or TCODE.
6650
6651          If we have an unsigned type that is not a sizetype, we cannot do
6652          this since it will change the result if the original computation
6653          overflowed.  */
6654       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
6655            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
6656           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
6657               || (tcode == MULT_EXPR
6658                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
6659                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
6660                   && code != MULT_EXPR)))
6661         {
6662           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6663             {
6664               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6665                 *strict_overflow_p = true;
6666               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6667                                   fold_convert (ctype,
6668                                                 const_binop (TRUNC_DIV_EXPR,
6669                                                              op1, c, 0)));
6670             }
6671           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
6672             {
6673               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6674                 *strict_overflow_p = true;
6675               return fold_build2 (code, ctype, fold_convert (ctype, op0),
6676                                   fold_convert (ctype,
6677                                                 const_binop (TRUNC_DIV_EXPR,
6678                                                              c, op1, 0)));
6679             }
6680         }
6681       break;
6682
6683     default:
6684       break;
6685     }
6686
6687   return 0;
6688 }
6689 \f
6690 /* Return a node which has the indicated constant VALUE (either 0 or
6691    1), and is of the indicated TYPE.  */
6692
6693 tree
6694 constant_boolean_node (int value, tree type)
6695 {
6696   if (type == integer_type_node)
6697     return value ? integer_one_node : integer_zero_node;
6698   else if (type == boolean_type_node)
6699     return value ? boolean_true_node : boolean_false_node;
6700   else
6701     return build_int_cst (type, value);
6702 }
6703
6704
6705 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6706    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6707    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6708    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6709    COND is the first argument to CODE; otherwise (as in the example
6710    given here), it is the second argument.  TYPE is the type of the
6711    original expression.  Return NULL_TREE if no simplification is
6712    possible.  */
6713
6714 static tree
6715 fold_binary_op_with_conditional_arg (location_t loc,
6716                                      enum tree_code code,
6717                                      tree type, tree op0, tree op1,
6718                                      tree cond, tree arg, int cond_first_p)
6719 {
6720   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6721   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6722   tree test, true_value, false_value;
6723   tree lhs = NULL_TREE;
6724   tree rhs = NULL_TREE;
6725
6726   /* This transformation is only worthwhile if we don't have to wrap
6727      arg in a SAVE_EXPR, and the operation can be simplified on at least
6728      one of the branches once its pushed inside the COND_EXPR.  */
6729   if (!TREE_CONSTANT (arg))
6730     return NULL_TREE;
6731
6732   if (TREE_CODE (cond) == COND_EXPR)
6733     {
6734       test = TREE_OPERAND (cond, 0);
6735       true_value = TREE_OPERAND (cond, 1);
6736       false_value = TREE_OPERAND (cond, 2);
6737       /* If this operand throws an expression, then it does not make
6738          sense to try to perform a logical or arithmetic operation
6739          involving it.  */
6740       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6741         lhs = true_value;
6742       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6743         rhs = false_value;
6744     }
6745   else
6746     {
6747       tree testtype = TREE_TYPE (cond);
6748       test = cond;
6749       true_value = constant_boolean_node (true, testtype);
6750       false_value = constant_boolean_node (false, testtype);
6751     }
6752
6753   arg = fold_convert_loc (loc, arg_type, arg);
6754   if (lhs == 0)
6755     {
6756       true_value = fold_convert_loc (loc, cond_type, true_value);
6757       if (cond_first_p)
6758         lhs = fold_build2_loc (loc, code, type, true_value, arg);
6759       else
6760         lhs = fold_build2_loc (loc, code, type, arg, true_value);
6761     }
6762   if (rhs == 0)
6763     {
6764       false_value = fold_convert_loc (loc, cond_type, false_value);
6765       if (cond_first_p)
6766         rhs = fold_build2_loc (loc, code, type, false_value, arg);
6767       else
6768         rhs = fold_build2_loc (loc, code, type, arg, false_value);
6769     }
6770
6771   test = fold_build3_loc (loc, COND_EXPR, type, test, lhs, rhs);
6772   return fold_convert_loc (loc, type, test);
6773 }
6774
6775 \f
6776 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6777
6778    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6779    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6780    ADDEND is the same as X.
6781
6782    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6783    and finite.  The problematic cases are when X is zero, and its mode
6784    has signed zeros.  In the case of rounding towards -infinity,
6785    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6786    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6787
6788 bool
6789 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6790 {
6791   if (!real_zerop (addend))
6792     return false;
6793
6794   /* Don't allow the fold with -fsignaling-nans.  */
6795   if (HONOR_SNANS (TYPE_MODE (type)))
6796     return false;
6797
6798   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6799   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6800     return true;
6801
6802   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6803   if (TREE_CODE (addend) == REAL_CST
6804       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6805     negate = !negate;
6806
6807   /* The mode has signed zeros, and we have to honor their sign.
6808      In this situation, there is only one case we can return true for.
6809      X - 0 is the same as X unless rounding towards -infinity is
6810      supported.  */
6811   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6812 }
6813
6814 /* Subroutine of fold() that checks comparisons of built-in math
6815    functions against real constants.
6816
6817    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6818    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6819    is the type of the result and ARG0 and ARG1 are the operands of the
6820    comparison.  ARG1 must be a TREE_REAL_CST.
6821
6822    The function returns the constant folded tree if a simplification
6823    can be made, and NULL_TREE otherwise.  */
6824
6825 static tree
6826 fold_mathfn_compare (location_t loc,
6827                      enum built_in_function fcode, enum tree_code code,
6828                      tree type, tree arg0, tree arg1)
6829 {
6830   REAL_VALUE_TYPE c;
6831
6832   if (BUILTIN_SQRT_P (fcode))
6833     {
6834       tree arg = CALL_EXPR_ARG (arg0, 0);
6835       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6836
6837       c = TREE_REAL_CST (arg1);
6838       if (REAL_VALUE_NEGATIVE (c))
6839         {
6840           /* sqrt(x) < y is always false, if y is negative.  */
6841           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6842             return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6843
6844           /* sqrt(x) > y is always true, if y is negative and we
6845              don't care about NaNs, i.e. negative values of x.  */
6846           if (code == NE_EXPR || !HONOR_NANS (mode))
6847             return omit_one_operand_loc (loc, type, integer_one_node, arg);
6848
6849           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6850           return fold_build2_loc (loc, GE_EXPR, type, arg,
6851                               build_real (TREE_TYPE (arg), dconst0));
6852         }
6853       else if (code == GT_EXPR || code == GE_EXPR)
6854         {
6855           REAL_VALUE_TYPE c2;
6856
6857           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6858           real_convert (&c2, mode, &c2);
6859
6860           if (REAL_VALUE_ISINF (c2))
6861             {
6862               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6863               if (HONOR_INFINITIES (mode))
6864                 return fold_build2_loc (loc, EQ_EXPR, type, arg,
6865                                     build_real (TREE_TYPE (arg), c2));
6866
6867               /* sqrt(x) > y is always false, when y is very large
6868                  and we don't care about infinities.  */
6869               return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6870             }
6871
6872           /* sqrt(x) > c is the same as x > c*c.  */
6873           return fold_build2_loc (loc, code, type, arg,
6874                               build_real (TREE_TYPE (arg), c2));
6875         }
6876       else if (code == LT_EXPR || code == LE_EXPR)
6877         {
6878           REAL_VALUE_TYPE c2;
6879
6880           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6881           real_convert (&c2, mode, &c2);
6882
6883           if (REAL_VALUE_ISINF (c2))
6884             {
6885               /* sqrt(x) < y is always true, when y is a very large
6886                  value and we don't care about NaNs or Infinities.  */
6887               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6888                 return omit_one_operand_loc (loc, type, integer_one_node, arg);
6889
6890               /* sqrt(x) < y is x != +Inf when y is very large and we
6891                  don't care about NaNs.  */
6892               if (! HONOR_NANS (mode))
6893                 return fold_build2_loc (loc, NE_EXPR, type, arg,
6894                                     build_real (TREE_TYPE (arg), c2));
6895
6896               /* sqrt(x) < y is x >= 0 when y is very large and we
6897                  don't care about Infinities.  */
6898               if (! HONOR_INFINITIES (mode))
6899                 return fold_build2_loc (loc, GE_EXPR, type, arg,
6900                                     build_real (TREE_TYPE (arg), dconst0));
6901
6902               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6903               if (lang_hooks.decls.global_bindings_p () != 0
6904                   || CONTAINS_PLACEHOLDER_P (arg))
6905                 return NULL_TREE;
6906
6907               arg = save_expr (arg);
6908               return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6909                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6910                                                build_real (TREE_TYPE (arg),
6911                                                            dconst0)),
6912                                   fold_build2_loc (loc, NE_EXPR, type, arg,
6913                                                build_real (TREE_TYPE (arg),
6914                                                            c2)));
6915             }
6916
6917           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6918           if (! HONOR_NANS (mode))
6919             return fold_build2_loc (loc, code, type, arg,
6920                                 build_real (TREE_TYPE (arg), c2));
6921
6922           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6923           if (lang_hooks.decls.global_bindings_p () == 0
6924               && ! CONTAINS_PLACEHOLDER_P (arg))
6925             {
6926               arg = save_expr (arg);
6927               return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6928                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6929                                                build_real (TREE_TYPE (arg),
6930                                                            dconst0)),
6931                                   fold_build2_loc (loc, code, type, arg,
6932                                                build_real (TREE_TYPE (arg),
6933                                                            c2)));
6934             }
6935         }
6936     }
6937
6938   return NULL_TREE;
6939 }
6940
6941 /* Subroutine of fold() that optimizes comparisons against Infinities,
6942    either +Inf or -Inf.
6943
6944    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6945    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6946    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6947
6948    The function returns the constant folded tree if a simplification
6949    can be made, and NULL_TREE otherwise.  */
6950
6951 static tree
6952 fold_inf_compare (location_t loc, enum tree_code code, tree type,
6953                   tree arg0, tree arg1)
6954 {
6955   enum machine_mode mode;
6956   REAL_VALUE_TYPE max;
6957   tree temp;
6958   bool neg;
6959
6960   mode = TYPE_MODE (TREE_TYPE (arg0));
6961
6962   /* For negative infinity swap the sense of the comparison.  */
6963   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6964   if (neg)
6965     code = swap_tree_comparison (code);
6966
6967   switch (code)
6968     {
6969     case GT_EXPR:
6970       /* x > +Inf is always false, if with ignore sNANs.  */
6971       if (HONOR_SNANS (mode))
6972         return NULL_TREE;
6973       return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6974
6975     case LE_EXPR:
6976       /* x <= +Inf is always true, if we don't case about NaNs.  */
6977       if (! HONOR_NANS (mode))
6978         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6979
6980       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6981       if (lang_hooks.decls.global_bindings_p () == 0
6982           && ! CONTAINS_PLACEHOLDER_P (arg0))
6983         {
6984           arg0 = save_expr (arg0);
6985           return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0);
6986         }
6987       break;
6988
6989     case EQ_EXPR:
6990     case GE_EXPR:
6991       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6992       real_maxval (&max, neg, mode);
6993       return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6994                           arg0, build_real (TREE_TYPE (arg0), max));
6995
6996     case LT_EXPR:
6997       /* x < +Inf is always equal to x <= DBL_MAX.  */
6998       real_maxval (&max, neg, mode);
6999       return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
7000                           arg0, build_real (TREE_TYPE (arg0), max));
7001
7002     case NE_EXPR:
7003       /* x != +Inf is always equal to !(x > DBL_MAX).  */
7004       real_maxval (&max, neg, mode);
7005       if (! HONOR_NANS (mode))
7006         return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
7007                             arg0, build_real (TREE_TYPE (arg0), max));
7008
7009       temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
7010                           arg0, build_real (TREE_TYPE (arg0), max));
7011       return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp);
7012
7013     default:
7014       break;
7015     }
7016
7017   return NULL_TREE;
7018 }
7019
7020 /* Subroutine of fold() that optimizes comparisons of a division by
7021    a nonzero integer constant against an integer constant, i.e.
7022    X/C1 op C2.
7023
7024    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
7025    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
7026    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
7027
7028    The function returns the constant folded tree if a simplification
7029    can be made, and NULL_TREE otherwise.  */
7030
7031 static tree
7032 fold_div_compare (location_t loc,
7033                   enum tree_code code, tree type, tree arg0, tree arg1)
7034 {
7035   tree prod, tmp, hi, lo;
7036   tree arg00 = TREE_OPERAND (arg0, 0);
7037   tree arg01 = TREE_OPERAND (arg0, 1);
7038   unsigned HOST_WIDE_INT lpart;
7039   HOST_WIDE_INT hpart;
7040   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
7041   bool neg_overflow;
7042   int overflow;
7043
7044   /* We have to do this the hard way to detect unsigned overflow.
7045      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
7046   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
7047                                    TREE_INT_CST_HIGH (arg01),
7048                                    TREE_INT_CST_LOW (arg1),
7049                                    TREE_INT_CST_HIGH (arg1),
7050                                    &lpart, &hpart, unsigned_p);
7051   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
7052                                 -1, overflow);
7053   neg_overflow = false;
7054
7055   if (unsigned_p)
7056     {
7057       tmp = int_const_binop (MINUS_EXPR, arg01,
7058                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7059       lo = prod;
7060
7061       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
7062       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
7063                                        TREE_INT_CST_HIGH (prod),
7064                                        TREE_INT_CST_LOW (tmp),
7065                                        TREE_INT_CST_HIGH (tmp),
7066                                        &lpart, &hpart, unsigned_p);
7067       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
7068                                   -1, overflow | TREE_OVERFLOW (prod));
7069     }
7070   else if (tree_int_cst_sgn (arg01) >= 0)
7071     {
7072       tmp = int_const_binop (MINUS_EXPR, arg01,
7073                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7074       switch (tree_int_cst_sgn (arg1))
7075         {
7076         case -1:
7077           neg_overflow = true;
7078           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
7079           hi = prod;
7080           break;
7081
7082         case  0:
7083           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
7084           hi = tmp;
7085           break;
7086
7087         case  1:
7088           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
7089           lo = prod;
7090           break;
7091
7092         default:
7093           gcc_unreachable ();
7094         }
7095     }
7096   else
7097     {
7098       /* A negative divisor reverses the relational operators.  */
7099       code = swap_tree_comparison (code);
7100
7101       tmp = int_const_binop (PLUS_EXPR, arg01,
7102                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7103       switch (tree_int_cst_sgn (arg1))
7104         {
7105         case -1:
7106           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
7107           lo = prod;
7108           break;
7109
7110         case  0:
7111           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
7112           lo = tmp;
7113           break;
7114
7115         case  1:
7116           neg_overflow = true;
7117           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
7118           hi = prod;
7119           break;
7120
7121         default:
7122           gcc_unreachable ();
7123         }
7124     }
7125
7126   switch (code)
7127     {
7128     case EQ_EXPR:
7129       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
7130         return omit_one_operand_loc (loc, type, integer_zero_node, arg00);
7131       if (TREE_OVERFLOW (hi))
7132         return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
7133       if (TREE_OVERFLOW (lo))
7134         return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
7135       return build_range_check (loc, type, arg00, 1, lo, hi);
7136
7137     case NE_EXPR:
7138       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
7139         return omit_one_operand_loc (loc, type, integer_one_node, arg00);
7140       if (TREE_OVERFLOW (hi))
7141         return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
7142       if (TREE_OVERFLOW (lo))
7143         return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
7144       return build_range_check (loc, type, arg00, 0, lo, hi);
7145
7146     case LT_EXPR:
7147       if (TREE_OVERFLOW (lo))
7148         {
7149           tmp = neg_overflow ? integer_zero_node : integer_one_node;
7150           return omit_one_operand_loc (loc, type, tmp, arg00);
7151         }
7152       return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
7153
7154     case LE_EXPR:
7155       if (TREE_OVERFLOW (hi))
7156         {
7157           tmp = neg_overflow ? integer_zero_node : integer_one_node;
7158           return omit_one_operand_loc (loc, type, tmp, arg00);
7159         }
7160       return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
7161
7162     case GT_EXPR:
7163       if (TREE_OVERFLOW (hi))
7164         {
7165           tmp = neg_overflow ? integer_one_node : integer_zero_node;
7166           return omit_one_operand_loc (loc, type, tmp, arg00);
7167         }
7168       return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
7169
7170     case GE_EXPR:
7171       if (TREE_OVERFLOW (lo))
7172         {
7173           tmp = neg_overflow ? integer_one_node : integer_zero_node;
7174           return omit_one_operand_loc (loc, type, tmp, arg00);
7175         }
7176       return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
7177
7178     default:
7179       break;
7180     }
7181
7182   return NULL_TREE;
7183 }
7184
7185
7186 /* If CODE with arguments ARG0 and ARG1 represents a single bit
7187    equality/inequality test, then return a simplified form of the test
7188    using a sign testing.  Otherwise return NULL.  TYPE is the desired
7189    result type.  */
7190
7191 static tree
7192 fold_single_bit_test_into_sign_test (location_t loc,
7193                                      enum tree_code code, tree arg0, tree arg1,
7194                                      tree result_type)
7195 {
7196   /* If this is testing a single bit, we can optimize the test.  */
7197   if ((code == NE_EXPR || code == EQ_EXPR)
7198       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
7199       && integer_pow2p (TREE_OPERAND (arg0, 1)))
7200     {
7201       /* If we have (A & C) != 0 where C is the sign bit of A, convert
7202          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
7203       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
7204
7205       if (arg00 != NULL_TREE
7206           /* This is only a win if casting to a signed type is cheap,
7207              i.e. when arg00's type is not a partial mode.  */
7208           && TYPE_PRECISION (TREE_TYPE (arg00))
7209              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
7210         {
7211           tree stype = signed_type_for (TREE_TYPE (arg00));
7212           return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
7213                               result_type,
7214                               fold_convert_loc (loc, stype, arg00),
7215                               build_int_cst (stype, 0));
7216         }
7217     }
7218
7219   return NULL_TREE;
7220 }
7221
7222 /* If CODE with arguments ARG0 and ARG1 represents a single bit
7223    equality/inequality test, then return a simplified form of
7224    the test using shifts and logical operations.  Otherwise return
7225    NULL.  TYPE is the desired result type.  */
7226
7227 tree
7228 fold_single_bit_test (location_t loc, enum tree_code code,
7229                       tree arg0, tree arg1, tree result_type)
7230 {
7231   /* If this is testing a single bit, we can optimize the test.  */
7232   if ((code == NE_EXPR || code == EQ_EXPR)
7233       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
7234       && integer_pow2p (TREE_OPERAND (arg0, 1)))
7235     {
7236       tree inner = TREE_OPERAND (arg0, 0);
7237       tree type = TREE_TYPE (arg0);
7238       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
7239       enum machine_mode operand_mode = TYPE_MODE (type);
7240       int ops_unsigned;
7241       tree signed_type, unsigned_type, intermediate_type;
7242       tree tem, one;
7243
7244       /* First, see if we can fold the single bit test into a sign-bit
7245          test.  */
7246       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1,
7247                                                  result_type);
7248       if (tem)
7249         return tem;
7250
7251       /* Otherwise we have (A & C) != 0 where C is a single bit,
7252          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
7253          Similarly for (A & C) == 0.  */
7254
7255       /* If INNER is a right shift of a constant and it plus BITNUM does
7256          not overflow, adjust BITNUM and INNER.  */
7257       if (TREE_CODE (inner) == RSHIFT_EXPR
7258           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
7259           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
7260           && bitnum < TYPE_PRECISION (type)
7261           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
7262                                    bitnum - TYPE_PRECISION (type)))
7263         {
7264           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
7265           inner = TREE_OPERAND (inner, 0);
7266         }
7267
7268       /* If we are going to be able to omit the AND below, we must do our
7269          operations as unsigned.  If we must use the AND, we have a choice.
7270          Normally unsigned is faster, but for some machines signed is.  */
7271 #ifdef LOAD_EXTEND_OP
7272       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 
7273                       && !flag_syntax_only) ? 0 : 1;
7274 #else
7275       ops_unsigned = 1;
7276 #endif
7277
7278       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
7279       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
7280       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
7281       inner = fold_convert_loc (loc, intermediate_type, inner);
7282
7283       if (bitnum != 0)
7284         inner = build2 (RSHIFT_EXPR, intermediate_type,
7285                         inner, size_int (bitnum));
7286
7287       one = build_int_cst (intermediate_type, 1);
7288
7289       if (code == EQ_EXPR)
7290         inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one);
7291
7292       /* Put the AND last so it can combine with more things.  */
7293       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
7294
7295       /* Make sure to return the proper type.  */
7296       inner = fold_convert_loc (loc, result_type, inner);
7297
7298       return inner;
7299     }
7300   return NULL_TREE;
7301 }
7302
7303 /* Check whether we are allowed to reorder operands arg0 and arg1,
7304    such that the evaluation of arg1 occurs before arg0.  */
7305
7306 static bool
7307 reorder_operands_p (const_tree arg0, const_tree arg1)
7308 {
7309   if (! flag_evaluation_order)
7310       return true;
7311   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
7312     return true;
7313   return ! TREE_SIDE_EFFECTS (arg0)
7314          && ! TREE_SIDE_EFFECTS (arg1);
7315 }
7316
7317 /* Test whether it is preferable two swap two operands, ARG0 and
7318    ARG1, for example because ARG0 is an integer constant and ARG1
7319    isn't.  If REORDER is true, only recommend swapping if we can
7320    evaluate the operands in reverse order.  */
7321
7322 bool
7323 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
7324 {
7325   STRIP_SIGN_NOPS (arg0);
7326   STRIP_SIGN_NOPS (arg1);
7327
7328   if (TREE_CODE (arg1) == INTEGER_CST)
7329     return 0;
7330   if (TREE_CODE (arg0) == INTEGER_CST)
7331     return 1;
7332
7333   if (TREE_CODE (arg1) == REAL_CST)
7334     return 0;
7335   if (TREE_CODE (arg0) == REAL_CST)
7336     return 1;
7337
7338   if (TREE_CODE (arg1) == FIXED_CST)
7339     return 0;
7340   if (TREE_CODE (arg0) == FIXED_CST)
7341     return 1;
7342
7343   if (TREE_CODE (arg1) == COMPLEX_CST)
7344     return 0;
7345   if (TREE_CODE (arg0) == COMPLEX_CST)
7346     return 1;
7347
7348   if (TREE_CONSTANT (arg1))
7349     return 0;
7350   if (TREE_CONSTANT (arg0))
7351     return 1;
7352
7353   if (optimize_function_for_size_p (cfun))
7354     return 0;
7355
7356   if (reorder && flag_evaluation_order
7357       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
7358     return 0;
7359
7360   /* It is preferable to swap two SSA_NAME to ensure a canonical form
7361      for commutative and comparison operators.  Ensuring a canonical
7362      form allows the optimizers to find additional redundancies without
7363      having to explicitly check for both orderings.  */
7364   if (TREE_CODE (arg0) == SSA_NAME
7365       && TREE_CODE (arg1) == SSA_NAME
7366       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
7367     return 1;
7368
7369   /* Put SSA_NAMEs last.  */
7370   if (TREE_CODE (arg1) == SSA_NAME)
7371     return 0;
7372   if (TREE_CODE (arg0) == SSA_NAME)
7373     return 1;
7374
7375   /* Put variables last.  */
7376   if (DECL_P (arg1))
7377     return 0;
7378   if (DECL_P (arg0))
7379     return 1;
7380
7381   return 0;
7382 }
7383
7384 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
7385    ARG0 is extended to a wider type.  */
7386
7387 static tree
7388 fold_widened_comparison (location_t loc, enum tree_code code,
7389                          tree type, tree arg0, tree arg1)
7390 {
7391   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
7392   tree arg1_unw;
7393   tree shorter_type, outer_type;
7394   tree min, max;
7395   bool above, below;
7396
7397   if (arg0_unw == arg0)
7398     return NULL_TREE;
7399   shorter_type = TREE_TYPE (arg0_unw);
7400
7401 #ifdef HAVE_canonicalize_funcptr_for_compare
7402   /* Disable this optimization if we're casting a function pointer
7403      type on targets that require function pointer canonicalization.  */
7404   if (HAVE_canonicalize_funcptr_for_compare
7405       && TREE_CODE (shorter_type) == POINTER_TYPE
7406       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
7407     return NULL_TREE;
7408 #endif
7409
7410   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
7411     return NULL_TREE;
7412
7413   arg1_unw = get_unwidened (arg1, NULL_TREE);
7414
7415   /* If possible, express the comparison in the shorter mode.  */
7416   if ((code == EQ_EXPR || code == NE_EXPR
7417        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
7418       && (TREE_TYPE (arg1_unw) == shorter_type
7419           || ((TYPE_PRECISION (shorter_type)
7420                >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
7421               && (TYPE_UNSIGNED (shorter_type)
7422                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
7423           || (TREE_CODE (arg1_unw) == INTEGER_CST
7424               && (TREE_CODE (shorter_type) == INTEGER_TYPE
7425                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
7426               && int_fits_type_p (arg1_unw, shorter_type))))
7427     return fold_build2_loc (loc, code, type, arg0_unw,
7428                         fold_convert_loc (loc, shorter_type, arg1_unw));
7429
7430   if (TREE_CODE (arg1_unw) != INTEGER_CST
7431       || TREE_CODE (shorter_type) != INTEGER_TYPE
7432       || !int_fits_type_p (arg1_unw, shorter_type))
7433     return NULL_TREE;
7434
7435   /* If we are comparing with the integer that does not fit into the range
7436      of the shorter type, the result is known.  */
7437   outer_type = TREE_TYPE (arg1_unw);
7438   min = lower_bound_in_type (outer_type, shorter_type);
7439   max = upper_bound_in_type (outer_type, shorter_type);
7440
7441   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7442                                                    max, arg1_unw));
7443   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7444                                                    arg1_unw, min));
7445
7446   switch (code)
7447     {
7448     case EQ_EXPR:
7449       if (above || below)
7450         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7451       break;
7452
7453     case NE_EXPR:
7454       if (above || below)
7455         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7456       break;
7457
7458     case LT_EXPR:
7459     case LE_EXPR:
7460       if (above)
7461         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7462       else if (below)
7463         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7464
7465     case GT_EXPR:
7466     case GE_EXPR:
7467       if (above)
7468         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7469       else if (below)
7470         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7471
7472     default:
7473       break;
7474     }
7475
7476   return NULL_TREE;
7477 }
7478
7479 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
7480    ARG0 just the signedness is changed.  */
7481
7482 static tree
7483 fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type,
7484                               tree arg0, tree arg1)
7485 {
7486   tree arg0_inner;
7487   tree inner_type, outer_type;
7488
7489   if (!CONVERT_EXPR_P (arg0))
7490     return NULL_TREE;
7491
7492   outer_type = TREE_TYPE (arg0);
7493   arg0_inner = TREE_OPERAND (arg0, 0);
7494   inner_type = TREE_TYPE (arg0_inner);
7495
7496 #ifdef HAVE_canonicalize_funcptr_for_compare
7497   /* Disable this optimization if we're casting a function pointer
7498      type on targets that require function pointer canonicalization.  */
7499   if (HAVE_canonicalize_funcptr_for_compare
7500       && TREE_CODE (inner_type) == POINTER_TYPE
7501       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
7502     return NULL_TREE;
7503 #endif
7504
7505   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
7506     return NULL_TREE;
7507
7508   if (TREE_CODE (arg1) != INTEGER_CST
7509       && !(CONVERT_EXPR_P (arg1)
7510            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
7511     return NULL_TREE;
7512
7513   if ((TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
7514        || POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
7515       && code != NE_EXPR
7516       && code != EQ_EXPR)
7517     return NULL_TREE;
7518
7519   if (TREE_CODE (arg1) == INTEGER_CST)
7520     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
7521                                   TREE_INT_CST_HIGH (arg1), 0,
7522                                   TREE_OVERFLOW (arg1));
7523   else
7524     arg1 = fold_convert_loc (loc, inner_type, arg1);
7525
7526   return fold_build2_loc (loc, code, type, arg0_inner, arg1);
7527 }
7528
7529 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
7530    step of the array.  Reconstructs s and delta in the case of s *
7531    delta being an integer constant (and thus already folded).  ADDR is
7532    the address. MULT is the multiplicative expression.  If the
7533    function succeeds, the new address expression is returned.
7534    Otherwise NULL_TREE is returned.  LOC is the location of the
7535    resulting expression.  */
7536
7537 static tree
7538 try_move_mult_to_index (location_t loc, tree addr, tree op1)
7539 {
7540   tree s, delta, step;
7541   tree ref = TREE_OPERAND (addr, 0), pref;
7542   tree ret, pos;
7543   tree itype;
7544   bool mdim = false;
7545
7546   /*  Strip the nops that might be added when converting op1 to sizetype. */
7547   STRIP_NOPS (op1);
7548
7549   /* Canonicalize op1 into a possibly non-constant delta
7550      and an INTEGER_CST s.  */
7551   if (TREE_CODE (op1) == MULT_EXPR)
7552     {
7553       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
7554
7555       STRIP_NOPS (arg0);
7556       STRIP_NOPS (arg1);
7557   
7558       if (TREE_CODE (arg0) == INTEGER_CST)
7559         {
7560           s = arg0;
7561           delta = arg1;
7562         }
7563       else if (TREE_CODE (arg1) == INTEGER_CST)
7564         {
7565           s = arg1;
7566           delta = arg0;
7567         }
7568       else
7569         return NULL_TREE;
7570     }
7571   else if (TREE_CODE (op1) == INTEGER_CST)
7572     {
7573       delta = op1;
7574       s = NULL_TREE;
7575     }
7576   else
7577     {
7578       /* Simulate we are delta * 1.  */
7579       delta = op1;
7580       s = integer_one_node;
7581     }
7582
7583   for (;; ref = TREE_OPERAND (ref, 0))
7584     {
7585       if (TREE_CODE (ref) == ARRAY_REF)
7586         {
7587           /* Remember if this was a multi-dimensional array.  */
7588           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
7589             mdim = true;
7590
7591           itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
7592           if (! itype)
7593             continue;
7594
7595           step = array_ref_element_size (ref);
7596           if (TREE_CODE (step) != INTEGER_CST)
7597             continue;
7598
7599           if (s)
7600             {
7601               if (! tree_int_cst_equal (step, s))
7602                 continue;
7603             }
7604           else
7605             {
7606               /* Try if delta is a multiple of step.  */
7607               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
7608               if (! tmp)
7609                 continue;
7610               delta = tmp;
7611             }
7612
7613           /* Only fold here if we can verify we do not overflow one
7614              dimension of a multi-dimensional array.  */
7615           if (mdim)
7616             {
7617               tree tmp;
7618
7619               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
7620                   || !INTEGRAL_TYPE_P (itype)
7621                   || !TYPE_MAX_VALUE (itype)
7622                   || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
7623                 continue;
7624
7625               tmp = fold_binary_loc (loc, PLUS_EXPR, itype,
7626                                  fold_convert_loc (loc, itype,
7627                                                    TREE_OPERAND (ref, 1)),
7628                                  fold_convert_loc (loc, itype, delta));
7629               if (!tmp
7630                   || TREE_CODE (tmp) != INTEGER_CST
7631                   || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
7632                 continue;
7633             }
7634
7635           break;
7636         }
7637       else
7638         mdim = false;
7639
7640       if (!handled_component_p (ref))
7641         return NULL_TREE;
7642     }
7643
7644   /* We found the suitable array reference.  So copy everything up to it,
7645      and replace the index.  */
7646
7647   pref = TREE_OPERAND (addr, 0);
7648   ret = copy_node (pref);
7649   SET_EXPR_LOCATION (ret, loc);
7650   pos = ret;
7651
7652   while (pref != ref)
7653     {
7654       pref = TREE_OPERAND (pref, 0);
7655       TREE_OPERAND (pos, 0) = copy_node (pref);
7656       pos = TREE_OPERAND (pos, 0);
7657     }
7658
7659   TREE_OPERAND (pos, 1) = fold_build2_loc (loc, PLUS_EXPR, itype,
7660                                        fold_convert_loc (loc, itype,
7661                                                          TREE_OPERAND (pos, 1)),
7662                                        fold_convert_loc (loc, itype, delta));
7663
7664   return fold_build1_loc (loc, ADDR_EXPR, TREE_TYPE (addr), ret);
7665 }
7666
7667
7668 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7669    means A >= Y && A != MAX, but in this case we know that
7670    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7671
7672 static tree
7673 fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound)
7674 {
7675   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7676
7677   if (TREE_CODE (bound) == LT_EXPR)
7678     a = TREE_OPERAND (bound, 0);
7679   else if (TREE_CODE (bound) == GT_EXPR)
7680     a = TREE_OPERAND (bound, 1);
7681   else
7682     return NULL_TREE;
7683
7684   typea = TREE_TYPE (a);
7685   if (!INTEGRAL_TYPE_P (typea)
7686       && !POINTER_TYPE_P (typea))
7687     return NULL_TREE;
7688
7689   if (TREE_CODE (ineq) == LT_EXPR)
7690     {
7691       a1 = TREE_OPERAND (ineq, 1);
7692       y = TREE_OPERAND (ineq, 0);
7693     }
7694   else if (TREE_CODE (ineq) == GT_EXPR)
7695     {
7696       a1 = TREE_OPERAND (ineq, 0);
7697       y = TREE_OPERAND (ineq, 1);
7698     }
7699   else
7700     return NULL_TREE;
7701
7702   if (TREE_TYPE (a1) != typea)
7703     return NULL_TREE;
7704
7705   if (POINTER_TYPE_P (typea))
7706     {
7707       /* Convert the pointer types into integer before taking the difference.  */
7708       tree ta = fold_convert_loc (loc, ssizetype, a);
7709       tree ta1 = fold_convert_loc (loc, ssizetype, a1);
7710       diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta);
7711     }
7712   else
7713     diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a);
7714
7715   if (!diff || !integer_onep (diff))
7716    return NULL_TREE;
7717
7718   return fold_build2_loc (loc, GE_EXPR, type, a, y);
7719 }
7720
7721 /* Fold a sum or difference of at least one multiplication.
7722    Returns the folded tree or NULL if no simplification could be made.  */
7723
7724 static tree
7725 fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
7726                           tree arg0, tree arg1)
7727 {
7728   tree arg00, arg01, arg10, arg11;
7729   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7730
7731   /* (A * C) +- (B * C) -> (A+-B) * C.
7732      (A * C) +- A -> A * (C+-1).
7733      We are most concerned about the case where C is a constant,
7734      but other combinations show up during loop reduction.  Since
7735      it is not difficult, try all four possibilities.  */
7736
7737   if (TREE_CODE (arg0) == MULT_EXPR)
7738     {
7739       arg00 = TREE_OPERAND (arg0, 0);
7740       arg01 = TREE_OPERAND (arg0, 1);
7741     }
7742   else if (TREE_CODE (arg0) == INTEGER_CST)
7743     {
7744       arg00 = build_one_cst (type);
7745       arg01 = arg0;
7746     }
7747   else
7748     {
7749       /* We cannot generate constant 1 for fract.  */
7750       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7751         return NULL_TREE;
7752       arg00 = arg0;
7753       arg01 = build_one_cst (type);
7754     }
7755   if (TREE_CODE (arg1) == MULT_EXPR)
7756     {
7757       arg10 = TREE_OPERAND (arg1, 0);
7758       arg11 = TREE_OPERAND (arg1, 1);
7759     }
7760   else if (TREE_CODE (arg1) == INTEGER_CST)
7761     {
7762       arg10 = build_one_cst (type);
7763       /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7764          the purpose of this canonicalization.  */
7765       if (TREE_INT_CST_HIGH (arg1) == -1
7766           && negate_expr_p (arg1)
7767           && code == PLUS_EXPR)
7768         {
7769           arg11 = negate_expr (arg1);
7770           code = MINUS_EXPR;
7771         }
7772       else
7773         arg11 = arg1;
7774     }
7775   else
7776     {
7777       /* We cannot generate constant 1 for fract.  */
7778       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7779         return NULL_TREE;
7780       arg10 = arg1;
7781       arg11 = build_one_cst (type);
7782     }
7783   same = NULL_TREE;
7784
7785   if (operand_equal_p (arg01, arg11, 0))
7786     same = arg01, alt0 = arg00, alt1 = arg10;
7787   else if (operand_equal_p (arg00, arg10, 0))
7788     same = arg00, alt0 = arg01, alt1 = arg11;
7789   else if (operand_equal_p (arg00, arg11, 0))
7790     same = arg00, alt0 = arg01, alt1 = arg10;
7791   else if (operand_equal_p (arg01, arg10, 0))
7792     same = arg01, alt0 = arg00, alt1 = arg11;
7793
7794   /* No identical multiplicands; see if we can find a common
7795      power-of-two factor in non-power-of-two multiplies.  This
7796      can help in multi-dimensional array access.  */
7797   else if (host_integerp (arg01, 0)
7798            && host_integerp (arg11, 0))
7799     {
7800       HOST_WIDE_INT int01, int11, tmp;
7801       bool swap = false;
7802       tree maybe_same;
7803       int01 = TREE_INT_CST_LOW (arg01);
7804       int11 = TREE_INT_CST_LOW (arg11);
7805
7806       /* Move min of absolute values to int11.  */
7807       if ((int01 >= 0 ? int01 : -int01)
7808           < (int11 >= 0 ? int11 : -int11))
7809         {
7810           tmp = int01, int01 = int11, int11 = tmp;
7811           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7812           maybe_same = arg01;
7813           swap = true;
7814         }
7815       else
7816         maybe_same = arg11;
7817
7818       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0
7819           /* The remainder should not be a constant, otherwise we
7820              end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7821              increased the number of multiplications necessary.  */
7822           && TREE_CODE (arg10) != INTEGER_CST)
7823         {
7824           alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00,
7825                               build_int_cst (TREE_TYPE (arg00),
7826                                              int01 / int11));
7827           alt1 = arg10;
7828           same = maybe_same;
7829           if (swap)
7830             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7831         }
7832     }
7833
7834   if (same)
7835     return fold_build2_loc (loc, MULT_EXPR, type,
7836                         fold_build2_loc (loc, code, type,
7837                                      fold_convert_loc (loc, type, alt0),
7838                                      fold_convert_loc (loc, type, alt1)),
7839                         fold_convert_loc (loc, type, same));
7840
7841   return NULL_TREE;
7842 }
7843
7844 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7845    specified by EXPR into the buffer PTR of length LEN bytes.
7846    Return the number of bytes placed in the buffer, or zero
7847    upon failure.  */
7848
7849 static int
7850 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7851 {
7852   tree type = TREE_TYPE (expr);
7853   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7854   int byte, offset, word, words;
7855   unsigned char value;
7856
7857   if (total_bytes > len)
7858     return 0;
7859   words = total_bytes / UNITS_PER_WORD;
7860
7861   for (byte = 0; byte < total_bytes; byte++)
7862     {
7863       int bitpos = byte * BITS_PER_UNIT;
7864       if (bitpos < HOST_BITS_PER_WIDE_INT)
7865         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7866       else
7867         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7868                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7869
7870       if (total_bytes > UNITS_PER_WORD)
7871         {
7872           word = byte / UNITS_PER_WORD;
7873           if (WORDS_BIG_ENDIAN)
7874             word = (words - 1) - word;
7875           offset = word * UNITS_PER_WORD;
7876           if (BYTES_BIG_ENDIAN)
7877             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7878           else
7879             offset += byte % UNITS_PER_WORD;
7880         }
7881       else
7882         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7883       ptr[offset] = value;
7884     }
7885   return total_bytes;
7886 }
7887
7888
7889 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7890    specified by EXPR into the buffer PTR of length LEN bytes.
7891    Return the number of bytes placed in the buffer, or zero
7892    upon failure.  */
7893
7894 static int
7895 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7896 {
7897   tree type = TREE_TYPE (expr);
7898   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7899   int byte, offset, word, words, bitpos;
7900   unsigned char value;
7901
7902   /* There are always 32 bits in each long, no matter the size of
7903      the hosts long.  We handle floating point representations with
7904      up to 192 bits.  */
7905   long tmp[6];
7906
7907   if (total_bytes > len)
7908     return 0;
7909   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7910
7911   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7912
7913   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7914        bitpos += BITS_PER_UNIT)
7915     {
7916       byte = (bitpos / BITS_PER_UNIT) & 3;
7917       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7918
7919       if (UNITS_PER_WORD < 4)
7920         {
7921           word = byte / UNITS_PER_WORD;
7922           if (WORDS_BIG_ENDIAN)
7923             word = (words - 1) - word;
7924           offset = word * UNITS_PER_WORD;
7925           if (BYTES_BIG_ENDIAN)
7926             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7927           else
7928             offset += byte % UNITS_PER_WORD;
7929         }
7930       else
7931         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7932       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7933     }
7934   return total_bytes;
7935 }
7936
7937 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7938    specified by EXPR into the buffer PTR of length LEN bytes.
7939    Return the number of bytes placed in the buffer, or zero
7940    upon failure.  */
7941
7942 static int
7943 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7944 {
7945   int rsize, isize;
7946   tree part;
7947
7948   part = TREE_REALPART (expr);
7949   rsize = native_encode_expr (part, ptr, len);
7950   if (rsize == 0)
7951     return 0;
7952   part = TREE_IMAGPART (expr);
7953   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7954   if (isize != rsize)
7955     return 0;
7956   return rsize + isize;
7957 }
7958
7959
7960 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7961    specified by EXPR into the buffer PTR of length LEN bytes.
7962    Return the number of bytes placed in the buffer, or zero
7963    upon failure.  */
7964
7965 static int
7966 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7967 {
7968   int i, size, offset, count;
7969   tree itype, elem, elements;
7970
7971   offset = 0;
7972   elements = TREE_VECTOR_CST_ELTS (expr);
7973   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7974   itype = TREE_TYPE (TREE_TYPE (expr));
7975   size = GET_MODE_SIZE (TYPE_MODE (itype));
7976   for (i = 0; i < count; i++)
7977     {
7978       if (elements)
7979         {
7980           elem = TREE_VALUE (elements);
7981           elements = TREE_CHAIN (elements);
7982         }
7983       else
7984         elem = NULL_TREE;
7985
7986       if (elem)
7987         {
7988           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7989             return 0;
7990         }
7991       else
7992         {
7993           if (offset + size > len)
7994             return 0;
7995           memset (ptr+offset, 0, size);
7996         }
7997       offset += size;
7998     }
7999   return offset;
8000 }
8001
8002
8003 /* Subroutine of native_encode_expr.  Encode the STRING_CST
8004    specified by EXPR into the buffer PTR of length LEN bytes.
8005    Return the number of bytes placed in the buffer, or zero
8006    upon failure.  */
8007
8008 static int
8009 native_encode_string (const_tree expr, unsigned char *ptr, int len)
8010 {
8011   tree type = TREE_TYPE (expr);
8012   HOST_WIDE_INT total_bytes;
8013
8014   if (TREE_CODE (type) != ARRAY_TYPE
8015       || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
8016       || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
8017       || !host_integerp (TYPE_SIZE_UNIT (type), 0))
8018     return 0;
8019   total_bytes = tree_low_cst (TYPE_SIZE_UNIT (type), 0);
8020   if (total_bytes > len)
8021     return 0;
8022   if (TREE_STRING_LENGTH (expr) < total_bytes)
8023     {
8024       memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr));
8025       memset (ptr + TREE_STRING_LENGTH (expr), 0,
8026               total_bytes - TREE_STRING_LENGTH (expr));
8027     }
8028   else
8029     memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes);
8030   return total_bytes;
8031 }
8032
8033
8034 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
8035    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
8036    buffer PTR of length LEN bytes.  Return the number of bytes
8037    placed in the buffer, or zero upon failure.  */
8038
8039 int
8040 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
8041 {
8042   switch (TREE_CODE (expr))
8043     {
8044     case INTEGER_CST:
8045       return native_encode_int (expr, ptr, len);
8046
8047     case REAL_CST:
8048       return native_encode_real (expr, ptr, len);
8049
8050     case COMPLEX_CST:
8051       return native_encode_complex (expr, ptr, len);
8052
8053     case VECTOR_CST:
8054       return native_encode_vector (expr, ptr, len);
8055
8056     case STRING_CST:
8057       return native_encode_string (expr, ptr, len);
8058
8059     default:
8060       return 0;
8061     }
8062 }
8063
8064
8065 /* Subroutine of native_interpret_expr.  Interpret the contents of
8066    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
8067    If the buffer cannot be interpreted, return NULL_TREE.  */
8068
8069 static tree
8070 native_interpret_int (tree type, const unsigned char *ptr, int len)
8071 {
8072   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
8073   int byte, offset, word, words;
8074   unsigned char value;
8075   unsigned int HOST_WIDE_INT lo = 0;
8076   HOST_WIDE_INT hi = 0;
8077
8078   if (total_bytes > len)
8079     return NULL_TREE;
8080   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
8081     return NULL_TREE;
8082   words = total_bytes / UNITS_PER_WORD;
8083
8084   for (byte = 0; byte < total_bytes; byte++)
8085     {
8086       int bitpos = byte * BITS_PER_UNIT;
8087       if (total_bytes > UNITS_PER_WORD)
8088         {
8089           word = byte / UNITS_PER_WORD;
8090           if (WORDS_BIG_ENDIAN)
8091             word = (words - 1) - word;
8092           offset = word * UNITS_PER_WORD;
8093           if (BYTES_BIG_ENDIAN)
8094             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
8095           else
8096             offset += byte % UNITS_PER_WORD;
8097         }
8098       else
8099         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
8100       value = ptr[offset];
8101
8102       if (bitpos < HOST_BITS_PER_WIDE_INT)
8103         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
8104       else
8105         hi |= (unsigned HOST_WIDE_INT) value
8106               << (bitpos - HOST_BITS_PER_WIDE_INT);
8107     }
8108
8109   return build_int_cst_wide_type (type, lo, hi);
8110 }
8111
8112
8113 /* Subroutine of native_interpret_expr.  Interpret the contents of
8114    the buffer PTR of length LEN as a REAL_CST of type TYPE.
8115    If the buffer cannot be interpreted, return NULL_TREE.  */
8116
8117 static tree
8118 native_interpret_real (tree type, const unsigned char *ptr, int len)
8119 {
8120   enum machine_mode mode = TYPE_MODE (type);
8121   int total_bytes = GET_MODE_SIZE (mode);
8122   int byte, offset, word, words, bitpos;
8123   unsigned char value;
8124   /* There are always 32 bits in each long, no matter the size of
8125      the hosts long.  We handle floating point representations with
8126      up to 192 bits.  */
8127   REAL_VALUE_TYPE r;
8128   long tmp[6];
8129
8130   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
8131   if (total_bytes > len || total_bytes > 24)
8132     return NULL_TREE;
8133   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
8134
8135   memset (tmp, 0, sizeof (tmp));
8136   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
8137        bitpos += BITS_PER_UNIT)
8138     {
8139       byte = (bitpos / BITS_PER_UNIT) & 3;
8140       if (UNITS_PER_WORD < 4)
8141         {
8142           word = byte / UNITS_PER_WORD;
8143           if (WORDS_BIG_ENDIAN)
8144             word = (words - 1) - word;
8145           offset = word * UNITS_PER_WORD;
8146           if (BYTES_BIG_ENDIAN)
8147             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
8148           else
8149             offset += byte % UNITS_PER_WORD;
8150         }
8151       else
8152         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
8153       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
8154
8155       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
8156     }
8157
8158   real_from_target (&r, tmp, mode);
8159   return build_real (type, r);
8160 }
8161
8162
8163 /* Subroutine of native_interpret_expr.  Interpret the contents of
8164    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
8165    If the buffer cannot be interpreted, return NULL_TREE.  */
8166
8167 static tree
8168 native_interpret_complex (tree type, const unsigned char *ptr, int len)
8169 {
8170   tree etype, rpart, ipart;
8171   int size;
8172
8173   etype = TREE_TYPE (type);
8174   size = GET_MODE_SIZE (TYPE_MODE (etype));
8175   if (size * 2 > len)
8176     return NULL_TREE;
8177   rpart = native_interpret_expr (etype, ptr, size);
8178   if (!rpart)
8179     return NULL_TREE;
8180   ipart = native_interpret_expr (etype, ptr+size, size);
8181   if (!ipart)
8182     return NULL_TREE;
8183   return build_complex (type, rpart, ipart);
8184 }
8185
8186
8187 /* Subroutine of native_interpret_expr.  Interpret the contents of
8188    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
8189    If the buffer cannot be interpreted, return NULL_TREE.  */
8190
8191 static tree
8192 native_interpret_vector (tree type, const unsigned char *ptr, int len)
8193 {
8194   tree etype, elem, elements;
8195   int i, size, count;
8196
8197   etype = TREE_TYPE (type);
8198   size = GET_MODE_SIZE (TYPE_MODE (etype));
8199   count = TYPE_VECTOR_SUBPARTS (type);
8200   if (size * count > len)
8201     return NULL_TREE;
8202
8203   elements = NULL_TREE;
8204   for (i = count - 1; i >= 0; i--)
8205     {
8206       elem = native_interpret_expr (etype, ptr+(i*size), size);
8207       if (!elem)
8208         return NULL_TREE;
8209       elements = tree_cons (NULL_TREE, elem, elements);
8210     }
8211   return build_vector (type, elements);
8212 }
8213
8214
8215 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
8216    the buffer PTR of length LEN as a constant of type TYPE.  For
8217    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
8218    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
8219    return NULL_TREE.  */
8220
8221 tree
8222 native_interpret_expr (tree type, const unsigned char *ptr, int len)
8223 {
8224   switch (TREE_CODE (type))
8225     {
8226     case INTEGER_TYPE:
8227     case ENUMERAL_TYPE:
8228     case BOOLEAN_TYPE:
8229       return native_interpret_int (type, ptr, len);
8230
8231     case REAL_TYPE:
8232       return native_interpret_real (type, ptr, len);
8233
8234     case COMPLEX_TYPE:
8235       return native_interpret_complex (type, ptr, len);
8236
8237     case VECTOR_TYPE:
8238       return native_interpret_vector (type, ptr, len);
8239
8240     default:
8241       return NULL_TREE;
8242     }
8243 }
8244
8245
8246 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
8247    TYPE at compile-time.  If we're unable to perform the conversion
8248    return NULL_TREE.  */
8249
8250 static tree
8251 fold_view_convert_expr (tree type, tree expr)
8252 {
8253   /* We support up to 512-bit values (for V8DFmode).  */
8254   unsigned char buffer[64];
8255   int len;
8256
8257   /* Check that the host and target are sane.  */
8258   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
8259     return NULL_TREE;
8260
8261   len = native_encode_expr (expr, buffer, sizeof (buffer));
8262   if (len == 0)
8263     return NULL_TREE;
8264
8265   return native_interpret_expr (type, buffer, len);
8266 }
8267
8268 /* Build an expression for the address of T.  Folds away INDIRECT_REF
8269    to avoid confusing the gimplify process.  */
8270
8271 tree
8272 build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype)
8273 {
8274   /* The size of the object is not relevant when talking about its address.  */
8275   if (TREE_CODE (t) == WITH_SIZE_EXPR)
8276     t = TREE_OPERAND (t, 0);
8277
8278   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
8279   if (TREE_CODE (t) == INDIRECT_REF
8280       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
8281     {
8282       t = TREE_OPERAND (t, 0);
8283
8284       if (TREE_TYPE (t) != ptrtype)
8285         {
8286           t = build1 (NOP_EXPR, ptrtype, t);
8287           SET_EXPR_LOCATION (t, loc);
8288         }
8289     }
8290   else if (TREE_CODE (t) == VIEW_CONVERT_EXPR)
8291     {
8292       t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0));
8293
8294       if (TREE_TYPE (t) != ptrtype)
8295         t = fold_convert_loc (loc, ptrtype, t);
8296     }
8297   else
8298     {
8299       t = build1 (ADDR_EXPR, ptrtype, t);
8300       SET_EXPR_LOCATION (t, loc);
8301     }
8302
8303   return t;
8304 }
8305
8306 /* Build an expression for the address of T.  */
8307
8308 tree
8309 build_fold_addr_expr_loc (location_t loc, tree t)
8310 {
8311   tree ptrtype = build_pointer_type (TREE_TYPE (t));
8312
8313   return build_fold_addr_expr_with_type_loc (loc, t, ptrtype);
8314 }
8315
8316 /* Fold a unary expression of code CODE and type TYPE with operand
8317    OP0.  Return the folded expression if folding is successful.
8318    Otherwise, return NULL_TREE.  */
8319
8320 tree
8321 fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
8322 {
8323   tree tem;
8324   tree arg0;
8325   enum tree_code_class kind = TREE_CODE_CLASS (code);
8326
8327   gcc_assert (IS_EXPR_CODE_CLASS (kind)
8328               && TREE_CODE_LENGTH (code) == 1);
8329
8330   arg0 = op0;
8331   if (arg0)
8332     {
8333       if (CONVERT_EXPR_CODE_P (code)
8334           || code == FLOAT_EXPR || code == ABS_EXPR)
8335         {
8336           /* Don't use STRIP_NOPS, because signedness of argument type
8337              matters.  */
8338           STRIP_SIGN_NOPS (arg0);
8339         }
8340       else
8341         {
8342           /* Strip any conversions that don't change the mode.  This
8343              is safe for every expression, except for a comparison
8344              expression because its signedness is derived from its
8345              operands.
8346
8347              Note that this is done as an internal manipulation within
8348              the constant folder, in order to find the simplest
8349              representation of the arguments so that their form can be
8350              studied.  In any cases, the appropriate type conversions
8351              should be put back in the tree that will get out of the
8352              constant folder.  */
8353           STRIP_NOPS (arg0);
8354         }
8355     }
8356
8357   if (TREE_CODE_CLASS (code) == tcc_unary)
8358     {
8359       if (TREE_CODE (arg0) == COMPOUND_EXPR)
8360         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
8361                        fold_build1_loc (loc, code, type,
8362                                     fold_convert_loc (loc, TREE_TYPE (op0),
8363                                                       TREE_OPERAND (arg0, 1))));
8364       else if (TREE_CODE (arg0) == COND_EXPR)
8365         {
8366           tree arg01 = TREE_OPERAND (arg0, 1);
8367           tree arg02 = TREE_OPERAND (arg0, 2);
8368           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
8369             arg01 = fold_build1_loc (loc, code, type,
8370                                  fold_convert_loc (loc,
8371                                                    TREE_TYPE (op0), arg01));
8372           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
8373             arg02 = fold_build1_loc (loc, code, type,
8374                                  fold_convert_loc (loc,
8375                                                    TREE_TYPE (op0), arg02));
8376           tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0),
8377                              arg01, arg02);
8378
8379           /* If this was a conversion, and all we did was to move into
8380              inside the COND_EXPR, bring it back out.  But leave it if
8381              it is a conversion from integer to integer and the
8382              result precision is no wider than a word since such a
8383              conversion is cheap and may be optimized away by combine,
8384              while it couldn't if it were outside the COND_EXPR.  Then return
8385              so we don't get into an infinite recursion loop taking the
8386              conversion out and then back in.  */
8387
8388           if ((CONVERT_EXPR_CODE_P (code)
8389                || code == NON_LVALUE_EXPR)
8390               && TREE_CODE (tem) == COND_EXPR
8391               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
8392               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
8393               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
8394               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
8395               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
8396                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
8397               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8398                      && (INTEGRAL_TYPE_P
8399                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
8400                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
8401                   || flag_syntax_only))
8402             {
8403               tem = build1 (code, type,
8404                             build3 (COND_EXPR,
8405                                     TREE_TYPE (TREE_OPERAND
8406                                                (TREE_OPERAND (tem, 1), 0)),
8407                                     TREE_OPERAND (tem, 0),
8408                                     TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
8409                                     TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
8410               SET_EXPR_LOCATION (tem, loc);
8411             }
8412           return tem;
8413         }
8414       else if (COMPARISON_CLASS_P (arg0))
8415         {
8416           if (TREE_CODE (type) == BOOLEAN_TYPE)
8417             {
8418               arg0 = copy_node (arg0);
8419               TREE_TYPE (arg0) = type;
8420               return arg0;
8421             }
8422           else if (TREE_CODE (type) != INTEGER_TYPE)
8423             return fold_build3_loc (loc, COND_EXPR, type, arg0,
8424                                 fold_build1_loc (loc, code, type,
8425                                              integer_one_node),
8426                                 fold_build1_loc (loc, code, type,
8427                                              integer_zero_node));
8428         }
8429    }
8430
8431   switch (code)
8432     {
8433     case PAREN_EXPR:
8434       /* Re-association barriers around constants and other re-association
8435          barriers can be removed.  */
8436       if (CONSTANT_CLASS_P (op0)
8437           || TREE_CODE (op0) == PAREN_EXPR)
8438         return fold_convert_loc (loc, type, op0);
8439       return NULL_TREE;
8440
8441     CASE_CONVERT:
8442     case FLOAT_EXPR:
8443     case FIX_TRUNC_EXPR:
8444       if (TREE_TYPE (op0) == type)
8445         return op0;
8446       
8447       /* If we have (type) (a CMP b) and type is an integral type, return
8448          new expression involving the new type.  */
8449       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
8450         return fold_build2_loc (loc, TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
8451                             TREE_OPERAND (op0, 1));
8452
8453       /* Handle cases of two conversions in a row.  */
8454       if (CONVERT_EXPR_P (op0))
8455         {
8456           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
8457           tree inter_type = TREE_TYPE (op0);
8458           int inside_int = INTEGRAL_TYPE_P (inside_type);
8459           int inside_ptr = POINTER_TYPE_P (inside_type);
8460           int inside_float = FLOAT_TYPE_P (inside_type);
8461           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
8462           unsigned int inside_prec = TYPE_PRECISION (inside_type);
8463           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
8464           int inter_int = INTEGRAL_TYPE_P (inter_type);
8465           int inter_ptr = POINTER_TYPE_P (inter_type);
8466           int inter_float = FLOAT_TYPE_P (inter_type);
8467           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
8468           unsigned int inter_prec = TYPE_PRECISION (inter_type);
8469           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
8470           int final_int = INTEGRAL_TYPE_P (type);
8471           int final_ptr = POINTER_TYPE_P (type);
8472           int final_float = FLOAT_TYPE_P (type);
8473           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
8474           unsigned int final_prec = TYPE_PRECISION (type);
8475           int final_unsignedp = TYPE_UNSIGNED (type);
8476
8477           /* In addition to the cases of two conversions in a row
8478              handled below, if we are converting something to its own
8479              type via an object of identical or wider precision, neither
8480              conversion is needed.  */
8481           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
8482               && (((inter_int || inter_ptr) && final_int)
8483                   || (inter_float && final_float))
8484               && inter_prec >= final_prec)
8485             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8486
8487           /* Likewise, if the intermediate and initial types are either both
8488              float or both integer, we don't need the middle conversion if the
8489              former is wider than the latter and doesn't change the signedness
8490              (for integers).  Avoid this if the final type is a pointer since
8491              then we sometimes need the middle conversion.  Likewise if the
8492              final type has a precision not equal to the size of its mode.  */
8493           if (((inter_int && inside_int)
8494                || (inter_float && inside_float)
8495                || (inter_vec && inside_vec))
8496               && inter_prec >= inside_prec
8497               && (inter_float || inter_vec
8498                   || inter_unsignedp == inside_unsignedp)
8499               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8500                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
8501               && ! final_ptr
8502               && (! final_vec || inter_prec == inside_prec))
8503             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8504
8505           /* If we have a sign-extension of a zero-extended value, we can
8506              replace that by a single zero-extension.  */
8507           if (inside_int && inter_int && final_int
8508               && inside_prec < inter_prec && inter_prec < final_prec
8509               && inside_unsignedp && !inter_unsignedp)
8510             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8511
8512           /* Two conversions in a row are not needed unless:
8513              - some conversion is floating-point (overstrict for now), or
8514              - some conversion is a vector (overstrict for now), or
8515              - the intermediate type is narrower than both initial and
8516                final, or
8517              - the intermediate type and innermost type differ in signedness,
8518                and the outermost type is wider than the intermediate, or
8519              - the initial type is a pointer type and the precisions of the
8520                intermediate and final types differ, or
8521              - the final type is a pointer type and the precisions of the
8522                initial and intermediate types differ.  */
8523           if (! inside_float && ! inter_float && ! final_float
8524               && ! inside_vec && ! inter_vec && ! final_vec
8525               && (inter_prec >= inside_prec || inter_prec >= final_prec)
8526               && ! (inside_int && inter_int
8527                     && inter_unsignedp != inside_unsignedp
8528                     && inter_prec < final_prec)
8529               && ((inter_unsignedp && inter_prec > inside_prec)
8530                   == (final_unsignedp && final_prec > inter_prec))
8531               && ! (inside_ptr && inter_prec != final_prec)
8532               && ! (final_ptr && inside_prec != inter_prec)
8533               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8534                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
8535             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8536         }
8537
8538       /* Handle (T *)&A.B.C for A being of type T and B and C
8539          living at offset zero.  This occurs frequently in
8540          C++ upcasting and then accessing the base.  */
8541       if (TREE_CODE (op0) == ADDR_EXPR
8542           && POINTER_TYPE_P (type)
8543           && handled_component_p (TREE_OPERAND (op0, 0)))
8544         {
8545           HOST_WIDE_INT bitsize, bitpos;
8546           tree offset;
8547           enum machine_mode mode;
8548           int unsignedp, volatilep;
8549           tree base = TREE_OPERAND (op0, 0);
8550           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
8551                                       &mode, &unsignedp, &volatilep, false);
8552           /* If the reference was to a (constant) zero offset, we can use
8553              the address of the base if it has the same base type
8554              as the result type.  */
8555           if (! offset && bitpos == 0
8556               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
8557                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
8558             return fold_convert_loc (loc, type,
8559                                      build_fold_addr_expr_loc (loc, base));
8560         }
8561
8562       if (TREE_CODE (op0) == MODIFY_EXPR
8563           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
8564           /* Detect assigning a bitfield.  */
8565           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
8566                && DECL_BIT_FIELD
8567                (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
8568         {
8569           /* Don't leave an assignment inside a conversion
8570              unless assigning a bitfield.  */
8571           tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1));
8572           /* First do the assignment, then return converted constant.  */
8573           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
8574           TREE_NO_WARNING (tem) = 1;
8575           TREE_USED (tem) = 1;
8576           SET_EXPR_LOCATION (tem, loc);
8577           return tem;
8578         }
8579
8580       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
8581          constants (if x has signed type, the sign bit cannot be set
8582          in c).  This folds extension into the BIT_AND_EXPR.
8583          ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
8584          very likely don't have maximal range for their precision and this
8585          transformation effectively doesn't preserve non-maximal ranges.  */
8586       if (TREE_CODE (type) == INTEGER_TYPE
8587           && TREE_CODE (op0) == BIT_AND_EXPR
8588           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
8589         {
8590           tree and_expr = op0;
8591           tree and0 = TREE_OPERAND (and_expr, 0);
8592           tree and1 = TREE_OPERAND (and_expr, 1);
8593           int change = 0;
8594
8595           if (TYPE_UNSIGNED (TREE_TYPE (and_expr))
8596               || (TYPE_PRECISION (type)
8597                   <= TYPE_PRECISION (TREE_TYPE (and_expr))))
8598             change = 1;
8599           else if (TYPE_PRECISION (TREE_TYPE (and1))
8600                    <= HOST_BITS_PER_WIDE_INT
8601                    && host_integerp (and1, 1))
8602             {
8603               unsigned HOST_WIDE_INT cst;
8604
8605               cst = tree_low_cst (and1, 1);
8606               cst &= (HOST_WIDE_INT) -1
8607                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
8608               change = (cst == 0);
8609 #ifdef LOAD_EXTEND_OP
8610               if (change
8611                   && !flag_syntax_only
8612                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
8613                       == ZERO_EXTEND))
8614                 {
8615                   tree uns = unsigned_type_for (TREE_TYPE (and0));
8616                   and0 = fold_convert_loc (loc, uns, and0);
8617                   and1 = fold_convert_loc (loc, uns, and1);
8618                 }
8619 #endif
8620             }
8621           if (change)
8622             {
8623               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
8624                                            TREE_INT_CST_HIGH (and1), 0,
8625                                            TREE_OVERFLOW (and1));
8626               return fold_build2_loc (loc, BIT_AND_EXPR, type,
8627                                   fold_convert_loc (loc, type, and0), tem);
8628             }
8629         }
8630
8631       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8632          when one of the new casts will fold away. Conservatively we assume
8633          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8634       if (POINTER_TYPE_P (type)
8635           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8636           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8637               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8638               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8639         {
8640           tree arg00 = TREE_OPERAND (arg0, 0);
8641           tree arg01 = TREE_OPERAND (arg0, 1);
8642
8643           return fold_build2_loc (loc,
8644                               TREE_CODE (arg0), type,
8645                               fold_convert_loc (loc, type, arg00),
8646                               fold_convert_loc (loc, sizetype, arg01));
8647         }
8648
8649       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8650          of the same precision, and X is an integer type not narrower than
8651          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
8652       if (INTEGRAL_TYPE_P (type)
8653           && TREE_CODE (op0) == BIT_NOT_EXPR
8654           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8655           && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8656           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8657         {
8658           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8659           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8660               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8661             return fold_build1_loc (loc, BIT_NOT_EXPR, type,
8662                                 fold_convert_loc (loc, type, tem));
8663         }
8664
8665       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8666          type of X and Y (integer types only).  */
8667       if (INTEGRAL_TYPE_P (type)
8668           && TREE_CODE (op0) == MULT_EXPR
8669           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8670           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8671         {
8672           /* Be careful not to introduce new overflows.  */
8673           tree mult_type;
8674           if (TYPE_OVERFLOW_WRAPS (type))
8675             mult_type = type;
8676           else
8677             mult_type = unsigned_type_for (type);
8678
8679           if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8680             {
8681               tem = fold_build2_loc (loc, MULT_EXPR, mult_type,
8682                                  fold_convert_loc (loc, mult_type,
8683                                                    TREE_OPERAND (op0, 0)),
8684                                  fold_convert_loc (loc, mult_type,
8685                                                    TREE_OPERAND (op0, 1)));
8686               return fold_convert_loc (loc, type, tem);
8687             }
8688         }
8689
8690       tem = fold_convert_const (code, type, op0);
8691       return tem ? tem : NULL_TREE;
8692
8693     case ADDR_SPACE_CONVERT_EXPR:
8694       if (integer_zerop (arg0))
8695         return fold_convert_const (code, type, arg0);
8696       return NULL_TREE;
8697
8698     case FIXED_CONVERT_EXPR:
8699       tem = fold_convert_const (code, type, arg0);
8700       return tem ? tem : NULL_TREE;
8701
8702     case VIEW_CONVERT_EXPR:
8703       if (TREE_TYPE (op0) == type)
8704         return op0;
8705       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
8706         return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8707                             type, TREE_OPERAND (op0, 0));
8708
8709       /* For integral conversions with the same precision or pointer
8710          conversions use a NOP_EXPR instead.  */
8711       if ((INTEGRAL_TYPE_P (type)
8712            || POINTER_TYPE_P (type))
8713           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8714               || POINTER_TYPE_P (TREE_TYPE (op0)))
8715           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8716         return fold_convert_loc (loc, type, op0);
8717
8718       /* Strip inner integral conversions that do not change the precision.  */
8719       if (CONVERT_EXPR_P (op0)
8720           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8721               || POINTER_TYPE_P (TREE_TYPE (op0)))
8722           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
8723               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
8724           && (TYPE_PRECISION (TREE_TYPE (op0))
8725               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
8726         return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8727                             type, TREE_OPERAND (op0, 0));
8728
8729       return fold_view_convert_expr (type, op0);
8730
8731     case NEGATE_EXPR:
8732       tem = fold_negate_expr (loc, arg0);
8733       if (tem)
8734         return fold_convert_loc (loc, type, tem);
8735       return NULL_TREE;
8736
8737     case ABS_EXPR:
8738       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8739         return fold_abs_const (arg0, type);
8740       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8741         return fold_build1_loc (loc, ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8742       /* Convert fabs((double)float) into (double)fabsf(float).  */
8743       else if (TREE_CODE (arg0) == NOP_EXPR
8744                && TREE_CODE (type) == REAL_TYPE)
8745         {
8746           tree targ0 = strip_float_extensions (arg0);
8747           if (targ0 != arg0)
8748             return fold_convert_loc (loc, type,
8749                                      fold_build1_loc (loc, ABS_EXPR,
8750                                                   TREE_TYPE (targ0),
8751                                                   targ0));
8752         }
8753       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8754       else if (TREE_CODE (arg0) == ABS_EXPR)
8755         return arg0;
8756       else if (tree_expr_nonnegative_p (arg0))
8757         return arg0;
8758
8759       /* Strip sign ops from argument.  */
8760       if (TREE_CODE (type) == REAL_TYPE)
8761         {
8762           tem = fold_strip_sign_ops (arg0);
8763           if (tem)
8764             return fold_build1_loc (loc, ABS_EXPR, type,
8765                                 fold_convert_loc (loc, type, tem));
8766         }
8767       return NULL_TREE;
8768
8769     case CONJ_EXPR:
8770       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8771         return fold_convert_loc (loc, type, arg0);
8772       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8773         {
8774           tree itype = TREE_TYPE (type);
8775           tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0));
8776           tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1));
8777           return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart,
8778                               negate_expr (ipart));
8779         }
8780       if (TREE_CODE (arg0) == COMPLEX_CST)
8781         {
8782           tree itype = TREE_TYPE (type);
8783           tree rpart = fold_convert_loc (loc, itype, TREE_REALPART (arg0));
8784           tree ipart = fold_convert_loc (loc, itype, TREE_IMAGPART (arg0));
8785           return build_complex (type, rpart, negate_expr (ipart));
8786         }
8787       if (TREE_CODE (arg0) == CONJ_EXPR)
8788         return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8789       return NULL_TREE;
8790
8791     case BIT_NOT_EXPR:
8792       if (TREE_CODE (arg0) == INTEGER_CST)
8793         return fold_not_const (arg0, type);
8794       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8795         return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8796       /* Convert ~ (-A) to A - 1.  */
8797       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8798         return fold_build2_loc (loc, MINUS_EXPR, type,
8799                             fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)),
8800                             build_int_cst (type, 1));
8801       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8802       else if (INTEGRAL_TYPE_P (type)
8803                && ((TREE_CODE (arg0) == MINUS_EXPR
8804                     && integer_onep (TREE_OPERAND (arg0, 1)))
8805                    || (TREE_CODE (arg0) == PLUS_EXPR
8806                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8807         return fold_build1_loc (loc, NEGATE_EXPR, type,
8808                             fold_convert_loc (loc, type,
8809                                               TREE_OPERAND (arg0, 0)));
8810       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8811       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8812                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8813                                      fold_convert_loc (loc, type,
8814                                                        TREE_OPERAND (arg0, 0)))))
8815         return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem,
8816                             fold_convert_loc (loc, type,
8817                                               TREE_OPERAND (arg0, 1)));
8818       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8819                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8820                                      fold_convert_loc (loc, type,
8821                                                        TREE_OPERAND (arg0, 1)))))
8822         return fold_build2_loc (loc, BIT_XOR_EXPR, type,
8823                             fold_convert_loc (loc, type,
8824                                               TREE_OPERAND (arg0, 0)), tem);
8825       /* Perform BIT_NOT_EXPR on each element individually.  */
8826       else if (TREE_CODE (arg0) == VECTOR_CST)
8827         {
8828           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8829           int count = TYPE_VECTOR_SUBPARTS (type), i;
8830
8831           for (i = 0; i < count; i++)
8832             {
8833               if (elements)
8834                 {
8835                   elem = TREE_VALUE (elements);
8836                   elem = fold_unary_loc (loc, BIT_NOT_EXPR, TREE_TYPE (type), elem);
8837                   if (elem == NULL_TREE)
8838                     break;
8839                   elements = TREE_CHAIN (elements);
8840                 }
8841               else
8842                 elem = build_int_cst (TREE_TYPE (type), -1);
8843               list = tree_cons (NULL_TREE, elem, list);
8844             }
8845           if (i == count)
8846             return build_vector (type, nreverse (list));
8847         }
8848
8849       return NULL_TREE;
8850
8851     case TRUTH_NOT_EXPR:
8852       /* The argument to invert_truthvalue must have Boolean type.  */
8853       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8854           arg0 = fold_convert_loc (loc, boolean_type_node, arg0);
8855
8856       /* Note that the operand of this must be an int
8857          and its values must be 0 or 1.
8858          ("true" is a fixed value perhaps depending on the language,
8859          but we don't handle values other than 1 correctly yet.)  */
8860       tem = fold_truth_not_expr (loc, arg0);
8861       if (!tem)
8862         return NULL_TREE;
8863       return fold_convert_loc (loc, type, tem);
8864
8865     case REALPART_EXPR:
8866       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8867         return fold_convert_loc (loc, type, arg0);
8868       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8869         return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0),
8870                                  TREE_OPERAND (arg0, 1));
8871       if (TREE_CODE (arg0) == COMPLEX_CST)
8872         return fold_convert_loc (loc, type, TREE_REALPART (arg0));
8873       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8874         {
8875           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8876           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8877                              fold_build1_loc (loc, REALPART_EXPR, itype,
8878                                           TREE_OPERAND (arg0, 0)),
8879                              fold_build1_loc (loc, REALPART_EXPR, itype,
8880                                           TREE_OPERAND (arg0, 1)));
8881           return fold_convert_loc (loc, type, tem);
8882         }
8883       if (TREE_CODE (arg0) == CONJ_EXPR)
8884         {
8885           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8886           tem = fold_build1_loc (loc, REALPART_EXPR, itype,
8887                              TREE_OPERAND (arg0, 0));
8888           return fold_convert_loc (loc, type, tem);
8889         }
8890       if (TREE_CODE (arg0) == CALL_EXPR)
8891         {
8892           tree fn = get_callee_fndecl (arg0);
8893           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8894             switch (DECL_FUNCTION_CODE (fn))
8895               {
8896               CASE_FLT_FN (BUILT_IN_CEXPI):
8897                 fn = mathfn_built_in (type, BUILT_IN_COS);
8898                 if (fn)
8899                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8900                 break;
8901
8902               default:
8903                 break;
8904               }
8905         }
8906       return NULL_TREE;
8907
8908     case IMAGPART_EXPR:
8909       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8910         return fold_convert_loc (loc, type, integer_zero_node);
8911       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8912         return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 1),
8913                                  TREE_OPERAND (arg0, 0));
8914       if (TREE_CODE (arg0) == COMPLEX_CST)
8915         return fold_convert_loc (loc, type, TREE_IMAGPART (arg0));
8916       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8917         {
8918           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8919           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8920                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8921                                           TREE_OPERAND (arg0, 0)),
8922                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8923                                           TREE_OPERAND (arg0, 1)));
8924           return fold_convert_loc (loc, type, tem);
8925         }
8926       if (TREE_CODE (arg0) == CONJ_EXPR)
8927         {
8928           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8929           tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8930           return fold_convert_loc (loc, type, negate_expr (tem));
8931         }
8932       if (TREE_CODE (arg0) == CALL_EXPR)
8933         {
8934           tree fn = get_callee_fndecl (arg0);
8935           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8936             switch (DECL_FUNCTION_CODE (fn))
8937               {
8938               CASE_FLT_FN (BUILT_IN_CEXPI):
8939                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8940                 if (fn)
8941                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8942                 break;
8943
8944               default:
8945                 break;
8946               }
8947         }
8948       return NULL_TREE;
8949
8950     default:
8951       return NULL_TREE;
8952     } /* switch (code) */
8953 }
8954
8955
8956 /* If the operation was a conversion do _not_ mark a resulting constant
8957    with TREE_OVERFLOW if the original constant was not.  These conversions
8958    have implementation defined behavior and retaining the TREE_OVERFLOW
8959    flag here would confuse later passes such as VRP.  */
8960 tree
8961 fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code,
8962                                 tree type, tree op0)
8963 {
8964   tree res = fold_unary_loc (loc, code, type, op0);
8965   if (res
8966       && TREE_CODE (res) == INTEGER_CST
8967       && TREE_CODE (op0) == INTEGER_CST
8968       && CONVERT_EXPR_CODE_P (code))
8969     TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8970
8971   return res;
8972 }
8973
8974 /* Fold a binary expression of code CODE and type TYPE with operands
8975    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8976    Return the folded expression if folding is successful.  Otherwise,
8977    return NULL_TREE.  */
8978
8979 static tree
8980 fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
8981 {
8982   enum tree_code compl_code;
8983
8984   if (code == MIN_EXPR)
8985     compl_code = MAX_EXPR;
8986   else if (code == MAX_EXPR)
8987     compl_code = MIN_EXPR;
8988   else
8989     gcc_unreachable ();
8990
8991   /* MIN (MAX (a, b), b) == b.  */
8992   if (TREE_CODE (op0) == compl_code
8993       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8994     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
8995
8996   /* MIN (MAX (b, a), b) == b.  */
8997   if (TREE_CODE (op0) == compl_code
8998       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8999       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
9000     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
9001
9002   /* MIN (a, MAX (a, b)) == a.  */
9003   if (TREE_CODE (op1) == compl_code
9004       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
9005       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
9006     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
9007
9008   /* MIN (a, MAX (b, a)) == a.  */
9009   if (TREE_CODE (op1) == compl_code
9010       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
9011       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
9012     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
9013
9014   return NULL_TREE;
9015 }
9016
9017 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
9018    by changing CODE to reduce the magnitude of constants involved in
9019    ARG0 of the comparison.
9020    Returns a canonicalized comparison tree if a simplification was
9021    possible, otherwise returns NULL_TREE.
9022    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
9023    valid if signed overflow is undefined.  */
9024
9025 static tree
9026 maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
9027                                  tree arg0, tree arg1,
9028                                  bool *strict_overflow_p)
9029 {
9030   enum tree_code code0 = TREE_CODE (arg0);
9031   tree t, cst0 = NULL_TREE;
9032   int sgn0;
9033   bool swap = false;
9034
9035   /* Match A +- CST code arg1 and CST code arg1.  We can change the
9036      first form only if overflow is undefined.  */
9037   if (!((TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9038          /* In principle pointers also have undefined overflow behavior,
9039             but that causes problems elsewhere.  */
9040          && !POINTER_TYPE_P (TREE_TYPE (arg0))
9041          && (code0 == MINUS_EXPR
9042              || code0 == PLUS_EXPR)
9043          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9044         || code0 == INTEGER_CST))
9045     return NULL_TREE;
9046
9047   /* Identify the constant in arg0 and its sign.  */
9048   if (code0 == INTEGER_CST)
9049     cst0 = arg0;
9050   else
9051     cst0 = TREE_OPERAND (arg0, 1);
9052   sgn0 = tree_int_cst_sgn (cst0);
9053
9054   /* Overflowed constants and zero will cause problems.  */
9055   if (integer_zerop (cst0)
9056       || TREE_OVERFLOW (cst0))
9057     return NULL_TREE;
9058
9059   /* See if we can reduce the magnitude of the constant in
9060      arg0 by changing the comparison code.  */
9061   if (code0 == INTEGER_CST)
9062     {
9063       /* CST <= arg1  ->  CST-1 < arg1.  */
9064       if (code == LE_EXPR && sgn0 == 1)
9065         code = LT_EXPR;
9066       /* -CST < arg1  ->  -CST-1 <= arg1.  */
9067       else if (code == LT_EXPR && sgn0 == -1)
9068         code = LE_EXPR;
9069       /* CST > arg1  ->  CST-1 >= arg1.  */
9070       else if (code == GT_EXPR && sgn0 == 1)
9071         code = GE_EXPR;
9072       /* -CST >= arg1  ->  -CST-1 > arg1.  */
9073       else if (code == GE_EXPR && sgn0 == -1)
9074         code = GT_EXPR;
9075       else
9076         return NULL_TREE;
9077       /* arg1 code' CST' might be more canonical.  */
9078       swap = true;
9079     }
9080   else
9081     {
9082       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
9083       if (code == LT_EXPR
9084           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
9085         code = LE_EXPR;
9086       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
9087       else if (code == GT_EXPR
9088                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
9089         code = GE_EXPR;
9090       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
9091       else if (code == LE_EXPR
9092                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
9093         code = LT_EXPR;
9094       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
9095       else if (code == GE_EXPR
9096                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
9097         code = GT_EXPR;
9098       else
9099         return NULL_TREE;
9100       *strict_overflow_p = true;
9101     }
9102
9103   /* Now build the constant reduced in magnitude.  But not if that
9104      would produce one outside of its types range.  */
9105   if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
9106       && ((sgn0 == 1
9107            && TYPE_MIN_VALUE (TREE_TYPE (cst0))
9108            && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
9109           || (sgn0 == -1
9110               && TYPE_MAX_VALUE (TREE_TYPE (cst0))
9111               && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
9112     /* We cannot swap the comparison here as that would cause us to
9113        endlessly recurse.  */
9114     return NULL_TREE;
9115
9116   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
9117                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
9118   if (code0 != INTEGER_CST)
9119     t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
9120
9121   /* If swapping might yield to a more canonical form, do so.  */
9122   if (swap)
9123     return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t);
9124   else
9125     return fold_build2_loc (loc, code, type, t, arg1);
9126 }
9127
9128 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
9129    overflow further.  Try to decrease the magnitude of constants involved
9130    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
9131    and put sole constants at the second argument position.
9132    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
9133
9134 static tree
9135 maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type,
9136                                tree arg0, tree arg1)
9137 {
9138   tree t;
9139   bool strict_overflow_p;
9140   const char * const warnmsg = G_("assuming signed overflow does not occur "
9141                                   "when reducing constant in comparison");
9142
9143   /* Try canonicalization by simplifying arg0.  */
9144   strict_overflow_p = false;
9145   t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
9146                                        &strict_overflow_p);
9147   if (t)
9148     {
9149       if (strict_overflow_p)
9150         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
9151       return t;
9152     }
9153
9154   /* Try canonicalization by simplifying arg1 using the swapped
9155      comparison.  */
9156   code = swap_tree_comparison (code);
9157   strict_overflow_p = false;
9158   t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
9159                                        &strict_overflow_p);
9160   if (t && strict_overflow_p)
9161     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
9162   return t;
9163 }
9164
9165 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
9166    space.  This is used to avoid issuing overflow warnings for
9167    expressions like &p->x which can not wrap.  */
9168
9169 static bool
9170 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
9171 {
9172   unsigned HOST_WIDE_INT offset_low, total_low;
9173   HOST_WIDE_INT size, offset_high, total_high;
9174
9175   if (!POINTER_TYPE_P (TREE_TYPE (base)))
9176     return true;
9177
9178   if (bitpos < 0)
9179     return true;
9180
9181   if (offset == NULL_TREE)
9182     {
9183       offset_low = 0;
9184       offset_high = 0;
9185     }
9186   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
9187     return true;
9188   else
9189     {
9190       offset_low = TREE_INT_CST_LOW (offset);
9191       offset_high = TREE_INT_CST_HIGH (offset);
9192     }
9193
9194   if (add_double_with_sign (offset_low, offset_high,
9195                             bitpos / BITS_PER_UNIT, 0,
9196                             &total_low, &total_high,
9197                             true))
9198     return true;
9199
9200   if (total_high != 0)
9201     return true;
9202
9203   size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
9204   if (size <= 0)
9205     return true;
9206
9207   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
9208      array.  */
9209   if (TREE_CODE (base) == ADDR_EXPR)
9210     {
9211       HOST_WIDE_INT base_size;
9212
9213       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
9214       if (base_size > 0 && size < base_size)
9215         size = base_size;
9216     }
9217
9218   return total_low > (unsigned HOST_WIDE_INT) size;
9219 }
9220
9221 /* Subroutine of fold_binary.  This routine performs all of the
9222    transformations that are common to the equality/inequality
9223    operators (EQ_EXPR and NE_EXPR) and the ordering operators
9224    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
9225    fold_binary should call fold_binary.  Fold a comparison with
9226    tree code CODE and type TYPE with operands OP0 and OP1.  Return
9227    the folded comparison or NULL_TREE.  */
9228
9229 static tree
9230 fold_comparison (location_t loc, enum tree_code code, tree type,
9231                  tree op0, tree op1)
9232 {
9233   tree arg0, arg1, tem;
9234
9235   arg0 = op0;
9236   arg1 = op1;
9237
9238   STRIP_SIGN_NOPS (arg0);
9239   STRIP_SIGN_NOPS (arg1);
9240
9241   tem = fold_relational_const (code, type, arg0, arg1);
9242   if (tem != NULL_TREE)
9243     return tem;
9244
9245   /* If one arg is a real or integer constant, put it last.  */
9246   if (tree_swap_operands_p (arg0, arg1, true))
9247     return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
9248
9249   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
9250   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9251       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9252           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9253           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
9254       && (TREE_CODE (arg1) == INTEGER_CST
9255           && !TREE_OVERFLOW (arg1)))
9256     {
9257       tree const1 = TREE_OPERAND (arg0, 1);
9258       tree const2 = arg1;
9259       tree variable = TREE_OPERAND (arg0, 0);
9260       tree lhs;
9261       int lhs_add;
9262       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
9263
9264       lhs = fold_build2_loc (loc, lhs_add ? PLUS_EXPR : MINUS_EXPR,
9265                          TREE_TYPE (arg1), const2, const1);
9266
9267       /* If the constant operation overflowed this can be
9268          simplified as a comparison against INT_MAX/INT_MIN.  */
9269       if (TREE_CODE (lhs) == INTEGER_CST
9270           && TREE_OVERFLOW (lhs))
9271         {
9272           int const1_sgn = tree_int_cst_sgn (const1);
9273           enum tree_code code2 = code;
9274
9275           /* Get the sign of the constant on the lhs if the
9276              operation were VARIABLE + CONST1.  */
9277           if (TREE_CODE (arg0) == MINUS_EXPR)
9278             const1_sgn = -const1_sgn;
9279
9280           /* The sign of the constant determines if we overflowed
9281              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
9282              Canonicalize to the INT_MIN overflow by swapping the comparison
9283              if necessary.  */
9284           if (const1_sgn == -1)
9285             code2 = swap_tree_comparison (code);
9286
9287           /* We now can look at the canonicalized case
9288                VARIABLE + 1  CODE2  INT_MIN
9289              and decide on the result.  */
9290           if (code2 == LT_EXPR
9291               || code2 == LE_EXPR
9292               || code2 == EQ_EXPR)
9293             return omit_one_operand_loc (loc, type, boolean_false_node, variable);
9294           else if (code2 == NE_EXPR
9295                    || code2 == GE_EXPR
9296                    || code2 == GT_EXPR)
9297             return omit_one_operand_loc (loc, type, boolean_true_node, variable);
9298         }
9299
9300       if (TREE_CODE (lhs) == TREE_CODE (arg1)
9301           && (TREE_CODE (lhs) != INTEGER_CST
9302               || !TREE_OVERFLOW (lhs)))
9303         {
9304           fold_overflow_warning (("assuming signed overflow does not occur "
9305                                   "when changing X +- C1 cmp C2 to "
9306                                   "X cmp C1 +- C2"),
9307                                  WARN_STRICT_OVERFLOW_COMPARISON);
9308           return fold_build2_loc (loc, code, type, variable, lhs);
9309         }
9310     }
9311
9312   /* For comparisons of pointers we can decompose it to a compile time
9313      comparison of the base objects and the offsets into the object.
9314      This requires at least one operand being an ADDR_EXPR or a
9315      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
9316   if (POINTER_TYPE_P (TREE_TYPE (arg0))
9317       && (TREE_CODE (arg0) == ADDR_EXPR
9318           || TREE_CODE (arg1) == ADDR_EXPR
9319           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
9320           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
9321     {
9322       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
9323       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
9324       enum machine_mode mode;
9325       int volatilep, unsignedp;
9326       bool indirect_base0 = false, indirect_base1 = false;
9327
9328       /* Get base and offset for the access.  Strip ADDR_EXPR for
9329          get_inner_reference, but put it back by stripping INDIRECT_REF
9330          off the base object if possible.  indirect_baseN will be true
9331          if baseN is not an address but refers to the object itself.  */
9332       base0 = arg0;
9333       if (TREE_CODE (arg0) == ADDR_EXPR)
9334         {
9335           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
9336                                        &bitsize, &bitpos0, &offset0, &mode,
9337                                        &unsignedp, &volatilep, false);
9338           if (TREE_CODE (base0) == INDIRECT_REF)
9339             base0 = TREE_OPERAND (base0, 0);
9340           else
9341             indirect_base0 = true;
9342         }
9343       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9344         {
9345           base0 = TREE_OPERAND (arg0, 0);
9346           offset0 = TREE_OPERAND (arg0, 1);
9347         }
9348
9349       base1 = arg1;
9350       if (TREE_CODE (arg1) == ADDR_EXPR)
9351         {
9352           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
9353                                        &bitsize, &bitpos1, &offset1, &mode,
9354                                        &unsignedp, &volatilep, false);
9355           if (TREE_CODE (base1) == INDIRECT_REF)
9356             base1 = TREE_OPERAND (base1, 0);
9357           else
9358             indirect_base1 = true;
9359         }
9360       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9361         {
9362           base1 = TREE_OPERAND (arg1, 0);
9363           offset1 = TREE_OPERAND (arg1, 1);
9364         }
9365
9366       /* If we have equivalent bases we might be able to simplify.  */
9367       if (indirect_base0 == indirect_base1
9368           && operand_equal_p (base0, base1, 0))
9369         {
9370           /* We can fold this expression to a constant if the non-constant
9371              offset parts are equal.  */
9372           if ((offset0 == offset1
9373                || (offset0 && offset1
9374                    && operand_equal_p (offset0, offset1, 0)))
9375               && (code == EQ_EXPR
9376                   || code == NE_EXPR
9377                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
9378                 
9379             {
9380               if (code != EQ_EXPR
9381                   && code != NE_EXPR
9382                   && bitpos0 != bitpos1
9383                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9384                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9385                 fold_overflow_warning (("assuming pointer wraparound does not "
9386                                         "occur when comparing P +- C1 with "
9387                                         "P +- C2"),
9388                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
9389
9390               switch (code)
9391                 {
9392                 case EQ_EXPR:
9393                   return constant_boolean_node (bitpos0 == bitpos1, type);
9394                 case NE_EXPR:
9395                   return constant_boolean_node (bitpos0 != bitpos1, type);
9396                 case LT_EXPR:
9397                   return constant_boolean_node (bitpos0 < bitpos1, type);
9398                 case LE_EXPR:
9399                   return constant_boolean_node (bitpos0 <= bitpos1, type);
9400                 case GE_EXPR:
9401                   return constant_boolean_node (bitpos0 >= bitpos1, type);
9402                 case GT_EXPR:
9403                   return constant_boolean_node (bitpos0 > bitpos1, type);
9404                 default:;
9405                 }
9406             }
9407           /* We can simplify the comparison to a comparison of the variable
9408              offset parts if the constant offset parts are equal.
9409              Be careful to use signed size type here because otherwise we
9410              mess with array offsets in the wrong way.  This is possible
9411              because pointer arithmetic is restricted to retain within an
9412              object and overflow on pointer differences is undefined as of
9413              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
9414           else if (bitpos0 == bitpos1
9415                    && ((code == EQ_EXPR || code == NE_EXPR)
9416                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
9417             {
9418               tree signed_size_type_node;
9419               signed_size_type_node = signed_type_for (size_type_node);
9420
9421               /* By converting to signed size type we cover middle-end pointer
9422                  arithmetic which operates on unsigned pointer types of size
9423                  type size and ARRAY_REF offsets which are properly sign or
9424                  zero extended from their type in case it is narrower than
9425                  size type.  */
9426               if (offset0 == NULL_TREE)
9427                 offset0 = build_int_cst (signed_size_type_node, 0);
9428               else
9429                 offset0 = fold_convert_loc (loc, signed_size_type_node,
9430                                             offset0);
9431               if (offset1 == NULL_TREE)
9432                 offset1 = build_int_cst (signed_size_type_node, 0);
9433               else
9434                 offset1 = fold_convert_loc (loc, signed_size_type_node,
9435                                             offset1);
9436
9437               if (code != EQ_EXPR
9438                   && code != NE_EXPR
9439                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9440                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9441                 fold_overflow_warning (("assuming pointer wraparound does not "
9442                                         "occur when comparing P +- C1 with "
9443                                         "P +- C2"),
9444                                        WARN_STRICT_OVERFLOW_COMPARISON);
9445
9446               return fold_build2_loc (loc, code, type, offset0, offset1);
9447             }
9448         }
9449       /* For non-equal bases we can simplify if they are addresses
9450          of local binding decls or constants.  */
9451       else if (indirect_base0 && indirect_base1
9452                /* We know that !operand_equal_p (base0, base1, 0)
9453                   because the if condition was false.  But make
9454                   sure two decls are not the same.  */
9455                && base0 != base1
9456                && TREE_CODE (arg0) == ADDR_EXPR
9457                && TREE_CODE (arg1) == ADDR_EXPR
9458                && (((TREE_CODE (base0) == VAR_DECL
9459                      || TREE_CODE (base0) == PARM_DECL)
9460                     && (targetm.binds_local_p (base0)
9461                         || CONSTANT_CLASS_P (base1)))
9462                    || CONSTANT_CLASS_P (base0))
9463                && (((TREE_CODE (base1) == VAR_DECL
9464                      || TREE_CODE (base1) == PARM_DECL)
9465                     && (targetm.binds_local_p (base1)
9466                         || CONSTANT_CLASS_P (base0)))
9467                    || CONSTANT_CLASS_P (base1)))
9468         {
9469           if (code == EQ_EXPR)
9470             return omit_two_operands_loc (loc, type, boolean_false_node,
9471                                       arg0, arg1);
9472           else if (code == NE_EXPR)
9473             return omit_two_operands_loc (loc, type, boolean_true_node,
9474                                       arg0, arg1);
9475         }
9476       /* For equal offsets we can simplify to a comparison of the
9477          base addresses.  */
9478       else if (bitpos0 == bitpos1
9479                && (indirect_base0
9480                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9481                && (indirect_base1
9482                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9483                && ((offset0 == offset1)
9484                    || (offset0 && offset1
9485                        && operand_equal_p (offset0, offset1, 0))))
9486         {
9487           if (indirect_base0)
9488             base0 = build_fold_addr_expr_loc (loc, base0);
9489           if (indirect_base1)
9490             base1 = build_fold_addr_expr_loc (loc, base1);
9491           return fold_build2_loc (loc, code, type, base0, base1);
9492         }
9493     }
9494
9495   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9496      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
9497      the resulting offset is smaller in absolute value than the
9498      original one.  */
9499   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9500       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9501       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9502           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9503       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9504       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9505           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9506     {
9507       tree const1 = TREE_OPERAND (arg0, 1);
9508       tree const2 = TREE_OPERAND (arg1, 1);
9509       tree variable1 = TREE_OPERAND (arg0, 0);
9510       tree variable2 = TREE_OPERAND (arg1, 0);
9511       tree cst;
9512       const char * const warnmsg = G_("assuming signed overflow does not "
9513                                       "occur when combining constants around "
9514                                       "a comparison");
9515
9516       /* Put the constant on the side where it doesn't overflow and is
9517          of lower absolute value than before.  */
9518       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9519                              ? MINUS_EXPR : PLUS_EXPR,
9520                              const2, const1, 0);
9521       if (!TREE_OVERFLOW (cst)
9522           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
9523         {
9524           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9525           return fold_build2_loc (loc, code, type,
9526                               variable1,
9527                               fold_build2_loc (loc,
9528                                            TREE_CODE (arg1), TREE_TYPE (arg1),
9529                                            variable2, cst));
9530         }
9531
9532       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9533                              ? MINUS_EXPR : PLUS_EXPR,
9534                              const1, const2, 0);
9535       if (!TREE_OVERFLOW (cst)
9536           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
9537         {
9538           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9539           return fold_build2_loc (loc, code, type,
9540                               fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0),
9541                                            variable1, cst),
9542                               variable2);
9543         }
9544     }
9545
9546   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9547      signed arithmetic case.  That form is created by the compiler
9548      often enough for folding it to be of value.  One example is in
9549      computing loop trip counts after Operator Strength Reduction.  */
9550   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9551       && TREE_CODE (arg0) == MULT_EXPR
9552       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9553           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9554       && integer_zerop (arg1))
9555     {
9556       tree const1 = TREE_OPERAND (arg0, 1);
9557       tree const2 = arg1;                       /* zero */
9558       tree variable1 = TREE_OPERAND (arg0, 0);
9559       enum tree_code cmp_code = code;
9560
9561       gcc_assert (!integer_zerop (const1));
9562
9563       fold_overflow_warning (("assuming signed overflow does not occur when "
9564                               "eliminating multiplication in comparison "
9565                               "with zero"),
9566                              WARN_STRICT_OVERFLOW_COMPARISON);
9567
9568       /* If const1 is negative we swap the sense of the comparison.  */
9569       if (tree_int_cst_sgn (const1) < 0)
9570         cmp_code = swap_tree_comparison (cmp_code);
9571
9572       return fold_build2_loc (loc, cmp_code, type, variable1, const2);
9573     }
9574
9575   tem = maybe_canonicalize_comparison (loc, code, type, op0, op1);
9576   if (tem)
9577     return tem;
9578
9579   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9580     {
9581       tree targ0 = strip_float_extensions (arg0);
9582       tree targ1 = strip_float_extensions (arg1);
9583       tree newtype = TREE_TYPE (targ0);
9584
9585       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9586         newtype = TREE_TYPE (targ1);
9587
9588       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9589       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9590         return fold_build2_loc (loc, code, type,
9591                             fold_convert_loc (loc, newtype, targ0),
9592                             fold_convert_loc (loc, newtype, targ1));
9593
9594       /* (-a) CMP (-b) -> b CMP a  */
9595       if (TREE_CODE (arg0) == NEGATE_EXPR
9596           && TREE_CODE (arg1) == NEGATE_EXPR)
9597         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0),
9598                             TREE_OPERAND (arg0, 0));
9599
9600       if (TREE_CODE (arg1) == REAL_CST)
9601         {
9602           REAL_VALUE_TYPE cst;
9603           cst = TREE_REAL_CST (arg1);
9604
9605           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
9606           if (TREE_CODE (arg0) == NEGATE_EXPR)
9607             return fold_build2_loc (loc, swap_tree_comparison (code), type,
9608                                 TREE_OPERAND (arg0, 0),
9609                                 build_real (TREE_TYPE (arg1),
9610                                             REAL_VALUE_NEGATE (cst)));
9611
9612           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9613           /* a CMP (-0) -> a CMP 0  */
9614           if (REAL_VALUE_MINUS_ZERO (cst))
9615             return fold_build2_loc (loc, code, type, arg0,
9616                                 build_real (TREE_TYPE (arg1), dconst0));
9617
9618           /* x != NaN is always true, other ops are always false.  */
9619           if (REAL_VALUE_ISNAN (cst)
9620               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
9621             {
9622               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9623               return omit_one_operand_loc (loc, type, tem, arg0);
9624             }
9625
9626           /* Fold comparisons against infinity.  */
9627           if (REAL_VALUE_ISINF (cst)
9628               && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9629             {
9630               tem = fold_inf_compare (loc, code, type, arg0, arg1);
9631               if (tem != NULL_TREE)
9632                 return tem;
9633             }
9634         }
9635
9636       /* If this is a comparison of a real constant with a PLUS_EXPR
9637          or a MINUS_EXPR of a real constant, we can convert it into a
9638          comparison with a revised real constant as long as no overflow
9639          occurs when unsafe_math_optimizations are enabled.  */
9640       if (flag_unsafe_math_optimizations
9641           && TREE_CODE (arg1) == REAL_CST
9642           && (TREE_CODE (arg0) == PLUS_EXPR
9643               || TREE_CODE (arg0) == MINUS_EXPR)
9644           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9645           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9646                                       ? MINUS_EXPR : PLUS_EXPR,
9647                                       arg1, TREE_OPERAND (arg0, 1), 0))
9648           && !TREE_OVERFLOW (tem))
9649         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
9650
9651       /* Likewise, we can simplify a comparison of a real constant with
9652          a MINUS_EXPR whose first operand is also a real constant, i.e.
9653          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on 
9654          floating-point types only if -fassociative-math is set.  */
9655       if (flag_associative_math
9656           && TREE_CODE (arg1) == REAL_CST
9657           && TREE_CODE (arg0) == MINUS_EXPR
9658           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9659           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9660                                       arg1, 0))
9661           && !TREE_OVERFLOW (tem))
9662         return fold_build2_loc (loc, swap_tree_comparison (code), type,
9663                             TREE_OPERAND (arg0, 1), tem);
9664
9665       /* Fold comparisons against built-in math functions.  */
9666       if (TREE_CODE (arg1) == REAL_CST
9667           && flag_unsafe_math_optimizations
9668           && ! flag_errno_math)
9669         {
9670           enum built_in_function fcode = builtin_mathfn_code (arg0);
9671
9672           if (fcode != END_BUILTINS)
9673             {
9674               tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1);
9675               if (tem != NULL_TREE)
9676                 return tem;
9677             }
9678         }
9679     }
9680
9681   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9682       && CONVERT_EXPR_P (arg0))
9683     {
9684       /* If we are widening one operand of an integer comparison,
9685          see if the other operand is similarly being widened.  Perhaps we
9686          can do the comparison in the narrower type.  */
9687       tem = fold_widened_comparison (loc, code, type, arg0, arg1);
9688       if (tem)
9689         return tem;
9690
9691       /* Or if we are changing signedness.  */
9692       tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1);
9693       if (tem)
9694         return tem;
9695     }
9696
9697   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9698      constant, we can simplify it.  */
9699   if (TREE_CODE (arg1) == INTEGER_CST
9700       && (TREE_CODE (arg0) == MIN_EXPR
9701           || TREE_CODE (arg0) == MAX_EXPR)
9702       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9703     {
9704       tem = optimize_minmax_comparison (loc, code, type, op0, op1);
9705       if (tem)
9706         return tem;
9707     }
9708
9709   /* Simplify comparison of something with itself.  (For IEEE
9710      floating-point, we can only do some of these simplifications.)  */
9711   if (operand_equal_p (arg0, arg1, 0))
9712     {
9713       switch (code)
9714         {
9715         case EQ_EXPR:
9716           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9717               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9718             return constant_boolean_node (1, type);
9719           break;
9720
9721         case GE_EXPR:
9722         case LE_EXPR:
9723           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9724               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9725             return constant_boolean_node (1, type);
9726           return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1);
9727
9728         case NE_EXPR:
9729           /* For NE, we can only do this simplification if integer
9730              or we don't honor IEEE floating point NaNs.  */
9731           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9732               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9733             break;
9734           /* ... fall through ...  */
9735         case GT_EXPR:
9736         case LT_EXPR:
9737           return constant_boolean_node (0, type);
9738         default:
9739           gcc_unreachable ();
9740         }
9741     }
9742
9743   /* If we are comparing an expression that just has comparisons
9744      of two integer values, arithmetic expressions of those comparisons,
9745      and constants, we can simplify it.  There are only three cases
9746      to check: the two values can either be equal, the first can be
9747      greater, or the second can be greater.  Fold the expression for
9748      those three values.  Since each value must be 0 or 1, we have
9749      eight possibilities, each of which corresponds to the constant 0
9750      or 1 or one of the six possible comparisons.
9751
9752      This handles common cases like (a > b) == 0 but also handles
9753      expressions like  ((x > y) - (y > x)) > 0, which supposedly
9754      occur in macroized code.  */
9755
9756   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9757     {
9758       tree cval1 = 0, cval2 = 0;
9759       int save_p = 0;
9760
9761       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9762           /* Don't handle degenerate cases here; they should already
9763              have been handled anyway.  */
9764           && cval1 != 0 && cval2 != 0
9765           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9766           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9767           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9768           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9769           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9770           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9771                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9772         {
9773           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9774           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9775
9776           /* We can't just pass T to eval_subst in case cval1 or cval2
9777              was the same as ARG1.  */
9778
9779           tree high_result
9780                 = fold_build2_loc (loc, code, type,
9781                                eval_subst (loc, arg0, cval1, maxval,
9782                                            cval2, minval),
9783                                arg1);
9784           tree equal_result
9785                 = fold_build2_loc (loc, code, type,
9786                                eval_subst (loc, arg0, cval1, maxval,
9787                                            cval2, maxval),
9788                                arg1);
9789           tree low_result
9790                 = fold_build2_loc (loc, code, type,
9791                                eval_subst (loc, arg0, cval1, minval,
9792                                            cval2, maxval),
9793                                arg1);
9794
9795           /* All three of these results should be 0 or 1.  Confirm they are.
9796              Then use those values to select the proper code to use.  */
9797
9798           if (TREE_CODE (high_result) == INTEGER_CST
9799               && TREE_CODE (equal_result) == INTEGER_CST
9800               && TREE_CODE (low_result) == INTEGER_CST)
9801             {
9802               /* Make a 3-bit mask with the high-order bit being the
9803                  value for `>', the next for '=', and the low for '<'.  */
9804               switch ((integer_onep (high_result) * 4)
9805                       + (integer_onep (equal_result) * 2)
9806                       + integer_onep (low_result))
9807                 {
9808                 case 0:
9809                   /* Always false.  */
9810                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
9811                 case 1:
9812                   code = LT_EXPR;
9813                   break;
9814                 case 2:
9815                   code = EQ_EXPR;
9816                   break;
9817                 case 3:
9818                   code = LE_EXPR;
9819                   break;
9820                 case 4:
9821                   code = GT_EXPR;
9822                   break;
9823                 case 5:
9824                   code = NE_EXPR;
9825                   break;
9826                 case 6:
9827                   code = GE_EXPR;
9828                   break;
9829                 case 7:
9830                   /* Always true.  */
9831                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
9832                 }
9833
9834               if (save_p)
9835                 {
9836                   tem = save_expr (build2 (code, type, cval1, cval2));
9837                   SET_EXPR_LOCATION (tem, loc);
9838                   return tem;
9839                 }
9840               return fold_build2_loc (loc, code, type, cval1, cval2);
9841             }
9842         }
9843     }
9844
9845   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9846      into a single range test.  */
9847   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9848        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9849       && TREE_CODE (arg1) == INTEGER_CST
9850       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9851       && !integer_zerop (TREE_OPERAND (arg0, 1))
9852       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9853       && !TREE_OVERFLOW (arg1))
9854     {
9855       tem = fold_div_compare (loc, code, type, arg0, arg1);
9856       if (tem != NULL_TREE)
9857         return tem;
9858     }
9859
9860   /* Fold ~X op ~Y as Y op X.  */
9861   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9862       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9863     {
9864       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9865       return fold_build2_loc (loc, code, type,
9866                           fold_convert_loc (loc, cmp_type,
9867                                             TREE_OPERAND (arg1, 0)),
9868                           TREE_OPERAND (arg0, 0));
9869     }
9870
9871   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9872   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9873       && TREE_CODE (arg1) == INTEGER_CST)
9874     {
9875       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9876       return fold_build2_loc (loc, swap_tree_comparison (code), type,
9877                           TREE_OPERAND (arg0, 0),
9878                           fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type,
9879                                        fold_convert_loc (loc, cmp_type, arg1)));
9880     }
9881
9882   return NULL_TREE;
9883 }
9884
9885
9886 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9887    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9888    argument EXPR represents the expression "z" of type TYPE.  */
9889
9890 static tree
9891 fold_mult_zconjz (location_t loc, tree type, tree expr)
9892 {
9893   tree itype = TREE_TYPE (type);
9894   tree rpart, ipart, tem;
9895
9896   if (TREE_CODE (expr) == COMPLEX_EXPR)
9897     {
9898       rpart = TREE_OPERAND (expr, 0);
9899       ipart = TREE_OPERAND (expr, 1);
9900     }
9901   else if (TREE_CODE (expr) == COMPLEX_CST)
9902     {
9903       rpart = TREE_REALPART (expr);
9904       ipart = TREE_IMAGPART (expr);
9905     }
9906   else
9907     {
9908       expr = save_expr (expr);
9909       rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr);
9910       ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr);
9911     }
9912
9913   rpart = save_expr (rpart);
9914   ipart = save_expr (ipart);
9915   tem = fold_build2_loc (loc, PLUS_EXPR, itype,
9916                      fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart),
9917                      fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart));
9918   return fold_build2_loc (loc, COMPLEX_EXPR, type, tem,
9919                       fold_convert_loc (loc, itype, integer_zero_node));
9920 }
9921
9922
9923 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9924    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9925    guarantees that P and N have the same least significant log2(M) bits.
9926    N is not otherwise constrained.  In particular, N is not normalized to
9927    0 <= N < M as is common.  In general, the precise value of P is unknown.
9928    M is chosen as large as possible such that constant N can be determined.
9929
9930    Returns M and sets *RESIDUE to N.
9931
9932    If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9933    account.  This is not always possible due to PR 35705.
9934  */
9935
9936 static unsigned HOST_WIDE_INT
9937 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9938                                  bool allow_func_align)
9939 {
9940   enum tree_code code;
9941
9942   *residue = 0;
9943
9944   code = TREE_CODE (expr);
9945   if (code == ADDR_EXPR)
9946     {
9947       expr = TREE_OPERAND (expr, 0);
9948       if (handled_component_p (expr))
9949         {
9950           HOST_WIDE_INT bitsize, bitpos;
9951           tree offset;
9952           enum machine_mode mode;
9953           int unsignedp, volatilep;
9954
9955           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9956                                       &mode, &unsignedp, &volatilep, false);
9957           *residue = bitpos / BITS_PER_UNIT;
9958           if (offset)
9959             {
9960               if (TREE_CODE (offset) == INTEGER_CST)
9961                 *residue += TREE_INT_CST_LOW (offset);
9962               else
9963                 /* We don't handle more complicated offset expressions.  */
9964                 return 1;
9965             }
9966         }
9967
9968       if (DECL_P (expr)
9969           && (allow_func_align || TREE_CODE (expr) != FUNCTION_DECL))
9970         return DECL_ALIGN_UNIT (expr);
9971     }
9972   else if (code == POINTER_PLUS_EXPR)
9973     {
9974       tree op0, op1;
9975       unsigned HOST_WIDE_INT modulus;
9976       enum tree_code inner_code;
9977       
9978       op0 = TREE_OPERAND (expr, 0);
9979       STRIP_NOPS (op0);
9980       modulus = get_pointer_modulus_and_residue (op0, residue,
9981                                                  allow_func_align);
9982
9983       op1 = TREE_OPERAND (expr, 1);
9984       STRIP_NOPS (op1);
9985       inner_code = TREE_CODE (op1);
9986       if (inner_code == INTEGER_CST)
9987         {
9988           *residue += TREE_INT_CST_LOW (op1);
9989           return modulus;
9990         }
9991       else if (inner_code == MULT_EXPR)
9992         {
9993           op1 = TREE_OPERAND (op1, 1);
9994           if (TREE_CODE (op1) == INTEGER_CST)
9995             {
9996               unsigned HOST_WIDE_INT align;
9997               
9998               /* Compute the greatest power-of-2 divisor of op1.  */
9999               align = TREE_INT_CST_LOW (op1);
10000               align &= -align;
10001
10002               /* If align is non-zero and less than *modulus, replace
10003                  *modulus with align., If align is 0, then either op1 is 0
10004                  or the greatest power-of-2 divisor of op1 doesn't fit in an
10005                  unsigned HOST_WIDE_INT.  In either case, no additional
10006                  constraint is imposed.  */
10007               if (align)
10008                 modulus = MIN (modulus, align);
10009
10010               return modulus;
10011             }
10012         }
10013     }
10014
10015     /* If we get here, we were unable to determine anything useful about the
10016        expression.  */
10017     return 1;
10018 }
10019
10020
10021 /* Fold a binary expression of code CODE and type TYPE with operands
10022    OP0 and OP1.  LOC is the location of the resulting expression.
10023    Return the folded expression if folding is successful.  Otherwise,
10024    return NULL_TREE.  */
10025
10026 tree
10027 fold_binary_loc (location_t loc,
10028              enum tree_code code, tree type, tree op0, tree op1)
10029 {
10030   enum tree_code_class kind = TREE_CODE_CLASS (code);
10031   tree arg0, arg1, tem;
10032   tree t1 = NULL_TREE;
10033   bool strict_overflow_p;
10034
10035   gcc_assert (IS_EXPR_CODE_CLASS (kind)
10036               && TREE_CODE_LENGTH (code) == 2
10037               && op0 != NULL_TREE
10038               && op1 != NULL_TREE);
10039
10040   arg0 = op0;
10041   arg1 = op1;
10042
10043   /* Strip any conversions that don't change the mode.  This is
10044      safe for every expression, except for a comparison expression
10045      because its signedness is derived from its operands.  So, in
10046      the latter case, only strip conversions that don't change the
10047      signedness.  MIN_EXPR/MAX_EXPR also need signedness of arguments
10048      preserved.
10049
10050      Note that this is done as an internal manipulation within the
10051      constant folder, in order to find the simplest representation
10052      of the arguments so that their form can be studied.  In any
10053      cases, the appropriate type conversions should be put back in
10054      the tree that will get out of the constant folder.  */
10055
10056   if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
10057     {
10058       STRIP_SIGN_NOPS (arg0);
10059       STRIP_SIGN_NOPS (arg1);
10060     }
10061   else
10062     {
10063       STRIP_NOPS (arg0);
10064       STRIP_NOPS (arg1);
10065     }
10066
10067   /* Note that TREE_CONSTANT isn't enough: static var addresses are
10068      constant but we can't do arithmetic on them.  */
10069   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
10070       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
10071       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
10072       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
10073       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
10074       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
10075     {
10076       if (kind == tcc_binary)
10077         {
10078           /* Make sure type and arg0 have the same saturating flag.  */
10079           gcc_assert (TYPE_SATURATING (type)
10080                       == TYPE_SATURATING (TREE_TYPE (arg0)));
10081           tem = const_binop (code, arg0, arg1, 0);
10082         }
10083       else if (kind == tcc_comparison)
10084         tem = fold_relational_const (code, type, arg0, arg1);
10085       else
10086         tem = NULL_TREE;
10087
10088       if (tem != NULL_TREE)
10089         {
10090           if (TREE_TYPE (tem) != type)
10091             tem = fold_convert_loc (loc, type, tem);
10092           return tem;
10093         }
10094     }
10095
10096   /* If this is a commutative operation, and ARG0 is a constant, move it
10097      to ARG1 to reduce the number of tests below.  */
10098   if (commutative_tree_code (code)
10099       && tree_swap_operands_p (arg0, arg1, true))
10100     return fold_build2_loc (loc, code, type, op1, op0);
10101
10102   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
10103
10104      First check for cases where an arithmetic operation is applied to a
10105      compound, conditional, or comparison operation.  Push the arithmetic
10106      operation inside the compound or conditional to see if any folding
10107      can then be done.  Convert comparison to conditional for this purpose.
10108      The also optimizes non-constant cases that used to be done in
10109      expand_expr.
10110
10111      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
10112      one of the operands is a comparison and the other is a comparison, a
10113      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
10114      code below would make the expression more complex.  Change it to a
10115      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
10116      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
10117
10118   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
10119        || code == EQ_EXPR || code == NE_EXPR)
10120       && ((truth_value_p (TREE_CODE (arg0))
10121            && (truth_value_p (TREE_CODE (arg1))
10122                || (TREE_CODE (arg1) == BIT_AND_EXPR
10123                    && integer_onep (TREE_OPERAND (arg1, 1)))))
10124           || (truth_value_p (TREE_CODE (arg1))
10125               && (truth_value_p (TREE_CODE (arg0))
10126                   || (TREE_CODE (arg0) == BIT_AND_EXPR
10127                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
10128     {
10129       tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR
10130                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
10131                          : TRUTH_XOR_EXPR,
10132                          boolean_type_node,
10133                          fold_convert_loc (loc, boolean_type_node, arg0),
10134                          fold_convert_loc (loc, boolean_type_node, arg1));
10135
10136       if (code == EQ_EXPR)
10137         tem = invert_truthvalue_loc (loc, tem);
10138
10139       return fold_convert_loc (loc, type, tem);
10140     }
10141
10142   if (TREE_CODE_CLASS (code) == tcc_binary
10143       || TREE_CODE_CLASS (code) == tcc_comparison)
10144     {
10145       if (TREE_CODE (arg0) == COMPOUND_EXPR)
10146         {
10147           tem = fold_build2_loc (loc, code, type,
10148                              fold_convert_loc (loc, TREE_TYPE (op0),
10149                                                TREE_OPERAND (arg0, 1)), op1);
10150           protected_set_expr_location (tem, loc);
10151           tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), tem);
10152           goto fold_binary_exit;
10153         }
10154       if (TREE_CODE (arg1) == COMPOUND_EXPR
10155           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10156         {
10157           tem = fold_build2_loc (loc, code, type, op0,
10158                              fold_convert_loc (loc, TREE_TYPE (op1),
10159                                                TREE_OPERAND (arg1, 1)));
10160           protected_set_expr_location (tem, loc);
10161           tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0), tem);
10162           goto fold_binary_exit;
10163         }
10164
10165       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
10166         {
10167           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10168                                                      arg0, arg1, 
10169                                                      /*cond_first_p=*/1);
10170           if (tem != NULL_TREE)
10171             return tem;
10172         }
10173
10174       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
10175         {
10176           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10177                                                      arg1, arg0, 
10178                                                      /*cond_first_p=*/0);
10179           if (tem != NULL_TREE)
10180             return tem;
10181         }
10182     }
10183
10184   switch (code)
10185     {
10186     case POINTER_PLUS_EXPR:
10187       /* 0 +p index -> (type)index */
10188       if (integer_zerop (arg0))
10189         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
10190
10191       /* PTR +p 0 -> PTR */
10192       if (integer_zerop (arg1))
10193         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10194
10195       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
10196       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10197            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10198         return fold_convert_loc (loc, type,
10199                                  fold_build2_loc (loc, PLUS_EXPR, sizetype,
10200                                               fold_convert_loc (loc, sizetype,
10201                                                                 arg1),
10202                                               fold_convert_loc (loc, sizetype,
10203                                                                 arg0)));
10204
10205       /* index +p PTR -> PTR +p index */
10206       if (POINTER_TYPE_P (TREE_TYPE (arg1))
10207           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10208         return fold_build2_loc (loc, POINTER_PLUS_EXPR, type,
10209                             fold_convert_loc (loc, type, arg1),
10210                             fold_convert_loc (loc, sizetype, arg0));
10211
10212       /* (PTR +p B) +p A -> PTR +p (B + A) */
10213       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10214         {
10215           tree inner;
10216           tree arg01 = fold_convert_loc (loc, sizetype, TREE_OPERAND (arg0, 1));
10217           tree arg00 = TREE_OPERAND (arg0, 0);
10218           inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
10219                                arg01, fold_convert_loc (loc, sizetype, arg1));
10220           return fold_convert_loc (loc, type,
10221                                    fold_build2_loc (loc, POINTER_PLUS_EXPR,
10222                                                 TREE_TYPE (arg00),
10223                                                 arg00, inner));
10224         }
10225
10226       /* PTR_CST +p CST -> CST1 */
10227       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
10228         return fold_build2_loc (loc, PLUS_EXPR, type, arg0,
10229                             fold_convert_loc (loc, type, arg1));
10230
10231      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
10232         of the array.  Loop optimizer sometimes produce this type of
10233         expressions.  */
10234       if (TREE_CODE (arg0) == ADDR_EXPR)
10235         {
10236           tem = try_move_mult_to_index (loc, arg0,
10237                                         fold_convert_loc (loc, sizetype, arg1));
10238           if (tem)
10239             return fold_convert_loc (loc, type, tem);
10240         }
10241
10242       return NULL_TREE;
10243
10244     case PLUS_EXPR:
10245       /* A + (-B) -> A - B */
10246       if (TREE_CODE (arg1) == NEGATE_EXPR)
10247         return fold_build2_loc (loc, MINUS_EXPR, type,
10248                             fold_convert_loc (loc, type, arg0),
10249                             fold_convert_loc (loc, type,
10250                                               TREE_OPERAND (arg1, 0)));
10251       /* (-A) + B -> B - A */
10252       if (TREE_CODE (arg0) == NEGATE_EXPR
10253           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
10254         return fold_build2_loc (loc, MINUS_EXPR, type,
10255                             fold_convert_loc (loc, type, arg1),
10256                             fold_convert_loc (loc, type,
10257                                               TREE_OPERAND (arg0, 0)));
10258
10259       if (INTEGRAL_TYPE_P (type))
10260         {
10261           /* Convert ~A + 1 to -A.  */
10262           if (TREE_CODE (arg0) == BIT_NOT_EXPR
10263               && integer_onep (arg1))
10264             return fold_build1_loc (loc, NEGATE_EXPR, type,
10265                                 fold_convert_loc (loc, type,
10266                                                   TREE_OPERAND (arg0, 0)));
10267
10268           /* ~X + X is -1.  */
10269           if (TREE_CODE (arg0) == BIT_NOT_EXPR
10270               && !TYPE_OVERFLOW_TRAPS (type))
10271             {
10272               tree tem = TREE_OPERAND (arg0, 0);
10273
10274               STRIP_NOPS (tem);
10275               if (operand_equal_p (tem, arg1, 0))
10276                 {
10277                   t1 = build_int_cst_type (type, -1);
10278                   return omit_one_operand_loc (loc, type, t1, arg1);
10279                 }
10280             }
10281
10282           /* X + ~X is -1.  */
10283           if (TREE_CODE (arg1) == BIT_NOT_EXPR
10284               && !TYPE_OVERFLOW_TRAPS (type))
10285             {
10286               tree tem = TREE_OPERAND (arg1, 0);
10287
10288               STRIP_NOPS (tem);
10289               if (operand_equal_p (arg0, tem, 0))
10290                 {
10291                   t1 = build_int_cst_type (type, -1);
10292                   return omit_one_operand_loc (loc, type, t1, arg0);
10293                 }
10294             }
10295
10296           /* X + (X / CST) * -CST is X % CST.  */
10297           if (TREE_CODE (arg1) == MULT_EXPR
10298               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10299               && operand_equal_p (arg0,
10300                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
10301             {
10302               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
10303               tree cst1 = TREE_OPERAND (arg1, 1);
10304               tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1),
10305                                       cst1, cst0);
10306               if (sum && integer_zerop (sum))
10307                 return fold_convert_loc (loc, type,
10308                                          fold_build2_loc (loc, TRUNC_MOD_EXPR,
10309                                                       TREE_TYPE (arg0), arg0,
10310                                                       cst0));
10311             }
10312         }
10313
10314       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
10315          same or one.  Make sure type is not saturating.
10316          fold_plusminus_mult_expr will re-associate.  */
10317       if ((TREE_CODE (arg0) == MULT_EXPR
10318            || TREE_CODE (arg1) == MULT_EXPR)
10319           && !TYPE_SATURATING (type)
10320           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10321         {
10322           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10323           if (tem)
10324             return tem;
10325         }
10326
10327       if (! FLOAT_TYPE_P (type))
10328         {
10329           if (integer_zerop (arg1))
10330             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10331
10332           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
10333              with a constant, and the two constants have no bits in common,
10334              we should treat this as a BIT_IOR_EXPR since this may produce more
10335              simplifications.  */
10336           if (TREE_CODE (arg0) == BIT_AND_EXPR
10337               && TREE_CODE (arg1) == BIT_AND_EXPR
10338               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10339               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10340               && integer_zerop (const_binop (BIT_AND_EXPR,
10341                                              TREE_OPERAND (arg0, 1),
10342                                              TREE_OPERAND (arg1, 1), 0)))
10343             {
10344               code = BIT_IOR_EXPR;
10345               goto bit_ior;
10346             }
10347
10348           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
10349              (plus (plus (mult) (mult)) (foo)) so that we can
10350              take advantage of the factoring cases below.  */
10351           if (((TREE_CODE (arg0) == PLUS_EXPR
10352                 || TREE_CODE (arg0) == MINUS_EXPR)
10353                && TREE_CODE (arg1) == MULT_EXPR)
10354               || ((TREE_CODE (arg1) == PLUS_EXPR
10355                    || TREE_CODE (arg1) == MINUS_EXPR)
10356                   && TREE_CODE (arg0) == MULT_EXPR))
10357             {
10358               tree parg0, parg1, parg, marg;
10359               enum tree_code pcode;
10360
10361               if (TREE_CODE (arg1) == MULT_EXPR)
10362                 parg = arg0, marg = arg1;
10363               else
10364                 parg = arg1, marg = arg0;
10365               pcode = TREE_CODE (parg);
10366               parg0 = TREE_OPERAND (parg, 0);
10367               parg1 = TREE_OPERAND (parg, 1);
10368               STRIP_NOPS (parg0);
10369               STRIP_NOPS (parg1);
10370
10371               if (TREE_CODE (parg0) == MULT_EXPR
10372                   && TREE_CODE (parg1) != MULT_EXPR)
10373                 return fold_build2_loc (loc, pcode, type,
10374                                     fold_build2_loc (loc, PLUS_EXPR, type,
10375                                                  fold_convert_loc (loc, type,
10376                                                                    parg0),
10377                                                  fold_convert_loc (loc, type,
10378                                                                    marg)),
10379                                     fold_convert_loc (loc, type, parg1));
10380               if (TREE_CODE (parg0) != MULT_EXPR
10381                   && TREE_CODE (parg1) == MULT_EXPR)
10382                 return
10383                   fold_build2_loc (loc, PLUS_EXPR, type,
10384                                fold_convert_loc (loc, type, parg0),
10385                                fold_build2_loc (loc, pcode, type,
10386                                             fold_convert_loc (loc, type, marg),
10387                                             fold_convert_loc (loc, type,
10388                                                               parg1)));
10389             }
10390         }
10391       else
10392         {
10393           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
10394           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
10395             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10396
10397           /* Likewise if the operands are reversed.  */
10398           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10399             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
10400
10401           /* Convert X + -C into X - C.  */
10402           if (TREE_CODE (arg1) == REAL_CST
10403               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
10404             {
10405               tem = fold_negate_const (arg1, type);
10406               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
10407                 return fold_build2_loc (loc, MINUS_EXPR, type,
10408                                     fold_convert_loc (loc, type, arg0),
10409                                     fold_convert_loc (loc, type, tem));
10410             }
10411
10412           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10413              to __complex__ ( x, y ).  This is not the same for SNaNs or
10414              if signed zeros are involved.  */
10415           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10416               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10417               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10418             {
10419               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10420               tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10421               tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10422               bool arg0rz = false, arg0iz = false;
10423               if ((arg0r && (arg0rz = real_zerop (arg0r)))
10424                   || (arg0i && (arg0iz = real_zerop (arg0i))))
10425                 {
10426                   tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10427                   tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10428                   if (arg0rz && arg1i && real_zerop (arg1i))
10429                     {
10430                       tree rp = arg1r ? arg1r
10431                                   : build1 (REALPART_EXPR, rtype, arg1);
10432                       tree ip = arg0i ? arg0i
10433                                   : build1 (IMAGPART_EXPR, rtype, arg0);
10434                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10435                     }
10436                   else if (arg0iz && arg1r && real_zerop (arg1r))
10437                     {
10438                       tree rp = arg0r ? arg0r
10439                                   : build1 (REALPART_EXPR, rtype, arg0);
10440                       tree ip = arg1i ? arg1i
10441                                   : build1 (IMAGPART_EXPR, rtype, arg1);
10442                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10443                     }
10444                 }
10445             }
10446
10447           if (flag_unsafe_math_optimizations
10448               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10449               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10450               && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10451             return tem;
10452
10453           /* Convert x+x into x*2.0.  */
10454           if (operand_equal_p (arg0, arg1, 0)
10455               && SCALAR_FLOAT_TYPE_P (type))
10456             return fold_build2_loc (loc, MULT_EXPR, type, arg0,
10457                                 build_real (type, dconst2));
10458
10459           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.  
10460              We associate floats only if the user has specified
10461              -fassociative-math.  */
10462           if (flag_associative_math
10463               && TREE_CODE (arg1) == PLUS_EXPR
10464               && TREE_CODE (arg0) != MULT_EXPR)
10465             {
10466               tree tree10 = TREE_OPERAND (arg1, 0);
10467               tree tree11 = TREE_OPERAND (arg1, 1);
10468               if (TREE_CODE (tree11) == MULT_EXPR
10469                   && TREE_CODE (tree10) == MULT_EXPR)
10470                 {
10471                   tree tree0;
10472                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10);
10473                   return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11);
10474                 }
10475             }
10476           /* Convert (b*c + d*e) + a into b*c + (d*e +a).  
10477              We associate floats only if the user has specified
10478              -fassociative-math.  */
10479           if (flag_associative_math
10480               && TREE_CODE (arg0) == PLUS_EXPR
10481               && TREE_CODE (arg1) != MULT_EXPR)
10482             {
10483               tree tree00 = TREE_OPERAND (arg0, 0);
10484               tree tree01 = TREE_OPERAND (arg0, 1);
10485               if (TREE_CODE (tree01) == MULT_EXPR
10486                   && TREE_CODE (tree00) == MULT_EXPR)
10487                 {
10488                   tree tree0;
10489                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1);
10490                   return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0);
10491                 }
10492             }
10493         }
10494
10495      bit_rotate:
10496       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10497          is a rotate of A by C1 bits.  */
10498       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10499          is a rotate of A by B bits.  */
10500       {
10501         enum tree_code code0, code1;
10502         tree rtype;
10503         code0 = TREE_CODE (arg0);
10504         code1 = TREE_CODE (arg1);
10505         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10506              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10507             && operand_equal_p (TREE_OPERAND (arg0, 0),
10508                                 TREE_OPERAND (arg1, 0), 0)
10509             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10510                 TYPE_UNSIGNED (rtype))
10511             /* Only create rotates in complete modes.  Other cases are not
10512                expanded properly.  */
10513             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
10514           {
10515             tree tree01, tree11;
10516             enum tree_code code01, code11;
10517
10518             tree01 = TREE_OPERAND (arg0, 1);
10519             tree11 = TREE_OPERAND (arg1, 1);
10520             STRIP_NOPS (tree01);
10521             STRIP_NOPS (tree11);
10522             code01 = TREE_CODE (tree01);
10523             code11 = TREE_CODE (tree11);
10524             if (code01 == INTEGER_CST
10525                 && code11 == INTEGER_CST
10526                 && TREE_INT_CST_HIGH (tree01) == 0
10527                 && TREE_INT_CST_HIGH (tree11) == 0
10528                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
10529                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10530               {
10531                 tem = build2 (LROTATE_EXPR,
10532                               TREE_TYPE (TREE_OPERAND (arg0, 0)),
10533                               TREE_OPERAND (arg0, 0),
10534                               code0 == LSHIFT_EXPR
10535                               ? tree01 : tree11);
10536                 SET_EXPR_LOCATION (tem, loc);
10537                 return fold_convert_loc (loc, type, tem);
10538               }
10539             else if (code11 == MINUS_EXPR)
10540               {
10541                 tree tree110, tree111;
10542                 tree110 = TREE_OPERAND (tree11, 0);
10543                 tree111 = TREE_OPERAND (tree11, 1);
10544                 STRIP_NOPS (tree110);
10545                 STRIP_NOPS (tree111);
10546                 if (TREE_CODE (tree110) == INTEGER_CST
10547                     && 0 == compare_tree_int (tree110,
10548                                               TYPE_PRECISION
10549                                               (TREE_TYPE (TREE_OPERAND
10550                                                           (arg0, 0))))
10551                     && operand_equal_p (tree01, tree111, 0))
10552                   return
10553                     fold_convert_loc (loc, type,
10554                                       build2 ((code0 == LSHIFT_EXPR
10555                                                ? LROTATE_EXPR
10556                                                : RROTATE_EXPR),
10557                                               TREE_TYPE (TREE_OPERAND (arg0, 0)),
10558                                               TREE_OPERAND (arg0, 0), tree01));
10559               }
10560             else if (code01 == MINUS_EXPR)
10561               {
10562                 tree tree010, tree011;
10563                 tree010 = TREE_OPERAND (tree01, 0);
10564                 tree011 = TREE_OPERAND (tree01, 1);
10565                 STRIP_NOPS (tree010);
10566                 STRIP_NOPS (tree011);
10567                 if (TREE_CODE (tree010) == INTEGER_CST
10568                     && 0 == compare_tree_int (tree010,
10569                                               TYPE_PRECISION
10570                                               (TREE_TYPE (TREE_OPERAND
10571                                                           (arg0, 0))))
10572                     && operand_equal_p (tree11, tree011, 0))
10573                     return fold_convert_loc
10574                       (loc, type,
10575                        build2 ((code0 != LSHIFT_EXPR
10576                                 ? LROTATE_EXPR
10577                                 : RROTATE_EXPR),
10578                                TREE_TYPE (TREE_OPERAND (arg0, 0)),
10579                                TREE_OPERAND (arg0, 0), tree11));
10580               }
10581           }
10582       }
10583
10584     associate:
10585       /* In most languages, can't associate operations on floats through
10586          parentheses.  Rather than remember where the parentheses were, we
10587          don't associate floats at all, unless the user has specified
10588          -fassociative-math.
10589          And, we need to make sure type is not saturating.  */
10590
10591       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10592           && !TYPE_SATURATING (type))
10593         {
10594           tree var0, con0, lit0, minus_lit0;
10595           tree var1, con1, lit1, minus_lit1;
10596           bool ok = true;
10597
10598           /* Split both trees into variables, constants, and literals.  Then
10599              associate each group together, the constants with literals,
10600              then the result with variables.  This increases the chances of
10601              literals being recombined later and of generating relocatable
10602              expressions for the sum of a constant and literal.  */
10603           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
10604           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
10605                              code == MINUS_EXPR);
10606
10607           /* With undefined overflow we can only associate constants
10608              with one variable.  */
10609           if (((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10610                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10611               && var0 && var1)
10612             {
10613               tree tmp0 = var0;
10614               tree tmp1 = var1;
10615
10616               if (TREE_CODE (tmp0) == NEGATE_EXPR)
10617                 tmp0 = TREE_OPERAND (tmp0, 0);
10618               if (TREE_CODE (tmp1) == NEGATE_EXPR)
10619                 tmp1 = TREE_OPERAND (tmp1, 0);
10620               /* The only case we can still associate with two variables
10621                  is if they are the same, modulo negation.  */
10622               if (!operand_equal_p (tmp0, tmp1, 0))
10623                 ok = false;
10624             }
10625
10626           /* Only do something if we found more than two objects.  Otherwise,
10627              nothing has changed and we risk infinite recursion.  */
10628           if (ok
10629               && (2 < ((var0 != 0) + (var1 != 0)
10630                        + (con0 != 0) + (con1 != 0)
10631                        + (lit0 != 0) + (lit1 != 0)
10632                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
10633             {
10634               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
10635               if (code == MINUS_EXPR)
10636                 code = PLUS_EXPR;
10637
10638               var0 = associate_trees (loc, var0, var1, code, type);
10639               con0 = associate_trees (loc, con0, con1, code, type);
10640               lit0 = associate_trees (loc, lit0, lit1, code, type);
10641               minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1, code, type);
10642
10643               /* Preserve the MINUS_EXPR if the negative part of the literal is
10644                  greater than the positive part.  Otherwise, the multiplicative
10645                  folding code (i.e extract_muldiv) may be fooled in case
10646                  unsigned constants are subtracted, like in the following
10647                  example: ((X*2 + 4) - 8U)/2.  */
10648               if (minus_lit0 && lit0)
10649                 {
10650                   if (TREE_CODE (lit0) == INTEGER_CST
10651                       && TREE_CODE (minus_lit0) == INTEGER_CST
10652                       && tree_int_cst_lt (lit0, minus_lit0))
10653                     {
10654                       minus_lit0 = associate_trees (loc, minus_lit0, lit0,
10655                                                     MINUS_EXPR, type);
10656                       lit0 = 0;
10657                     }
10658                   else
10659                     {
10660                       lit0 = associate_trees (loc, lit0, minus_lit0,
10661                                               MINUS_EXPR, type);
10662                       minus_lit0 = 0;
10663                     }
10664                 }
10665               if (minus_lit0)
10666                 {
10667                   if (con0 == 0)
10668                     return
10669                       fold_convert_loc (loc, type,
10670                                         associate_trees (loc, var0, minus_lit0,
10671                                                          MINUS_EXPR, type));
10672                   else
10673                     {
10674                       con0 = associate_trees (loc, con0, minus_lit0,
10675                                               MINUS_EXPR, type);
10676                       return
10677                         fold_convert_loc (loc, type,
10678                                           associate_trees (loc, var0, con0,
10679                                                            PLUS_EXPR, type));
10680                     }
10681                 }
10682
10683               con0 = associate_trees (loc, con0, lit0, code, type);
10684               return
10685                 fold_convert_loc (loc, type, associate_trees (loc, var0, con0,
10686                                                               code, type));
10687             }
10688         }
10689
10690       return NULL_TREE;
10691
10692     case MINUS_EXPR:
10693       /* Pointer simplifications for subtraction, simple reassociations. */
10694       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10695         {
10696           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10697           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10698               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10699             {
10700               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10701               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10702               tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
10703               tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
10704               return fold_build2_loc (loc, PLUS_EXPR, type,
10705                                   fold_build2_loc (loc, MINUS_EXPR, type,
10706                                                arg00, arg10),
10707                                   fold_build2_loc (loc, MINUS_EXPR, type,
10708                                                arg01, arg11));
10709             }
10710           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10711           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10712             {
10713               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10714               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10715               tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00,
10716                                       fold_convert_loc (loc, type, arg1));
10717               if (tmp)
10718                 return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01);
10719             }
10720         }
10721       /* A - (-B) -> A + B */
10722       if (TREE_CODE (arg1) == NEGATE_EXPR)
10723         return fold_build2_loc (loc, PLUS_EXPR, type, op0,
10724                             fold_convert_loc (loc, type,
10725                                               TREE_OPERAND (arg1, 0)));
10726       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
10727       if (TREE_CODE (arg0) == NEGATE_EXPR
10728           && (FLOAT_TYPE_P (type)
10729               || INTEGRAL_TYPE_P (type))
10730           && negate_expr_p (arg1)
10731           && reorder_operands_p (arg0, arg1))
10732         return fold_build2_loc (loc, MINUS_EXPR, type,
10733                             fold_convert_loc (loc, type,
10734                                               negate_expr (arg1)),
10735                             fold_convert_loc (loc, type,
10736                                               TREE_OPERAND (arg0, 0)));
10737       /* Convert -A - 1 to ~A.  */
10738       if (INTEGRAL_TYPE_P (type)
10739           && TREE_CODE (arg0) == NEGATE_EXPR
10740           && integer_onep (arg1)
10741           && !TYPE_OVERFLOW_TRAPS (type))
10742         return fold_build1_loc (loc, BIT_NOT_EXPR, type,
10743                             fold_convert_loc (loc, type,
10744                                               TREE_OPERAND (arg0, 0)));
10745
10746       /* Convert -1 - A to ~A.  */
10747       if (INTEGRAL_TYPE_P (type)
10748           && integer_all_onesp (arg0))
10749         return fold_build1_loc (loc, BIT_NOT_EXPR, type, op1);
10750
10751
10752       /* X - (X / CST) * CST is X % CST.  */
10753       if (INTEGRAL_TYPE_P (type)
10754           && TREE_CODE (arg1) == MULT_EXPR
10755           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10756           && operand_equal_p (arg0,
10757                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10758           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10759                               TREE_OPERAND (arg1, 1), 0))
10760         return
10761           fold_convert_loc (loc, type,
10762                             fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10763                                          arg0, TREE_OPERAND (arg1, 1)));
10764
10765       if (! FLOAT_TYPE_P (type))
10766         {
10767           if (integer_zerop (arg0))
10768             return negate_expr (fold_convert_loc (loc, type, arg1));
10769           if (integer_zerop (arg1))
10770             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10771
10772           /* Fold A - (A & B) into ~B & A.  */
10773           if (!TREE_SIDE_EFFECTS (arg0)
10774               && TREE_CODE (arg1) == BIT_AND_EXPR)
10775             {
10776               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10777                 {
10778                   tree arg10 = fold_convert_loc (loc, type,
10779                                                  TREE_OPERAND (arg1, 0));
10780                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10781                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10782                                                    type, arg10),
10783                                       fold_convert_loc (loc, type, arg0));
10784                 }
10785               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10786                 {
10787                   tree arg11 = fold_convert_loc (loc,
10788                                                  type, TREE_OPERAND (arg1, 1));
10789                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10790                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10791                                                    type, arg11),
10792                                       fold_convert_loc (loc, type, arg0));
10793                 }
10794             }
10795
10796           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10797              any power of 2 minus 1.  */
10798           if (TREE_CODE (arg0) == BIT_AND_EXPR
10799               && TREE_CODE (arg1) == BIT_AND_EXPR
10800               && operand_equal_p (TREE_OPERAND (arg0, 0),
10801                                   TREE_OPERAND (arg1, 0), 0))
10802             {
10803               tree mask0 = TREE_OPERAND (arg0, 1);
10804               tree mask1 = TREE_OPERAND (arg1, 1);
10805               tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0);
10806
10807               if (operand_equal_p (tem, mask1, 0))
10808                 {
10809                   tem = fold_build2_loc (loc, BIT_XOR_EXPR, type,
10810                                      TREE_OPERAND (arg0, 0), mask1);
10811                   return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1);
10812                 }
10813             }
10814         }
10815
10816       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
10817       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
10818         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10819
10820       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
10821          ARG0 is zero and X + ARG0 reduces to X, since that would mean
10822          (-ARG1 + ARG0) reduces to -ARG1.  */
10823       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10824         return negate_expr (fold_convert_loc (loc, type, arg1));
10825
10826       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10827          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10828          signed zeros are involved.  */
10829       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10830           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10831           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10832         {
10833           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10834           tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10835           tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10836           bool arg0rz = false, arg0iz = false;
10837           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10838               || (arg0i && (arg0iz = real_zerop (arg0i))))
10839             {
10840               tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10841               tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10842               if (arg0rz && arg1i && real_zerop (arg1i))
10843                 {
10844                   tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10845                                          arg1r ? arg1r
10846                                          : build1 (REALPART_EXPR, rtype, arg1));
10847                   tree ip = arg0i ? arg0i
10848                     : build1 (IMAGPART_EXPR, rtype, arg0);
10849                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10850                 }
10851               else if (arg0iz && arg1r && real_zerop (arg1r))
10852                 {
10853                   tree rp = arg0r ? arg0r
10854                     : build1 (REALPART_EXPR, rtype, arg0);
10855                   tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10856                                          arg1i ? arg1i
10857                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10858                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10859                 }
10860             }
10861         }
10862
10863       /* Fold &x - &x.  This can happen from &x.foo - &x.
10864          This is unsafe for certain floats even in non-IEEE formats.
10865          In IEEE, it is unsafe because it does wrong for NaNs.
10866          Also note that operand_equal_p is always false if an operand
10867          is volatile.  */
10868
10869       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10870           && operand_equal_p (arg0, arg1, 0))
10871         return fold_convert_loc (loc, type, integer_zero_node);
10872
10873       /* A - B -> A + (-B) if B is easily negatable.  */
10874       if (negate_expr_p (arg1)
10875           && ((FLOAT_TYPE_P (type)
10876                /* Avoid this transformation if B is a positive REAL_CST.  */
10877                && (TREE_CODE (arg1) != REAL_CST
10878                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10879               || INTEGRAL_TYPE_P (type)))
10880         return fold_build2_loc (loc, PLUS_EXPR, type,
10881                             fold_convert_loc (loc, type, arg0),
10882                             fold_convert_loc (loc, type,
10883                                               negate_expr (arg1)));
10884
10885       /* Try folding difference of addresses.  */
10886       {
10887         HOST_WIDE_INT diff;
10888
10889         if ((TREE_CODE (arg0) == ADDR_EXPR
10890              || TREE_CODE (arg1) == ADDR_EXPR)
10891             && ptr_difference_const (arg0, arg1, &diff))
10892           return build_int_cst_type (type, diff);
10893       }
10894
10895       /* Fold &a[i] - &a[j] to i-j.  */
10896       if (TREE_CODE (arg0) == ADDR_EXPR
10897           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10898           && TREE_CODE (arg1) == ADDR_EXPR
10899           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10900         {
10901           tree aref0 = TREE_OPERAND (arg0, 0);
10902           tree aref1 = TREE_OPERAND (arg1, 0);
10903           if (operand_equal_p (TREE_OPERAND (aref0, 0),
10904                                TREE_OPERAND (aref1, 0), 0))
10905             {
10906               tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
10907               tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
10908               tree esz = array_ref_element_size (aref0);
10909               tree diff = build2 (MINUS_EXPR, type, op0, op1);
10910               return fold_build2_loc (loc, MULT_EXPR, type, diff,
10911                                   fold_convert_loc (loc, type, esz));
10912                                   
10913             }
10914         }
10915
10916       if (FLOAT_TYPE_P (type)
10917           && flag_unsafe_math_optimizations
10918           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10919           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10920           && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10921         return tem;
10922
10923       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10924          same or one.  Make sure type is not saturating.
10925          fold_plusminus_mult_expr will re-associate.  */
10926       if ((TREE_CODE (arg0) == MULT_EXPR
10927            || TREE_CODE (arg1) == MULT_EXPR)
10928           && !TYPE_SATURATING (type)
10929           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10930         {
10931           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10932           if (tem)
10933             return tem;
10934         }
10935
10936       goto associate;
10937
10938     case MULT_EXPR:
10939       /* (-A) * (-B) -> A * B  */
10940       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10941         return fold_build2_loc (loc, MULT_EXPR, type,
10942                             fold_convert_loc (loc, type,
10943                                               TREE_OPERAND (arg0, 0)),
10944                             fold_convert_loc (loc, type,
10945                                               negate_expr (arg1)));
10946       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10947         return fold_build2_loc (loc, MULT_EXPR, type,
10948                             fold_convert_loc (loc, type,
10949                                               negate_expr (arg0)),
10950                             fold_convert_loc (loc, type,
10951                                               TREE_OPERAND (arg1, 0)));
10952
10953       if (! FLOAT_TYPE_P (type))
10954         {
10955           if (integer_zerop (arg1))
10956             return omit_one_operand_loc (loc, type, arg1, arg0);
10957           if (integer_onep (arg1))
10958             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10959           /* Transform x * -1 into -x.  Make sure to do the negation
10960              on the original operand with conversions not stripped
10961              because we can only strip non-sign-changing conversions.  */
10962           if (integer_all_onesp (arg1))
10963             return fold_convert_loc (loc, type, negate_expr (op0));
10964           /* Transform x * -C into -x * C if x is easily negatable.  */
10965           if (TREE_CODE (arg1) == INTEGER_CST
10966               && tree_int_cst_sgn (arg1) == -1
10967               && negate_expr_p (arg0)
10968               && (tem = negate_expr (arg1)) != arg1
10969               && !TREE_OVERFLOW (tem))
10970             return fold_build2_loc (loc, MULT_EXPR, type,
10971                                 fold_convert_loc (loc, type,
10972                                                   negate_expr (arg0)),
10973                                 tem);
10974
10975           /* (a * (1 << b)) is (a << b)  */
10976           if (TREE_CODE (arg1) == LSHIFT_EXPR
10977               && integer_onep (TREE_OPERAND (arg1, 0)))
10978             return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
10979                                 TREE_OPERAND (arg1, 1));
10980           if (TREE_CODE (arg0) == LSHIFT_EXPR
10981               && integer_onep (TREE_OPERAND (arg0, 0)))
10982             return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
10983                                 TREE_OPERAND (arg0, 1));
10984
10985           /* (A + A) * C -> A * 2 * C  */
10986           if (TREE_CODE (arg0) == PLUS_EXPR
10987               && TREE_CODE (arg1) == INTEGER_CST
10988               && operand_equal_p (TREE_OPERAND (arg0, 0),
10989                                   TREE_OPERAND (arg0, 1), 0))
10990             return fold_build2_loc (loc, MULT_EXPR, type,
10991                                 omit_one_operand_loc (loc, type,
10992                                                   TREE_OPERAND (arg0, 0),
10993                                                   TREE_OPERAND (arg0, 1)),
10994                                 fold_build2_loc (loc, MULT_EXPR, type,
10995                                              build_int_cst (type, 2) , arg1));
10996
10997           strict_overflow_p = false;
10998           if (TREE_CODE (arg1) == INTEGER_CST
10999               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11000                                              &strict_overflow_p)))
11001             {
11002               if (strict_overflow_p)
11003                 fold_overflow_warning (("assuming signed overflow does not "
11004                                         "occur when simplifying "
11005                                         "multiplication"),
11006                                        WARN_STRICT_OVERFLOW_MISC);
11007               return fold_convert_loc (loc, type, tem);
11008             }
11009
11010           /* Optimize z * conj(z) for integer complex numbers.  */
11011           if (TREE_CODE (arg0) == CONJ_EXPR
11012               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11013             return fold_mult_zconjz (loc, type, arg1);
11014           if (TREE_CODE (arg1) == CONJ_EXPR
11015               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11016             return fold_mult_zconjz (loc, type, arg0);
11017         }
11018       else
11019         {
11020           /* Maybe fold x * 0 to 0.  The expressions aren't the same
11021              when x is NaN, since x * 0 is also NaN.  Nor are they the
11022              same in modes with signed zeros, since multiplying a
11023              negative value by 0 gives -0, not +0.  */
11024           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11025               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11026               && real_zerop (arg1))
11027             return omit_one_operand_loc (loc, type, arg1, arg0);
11028           /* In IEEE floating point, x*1 is not equivalent to x for snans.
11029              Likewise for complex arithmetic with signed zeros.  */
11030           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11031               && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11032                   || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
11033               && real_onep (arg1))
11034             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11035
11036           /* Transform x * -1.0 into -x.  */
11037           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11038               && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11039                   || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
11040               && real_minus_onep (arg1))
11041             return fold_convert_loc (loc, type, negate_expr (arg0));
11042
11043           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
11044              the result for floating point types due to rounding so it is applied
11045              only if -fassociative-math was specify.  */
11046           if (flag_associative_math
11047               && TREE_CODE (arg0) == RDIV_EXPR
11048               && TREE_CODE (arg1) == REAL_CST
11049               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
11050             {
11051               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
11052                                       arg1, 0);
11053               if (tem)
11054                 return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11055                                     TREE_OPERAND (arg0, 1));
11056             }
11057
11058           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
11059           if (operand_equal_p (arg0, arg1, 0))
11060             {
11061               tree tem = fold_strip_sign_ops (arg0);
11062               if (tem != NULL_TREE)
11063                 {
11064                   tem = fold_convert_loc (loc, type, tem);
11065                   return fold_build2_loc (loc, MULT_EXPR, type, tem, tem);
11066                 }
11067             }
11068
11069           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
11070              This is not the same for NaNs or if signed zeros are
11071              involved.  */
11072           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11073               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11074               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11075               && TREE_CODE (arg1) == COMPLEX_CST
11076               && real_zerop (TREE_REALPART (arg1)))
11077             {
11078               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
11079               if (real_onep (TREE_IMAGPART (arg1)))
11080                 return
11081                   fold_build2_loc (loc, COMPLEX_EXPR, type,
11082                                negate_expr (fold_build1_loc (loc, IMAGPART_EXPR,
11083                                                              rtype, arg0)),
11084                                fold_build1_loc (loc, REALPART_EXPR, rtype, arg0));
11085               else if (real_minus_onep (TREE_IMAGPART (arg1)))
11086                 return
11087                   fold_build2_loc (loc, COMPLEX_EXPR, type,
11088                                fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0),
11089                                negate_expr (fold_build1_loc (loc, REALPART_EXPR,
11090                                                              rtype, arg0)));
11091             }
11092
11093           /* Optimize z * conj(z) for floating point complex numbers.
11094              Guarded by flag_unsafe_math_optimizations as non-finite
11095              imaginary components don't produce scalar results.  */
11096           if (flag_unsafe_math_optimizations
11097               && TREE_CODE (arg0) == CONJ_EXPR
11098               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11099             return fold_mult_zconjz (loc, type, arg1);
11100           if (flag_unsafe_math_optimizations
11101               && TREE_CODE (arg1) == CONJ_EXPR
11102               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11103             return fold_mult_zconjz (loc, type, arg0);
11104
11105           if (flag_unsafe_math_optimizations)
11106             {
11107               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11108               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11109
11110               /* Optimizations of root(...)*root(...).  */
11111               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
11112                 {
11113                   tree rootfn, arg;
11114                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11115                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11116
11117                   /* Optimize sqrt(x)*sqrt(x) as x.  */
11118                   if (BUILTIN_SQRT_P (fcode0)
11119                       && operand_equal_p (arg00, arg10, 0)
11120                       && ! HONOR_SNANS (TYPE_MODE (type)))
11121                     return arg00;
11122
11123                   /* Optimize root(x)*root(y) as root(x*y).  */
11124                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11125                   arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10);
11126                   return build_call_expr_loc (loc, rootfn, 1, arg);
11127                 }
11128
11129               /* Optimize expN(x)*expN(y) as expN(x+y).  */
11130               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
11131                 {
11132                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11133                   tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
11134                                           CALL_EXPR_ARG (arg0, 0),
11135                                           CALL_EXPR_ARG (arg1, 0));
11136                   return build_call_expr_loc (loc, expfn, 1, arg);
11137                 }
11138
11139               /* Optimizations of pow(...)*pow(...).  */
11140               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
11141                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
11142                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
11143                 {
11144                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11145                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
11146                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11147                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
11148
11149                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
11150                   if (operand_equal_p (arg01, arg11, 0))
11151                     {
11152                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11153                       tree arg = fold_build2_loc (loc, MULT_EXPR, type,
11154                                               arg00, arg10);
11155                       return build_call_expr_loc (loc, powfn, 2, arg, arg01);
11156                     }
11157
11158                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
11159                   if (operand_equal_p (arg00, arg10, 0))
11160                     {
11161                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11162                       tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
11163                                               arg01, arg11);
11164                       return build_call_expr_loc (loc, powfn, 2, arg00, arg);
11165                     }
11166                 }
11167
11168               /* Optimize tan(x)*cos(x) as sin(x).  */
11169               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
11170                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
11171                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
11172                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
11173                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
11174                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
11175                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11176                                       CALL_EXPR_ARG (arg1, 0), 0))
11177                 {
11178                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
11179
11180                   if (sinfn != NULL_TREE)
11181                     return build_call_expr_loc (loc, sinfn, 1,
11182                                             CALL_EXPR_ARG (arg0, 0));
11183                 }
11184
11185               /* Optimize x*pow(x,c) as pow(x,c+1).  */
11186               if (fcode1 == BUILT_IN_POW
11187                   || fcode1 == BUILT_IN_POWF
11188                   || fcode1 == BUILT_IN_POWL)
11189                 {
11190                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11191                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
11192                   if (TREE_CODE (arg11) == REAL_CST
11193                       && !TREE_OVERFLOW (arg11)
11194                       && operand_equal_p (arg0, arg10, 0))
11195                     {
11196                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11197                       REAL_VALUE_TYPE c;
11198                       tree arg;
11199
11200                       c = TREE_REAL_CST (arg11);
11201                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
11202                       arg = build_real (type, c);
11203                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11204                     }
11205                 }
11206
11207               /* Optimize pow(x,c)*x as pow(x,c+1).  */
11208               if (fcode0 == BUILT_IN_POW
11209                   || fcode0 == BUILT_IN_POWF
11210                   || fcode0 == BUILT_IN_POWL)
11211                 {
11212                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11213                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
11214                   if (TREE_CODE (arg01) == REAL_CST
11215                       && !TREE_OVERFLOW (arg01)
11216                       && operand_equal_p (arg1, arg00, 0))
11217                     {
11218                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11219                       REAL_VALUE_TYPE c;
11220                       tree arg;
11221
11222                       c = TREE_REAL_CST (arg01);
11223                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
11224                       arg = build_real (type, c);
11225                       return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11226                     }
11227                 }
11228
11229               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
11230               if (optimize_function_for_speed_p (cfun)
11231                   && operand_equal_p (arg0, arg1, 0))
11232                 {
11233                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
11234
11235                   if (powfn)
11236                     {
11237                       tree arg = build_real (type, dconst2);
11238                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11239                     }
11240                 }
11241             }
11242         }
11243       goto associate;
11244
11245     case BIT_IOR_EXPR:
11246     bit_ior:
11247       if (integer_all_onesp (arg1))
11248         return omit_one_operand_loc (loc, type, arg1, arg0);
11249       if (integer_zerop (arg1))
11250         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11251       if (operand_equal_p (arg0, arg1, 0))
11252         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11253
11254       /* ~X | X is -1.  */
11255       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11256           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11257         {
11258           t1 = fold_convert_loc (loc, type, integer_zero_node);
11259           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11260           return omit_one_operand_loc (loc, type, t1, arg1);
11261         }
11262
11263       /* X | ~X is -1.  */
11264       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11265           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11266         {
11267           t1 = fold_convert_loc (loc, type, integer_zero_node);
11268           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11269           return omit_one_operand_loc (loc, type, t1, arg0);
11270         }
11271
11272       /* Canonicalize (X & C1) | C2.  */
11273       if (TREE_CODE (arg0) == BIT_AND_EXPR
11274           && TREE_CODE (arg1) == INTEGER_CST
11275           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11276         {
11277           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
11278           int width = TYPE_PRECISION (type), w;
11279           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
11280           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11281           hi2 = TREE_INT_CST_HIGH (arg1);
11282           lo2 = TREE_INT_CST_LOW (arg1);
11283
11284           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
11285           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
11286             return omit_one_operand_loc (loc, type, arg1,
11287                                      TREE_OPERAND (arg0, 0));
11288
11289           if (width > HOST_BITS_PER_WIDE_INT)
11290             {
11291               mhi = (unsigned HOST_WIDE_INT) -1 
11292                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
11293               mlo = -1;
11294             }
11295           else
11296             {
11297               mhi = 0;
11298               mlo = (unsigned HOST_WIDE_INT) -1
11299                     >> (HOST_BITS_PER_WIDE_INT - width);
11300             }
11301
11302           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
11303           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
11304             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11305                                 TREE_OPERAND (arg0, 0), arg1);
11306
11307           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
11308              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
11309              mode which allows further optimizations.  */
11310           hi1 &= mhi;
11311           lo1 &= mlo;
11312           hi2 &= mhi;
11313           lo2 &= mlo;
11314           hi3 = hi1 & ~hi2;
11315           lo3 = lo1 & ~lo2;
11316           for (w = BITS_PER_UNIT;
11317                w <= width && w <= HOST_BITS_PER_WIDE_INT;
11318                w <<= 1)
11319             {
11320               unsigned HOST_WIDE_INT mask
11321                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
11322               if (((lo1 | lo2) & mask) == mask
11323                   && (lo1 & ~mask) == 0 && hi1 == 0)
11324                 {
11325                   hi3 = 0;
11326                   lo3 = mask;
11327                   break;
11328                 }
11329             }
11330           if (hi3 != hi1 || lo3 != lo1)
11331             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11332                                 fold_build2_loc (loc, BIT_AND_EXPR, type,
11333                                              TREE_OPERAND (arg0, 0),
11334                                              build_int_cst_wide (type,
11335                                                                  lo3, hi3)),
11336                                 arg1);
11337         }
11338
11339       /* (X & Y) | Y is (X, Y).  */
11340       if (TREE_CODE (arg0) == BIT_AND_EXPR
11341           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11342         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11343       /* (X & Y) | X is (Y, X).  */
11344       if (TREE_CODE (arg0) == BIT_AND_EXPR
11345           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11346           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11347         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11348       /* X | (X & Y) is (Y, X).  */
11349       if (TREE_CODE (arg1) == BIT_AND_EXPR
11350           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11351           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11352         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11353       /* X | (Y & X) is (Y, X).  */
11354       if (TREE_CODE (arg1) == BIT_AND_EXPR
11355           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11356           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11357         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11358
11359       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11360       if (t1 != NULL_TREE)
11361         return t1;
11362
11363       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
11364
11365          This results in more efficient code for machines without a NAND
11366          instruction.  Combine will canonicalize to the first form
11367          which will allow use of NAND instructions provided by the
11368          backend if they exist.  */
11369       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11370           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11371         {
11372           return
11373             fold_build1_loc (loc, BIT_NOT_EXPR, type,
11374                          build2 (BIT_AND_EXPR, type,
11375                                  fold_convert_loc (loc, type,
11376                                                    TREE_OPERAND (arg0, 0)),
11377                                  fold_convert_loc (loc, type,
11378                                                    TREE_OPERAND (arg1, 0))));
11379         }
11380
11381       /* See if this can be simplified into a rotate first.  If that
11382          is unsuccessful continue in the association code.  */
11383       goto bit_rotate;
11384
11385     case BIT_XOR_EXPR:
11386       if (integer_zerop (arg1))
11387         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11388       if (integer_all_onesp (arg1))
11389         return fold_build1_loc (loc, BIT_NOT_EXPR, type, op0);
11390       if (operand_equal_p (arg0, arg1, 0))
11391         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11392
11393       /* ~X ^ X is -1.  */
11394       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11395           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11396         {
11397           t1 = fold_convert_loc (loc, type, integer_zero_node);
11398           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11399           return omit_one_operand_loc (loc, type, t1, arg1);
11400         }
11401
11402       /* X ^ ~X is -1.  */
11403       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11404           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11405         {
11406           t1 = fold_convert_loc (loc, type, integer_zero_node);
11407           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11408           return omit_one_operand_loc (loc, type, t1, arg0);
11409         }
11410
11411       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
11412          with a constant, and the two constants have no bits in common,
11413          we should treat this as a BIT_IOR_EXPR since this may produce more
11414          simplifications.  */
11415       if (TREE_CODE (arg0) == BIT_AND_EXPR
11416           && TREE_CODE (arg1) == BIT_AND_EXPR
11417           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11418           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
11419           && integer_zerop (const_binop (BIT_AND_EXPR,
11420                                          TREE_OPERAND (arg0, 1),
11421                                          TREE_OPERAND (arg1, 1), 0)))
11422         {
11423           code = BIT_IOR_EXPR;
11424           goto bit_ior;
11425         }
11426
11427       /* (X | Y) ^ X -> Y & ~ X*/
11428       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11429           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11430         {
11431           tree t2 = TREE_OPERAND (arg0, 1);
11432           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11433                             arg1);
11434           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11435                             fold_convert_loc (loc, type, t2),
11436                             fold_convert_loc (loc, type, t1));
11437           return t1;
11438         }
11439
11440       /* (Y | X) ^ X -> Y & ~ X*/
11441       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11442           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11443         {
11444           tree t2 = TREE_OPERAND (arg0, 0);
11445           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11446                             arg1);
11447           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11448                             fold_convert_loc (loc, type, t2),
11449                             fold_convert_loc (loc, type, t1));
11450           return t1;
11451         }
11452
11453       /* X ^ (X | Y) -> Y & ~ X*/
11454       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11455           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11456         {
11457           tree t2 = TREE_OPERAND (arg1, 1);
11458           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11459                             arg0);
11460           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11461                             fold_convert_loc (loc, type, t2),
11462                             fold_convert_loc (loc, type, t1));
11463           return t1;
11464         }
11465
11466       /* X ^ (Y | X) -> Y & ~ X*/
11467       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11468           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11469         {
11470           tree t2 = TREE_OPERAND (arg1, 0);
11471           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11472                             arg0);
11473           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11474                             fold_convert_loc (loc, type, t2),
11475                             fold_convert_loc (loc, type, t1));
11476           return t1;
11477         }
11478         
11479       /* Convert ~X ^ ~Y to X ^ Y.  */
11480       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11481           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11482         return fold_build2_loc (loc, code, type,
11483                             fold_convert_loc (loc, type,
11484                                               TREE_OPERAND (arg0, 0)),
11485                             fold_convert_loc (loc, type,
11486                                               TREE_OPERAND (arg1, 0)));
11487
11488       /* Convert ~X ^ C to X ^ ~C.  */
11489       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11490           && TREE_CODE (arg1) == INTEGER_CST)
11491         return fold_build2_loc (loc, code, type,
11492                             fold_convert_loc (loc, type,
11493                                               TREE_OPERAND (arg0, 0)),
11494                             fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1));
11495
11496       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
11497       if (TREE_CODE (arg0) == BIT_AND_EXPR
11498           && integer_onep (TREE_OPERAND (arg0, 1))
11499           && integer_onep (arg1))
11500         return fold_build2_loc (loc, EQ_EXPR, type, arg0,
11501                             build_int_cst (TREE_TYPE (arg0), 0));
11502
11503       /* Fold (X & Y) ^ Y as ~X & Y.  */
11504       if (TREE_CODE (arg0) == BIT_AND_EXPR
11505           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11506         {
11507           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11508           return fold_build2_loc (loc, BIT_AND_EXPR, type, 
11509                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11510                               fold_convert_loc (loc, type, arg1));
11511         }
11512       /* Fold (X & Y) ^ X as ~Y & X.  */
11513       if (TREE_CODE (arg0) == BIT_AND_EXPR
11514           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11515           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11516         {
11517           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11518           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11519                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11520                               fold_convert_loc (loc, type, arg1));
11521         }
11522       /* Fold X ^ (X & Y) as X & ~Y.  */
11523       if (TREE_CODE (arg1) == BIT_AND_EXPR
11524           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11525         {
11526           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11527           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11528                               fold_convert_loc (loc, type, arg0),
11529                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11530         }
11531       /* Fold X ^ (Y & X) as ~Y & X.  */
11532       if (TREE_CODE (arg1) == BIT_AND_EXPR
11533           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11534           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11535         {
11536           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11537           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11538                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11539                               fold_convert_loc (loc, type, arg0));
11540         }
11541
11542       /* See if this can be simplified into a rotate first.  If that
11543          is unsuccessful continue in the association code.  */
11544       goto bit_rotate;
11545
11546     case BIT_AND_EXPR:
11547       if (integer_all_onesp (arg1))
11548         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11549       if (integer_zerop (arg1))
11550         return omit_one_operand_loc (loc, type, arg1, arg0);
11551       if (operand_equal_p (arg0, arg1, 0))
11552         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11553
11554       /* ~X & X is always zero.  */
11555       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11556           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11557         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
11558
11559       /* X & ~X is always zero.  */
11560       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11561           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11562         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11563
11564       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
11565       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11566           && TREE_CODE (arg1) == INTEGER_CST
11567           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11568         {
11569           tree tmp1 = fold_convert_loc (loc, type, arg1);
11570           tree tmp2 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11571           tree tmp3 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11572           tmp2 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp2, tmp1);
11573           tmp3 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp3, tmp1);
11574           return
11575             fold_convert_loc (loc, type,
11576                               fold_build2_loc (loc, BIT_IOR_EXPR,
11577                                            type, tmp2, tmp3));
11578         }
11579
11580       /* (X | Y) & Y is (X, Y).  */
11581       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11582           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11583         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11584       /* (X | Y) & X is (Y, X).  */
11585       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11586           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11587           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11588         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11589       /* X & (X | Y) is (Y, X).  */
11590       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11591           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11592           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11593         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11594       /* X & (Y | X) is (Y, X).  */
11595       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11596           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11597           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11598         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11599
11600       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
11601       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11602           && integer_onep (TREE_OPERAND (arg0, 1))
11603           && integer_onep (arg1))
11604         {
11605           tem = TREE_OPERAND (arg0, 0);
11606           return fold_build2_loc (loc, EQ_EXPR, type,
11607                               fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11608                                            build_int_cst (TREE_TYPE (tem), 1)),
11609                               build_int_cst (TREE_TYPE (tem), 0));
11610         }
11611       /* Fold ~X & 1 as (X & 1) == 0.  */
11612       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11613           && integer_onep (arg1))
11614         {
11615           tem = TREE_OPERAND (arg0, 0);
11616           return fold_build2_loc (loc, EQ_EXPR, type,
11617                               fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11618                                            build_int_cst (TREE_TYPE (tem), 1)),
11619                               build_int_cst (TREE_TYPE (tem), 0));
11620         }
11621
11622       /* Fold (X ^ Y) & Y as ~X & Y.  */
11623       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11624           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11625         {
11626           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11627           return fold_build2_loc (loc, BIT_AND_EXPR, type, 
11628                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11629                               fold_convert_loc (loc, type, arg1));
11630         }
11631       /* Fold (X ^ Y) & X as ~Y & X.  */
11632       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11633           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11634           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11635         {
11636           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11637           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11638                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11639                               fold_convert_loc (loc, type, arg1));
11640         }
11641       /* Fold X & (X ^ Y) as X & ~Y.  */
11642       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11643           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11644         {
11645           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11646           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11647                               fold_convert_loc (loc, type, arg0),
11648                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11649         }
11650       /* Fold X & (Y ^ X) as ~Y & X.  */
11651       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11652           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11653           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11654         {
11655           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11656           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11657                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11658                               fold_convert_loc (loc, type, arg0));
11659         }
11660
11661       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11662       if (t1 != NULL_TREE)
11663         return t1;
11664       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
11665       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11666           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11667         {
11668           unsigned int prec
11669             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11670
11671           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
11672               && (~TREE_INT_CST_LOW (arg1)
11673                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
11674             return
11675               fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11676         }
11677
11678       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11679
11680          This results in more efficient code for machines without a NOR
11681          instruction.  Combine will canonicalize to the first form
11682          which will allow use of NOR instructions provided by the
11683          backend if they exist.  */
11684       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11685           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11686         {
11687           return fold_build1_loc (loc, BIT_NOT_EXPR, type,
11688                               build2 (BIT_IOR_EXPR, type,
11689                                       fold_convert_loc (loc, type,
11690                                                         TREE_OPERAND (arg0, 0)),
11691                                       fold_convert_loc (loc, type,
11692                                                         TREE_OPERAND (arg1, 0))));
11693         }
11694
11695       /* If arg0 is derived from the address of an object or function, we may
11696          be able to fold this expression using the object or function's
11697          alignment.  */
11698       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
11699         {
11700           unsigned HOST_WIDE_INT modulus, residue;
11701           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
11702
11703           modulus = get_pointer_modulus_and_residue (arg0, &residue,
11704                                                      integer_onep (arg1));
11705
11706           /* This works because modulus is a power of 2.  If this weren't the
11707              case, we'd have to replace it by its greatest power-of-2
11708              divisor: modulus & -modulus.  */
11709           if (low < modulus)
11710             return build_int_cst (type, residue & low);
11711         }
11712
11713       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11714               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11715          if the new mask might be further optimized.  */
11716       if ((TREE_CODE (arg0) == LSHIFT_EXPR
11717            || TREE_CODE (arg0) == RSHIFT_EXPR)
11718           && host_integerp (TREE_OPERAND (arg0, 1), 1)
11719           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
11720           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
11721              < TYPE_PRECISION (TREE_TYPE (arg0))
11722           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11723           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
11724         {
11725           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
11726           unsigned HOST_WIDE_INT mask
11727             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
11728           unsigned HOST_WIDE_INT newmask, zerobits = 0;
11729           tree shift_type = TREE_TYPE (arg0);
11730
11731           if (TREE_CODE (arg0) == LSHIFT_EXPR)
11732             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11733           else if (TREE_CODE (arg0) == RSHIFT_EXPR
11734                    && TYPE_PRECISION (TREE_TYPE (arg0))
11735                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
11736             {
11737               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
11738               tree arg00 = TREE_OPERAND (arg0, 0);
11739               /* See if more bits can be proven as zero because of
11740                  zero extension.  */
11741               if (TREE_CODE (arg00) == NOP_EXPR
11742                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11743                 {
11744                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11745                   if (TYPE_PRECISION (inner_type)
11746                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
11747                       && TYPE_PRECISION (inner_type) < prec)
11748                     {
11749                       prec = TYPE_PRECISION (inner_type);
11750                       /* See if we can shorten the right shift.  */
11751                       if (shiftc < prec)
11752                         shift_type = inner_type;
11753                     }
11754                 }
11755               zerobits = ~(unsigned HOST_WIDE_INT) 0;
11756               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11757               zerobits <<= prec - shiftc;
11758               /* For arithmetic shift if sign bit could be set, zerobits
11759                  can contain actually sign bits, so no transformation is
11760                  possible, unless MASK masks them all away.  In that
11761                  case the shift needs to be converted into logical shift.  */
11762               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11763                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11764                 {
11765                   if ((mask & zerobits) == 0)
11766                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
11767                   else
11768                     zerobits = 0;
11769                 }
11770             }
11771
11772           /* ((X << 16) & 0xff00) is (X, 0).  */
11773           if ((mask & zerobits) == mask)
11774             return omit_one_operand_loc (loc, type,
11775                                      build_int_cst (type, 0), arg0);
11776
11777           newmask = mask | zerobits;
11778           if (newmask != mask && (newmask & (newmask + 1)) == 0)
11779             {
11780               unsigned int prec;
11781
11782               /* Only do the transformation if NEWMASK is some integer
11783                  mode's mask.  */
11784               for (prec = BITS_PER_UNIT;
11785                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11786                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11787                   break;
11788               if (prec < HOST_BITS_PER_WIDE_INT
11789                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
11790                 {
11791                   tree newmaskt;
11792
11793                   if (shift_type != TREE_TYPE (arg0))
11794                     {
11795                       tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type,
11796                                          fold_convert_loc (loc, shift_type,
11797                                                            TREE_OPERAND (arg0, 0)),
11798                                          TREE_OPERAND (arg0, 1));
11799                       tem = fold_convert_loc (loc, type, tem);
11800                     }
11801                   else
11802                     tem = op0;
11803                   newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask);
11804                   if (!tree_int_cst_equal (newmaskt, arg1))
11805                     return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt);
11806                 }
11807             }
11808         }
11809
11810       goto associate;
11811
11812     case RDIV_EXPR:
11813       /* Don't touch a floating-point divide by zero unless the mode
11814          of the constant can represent infinity.  */
11815       if (TREE_CODE (arg1) == REAL_CST
11816           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11817           && real_zerop (arg1))
11818         return NULL_TREE;
11819
11820       /* Optimize A / A to 1.0 if we don't care about
11821          NaNs or Infinities.  Skip the transformation
11822          for non-real operands.  */
11823       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
11824           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11825           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
11826           && operand_equal_p (arg0, arg1, 0))
11827         {
11828           tree r = build_real (TREE_TYPE (arg0), dconst1);
11829
11830           return omit_two_operands_loc (loc, type, r, arg0, arg1);
11831         }
11832
11833       /* The complex version of the above A / A optimization.  */
11834       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11835           && operand_equal_p (arg0, arg1, 0))
11836         {
11837           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
11838           if (! HONOR_NANS (TYPE_MODE (elem_type))
11839               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
11840             {
11841               tree r = build_real (elem_type, dconst1);
11842               /* omit_two_operands will call fold_convert for us.  */
11843               return omit_two_operands_loc (loc, type, r, arg0, arg1);
11844             }
11845         }
11846
11847       /* (-A) / (-B) -> A / B  */
11848       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11849         return fold_build2_loc (loc, RDIV_EXPR, type,
11850                             TREE_OPERAND (arg0, 0),
11851                             negate_expr (arg1));
11852       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11853         return fold_build2_loc (loc, RDIV_EXPR, type,
11854                             negate_expr (arg0),
11855                             TREE_OPERAND (arg1, 0));
11856
11857       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
11858       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11859           && real_onep (arg1))
11860         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11861
11862       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
11863       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11864           && real_minus_onep (arg1))
11865         return non_lvalue_loc (loc, fold_convert_loc (loc, type,
11866                                                   negate_expr (arg0)));
11867
11868       /* If ARG1 is a constant, we can convert this to a multiply by the
11869          reciprocal.  This does not have the same rounding properties,
11870          so only do this if -freciprocal-math.  We can actually
11871          always safely do it if ARG1 is a power of two, but it's hard to
11872          tell if it is or not in a portable manner.  */
11873       if (TREE_CODE (arg1) == REAL_CST)
11874         {
11875           if (flag_reciprocal_math
11876               && 0 != (tem = const_binop (code, build_real (type, dconst1),
11877                                           arg1, 0)))
11878             return fold_build2_loc (loc, MULT_EXPR, type, arg0, tem);
11879           /* Find the reciprocal if optimizing and the result is exact.  */
11880           if (optimize)
11881             {
11882               REAL_VALUE_TYPE r;
11883               r = TREE_REAL_CST (arg1);
11884               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11885                 {
11886                   tem = build_real (type, r);
11887                   return fold_build2_loc (loc, MULT_EXPR, type,
11888                                       fold_convert_loc (loc, type, arg0), tem);
11889                 }
11890             }
11891         }
11892       /* Convert A/B/C to A/(B*C).  */ 
11893       if (flag_reciprocal_math
11894           && TREE_CODE (arg0) == RDIV_EXPR)
11895         return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11896                             fold_build2_loc (loc, MULT_EXPR, type,
11897                                          TREE_OPERAND (arg0, 1), arg1));
11898
11899       /* Convert A/(B/C) to (A/B)*C.  */
11900       if (flag_reciprocal_math
11901           && TREE_CODE (arg1) == RDIV_EXPR)
11902         return fold_build2_loc (loc, MULT_EXPR, type,
11903                             fold_build2_loc (loc, RDIV_EXPR, type, arg0,
11904                                          TREE_OPERAND (arg1, 0)),
11905                             TREE_OPERAND (arg1, 1));
11906
11907       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11908       if (flag_reciprocal_math
11909           && TREE_CODE (arg1) == MULT_EXPR
11910           && TREE_CODE (arg0) == REAL_CST
11911           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11912         {
11913           tree tem = const_binop (RDIV_EXPR, arg0,
11914                                   TREE_OPERAND (arg1, 1), 0);
11915           if (tem)
11916             return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11917                                 TREE_OPERAND (arg1, 0));
11918         }
11919
11920       if (flag_unsafe_math_optimizations)
11921         {
11922           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11923           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11924
11925           /* Optimize sin(x)/cos(x) as tan(x).  */
11926           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11927                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11928                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11929               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11930                                   CALL_EXPR_ARG (arg1, 0), 0))
11931             {
11932               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11933
11934               if (tanfn != NULL_TREE)
11935                 return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11936             }
11937
11938           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11939           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11940                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11941                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11942               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11943                                   CALL_EXPR_ARG (arg1, 0), 0))
11944             {
11945               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11946
11947               if (tanfn != NULL_TREE)
11948                 {
11949                   tree tmp = build_call_expr_loc (loc, tanfn, 1,
11950                                               CALL_EXPR_ARG (arg0, 0));
11951                   return fold_build2_loc (loc, RDIV_EXPR, type,
11952                                       build_real (type, dconst1), tmp);
11953                 }
11954             }
11955
11956           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11957              NaNs or Infinities.  */
11958           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11959                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11960                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11961             {
11962               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11963               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11964
11965               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11966                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11967                   && operand_equal_p (arg00, arg01, 0))
11968                 {
11969                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11970
11971                   if (cosfn != NULL_TREE)
11972                     return build_call_expr_loc (loc, cosfn, 1, arg00);
11973                 }
11974             }
11975
11976           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11977              NaNs or Infinities.  */
11978           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11979                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11980                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11981             {
11982               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11983               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11984
11985               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11986                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11987                   && operand_equal_p (arg00, arg01, 0))
11988                 {
11989                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11990
11991                   if (cosfn != NULL_TREE)
11992                     {
11993                       tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00);
11994                       return fold_build2_loc (loc, RDIV_EXPR, type,
11995                                           build_real (type, dconst1),
11996                                           tmp);
11997                     }
11998                 }
11999             }
12000
12001           /* Optimize pow(x,c)/x as pow(x,c-1).  */
12002           if (fcode0 == BUILT_IN_POW
12003               || fcode0 == BUILT_IN_POWF
12004               || fcode0 == BUILT_IN_POWL)
12005             {
12006               tree arg00 = CALL_EXPR_ARG (arg0, 0);
12007               tree arg01 = CALL_EXPR_ARG (arg0, 1);
12008               if (TREE_CODE (arg01) == REAL_CST
12009                   && !TREE_OVERFLOW (arg01)
12010                   && operand_equal_p (arg1, arg00, 0))
12011                 {
12012                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
12013                   REAL_VALUE_TYPE c;
12014                   tree arg;
12015
12016                   c = TREE_REAL_CST (arg01);
12017                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
12018                   arg = build_real (type, c);
12019                   return build_call_expr_loc (loc, powfn, 2, arg1, arg);
12020                 }
12021             }
12022
12023           /* Optimize a/root(b/c) into a*root(c/b).  */
12024           if (BUILTIN_ROOT_P (fcode1))
12025             {
12026               tree rootarg = CALL_EXPR_ARG (arg1, 0);
12027
12028               if (TREE_CODE (rootarg) == RDIV_EXPR)
12029                 {
12030                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12031                   tree b = TREE_OPERAND (rootarg, 0);
12032                   tree c = TREE_OPERAND (rootarg, 1);
12033
12034                   tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b);
12035
12036                   tmp = build_call_expr_loc (loc, rootfn, 1, tmp);
12037                   return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp);
12038                 }
12039             }
12040
12041           /* Optimize x/expN(y) into x*expN(-y).  */
12042           if (BUILTIN_EXPONENT_P (fcode1))
12043             {
12044               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12045               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
12046               arg1 = build_call_expr_loc (loc,
12047                                       expfn, 1,
12048                                       fold_convert_loc (loc, type, arg));
12049               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
12050             }
12051
12052           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
12053           if (fcode1 == BUILT_IN_POW
12054               || fcode1 == BUILT_IN_POWF
12055               || fcode1 == BUILT_IN_POWL)
12056             {
12057               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12058               tree arg10 = CALL_EXPR_ARG (arg1, 0);
12059               tree arg11 = CALL_EXPR_ARG (arg1, 1);
12060               tree neg11 = fold_convert_loc (loc, type,
12061                                              negate_expr (arg11));
12062               arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11);
12063               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
12064             }
12065         }
12066       return NULL_TREE;
12067
12068     case TRUNC_DIV_EXPR:
12069     case FLOOR_DIV_EXPR:
12070       /* Simplify A / (B << N) where A and B are positive and B is
12071          a power of 2, to A >> (N + log2(B)).  */
12072       strict_overflow_p = false;
12073       if (TREE_CODE (arg1) == LSHIFT_EXPR
12074           && (TYPE_UNSIGNED (type)
12075               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12076         {
12077           tree sval = TREE_OPERAND (arg1, 0);
12078           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
12079             {
12080               tree sh_cnt = TREE_OPERAND (arg1, 1);
12081               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
12082
12083               if (strict_overflow_p)
12084                 fold_overflow_warning (("assuming signed overflow does not "
12085                                         "occur when simplifying A / (B << N)"),
12086                                        WARN_STRICT_OVERFLOW_MISC);
12087
12088               sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
12089                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
12090               return fold_build2_loc (loc, RSHIFT_EXPR, type,
12091                                   fold_convert_loc (loc, type, arg0), sh_cnt);
12092             }
12093         }
12094
12095       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
12096          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
12097       if (INTEGRAL_TYPE_P (type)
12098           && TYPE_UNSIGNED (type)
12099           && code == FLOOR_DIV_EXPR)
12100         return fold_build2_loc (loc, TRUNC_DIV_EXPR, type, op0, op1);
12101
12102       /* Fall thru */
12103
12104     case ROUND_DIV_EXPR:
12105     case CEIL_DIV_EXPR:
12106     case EXACT_DIV_EXPR:
12107       if (integer_onep (arg1))
12108         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12109       if (integer_zerop (arg1))
12110         return NULL_TREE;
12111       /* X / -1 is -X.  */
12112       if (!TYPE_UNSIGNED (type)
12113           && TREE_CODE (arg1) == INTEGER_CST
12114           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12115           && TREE_INT_CST_HIGH (arg1) == -1)
12116         return fold_convert_loc (loc, type, negate_expr (arg0));
12117
12118       /* Convert -A / -B to A / B when the type is signed and overflow is
12119          undefined.  */
12120       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12121           && TREE_CODE (arg0) == NEGATE_EXPR
12122           && negate_expr_p (arg1))
12123         {
12124           if (INTEGRAL_TYPE_P (type))
12125             fold_overflow_warning (("assuming signed overflow does not occur "
12126                                     "when distributing negation across "
12127                                     "division"),
12128                                    WARN_STRICT_OVERFLOW_MISC);
12129           return fold_build2_loc (loc, code, type,
12130                               fold_convert_loc (loc, type,
12131                                                 TREE_OPERAND (arg0, 0)),
12132                               fold_convert_loc (loc, type,
12133                                                 negate_expr (arg1)));
12134         }
12135       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12136           && TREE_CODE (arg1) == NEGATE_EXPR
12137           && negate_expr_p (arg0))
12138         {
12139           if (INTEGRAL_TYPE_P (type))
12140             fold_overflow_warning (("assuming signed overflow does not occur "
12141                                     "when distributing negation across "
12142                                     "division"),
12143                                    WARN_STRICT_OVERFLOW_MISC);
12144           return fold_build2_loc (loc, code, type,
12145                               fold_convert_loc (loc, type,
12146                                                 negate_expr (arg0)),
12147                               fold_convert_loc (loc, type,
12148                                                 TREE_OPERAND (arg1, 0)));
12149         }
12150
12151       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
12152          operation, EXACT_DIV_EXPR.
12153
12154          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
12155          At one time others generated faster code, it's not clear if they do
12156          after the last round to changes to the DIV code in expmed.c.  */
12157       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
12158           && multiple_of_p (type, arg0, arg1))
12159         return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
12160
12161       strict_overflow_p = false;
12162       if (TREE_CODE (arg1) == INTEGER_CST
12163           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12164                                          &strict_overflow_p)))
12165         {
12166           if (strict_overflow_p)
12167             fold_overflow_warning (("assuming signed overflow does not occur "
12168                                     "when simplifying division"),
12169                                    WARN_STRICT_OVERFLOW_MISC);
12170           return fold_convert_loc (loc, type, tem);
12171         }
12172
12173       return NULL_TREE;
12174
12175     case CEIL_MOD_EXPR:
12176     case FLOOR_MOD_EXPR:
12177     case ROUND_MOD_EXPR:
12178     case TRUNC_MOD_EXPR:
12179       /* X % 1 is always zero, but be sure to preserve any side
12180          effects in X.  */
12181       if (integer_onep (arg1))
12182         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12183
12184       /* X % 0, return X % 0 unchanged so that we can get the
12185          proper warnings and errors.  */
12186       if (integer_zerop (arg1))
12187         return NULL_TREE;
12188
12189       /* 0 % X is always zero, but be sure to preserve any side
12190          effects in X.  Place this after checking for X == 0.  */
12191       if (integer_zerop (arg0))
12192         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12193
12194       /* X % -1 is zero.  */
12195       if (!TYPE_UNSIGNED (type)
12196           && TREE_CODE (arg1) == INTEGER_CST
12197           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12198           && TREE_INT_CST_HIGH (arg1) == -1)
12199         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12200
12201       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
12202          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
12203       strict_overflow_p = false;
12204       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
12205           && (TYPE_UNSIGNED (type)
12206               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12207         {
12208           tree c = arg1;
12209           /* Also optimize A % (C << N)  where C is a power of 2,
12210              to A & ((C << N) - 1).  */
12211           if (TREE_CODE (arg1) == LSHIFT_EXPR)
12212             c = TREE_OPERAND (arg1, 0);
12213
12214           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
12215             {
12216               tree mask = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1,
12217                                        build_int_cst (TREE_TYPE (arg1), 1));
12218               if (strict_overflow_p)
12219                 fold_overflow_warning (("assuming signed overflow does not "
12220                                         "occur when simplifying "
12221                                         "X % (power of two)"),
12222                                        WARN_STRICT_OVERFLOW_MISC);
12223               return fold_build2_loc (loc, BIT_AND_EXPR, type,
12224                                   fold_convert_loc (loc, type, arg0),
12225                                   fold_convert_loc (loc, type, mask));
12226             }
12227         }
12228
12229       /* X % -C is the same as X % C.  */
12230       if (code == TRUNC_MOD_EXPR
12231           && !TYPE_UNSIGNED (type)
12232           && TREE_CODE (arg1) == INTEGER_CST
12233           && !TREE_OVERFLOW (arg1)
12234           && TREE_INT_CST_HIGH (arg1) < 0
12235           && !TYPE_OVERFLOW_TRAPS (type)
12236           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
12237           && !sign_bit_p (arg1, arg1))
12238         return fold_build2_loc (loc, code, type,
12239                             fold_convert_loc (loc, type, arg0),
12240                             fold_convert_loc (loc, type,
12241                                               negate_expr (arg1)));
12242
12243       /* X % -Y is the same as X % Y.  */
12244       if (code == TRUNC_MOD_EXPR
12245           && !TYPE_UNSIGNED (type)
12246           && TREE_CODE (arg1) == NEGATE_EXPR
12247           && !TYPE_OVERFLOW_TRAPS (type))
12248         return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0),
12249                             fold_convert_loc (loc, type,
12250                                               TREE_OPERAND (arg1, 0)));
12251
12252       if (TREE_CODE (arg1) == INTEGER_CST
12253           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12254                                          &strict_overflow_p)))
12255         {
12256           if (strict_overflow_p)
12257             fold_overflow_warning (("assuming signed overflow does not occur "
12258                                     "when simplifying modulus"),
12259                                    WARN_STRICT_OVERFLOW_MISC);
12260           return fold_convert_loc (loc, type, tem);
12261         }
12262
12263       return NULL_TREE;
12264
12265     case LROTATE_EXPR:
12266     case RROTATE_EXPR:
12267       if (integer_all_onesp (arg0))
12268         return omit_one_operand_loc (loc, type, arg0, arg1);
12269       goto shift;
12270
12271     case RSHIFT_EXPR:
12272       /* Optimize -1 >> x for arithmetic right shifts.  */
12273       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type)
12274           && tree_expr_nonnegative_p (arg1))
12275         return omit_one_operand_loc (loc, type, arg0, arg1);
12276       /* ... fall through ...  */
12277
12278     case LSHIFT_EXPR:
12279     shift:
12280       if (integer_zerop (arg1))
12281         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12282       if (integer_zerop (arg0))
12283         return omit_one_operand_loc (loc, type, arg0, arg1);
12284
12285       /* Since negative shift count is not well-defined,
12286          don't try to compute it in the compiler.  */
12287       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
12288         return NULL_TREE;
12289
12290       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
12291       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
12292           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12293           && host_integerp (TREE_OPERAND (arg0, 1), false)
12294           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12295         {
12296           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
12297                                + TREE_INT_CST_LOW (arg1));
12298
12299           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
12300              being well defined.  */
12301           if (low >= TYPE_PRECISION (type))
12302             {
12303               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
12304                 low = low % TYPE_PRECISION (type);
12305               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
12306                 return omit_one_operand_loc (loc, type, build_int_cst (type, 0),
12307                                          TREE_OPERAND (arg0, 0));
12308               else
12309                 low = TYPE_PRECISION (type) - 1;
12310             }
12311
12312           return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12313                               build_int_cst (type, low));
12314         }
12315
12316       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
12317          into x & ((unsigned)-1 >> c) for unsigned types.  */
12318       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
12319            || (TYPE_UNSIGNED (type)
12320                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
12321           && host_integerp (arg1, false)
12322           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12323           && host_integerp (TREE_OPERAND (arg0, 1), false)
12324           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12325         {
12326           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
12327           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
12328           tree lshift;
12329           tree arg00;
12330
12331           if (low0 == low1)
12332             {
12333               arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12334
12335               lshift = build_int_cst (type, -1);
12336               lshift = int_const_binop (code, lshift, arg1, 0);
12337
12338               return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift);
12339             }
12340         }
12341
12342       /* Rewrite an LROTATE_EXPR by a constant into an
12343          RROTATE_EXPR by a new constant.  */
12344       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
12345         {
12346           tree tem = build_int_cst (TREE_TYPE (arg1),
12347                                     TYPE_PRECISION (type));
12348           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
12349           return fold_build2_loc (loc, RROTATE_EXPR, type, op0, tem);
12350         }
12351
12352       /* If we have a rotate of a bit operation with the rotate count and
12353          the second operand of the bit operation both constant,
12354          permute the two operations.  */
12355       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12356           && (TREE_CODE (arg0) == BIT_AND_EXPR
12357               || TREE_CODE (arg0) == BIT_IOR_EXPR
12358               || TREE_CODE (arg0) == BIT_XOR_EXPR)
12359           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12360         return fold_build2_loc (loc, TREE_CODE (arg0), type,
12361                             fold_build2_loc (loc, code, type,
12362                                          TREE_OPERAND (arg0, 0), arg1),
12363                             fold_build2_loc (loc, code, type,
12364                                          TREE_OPERAND (arg0, 1), arg1));
12365
12366       /* Two consecutive rotates adding up to the precision of the
12367          type can be ignored.  */
12368       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12369           && TREE_CODE (arg0) == RROTATE_EXPR
12370           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12371           && TREE_INT_CST_HIGH (arg1) == 0
12372           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
12373           && ((TREE_INT_CST_LOW (arg1)
12374                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
12375               == (unsigned int) TYPE_PRECISION (type)))
12376         return TREE_OPERAND (arg0, 0);
12377
12378       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
12379               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
12380          if the latter can be further optimized.  */
12381       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
12382           && TREE_CODE (arg0) == BIT_AND_EXPR
12383           && TREE_CODE (arg1) == INTEGER_CST
12384           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12385         {
12386           tree mask = fold_build2_loc (loc, code, type,
12387                                    fold_convert_loc (loc, type,
12388                                                      TREE_OPERAND (arg0, 1)),
12389                                    arg1);
12390           tree shift = fold_build2_loc (loc, code, type,
12391                                     fold_convert_loc (loc, type,
12392                                                       TREE_OPERAND (arg0, 0)),
12393                                     arg1);
12394           tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
12395           if (tem)
12396             return tem;
12397         }
12398
12399       return NULL_TREE;
12400
12401     case MIN_EXPR:
12402       if (operand_equal_p (arg0, arg1, 0))
12403         return omit_one_operand_loc (loc, type, arg0, arg1);
12404       if (INTEGRAL_TYPE_P (type)
12405           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
12406         return omit_one_operand_loc (loc, type, arg1, arg0);
12407       tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
12408       if (tem)
12409         return tem;
12410       goto associate;
12411
12412     case MAX_EXPR:
12413       if (operand_equal_p (arg0, arg1, 0))
12414         return omit_one_operand_loc (loc, type, arg0, arg1);
12415       if (INTEGRAL_TYPE_P (type)
12416           && TYPE_MAX_VALUE (type)
12417           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
12418         return omit_one_operand_loc (loc, type, arg1, arg0);
12419       tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
12420       if (tem)
12421         return tem;
12422       goto associate;
12423
12424     case TRUTH_ANDIF_EXPR:
12425       /* Note that the operands of this must be ints
12426          and their values must be 0 or 1.
12427          ("true" is a fixed value perhaps depending on the language.)  */
12428       /* If first arg is constant zero, return it.  */
12429       if (integer_zerop (arg0))
12430         return fold_convert_loc (loc, type, arg0);
12431     case TRUTH_AND_EXPR:
12432       /* If either arg is constant true, drop it.  */
12433       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12434         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12435       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
12436           /* Preserve sequence points.  */
12437           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12438         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12439       /* If second arg is constant zero, result is zero, but first arg
12440          must be evaluated.  */
12441       if (integer_zerop (arg1))
12442         return omit_one_operand_loc (loc, type, arg1, arg0);
12443       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
12444          case will be handled here.  */
12445       if (integer_zerop (arg0))
12446         return omit_one_operand_loc (loc, type, arg0, arg1);
12447
12448       /* !X && X is always false.  */
12449       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12450           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12451         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12452       /* X && !X is always false.  */
12453       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12454           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12455         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12456
12457       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
12458          means A >= Y && A != MAX, but in this case we know that
12459          A < X <= MAX.  */
12460
12461       if (!TREE_SIDE_EFFECTS (arg0)
12462           && !TREE_SIDE_EFFECTS (arg1))
12463         {
12464           tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1);
12465           if (tem && !operand_equal_p (tem, arg0, 0))
12466             return fold_build2_loc (loc, code, type, tem, arg1);
12467
12468           tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0);
12469           if (tem && !operand_equal_p (tem, arg1, 0))
12470             return fold_build2_loc (loc, code, type, arg0, tem);
12471         }
12472
12473     truth_andor:
12474       /* We only do these simplifications if we are optimizing.  */
12475       if (!optimize)
12476         return NULL_TREE;
12477
12478       /* Check for things like (A || B) && (A || C).  We can convert this
12479          to A || (B && C).  Note that either operator can be any of the four
12480          truth and/or operations and the transformation will still be
12481          valid.   Also note that we only care about order for the
12482          ANDIF and ORIF operators.  If B contains side effects, this
12483          might change the truth-value of A.  */
12484       if (TREE_CODE (arg0) == TREE_CODE (arg1)
12485           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
12486               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
12487               || TREE_CODE (arg0) == TRUTH_AND_EXPR
12488               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
12489           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
12490         {
12491           tree a00 = TREE_OPERAND (arg0, 0);
12492           tree a01 = TREE_OPERAND (arg0, 1);
12493           tree a10 = TREE_OPERAND (arg1, 0);
12494           tree a11 = TREE_OPERAND (arg1, 1);
12495           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
12496                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
12497                              && (code == TRUTH_AND_EXPR
12498                                  || code == TRUTH_OR_EXPR));
12499
12500           if (operand_equal_p (a00, a10, 0))
12501             return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
12502                                 fold_build2_loc (loc, code, type, a01, a11));
12503           else if (commutative && operand_equal_p (a00, a11, 0))
12504             return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
12505                                 fold_build2_loc (loc, code, type, a01, a10));
12506           else if (commutative && operand_equal_p (a01, a10, 0))
12507             return fold_build2_loc (loc, TREE_CODE (arg0), type, a01,
12508                                 fold_build2_loc (loc, code, type, a00, a11));
12509
12510           /* This case if tricky because we must either have commutative
12511              operators or else A10 must not have side-effects.  */
12512
12513           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
12514                    && operand_equal_p (a01, a11, 0))
12515             return fold_build2_loc (loc, TREE_CODE (arg0), type,
12516                                 fold_build2_loc (loc, code, type, a00, a10),
12517                                 a01);
12518         }
12519
12520       /* See if we can build a range comparison.  */
12521       if (0 != (tem = fold_range_test (loc, code, type, op0, op1)))
12522         return tem;
12523
12524       /* Check for the possibility of merging component references.  If our
12525          lhs is another similar operation, try to merge its rhs with our
12526          rhs.  Then try to merge our lhs and rhs.  */
12527       if (TREE_CODE (arg0) == code
12528           && 0 != (tem = fold_truthop (loc, code, type,
12529                                        TREE_OPERAND (arg0, 1), arg1)))
12530         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12531
12532       if ((tem = fold_truthop (loc, code, type, arg0, arg1)) != 0)
12533         return tem;
12534
12535       return NULL_TREE;
12536
12537     case TRUTH_ORIF_EXPR:
12538       /* Note that the operands of this must be ints
12539          and their values must be 0 or true.
12540          ("true" is a fixed value perhaps depending on the language.)  */
12541       /* If first arg is constant true, return it.  */
12542       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12543         return fold_convert_loc (loc, type, arg0);
12544     case TRUTH_OR_EXPR:
12545       /* If either arg is constant zero, drop it.  */
12546       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12547         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12548       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12549           /* Preserve sequence points.  */
12550           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12551         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12552       /* If second arg is constant true, result is true, but we must
12553          evaluate first arg.  */
12554       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12555         return omit_one_operand_loc (loc, type, arg1, arg0);
12556       /* Likewise for first arg, but note this only occurs here for
12557          TRUTH_OR_EXPR.  */
12558       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12559         return omit_one_operand_loc (loc, type, arg0, arg1);
12560
12561       /* !X || X is always true.  */
12562       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12563           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12564         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12565       /* X || !X is always true.  */
12566       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12567           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12568         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12569
12570       goto truth_andor;
12571
12572     case TRUTH_XOR_EXPR:
12573       /* If the second arg is constant zero, drop it.  */
12574       if (integer_zerop (arg1))
12575         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12576       /* If the second arg is constant true, this is a logical inversion.  */
12577       if (integer_onep (arg1))
12578         {
12579           /* Only call invert_truthvalue if operand is a truth value.  */
12580           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
12581             tem = fold_build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
12582           else
12583             tem = invert_truthvalue_loc (loc, arg0);
12584           return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
12585         }
12586       /* Identical arguments cancel to zero.  */
12587       if (operand_equal_p (arg0, arg1, 0))
12588         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12589
12590       /* !X ^ X is always true.  */
12591       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12592           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12593         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12594
12595       /* X ^ !X is always true.  */
12596       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12597           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12598         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12599
12600       return NULL_TREE;
12601
12602     case EQ_EXPR:
12603     case NE_EXPR:
12604       tem = fold_comparison (loc, code, type, op0, op1);
12605       if (tem != NULL_TREE)
12606         return tem;
12607
12608       /* bool_var != 0 becomes bool_var. */
12609       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12610           && code == NE_EXPR)
12611         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12612
12613       /* bool_var == 1 becomes bool_var. */
12614       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12615           && code == EQ_EXPR)
12616         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12617
12618       /* bool_var != 1 becomes !bool_var. */
12619       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12620           && code == NE_EXPR)
12621         return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
12622                             fold_convert_loc (loc, type, arg0));
12623
12624       /* bool_var == 0 becomes !bool_var. */
12625       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12626           && code == EQ_EXPR)
12627         return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
12628                             fold_convert_loc (loc, type, arg0));
12629
12630       /* !exp != 0 becomes !exp */
12631       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1)
12632           && code == NE_EXPR)
12633         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12634
12635       /* If this is an equality comparison of the address of two non-weak,
12636          unaliased symbols neither of which are extern (since we do not
12637          have access to attributes for externs), then we know the result.  */
12638       if (TREE_CODE (arg0) == ADDR_EXPR
12639           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
12640           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
12641           && ! lookup_attribute ("alias",
12642                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
12643           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
12644           && TREE_CODE (arg1) == ADDR_EXPR
12645           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
12646           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
12647           && ! lookup_attribute ("alias",
12648                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
12649           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
12650         {
12651           /* We know that we're looking at the address of two
12652              non-weak, unaliased, static _DECL nodes.
12653
12654              It is both wasteful and incorrect to call operand_equal_p
12655              to compare the two ADDR_EXPR nodes.  It is wasteful in that
12656              all we need to do is test pointer equality for the arguments
12657              to the two ADDR_EXPR nodes.  It is incorrect to use
12658              operand_equal_p as that function is NOT equivalent to a
12659              C equality test.  It can in fact return false for two
12660              objects which would test as equal using the C equality
12661              operator.  */
12662           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12663           return constant_boolean_node (equal
12664                                         ? code == EQ_EXPR : code != EQ_EXPR,
12665                                         type);
12666         }
12667
12668       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
12669          a MINUS_EXPR of a constant, we can convert it into a comparison with
12670          a revised constant as long as no overflow occurs.  */
12671       if (TREE_CODE (arg1) == INTEGER_CST
12672           && (TREE_CODE (arg0) == PLUS_EXPR
12673               || TREE_CODE (arg0) == MINUS_EXPR)
12674           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12675           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
12676                                       ? MINUS_EXPR : PLUS_EXPR,
12677                                       fold_convert_loc (loc, TREE_TYPE (arg0),
12678                                                         arg1),
12679                                       TREE_OPERAND (arg0, 1), 0))
12680           && !TREE_OVERFLOW (tem))
12681         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12682
12683       /* Similarly for a NEGATE_EXPR.  */
12684       if (TREE_CODE (arg0) == NEGATE_EXPR
12685           && TREE_CODE (arg1) == INTEGER_CST
12686           && 0 != (tem = negate_expr (arg1))
12687           && TREE_CODE (tem) == INTEGER_CST
12688           && !TREE_OVERFLOW (tem))
12689         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12690
12691       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
12692       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12693           && TREE_CODE (arg1) == INTEGER_CST
12694           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12695         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12696                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0),
12697                                          fold_convert_loc (loc,
12698                                                            TREE_TYPE (arg0),
12699                                                            arg1),
12700                                          TREE_OPERAND (arg0, 1)));
12701
12702       /* Transform comparisons of the form X +- Y CMP X to Y CMP 0.  */
12703       if ((TREE_CODE (arg0) == PLUS_EXPR
12704            || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12705            || TREE_CODE (arg0) == MINUS_EXPR)
12706           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12707           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12708               || POINTER_TYPE_P (TREE_TYPE (arg0))))
12709         {
12710           tree val = TREE_OPERAND (arg0, 1);
12711           return omit_two_operands_loc (loc, type,
12712                                     fold_build2_loc (loc, code, type,
12713                                                  val,
12714                                                  build_int_cst (TREE_TYPE (val),
12715                                                                 0)),
12716                                     TREE_OPERAND (arg0, 0), arg1);
12717         }
12718
12719       /* Transform comparisons of the form C - X CMP X if C % 2 == 1.  */
12720       if (TREE_CODE (arg0) == MINUS_EXPR
12721           && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12722           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)
12723           && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1)
12724         {
12725           return omit_two_operands_loc (loc, type,
12726                                     code == NE_EXPR
12727                                     ? boolean_true_node : boolean_false_node,
12728                                     TREE_OPERAND (arg0, 1), arg1);
12729         }
12730
12731       /* If we have X - Y == 0, we can convert that to X == Y and similarly
12732          for !=.  Don't do this for ordered comparisons due to overflow.  */
12733       if (TREE_CODE (arg0) == MINUS_EXPR
12734           && integer_zerop (arg1))
12735         return fold_build2_loc (loc, code, type,
12736                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
12737
12738       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
12739       if (TREE_CODE (arg0) == ABS_EXPR
12740           && (integer_zerop (arg1) || real_zerop (arg1)))
12741         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1);
12742
12743       /* If this is an EQ or NE comparison with zero and ARG0 is
12744          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
12745          two operations, but the latter can be done in one less insn
12746          on machines that have only two-operand insns or on which a
12747          constant cannot be the first operand.  */
12748       if (TREE_CODE (arg0) == BIT_AND_EXPR
12749           && integer_zerop (arg1))
12750         {
12751           tree arg00 = TREE_OPERAND (arg0, 0);
12752           tree arg01 = TREE_OPERAND (arg0, 1);
12753           if (TREE_CODE (arg00) == LSHIFT_EXPR
12754               && integer_onep (TREE_OPERAND (arg00, 0)))
12755             {
12756               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00),
12757                                       arg01, TREE_OPERAND (arg00, 1));
12758               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12759                                  build_int_cst (TREE_TYPE (arg0), 1));
12760               return fold_build2_loc (loc, code, type,
12761                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12762                                   arg1);
12763             }
12764           else if (TREE_CODE (arg01) == LSHIFT_EXPR
12765                    && integer_onep (TREE_OPERAND (arg01, 0)))
12766             {
12767               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01),
12768                                       arg00, TREE_OPERAND (arg01, 1));
12769               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12770                                  build_int_cst (TREE_TYPE (arg0), 1));
12771               return fold_build2_loc (loc, code, type,
12772                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12773                                   arg1);
12774             }
12775         }
12776
12777       /* If this is an NE or EQ comparison of zero against the result of a
12778          signed MOD operation whose second operand is a power of 2, make
12779          the MOD operation unsigned since it is simpler and equivalent.  */
12780       if (integer_zerop (arg1)
12781           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12782           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12783               || TREE_CODE (arg0) == CEIL_MOD_EXPR
12784               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12785               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12786           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12787         {
12788           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12789           tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype,
12790                                      fold_convert_loc (loc, newtype,
12791                                                        TREE_OPERAND (arg0, 0)),
12792                                      fold_convert_loc (loc, newtype,
12793                                                        TREE_OPERAND (arg0, 1)));
12794
12795           return fold_build2_loc (loc, code, type, newmod,
12796                               fold_convert_loc (loc, newtype, arg1));
12797         }
12798
12799       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12800          C1 is a valid shift constant, and C2 is a power of two, i.e.
12801          a single bit.  */
12802       if (TREE_CODE (arg0) == BIT_AND_EXPR
12803           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12804           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12805              == INTEGER_CST
12806           && integer_pow2p (TREE_OPERAND (arg0, 1))
12807           && integer_zerop (arg1))
12808         {
12809           tree itype = TREE_TYPE (arg0);
12810           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
12811           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12812
12813           /* Check for a valid shift count.  */
12814           if (TREE_INT_CST_HIGH (arg001) == 0
12815               && TREE_INT_CST_LOW (arg001) < prec)
12816             {
12817               tree arg01 = TREE_OPERAND (arg0, 1);
12818               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12819               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12820               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12821                  can be rewritten as (X & (C2 << C1)) != 0.  */
12822               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12823                 {
12824                   tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001);
12825                   tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem);
12826                   return fold_build2_loc (loc, code, type, tem, arg1);
12827                 }
12828               /* Otherwise, for signed (arithmetic) shifts,
12829                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12830                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
12831               else if (!TYPE_UNSIGNED (itype))
12832                 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12833                                     arg000, build_int_cst (itype, 0));
12834               /* Otherwise, of unsigned (logical) shifts,
12835                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12836                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
12837               else
12838                 return omit_one_operand_loc (loc, type,
12839                                          code == EQ_EXPR ? integer_one_node
12840                                                          : integer_zero_node,
12841                                          arg000);
12842             }
12843         }
12844
12845       /* If this is an NE comparison of zero with an AND of one, remove the
12846          comparison since the AND will give the correct value.  */
12847       if (code == NE_EXPR
12848           && integer_zerop (arg1)
12849           && TREE_CODE (arg0) == BIT_AND_EXPR
12850           && integer_onep (TREE_OPERAND (arg0, 1)))
12851         return fold_convert_loc (loc, type, arg0);
12852
12853       /* If we have (A & C) == C where C is a power of 2, convert this into
12854          (A & C) != 0.  Similarly for NE_EXPR.  */
12855       if (TREE_CODE (arg0) == BIT_AND_EXPR
12856           && integer_pow2p (TREE_OPERAND (arg0, 1))
12857           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12858         return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12859                             arg0, fold_convert_loc (loc, TREE_TYPE (arg0),
12860                                                     integer_zero_node));
12861
12862       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12863          bit, then fold the expression into A < 0 or A >= 0.  */
12864       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type);
12865       if (tem)
12866         return tem;
12867
12868       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12869          Similarly for NE_EXPR.  */
12870       if (TREE_CODE (arg0) == BIT_AND_EXPR
12871           && TREE_CODE (arg1) == INTEGER_CST
12872           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12873         {
12874           tree notc = fold_build1_loc (loc, BIT_NOT_EXPR,
12875                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
12876                                    TREE_OPERAND (arg0, 1));
12877           tree dandnotc = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12878                                        arg1, notc);
12879           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12880           if (integer_nonzerop (dandnotc))
12881             return omit_one_operand_loc (loc, type, rslt, arg0);
12882         }
12883
12884       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12885          Similarly for NE_EXPR.  */
12886       if (TREE_CODE (arg0) == BIT_IOR_EXPR
12887           && TREE_CODE (arg1) == INTEGER_CST
12888           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12889         {
12890           tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12891           tree candnotd = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12892                                        TREE_OPERAND (arg0, 1), notd);
12893           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12894           if (integer_nonzerop (candnotd))
12895             return omit_one_operand_loc (loc, type, rslt, arg0);
12896         }
12897
12898       /* If this is a comparison of a field, we may be able to simplify it.  */
12899       if ((TREE_CODE (arg0) == COMPONENT_REF
12900            || TREE_CODE (arg0) == BIT_FIELD_REF)
12901           /* Handle the constant case even without -O
12902              to make sure the warnings are given.  */
12903           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12904         {
12905           t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1);
12906           if (t1)
12907             return t1;
12908         }
12909
12910       /* Optimize comparisons of strlen vs zero to a compare of the
12911          first character of the string vs zero.  To wit,
12912                 strlen(ptr) == 0   =>  *ptr == 0
12913                 strlen(ptr) != 0   =>  *ptr != 0
12914          Other cases should reduce to one of these two (or a constant)
12915          due to the return value of strlen being unsigned.  */
12916       if (TREE_CODE (arg0) == CALL_EXPR
12917           && integer_zerop (arg1))
12918         {
12919           tree fndecl = get_callee_fndecl (arg0);
12920
12921           if (fndecl
12922               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12923               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12924               && call_expr_nargs (arg0) == 1
12925               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12926             {
12927               tree iref = build_fold_indirect_ref_loc (loc,
12928                                                    CALL_EXPR_ARG (arg0, 0));
12929               return fold_build2_loc (loc, code, type, iref,
12930                                   build_int_cst (TREE_TYPE (iref), 0));
12931             }
12932         }
12933
12934       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12935          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12936       if (TREE_CODE (arg0) == RSHIFT_EXPR
12937           && integer_zerop (arg1)
12938           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12939         {
12940           tree arg00 = TREE_OPERAND (arg0, 0);
12941           tree arg01 = TREE_OPERAND (arg0, 1);
12942           tree itype = TREE_TYPE (arg00);
12943           if (TREE_INT_CST_HIGH (arg01) == 0
12944               && TREE_INT_CST_LOW (arg01)
12945                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12946             {
12947               if (TYPE_UNSIGNED (itype))
12948                 {
12949                   itype = signed_type_for (itype);
12950                   arg00 = fold_convert_loc (loc, itype, arg00);
12951                 }
12952               return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12953                                   type, arg00, build_int_cst (itype, 0));
12954             }
12955         }
12956
12957       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12958       if (integer_zerop (arg1)
12959           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12960         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12961                             TREE_OPERAND (arg0, 1));
12962
12963       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12964       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12965           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12966         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12967                             build_int_cst (TREE_TYPE (arg1), 0));
12968       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12969       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12970           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12971           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12972         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
12973                             build_int_cst (TREE_TYPE (arg1), 0));
12974
12975       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12976       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12977           && TREE_CODE (arg1) == INTEGER_CST
12978           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12979         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12980                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1),
12981                                          TREE_OPERAND (arg0, 1), arg1));
12982
12983       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12984          (X & C) == 0 when C is a single bit.  */
12985       if (TREE_CODE (arg0) == BIT_AND_EXPR
12986           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12987           && integer_zerop (arg1)
12988           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12989         {
12990           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12991                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12992                              TREE_OPERAND (arg0, 1));
12993           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12994                               type, tem, arg1);
12995         }
12996
12997       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12998          constant C is a power of two, i.e. a single bit.  */
12999       if (TREE_CODE (arg0) == BIT_XOR_EXPR
13000           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13001           && integer_zerop (arg1)
13002           && integer_pow2p (TREE_OPERAND (arg0, 1))
13003           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13004                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
13005         {
13006           tree arg00 = TREE_OPERAND (arg0, 0);
13007           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
13008                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
13009         }
13010
13011       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
13012          when is C is a power of two, i.e. a single bit.  */
13013       if (TREE_CODE (arg0) == BIT_AND_EXPR
13014           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
13015           && integer_zerop (arg1)
13016           && integer_pow2p (TREE_OPERAND (arg0, 1))
13017           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13018                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
13019         {
13020           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
13021           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000),
13022                              arg000, TREE_OPERAND (arg0, 1));
13023           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
13024                               tem, build_int_cst (TREE_TYPE (tem), 0));
13025         }
13026
13027       if (integer_zerop (arg1)
13028           && tree_expr_nonzero_p (arg0))
13029         {
13030           tree res = constant_boolean_node (code==NE_EXPR, type);
13031           return omit_one_operand_loc (loc, type, res, arg0);
13032         }
13033
13034       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
13035       if (TREE_CODE (arg0) == NEGATE_EXPR
13036           && TREE_CODE (arg1) == NEGATE_EXPR)
13037         return fold_build2_loc (loc, code, type,
13038                             TREE_OPERAND (arg0, 0),
13039                             TREE_OPERAND (arg1, 0));
13040
13041       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
13042       if (TREE_CODE (arg0) == BIT_AND_EXPR
13043           && TREE_CODE (arg1) == BIT_AND_EXPR)
13044         {
13045           tree arg00 = TREE_OPERAND (arg0, 0);
13046           tree arg01 = TREE_OPERAND (arg0, 1);
13047           tree arg10 = TREE_OPERAND (arg1, 0);
13048           tree arg11 = TREE_OPERAND (arg1, 1);
13049           tree itype = TREE_TYPE (arg0);
13050
13051           if (operand_equal_p (arg01, arg11, 0))
13052             return fold_build2_loc (loc, code, type,
13053                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13054                                              fold_build2_loc (loc,
13055                                                           BIT_XOR_EXPR, itype,
13056                                                           arg00, arg10),
13057                                              arg01),
13058                                 build_int_cst (itype, 0));
13059
13060           if (operand_equal_p (arg01, arg10, 0))
13061             return fold_build2_loc (loc, code, type,
13062                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13063                                              fold_build2_loc (loc,
13064                                                           BIT_XOR_EXPR, itype,
13065                                                           arg00, arg11),
13066                                              arg01),
13067                                 build_int_cst (itype, 0));
13068
13069           if (operand_equal_p (arg00, arg11, 0))
13070             return fold_build2_loc (loc, code, type,
13071                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13072                                              fold_build2_loc (loc,
13073                                                           BIT_XOR_EXPR, itype,
13074                                                           arg01, arg10),
13075                                              arg00),
13076                                 build_int_cst (itype, 0));
13077
13078           if (operand_equal_p (arg00, arg10, 0))
13079             return fold_build2_loc (loc, code, type,
13080                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13081                                              fold_build2_loc (loc,
13082                                                           BIT_XOR_EXPR, itype,
13083                                                           arg01, arg11),
13084                                              arg00),
13085                                 build_int_cst (itype, 0));
13086         }
13087
13088       if (TREE_CODE (arg0) == BIT_XOR_EXPR
13089           && TREE_CODE (arg1) == BIT_XOR_EXPR)
13090         {
13091           tree arg00 = TREE_OPERAND (arg0, 0);
13092           tree arg01 = TREE_OPERAND (arg0, 1);
13093           tree arg10 = TREE_OPERAND (arg1, 0);
13094           tree arg11 = TREE_OPERAND (arg1, 1);
13095           tree itype = TREE_TYPE (arg0);
13096
13097           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
13098              operand_equal_p guarantees no side-effects so we don't need
13099              to use omit_one_operand on Z.  */
13100           if (operand_equal_p (arg01, arg11, 0))
13101             return fold_build2_loc (loc, code, type, arg00, arg10);
13102           if (operand_equal_p (arg01, arg10, 0))
13103             return fold_build2_loc (loc, code, type, arg00, arg11);
13104           if (operand_equal_p (arg00, arg11, 0))
13105             return fold_build2_loc (loc, code, type, arg01, arg10);
13106           if (operand_equal_p (arg00, arg10, 0))
13107             return fold_build2_loc (loc, code, type, arg01, arg11);
13108
13109           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
13110           if (TREE_CODE (arg01) == INTEGER_CST
13111               && TREE_CODE (arg11) == INTEGER_CST)
13112             return fold_build2_loc (loc, code, type,
13113                                 fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00,
13114                                              fold_build2_loc (loc,
13115                                                           BIT_XOR_EXPR, itype,
13116                                                           arg01, arg11)),
13117                                 arg10);
13118         }
13119
13120       /* Attempt to simplify equality/inequality comparisons of complex
13121          values.  Only lower the comparison if the result is known or
13122          can be simplified to a single scalar comparison.  */
13123       if ((TREE_CODE (arg0) == COMPLEX_EXPR
13124            || TREE_CODE (arg0) == COMPLEX_CST)
13125           && (TREE_CODE (arg1) == COMPLEX_EXPR
13126               || TREE_CODE (arg1) == COMPLEX_CST))
13127         {
13128           tree real0, imag0, real1, imag1;
13129           tree rcond, icond;
13130
13131           if (TREE_CODE (arg0) == COMPLEX_EXPR)
13132             {
13133               real0 = TREE_OPERAND (arg0, 0);
13134               imag0 = TREE_OPERAND (arg0, 1);
13135             }
13136           else
13137             {
13138               real0 = TREE_REALPART (arg0);
13139               imag0 = TREE_IMAGPART (arg0);
13140             }
13141
13142           if (TREE_CODE (arg1) == COMPLEX_EXPR)
13143             {
13144               real1 = TREE_OPERAND (arg1, 0);
13145               imag1 = TREE_OPERAND (arg1, 1);
13146             }
13147           else
13148             {
13149               real1 = TREE_REALPART (arg1);
13150               imag1 = TREE_IMAGPART (arg1);
13151             }
13152
13153           rcond = fold_binary_loc (loc, code, type, real0, real1);
13154           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
13155             {
13156               if (integer_zerop (rcond))
13157                 {
13158                   if (code == EQ_EXPR)
13159                     return omit_two_operands_loc (loc, type, boolean_false_node,
13160                                               imag0, imag1);
13161                   return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1);
13162                 }
13163               else
13164                 {
13165                   if (code == NE_EXPR)
13166                     return omit_two_operands_loc (loc, type, boolean_true_node,
13167                                               imag0, imag1);
13168                   return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1);
13169                 }
13170             }
13171
13172           icond = fold_binary_loc (loc, code, type, imag0, imag1);
13173           if (icond && TREE_CODE (icond) == INTEGER_CST)
13174             {
13175               if (integer_zerop (icond))
13176                 {
13177                   if (code == EQ_EXPR)
13178                     return omit_two_operands_loc (loc, type, boolean_false_node,
13179                                               real0, real1);
13180                   return fold_build2_loc (loc, NE_EXPR, type, real0, real1);
13181                 }
13182               else
13183                 {
13184                   if (code == NE_EXPR)
13185                     return omit_two_operands_loc (loc, type, boolean_true_node,
13186                                               real0, real1);
13187                   return fold_build2_loc (loc, EQ_EXPR, type, real0, real1);
13188                 }
13189             }
13190         }
13191
13192       return NULL_TREE;
13193
13194     case LT_EXPR:
13195     case GT_EXPR:
13196     case LE_EXPR:
13197     case GE_EXPR:
13198       tem = fold_comparison (loc, code, type, op0, op1);
13199       if (tem != NULL_TREE)
13200         return tem;
13201
13202       /* Transform comparisons of the form X +- C CMP X.  */
13203       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
13204           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
13205           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
13206                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
13207               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
13208                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
13209         {
13210           tree arg01 = TREE_OPERAND (arg0, 1);
13211           enum tree_code code0 = TREE_CODE (arg0);
13212           int is_positive;
13213
13214           if (TREE_CODE (arg01) == REAL_CST)
13215             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
13216           else
13217             is_positive = tree_int_cst_sgn (arg01);
13218
13219           /* (X - c) > X becomes false.  */
13220           if (code == GT_EXPR
13221               && ((code0 == MINUS_EXPR && is_positive >= 0)
13222                   || (code0 == PLUS_EXPR && is_positive <= 0)))
13223             {
13224               if (TREE_CODE (arg01) == INTEGER_CST
13225                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13226                 fold_overflow_warning (("assuming signed overflow does not "
13227                                         "occur when assuming that (X - c) > X "
13228                                         "is always false"),
13229                                        WARN_STRICT_OVERFLOW_ALL);
13230               return constant_boolean_node (0, type);
13231             }
13232
13233           /* Likewise (X + c) < X becomes false.  */
13234           if (code == LT_EXPR
13235               && ((code0 == PLUS_EXPR && is_positive >= 0)
13236                   || (code0 == MINUS_EXPR && is_positive <= 0)))
13237             {
13238               if (TREE_CODE (arg01) == INTEGER_CST
13239                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13240                 fold_overflow_warning (("assuming signed overflow does not "
13241                                         "occur when assuming that "
13242                                         "(X + c) < X is always false"),
13243                                        WARN_STRICT_OVERFLOW_ALL);
13244               return constant_boolean_node (0, type);
13245             }
13246
13247           /* Convert (X - c) <= X to true.  */
13248           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13249               && code == LE_EXPR
13250               && ((code0 == MINUS_EXPR && is_positive >= 0)
13251                   || (code0 == PLUS_EXPR && is_positive <= 0)))
13252             {
13253               if (TREE_CODE (arg01) == INTEGER_CST
13254                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13255                 fold_overflow_warning (("assuming signed overflow does not "
13256                                         "occur when assuming that "
13257                                         "(X - c) <= X is always true"),
13258                                        WARN_STRICT_OVERFLOW_ALL);
13259               return constant_boolean_node (1, type);
13260             }
13261
13262           /* Convert (X + c) >= X to true.  */
13263           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13264               && code == GE_EXPR
13265               && ((code0 == PLUS_EXPR && is_positive >= 0)
13266                   || (code0 == MINUS_EXPR && is_positive <= 0)))
13267             {
13268               if (TREE_CODE (arg01) == INTEGER_CST
13269                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13270                 fold_overflow_warning (("assuming signed overflow does not "
13271                                         "occur when assuming that "
13272                                         "(X + c) >= X is always true"),
13273                                        WARN_STRICT_OVERFLOW_ALL);
13274               return constant_boolean_node (1, type);
13275             }
13276
13277           if (TREE_CODE (arg01) == INTEGER_CST)
13278             {
13279               /* Convert X + c > X and X - c < X to true for integers.  */
13280               if (code == GT_EXPR
13281                   && ((code0 == PLUS_EXPR && is_positive > 0)
13282                       || (code0 == MINUS_EXPR && is_positive < 0)))
13283                 {
13284                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13285                     fold_overflow_warning (("assuming signed overflow does "
13286                                             "not occur when assuming that "
13287                                             "(X + c) > X is always true"),
13288                                            WARN_STRICT_OVERFLOW_ALL);
13289                   return constant_boolean_node (1, type);
13290                 }
13291
13292               if (code == LT_EXPR
13293                   && ((code0 == MINUS_EXPR && is_positive > 0)
13294                       || (code0 == PLUS_EXPR && is_positive < 0)))
13295                 {
13296                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13297                     fold_overflow_warning (("assuming signed overflow does "
13298                                             "not occur when assuming that "
13299                                             "(X - c) < X is always true"),
13300                                            WARN_STRICT_OVERFLOW_ALL);
13301                   return constant_boolean_node (1, type);
13302                 }
13303
13304               /* Convert X + c <= X and X - c >= X to false for integers.  */
13305               if (code == LE_EXPR
13306                   && ((code0 == PLUS_EXPR && is_positive > 0)
13307                       || (code0 == MINUS_EXPR && is_positive < 0)))
13308                 {
13309                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13310                     fold_overflow_warning (("assuming signed overflow does "
13311                                             "not occur when assuming that "
13312                                             "(X + c) <= X is always false"),
13313                                            WARN_STRICT_OVERFLOW_ALL);
13314                   return constant_boolean_node (0, type);
13315                 }
13316
13317               if (code == GE_EXPR
13318                   && ((code0 == MINUS_EXPR && is_positive > 0)
13319                       || (code0 == PLUS_EXPR && is_positive < 0)))
13320                 {
13321                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13322                     fold_overflow_warning (("assuming signed overflow does "
13323                                             "not occur when assuming that "
13324                                             "(X - c) >= X is always false"),
13325                                            WARN_STRICT_OVERFLOW_ALL);
13326                   return constant_boolean_node (0, type);
13327                 }
13328             }
13329         }
13330
13331       /* Comparisons with the highest or lowest possible integer of
13332          the specified precision will have known values.  */
13333       {
13334         tree arg1_type = TREE_TYPE (arg1);
13335         unsigned int width = TYPE_PRECISION (arg1_type);
13336
13337         if (TREE_CODE (arg1) == INTEGER_CST
13338             && width <= 2 * HOST_BITS_PER_WIDE_INT
13339             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
13340           {
13341             HOST_WIDE_INT signed_max_hi;
13342             unsigned HOST_WIDE_INT signed_max_lo;
13343             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
13344
13345             if (width <= HOST_BITS_PER_WIDE_INT)
13346               {
13347                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13348                                 - 1;
13349                 signed_max_hi = 0;
13350                 max_hi = 0;
13351
13352                 if (TYPE_UNSIGNED (arg1_type))
13353                   {
13354                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13355                     min_lo = 0;
13356                     min_hi = 0;
13357                   }
13358                 else
13359                   {
13360                     max_lo = signed_max_lo;
13361                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13362                     min_hi = -1;
13363                   }
13364               }
13365             else
13366               {
13367                 width -= HOST_BITS_PER_WIDE_INT;
13368                 signed_max_lo = -1;
13369                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13370                                 - 1;
13371                 max_lo = -1;
13372                 min_lo = 0;
13373
13374                 if (TYPE_UNSIGNED (arg1_type))
13375                   {
13376                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13377                     min_hi = 0;
13378                   }
13379                 else
13380                   {
13381                     max_hi = signed_max_hi;
13382                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13383                   }
13384               }
13385
13386             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
13387                 && TREE_INT_CST_LOW (arg1) == max_lo)
13388               switch (code)
13389                 {
13390                 case GT_EXPR:
13391                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13392
13393                 case GE_EXPR:
13394                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13395
13396                 case LE_EXPR:
13397                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13398
13399                 case LT_EXPR:
13400                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13401
13402                 /* The GE_EXPR and LT_EXPR cases above are not normally
13403                    reached because of previous transformations.  */
13404
13405                 default:
13406                   break;
13407                 }
13408             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13409                      == max_hi
13410                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
13411               switch (code)
13412                 {
13413                 case GT_EXPR:
13414                   arg1 = const_binop (PLUS_EXPR, arg1,
13415                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
13416                   return fold_build2_loc (loc, EQ_EXPR, type,
13417                                       fold_convert_loc (loc,
13418                                                         TREE_TYPE (arg1), arg0),
13419                                       arg1);
13420                 case LE_EXPR:
13421                   arg1 = const_binop (PLUS_EXPR, arg1,
13422                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
13423                   return fold_build2_loc (loc, NE_EXPR, type,
13424                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13425                                                         arg0),
13426                                       arg1);
13427                 default:
13428                   break;
13429                 }
13430             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13431                      == min_hi
13432                      && TREE_INT_CST_LOW (arg1) == min_lo)
13433               switch (code)
13434                 {
13435                 case LT_EXPR:
13436                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13437
13438                 case LE_EXPR:
13439                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13440
13441                 case GE_EXPR:
13442                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13443
13444                 case GT_EXPR:
13445                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13446
13447                 default:
13448                   break;
13449                 }
13450             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13451                      == min_hi
13452                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
13453               switch (code)
13454                 {
13455                 case GE_EXPR:
13456                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
13457                   return fold_build2_loc (loc, NE_EXPR, type,
13458                                       fold_convert_loc (loc,
13459                                                         TREE_TYPE (arg1), arg0),
13460                                       arg1);
13461                 case LT_EXPR:
13462                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
13463                   return fold_build2_loc (loc, EQ_EXPR, type,
13464                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13465                                                         arg0),
13466                                       arg1);
13467                 default:
13468                   break;
13469                 }
13470
13471             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
13472                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
13473                      && TYPE_UNSIGNED (arg1_type)
13474                      /* We will flip the signedness of the comparison operator
13475                         associated with the mode of arg1, so the sign bit is
13476                         specified by this mode.  Check that arg1 is the signed
13477                         max associated with this sign bit.  */
13478                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
13479                      /* signed_type does not work on pointer types.  */
13480                      && INTEGRAL_TYPE_P (arg1_type))
13481               {
13482                 /* The following case also applies to X < signed_max+1
13483                    and X >= signed_max+1 because previous transformations.  */
13484                 if (code == LE_EXPR || code == GT_EXPR)
13485                   {
13486                     tree st;
13487                     st = signed_type_for (TREE_TYPE (arg1));
13488                     return fold_build2_loc (loc,
13489                                         code == LE_EXPR ? GE_EXPR : LT_EXPR,
13490                                         type, fold_convert_loc (loc, st, arg0),
13491                                         build_int_cst (st, 0));
13492                   }
13493               }
13494           }
13495       }
13496
13497       /* If we are comparing an ABS_EXPR with a constant, we can
13498          convert all the cases into explicit comparisons, but they may
13499          well not be faster than doing the ABS and one comparison.
13500          But ABS (X) <= C is a range comparison, which becomes a subtraction
13501          and a comparison, and is probably faster.  */
13502       if (code == LE_EXPR
13503           && TREE_CODE (arg1) == INTEGER_CST
13504           && TREE_CODE (arg0) == ABS_EXPR
13505           && ! TREE_SIDE_EFFECTS (arg0)
13506           && (0 != (tem = negate_expr (arg1)))
13507           && TREE_CODE (tem) == INTEGER_CST
13508           && !TREE_OVERFLOW (tem))
13509         return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13510                             build2 (GE_EXPR, type,
13511                                     TREE_OPERAND (arg0, 0), tem),
13512                             build2 (LE_EXPR, type,
13513                                     TREE_OPERAND (arg0, 0), arg1));
13514
13515       /* Convert ABS_EXPR<x> >= 0 to true.  */
13516       strict_overflow_p = false;
13517       if (code == GE_EXPR
13518           && (integer_zerop (arg1)
13519               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
13520                   && real_zerop (arg1)))
13521           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13522         {
13523           if (strict_overflow_p)
13524             fold_overflow_warning (("assuming signed overflow does not occur "
13525                                     "when simplifying comparison of "
13526                                     "absolute value and zero"),
13527                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13528           return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13529         }
13530
13531       /* Convert ABS_EXPR<x> < 0 to false.  */
13532       strict_overflow_p = false;
13533       if (code == LT_EXPR
13534           && (integer_zerop (arg1) || real_zerop (arg1))
13535           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13536         {
13537           if (strict_overflow_p)
13538             fold_overflow_warning (("assuming signed overflow does not occur "
13539                                     "when simplifying comparison of "
13540                                     "absolute value and zero"),
13541                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13542           return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13543         }
13544
13545       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13546          and similarly for >= into !=.  */
13547       if ((code == LT_EXPR || code == GE_EXPR)
13548           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13549           && TREE_CODE (arg1) == LSHIFT_EXPR
13550           && integer_onep (TREE_OPERAND (arg1, 0)))
13551         {
13552           tem = build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13553                         build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13554                                 TREE_OPERAND (arg1, 1)),
13555                         build_int_cst (TREE_TYPE (arg0), 0));
13556           goto fold_binary_exit;
13557         }
13558
13559       if ((code == LT_EXPR || code == GE_EXPR)
13560           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13561           && CONVERT_EXPR_P (arg1)
13562           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13563           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13564         {
13565           tem = build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13566                         fold_convert_loc (loc, TREE_TYPE (arg0),
13567                                           build2 (RSHIFT_EXPR,
13568                                                   TREE_TYPE (arg0), arg0,
13569                                                   TREE_OPERAND (TREE_OPERAND (arg1, 0),
13570                                                                 1))),
13571                         build_int_cst (TREE_TYPE (arg0), 0));
13572           goto fold_binary_exit;
13573         }
13574
13575       return NULL_TREE;
13576
13577     case UNORDERED_EXPR:
13578     case ORDERED_EXPR:
13579     case UNLT_EXPR:
13580     case UNLE_EXPR:
13581     case UNGT_EXPR:
13582     case UNGE_EXPR:
13583     case UNEQ_EXPR:
13584     case LTGT_EXPR:
13585       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13586         {
13587           t1 = fold_relational_const (code, type, arg0, arg1);
13588           if (t1 != NULL_TREE)
13589             return t1;
13590         }
13591
13592       /* If the first operand is NaN, the result is constant.  */
13593       if (TREE_CODE (arg0) == REAL_CST
13594           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13595           && (code != LTGT_EXPR || ! flag_trapping_math))
13596         {
13597           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13598                ? integer_zero_node
13599                : integer_one_node;
13600           return omit_one_operand_loc (loc, type, t1, arg1);
13601         }
13602
13603       /* If the second operand is NaN, the result is constant.  */
13604       if (TREE_CODE (arg1) == REAL_CST
13605           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13606           && (code != LTGT_EXPR || ! flag_trapping_math))
13607         {
13608           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13609                ? integer_zero_node
13610                : integer_one_node;
13611           return omit_one_operand_loc (loc, type, t1, arg0);
13612         }
13613
13614       /* Simplify unordered comparison of something with itself.  */
13615       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13616           && operand_equal_p (arg0, arg1, 0))
13617         return constant_boolean_node (1, type);
13618
13619       if (code == LTGT_EXPR
13620           && !flag_trapping_math
13621           && operand_equal_p (arg0, arg1, 0))
13622         return constant_boolean_node (0, type);
13623
13624       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
13625       {
13626         tree targ0 = strip_float_extensions (arg0);
13627         tree targ1 = strip_float_extensions (arg1);
13628         tree newtype = TREE_TYPE (targ0);
13629
13630         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13631           newtype = TREE_TYPE (targ1);
13632
13633         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13634           return fold_build2_loc (loc, code, type,
13635                               fold_convert_loc (loc, newtype, targ0),
13636                               fold_convert_loc (loc, newtype, targ1));
13637       }
13638
13639       return NULL_TREE;
13640
13641     case COMPOUND_EXPR:
13642       /* When pedantic, a compound expression can be neither an lvalue
13643          nor an integer constant expression.  */
13644       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13645         return NULL_TREE;
13646       /* Don't let (0, 0) be null pointer constant.  */
13647       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13648                                  : fold_convert_loc (loc, type, arg1);
13649       return pedantic_non_lvalue_loc (loc, tem);
13650
13651     case COMPLEX_EXPR:
13652       if ((TREE_CODE (arg0) == REAL_CST
13653            && TREE_CODE (arg1) == REAL_CST)
13654           || (TREE_CODE (arg0) == INTEGER_CST
13655               && TREE_CODE (arg1) == INTEGER_CST))
13656         return build_complex (type, arg0, arg1);
13657       return NULL_TREE;
13658
13659     case ASSERT_EXPR:
13660       /* An ASSERT_EXPR should never be passed to fold_binary.  */
13661       gcc_unreachable ();
13662
13663     default:
13664       return NULL_TREE;
13665     } /* switch (code) */
13666  fold_binary_exit:
13667   protected_set_expr_location (tem, loc);
13668   return tem;
13669 }
13670
13671 /* Callback for walk_tree, looking for LABEL_EXPR.  Return *TP if it is
13672    a LABEL_EXPR; otherwise return NULL_TREE.  Do not check the subtrees
13673    of GOTO_EXPR.  */
13674
13675 static tree
13676 contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13677 {
13678   switch (TREE_CODE (*tp))
13679     {
13680     case LABEL_EXPR:
13681       return *tp;
13682
13683     case GOTO_EXPR:
13684       *walk_subtrees = 0;
13685
13686       /* ... fall through ...  */
13687
13688     default:
13689       return NULL_TREE;
13690     }
13691 }
13692
13693 /* Return whether the sub-tree ST contains a label which is accessible from
13694    outside the sub-tree.  */
13695
13696 static bool
13697 contains_label_p (tree st)
13698 {
13699   return
13700    (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE);
13701 }
13702
13703 /* Fold a ternary expression of code CODE and type TYPE with operands
13704    OP0, OP1, and OP2.  Return the folded expression if folding is
13705    successful.  Otherwise, return NULL_TREE.  */
13706
13707 tree
13708 fold_ternary_loc (location_t loc, enum tree_code code, tree type,
13709               tree op0, tree op1, tree op2)
13710 {
13711   tree tem;
13712   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
13713   enum tree_code_class kind = TREE_CODE_CLASS (code);
13714
13715   gcc_assert (IS_EXPR_CODE_CLASS (kind)
13716               && TREE_CODE_LENGTH (code) == 3);
13717
13718   /* Strip any conversions that don't change the mode.  This is safe
13719      for every expression, except for a comparison expression because
13720      its signedness is derived from its operands.  So, in the latter
13721      case, only strip conversions that don't change the signedness.
13722
13723      Note that this is done as an internal manipulation within the
13724      constant folder, in order to find the simplest representation of
13725      the arguments so that their form can be studied.  In any cases,
13726      the appropriate type conversions should be put back in the tree
13727      that will get out of the constant folder.  */
13728   if (op0)
13729     {
13730       arg0 = op0;
13731       STRIP_NOPS (arg0);
13732     }
13733
13734   if (op1)
13735     {
13736       arg1 = op1;
13737       STRIP_NOPS (arg1);
13738     }
13739
13740   switch (code)
13741     {
13742     case COMPONENT_REF:
13743       if (TREE_CODE (arg0) == CONSTRUCTOR
13744           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13745         {
13746           unsigned HOST_WIDE_INT idx;
13747           tree field, value;
13748           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13749             if (field == arg1)
13750               return value;
13751         }
13752       return NULL_TREE;
13753
13754     case COND_EXPR:
13755       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13756          so all simple results must be passed through pedantic_non_lvalue.  */
13757       if (TREE_CODE (arg0) == INTEGER_CST)
13758         {
13759           tree unused_op = integer_zerop (arg0) ? op1 : op2;
13760           tem = integer_zerop (arg0) ? op2 : op1;
13761           /* Only optimize constant conditions when the selected branch
13762              has the same type as the COND_EXPR.  This avoids optimizing
13763              away "c ? x : throw", where the throw has a void type.
13764              Avoid throwing away that operand which contains label.  */
13765           if ((!TREE_SIDE_EFFECTS (unused_op)
13766                || !contains_label_p (unused_op))
13767               && (! VOID_TYPE_P (TREE_TYPE (tem))
13768                   || VOID_TYPE_P (type)))
13769             return pedantic_non_lvalue_loc (loc, tem);
13770           return NULL_TREE;
13771         }
13772       if (operand_equal_p (arg1, op2, 0))
13773         return pedantic_omit_one_operand_loc (loc, type, arg1, arg0);
13774
13775       /* If we have A op B ? A : C, we may be able to convert this to a
13776          simpler expression, depending on the operation and the values
13777          of B and C.  Signed zeros prevent all of these transformations,
13778          for reasons given above each one.
13779
13780          Also try swapping the arguments and inverting the conditional.  */
13781       if (COMPARISON_CLASS_P (arg0)
13782           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13783                                              arg1, TREE_OPERAND (arg0, 1))
13784           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
13785         {
13786           tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2);
13787           if (tem)
13788             return tem;
13789         }
13790
13791       if (COMPARISON_CLASS_P (arg0)
13792           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13793                                              op2,
13794                                              TREE_OPERAND (arg0, 1))
13795           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
13796         {
13797           tem = fold_truth_not_expr (loc, arg0);
13798           if (tem && COMPARISON_CLASS_P (tem))
13799             {
13800               tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
13801               if (tem)
13802                 return tem;
13803             }
13804         }
13805
13806       /* If the second operand is simpler than the third, swap them
13807          since that produces better jump optimization results.  */
13808       if (truth_value_p (TREE_CODE (arg0))
13809           && tree_swap_operands_p (op1, op2, false))
13810         {
13811           /* See if this can be inverted.  If it can't, possibly because
13812              it was a floating-point inequality comparison, don't do
13813              anything.  */
13814           tem = fold_truth_not_expr (loc, arg0);
13815           if (tem)
13816             return fold_build3_loc (loc, code, type, tem, op2, op1);
13817         }
13818
13819       /* Convert A ? 1 : 0 to simply A.  */
13820       if (integer_onep (op1)
13821           && integer_zerop (op2)
13822           /* If we try to convert OP0 to our type, the
13823              call to fold will try to move the conversion inside
13824              a COND, which will recurse.  In that case, the COND_EXPR
13825              is probably the best choice, so leave it alone.  */
13826           && type == TREE_TYPE (arg0))
13827         return pedantic_non_lvalue_loc (loc, arg0);
13828
13829       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
13830          over COND_EXPR in cases such as floating point comparisons.  */
13831       if (integer_zerop (op1)
13832           && integer_onep (op2)
13833           && truth_value_p (TREE_CODE (arg0)))
13834         return pedantic_non_lvalue_loc (loc,
13835                                     fold_convert_loc (loc, type,
13836                                               invert_truthvalue_loc (loc,
13837                                                                      arg0)));
13838
13839       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
13840       if (TREE_CODE (arg0) == LT_EXPR
13841           && integer_zerop (TREE_OPERAND (arg0, 1))
13842           && integer_zerop (op2)
13843           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13844         {
13845           /* sign_bit_p only checks ARG1 bits within A's precision.
13846              If <sign bit of A> has wider type than A, bits outside
13847              of A's precision in <sign bit of A> need to be checked.
13848              If they are all 0, this optimization needs to be done
13849              in unsigned A's type, if they are all 1 in signed A's type,
13850              otherwise this can't be done.  */
13851           if (TYPE_PRECISION (TREE_TYPE (tem))
13852               < TYPE_PRECISION (TREE_TYPE (arg1))
13853               && TYPE_PRECISION (TREE_TYPE (tem))
13854                  < TYPE_PRECISION (type))
13855             {
13856               unsigned HOST_WIDE_INT mask_lo;
13857               HOST_WIDE_INT mask_hi;
13858               int inner_width, outer_width;
13859               tree tem_type;
13860
13861               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13862               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13863               if (outer_width > TYPE_PRECISION (type))
13864                 outer_width = TYPE_PRECISION (type);
13865
13866               if (outer_width > HOST_BITS_PER_WIDE_INT)
13867                 {
13868                   mask_hi = ((unsigned HOST_WIDE_INT) -1
13869                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
13870                   mask_lo = -1;
13871                 }
13872               else
13873                 {
13874                   mask_hi = 0;
13875                   mask_lo = ((unsigned HOST_WIDE_INT) -1
13876                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
13877                 }
13878               if (inner_width > HOST_BITS_PER_WIDE_INT)
13879                 {
13880                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
13881                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
13882                   mask_lo = 0;
13883                 }
13884               else
13885                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
13886                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
13887
13888               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
13889                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
13890                 {
13891                   tem_type = signed_type_for (TREE_TYPE (tem));
13892                   tem = fold_convert_loc (loc, tem_type, tem);
13893                 }
13894               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
13895                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
13896                 {
13897                   tem_type = unsigned_type_for (TREE_TYPE (tem));
13898                   tem = fold_convert_loc (loc, tem_type, tem);
13899                 }
13900               else
13901                 tem = NULL;
13902             }
13903
13904           if (tem)
13905             return
13906               fold_convert_loc (loc, type,
13907                                 fold_build2_loc (loc, BIT_AND_EXPR,
13908                                              TREE_TYPE (tem), tem,
13909                                              fold_convert_loc (loc,
13910                                                                TREE_TYPE (tem),
13911                                                                arg1)));
13912         }
13913
13914       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13915          already handled above.  */
13916       if (TREE_CODE (arg0) == BIT_AND_EXPR
13917           && integer_onep (TREE_OPERAND (arg0, 1))
13918           && integer_zerop (op2)
13919           && integer_pow2p (arg1))
13920         {
13921           tree tem = TREE_OPERAND (arg0, 0);
13922           STRIP_NOPS (tem);
13923           if (TREE_CODE (tem) == RSHIFT_EXPR
13924               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13925               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13926                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13927             return fold_build2_loc (loc, BIT_AND_EXPR, type,
13928                                 TREE_OPERAND (tem, 0), arg1);
13929         }
13930
13931       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13932          is probably obsolete because the first operand should be a
13933          truth value (that's why we have the two cases above), but let's
13934          leave it in until we can confirm this for all front-ends.  */
13935       if (integer_zerop (op2)
13936           && TREE_CODE (arg0) == NE_EXPR
13937           && integer_zerop (TREE_OPERAND (arg0, 1))
13938           && integer_pow2p (arg1)
13939           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13940           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13941                               arg1, OEP_ONLY_CONST))
13942         return pedantic_non_lvalue_loc (loc,
13943                                     fold_convert_loc (loc, type,
13944                                                       TREE_OPERAND (arg0, 0)));
13945
13946       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13947       if (integer_zerop (op2)
13948           && truth_value_p (TREE_CODE (arg0))
13949           && truth_value_p (TREE_CODE (arg1)))
13950         return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13951                             fold_convert_loc (loc, type, arg0),
13952                             arg1);
13953
13954       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13955       if (integer_onep (op2)
13956           && truth_value_p (TREE_CODE (arg0))
13957           && truth_value_p (TREE_CODE (arg1)))
13958         {
13959           /* Only perform transformation if ARG0 is easily inverted.  */
13960           tem = fold_truth_not_expr (loc, arg0);
13961           if (tem)
13962             return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
13963                                 fold_convert_loc (loc, type, tem),
13964                                 arg1);
13965         }
13966
13967       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13968       if (integer_zerop (arg1)
13969           && truth_value_p (TREE_CODE (arg0))
13970           && truth_value_p (TREE_CODE (op2)))
13971         {
13972           /* Only perform transformation if ARG0 is easily inverted.  */
13973           tem = fold_truth_not_expr (loc, arg0);
13974           if (tem)
13975             return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13976                                 fold_convert_loc (loc, type, tem),
13977                                 op2);
13978         }
13979
13980       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13981       if (integer_onep (arg1)
13982           && truth_value_p (TREE_CODE (arg0))
13983           && truth_value_p (TREE_CODE (op2)))
13984         return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
13985                             fold_convert_loc (loc, type, arg0),
13986                             op2);
13987
13988       return NULL_TREE;
13989
13990     case CALL_EXPR:
13991       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13992          of fold_ternary on them.  */
13993       gcc_unreachable ();
13994
13995     case BIT_FIELD_REF:
13996       if ((TREE_CODE (arg0) == VECTOR_CST
13997            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
13998           && type == TREE_TYPE (TREE_TYPE (arg0)))
13999         {
14000           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
14001           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
14002
14003           if (width != 0
14004               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
14005               && (idx % width) == 0
14006               && (idx = idx / width)
14007                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
14008             {
14009               tree elements = NULL_TREE;
14010
14011               if (TREE_CODE (arg0) == VECTOR_CST)
14012                 elements = TREE_VECTOR_CST_ELTS (arg0);
14013               else
14014                 {
14015                   unsigned HOST_WIDE_INT idx;
14016                   tree value;
14017
14018                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
14019                     elements = tree_cons (NULL_TREE, value, elements);
14020                 }
14021               while (idx-- > 0 && elements)
14022                 elements = TREE_CHAIN (elements);
14023               if (elements)
14024                 return TREE_VALUE (elements);
14025               else
14026                 return fold_convert_loc (loc, type, integer_zero_node);
14027             }
14028         }
14029
14030       /* A bit-field-ref that referenced the full argument can be stripped.  */
14031       if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
14032           && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_low_cst (arg1, 1)
14033           && integer_zerop (op2))
14034         return fold_convert_loc (loc, type, arg0);
14035
14036       return NULL_TREE;
14037
14038     default:
14039       return NULL_TREE;
14040     } /* switch (code) */
14041 }
14042
14043 /* Perform constant folding and related simplification of EXPR.
14044    The related simplifications include x*1 => x, x*0 => 0, etc.,
14045    and application of the associative law.
14046    NOP_EXPR conversions may be removed freely (as long as we
14047    are careful not to change the type of the overall expression).
14048    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
14049    but we can constant-fold them if they have constant operands.  */
14050
14051 #ifdef ENABLE_FOLD_CHECKING
14052 # define fold(x) fold_1 (x)
14053 static tree fold_1 (tree);
14054 static
14055 #endif
14056 tree
14057 fold (tree expr)
14058 {
14059   const tree t = expr;
14060   enum tree_code code = TREE_CODE (t);
14061   enum tree_code_class kind = TREE_CODE_CLASS (code);
14062   tree tem;
14063   location_t loc = EXPR_LOCATION (expr);
14064
14065   /* Return right away if a constant.  */
14066   if (kind == tcc_constant)
14067     return t;
14068
14069   /* CALL_EXPR-like objects with variable numbers of operands are
14070      treated specially.  */
14071   if (kind == tcc_vl_exp)
14072     {
14073       if (code == CALL_EXPR)
14074         {
14075           tem = fold_call_expr (loc, expr, false);
14076           return tem ? tem : expr;
14077         }
14078       return expr;
14079     }
14080
14081   if (IS_EXPR_CODE_CLASS (kind))
14082     {
14083       tree type = TREE_TYPE (t);
14084       tree op0, op1, op2;
14085
14086       switch (TREE_CODE_LENGTH (code))
14087         {
14088         case 1:
14089           op0 = TREE_OPERAND (t, 0);
14090           tem = fold_unary_loc (loc, code, type, op0);
14091           return tem ? tem : expr;
14092         case 2:
14093           op0 = TREE_OPERAND (t, 0);
14094           op1 = TREE_OPERAND (t, 1);
14095           tem = fold_binary_loc (loc, code, type, op0, op1);
14096           return tem ? tem : expr;
14097         case 3:
14098           op0 = TREE_OPERAND (t, 0);
14099           op1 = TREE_OPERAND (t, 1);
14100           op2 = TREE_OPERAND (t, 2);
14101           tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14102           return tem ? tem : expr;
14103         default:
14104           break;
14105         }
14106     }
14107
14108   switch (code)
14109     {
14110     case ARRAY_REF:
14111       {
14112         tree op0 = TREE_OPERAND (t, 0);
14113         tree op1 = TREE_OPERAND (t, 1);
14114
14115         if (TREE_CODE (op1) == INTEGER_CST
14116             && TREE_CODE (op0) == CONSTRUCTOR
14117             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
14118           {
14119             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
14120             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
14121             unsigned HOST_WIDE_INT begin = 0;
14122
14123             /* Find a matching index by means of a binary search.  */
14124             while (begin != end)
14125               {
14126                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
14127                 tree index = VEC_index (constructor_elt, elts, middle)->index;
14128
14129                 if (TREE_CODE (index) == INTEGER_CST
14130                     && tree_int_cst_lt (index, op1))
14131                   begin = middle + 1;
14132                 else if (TREE_CODE (index) == INTEGER_CST
14133                          && tree_int_cst_lt (op1, index))
14134                   end = middle;
14135                 else if (TREE_CODE (index) == RANGE_EXPR
14136                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
14137                   begin = middle + 1;
14138                 else if (TREE_CODE (index) == RANGE_EXPR
14139                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
14140                   end = middle;
14141                 else
14142                   return VEC_index (constructor_elt, elts, middle)->value;
14143               }
14144           }
14145
14146         return t;
14147       }
14148
14149     case CONST_DECL:
14150       return fold (DECL_INITIAL (t));
14151
14152     default:
14153       return t;
14154     } /* switch (code) */
14155 }
14156
14157 #ifdef ENABLE_FOLD_CHECKING
14158 #undef fold
14159
14160 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
14161 static void fold_check_failed (const_tree, const_tree);
14162 void print_fold_checksum (const_tree);
14163
14164 /* When --enable-checking=fold, compute a digest of expr before
14165    and after actual fold call to see if fold did not accidentally
14166    change original expr.  */
14167
14168 tree
14169 fold (tree expr)
14170 {
14171   tree ret;
14172   struct md5_ctx ctx;
14173   unsigned char checksum_before[16], checksum_after[16];
14174   htab_t ht;
14175
14176   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14177   md5_init_ctx (&ctx);
14178   fold_checksum_tree (expr, &ctx, ht);
14179   md5_finish_ctx (&ctx, checksum_before);
14180   htab_empty (ht);
14181
14182   ret = fold_1 (expr);
14183
14184   md5_init_ctx (&ctx);
14185   fold_checksum_tree (expr, &ctx, ht);
14186   md5_finish_ctx (&ctx, checksum_after);
14187   htab_delete (ht);
14188
14189   if (memcmp (checksum_before, checksum_after, 16))
14190     fold_check_failed (expr, ret);
14191
14192   return ret;
14193 }
14194
14195 void
14196 print_fold_checksum (const_tree expr)
14197 {
14198   struct md5_ctx ctx;
14199   unsigned char checksum[16], cnt;
14200   htab_t ht;
14201
14202   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14203   md5_init_ctx (&ctx);
14204   fold_checksum_tree (expr, &ctx, ht);
14205   md5_finish_ctx (&ctx, checksum);
14206   htab_delete (ht);
14207   for (cnt = 0; cnt < 16; ++cnt)
14208     fprintf (stderr, "%02x", checksum[cnt]);
14209   putc ('\n', stderr);
14210 }
14211
14212 static void
14213 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
14214 {
14215   internal_error ("fold check: original tree changed by fold");
14216 }
14217
14218 static void
14219 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
14220 {
14221   const void **slot;
14222   enum tree_code code;
14223   union tree_node buf;
14224   int i, len;
14225   
14226 recursive_label:
14227
14228   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
14229                <= sizeof (struct tree_function_decl))
14230               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
14231   if (expr == NULL)
14232     return;
14233   slot = (const void **) htab_find_slot (ht, expr, INSERT);
14234   if (*slot != NULL)
14235     return;
14236   *slot = expr;
14237   code = TREE_CODE (expr);
14238   if (TREE_CODE_CLASS (code) == tcc_declaration
14239       && DECL_ASSEMBLER_NAME_SET_P (expr))
14240     {
14241       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
14242       memcpy ((char *) &buf, expr, tree_size (expr));
14243       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
14244       expr = (tree) &buf;
14245     }
14246   else if (TREE_CODE_CLASS (code) == tcc_type
14247            && (TYPE_POINTER_TO (expr)
14248                || TYPE_REFERENCE_TO (expr)
14249                || TYPE_CACHED_VALUES_P (expr)
14250                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
14251                || TYPE_NEXT_VARIANT (expr)))
14252     {
14253       /* Allow these fields to be modified.  */
14254       tree tmp;
14255       memcpy ((char *) &buf, expr, tree_size (expr));
14256       expr = tmp = (tree) &buf;
14257       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
14258       TYPE_POINTER_TO (tmp) = NULL;
14259       TYPE_REFERENCE_TO (tmp) = NULL;
14260       TYPE_NEXT_VARIANT (tmp) = NULL;
14261       if (TYPE_CACHED_VALUES_P (tmp))
14262         {
14263           TYPE_CACHED_VALUES_P (tmp) = 0;
14264           TYPE_CACHED_VALUES (tmp) = NULL;
14265         }
14266     }
14267   md5_process_bytes (expr, tree_size (expr), ctx);
14268   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
14269   if (TREE_CODE_CLASS (code) != tcc_type
14270       && TREE_CODE_CLASS (code) != tcc_declaration
14271       && code != TREE_LIST
14272       && code != SSA_NAME)
14273     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
14274   switch (TREE_CODE_CLASS (code))
14275     {
14276     case tcc_constant:
14277       switch (code)
14278         {
14279         case STRING_CST:
14280           md5_process_bytes (TREE_STRING_POINTER (expr),
14281                              TREE_STRING_LENGTH (expr), ctx);
14282           break;
14283         case COMPLEX_CST:
14284           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
14285           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
14286           break;
14287         case VECTOR_CST:
14288           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
14289           break;
14290         default:
14291           break;
14292         }
14293       break;
14294     case tcc_exceptional:
14295       switch (code)
14296         {
14297         case TREE_LIST:
14298           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
14299           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
14300           expr = TREE_CHAIN (expr);
14301           goto recursive_label;
14302           break;
14303         case TREE_VEC:
14304           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
14305             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
14306           break;
14307         default:
14308           break;
14309         }
14310       break;
14311     case tcc_expression:
14312     case tcc_reference:
14313     case tcc_comparison:
14314     case tcc_unary:
14315     case tcc_binary:
14316     case tcc_statement:
14317     case tcc_vl_exp:
14318       len = TREE_OPERAND_LENGTH (expr);
14319       for (i = 0; i < len; ++i)
14320         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
14321       break;
14322     case tcc_declaration:
14323       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
14324       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
14325       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
14326         {
14327           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
14328           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
14329           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
14330           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
14331           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
14332         }
14333       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
14334         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
14335           
14336       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
14337         {
14338           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
14339           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
14340           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
14341         }
14342       break;
14343     case tcc_type:
14344       if (TREE_CODE (expr) == ENUMERAL_TYPE)
14345         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
14346       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
14347       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
14348       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
14349       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
14350       if (INTEGRAL_TYPE_P (expr)
14351           || SCALAR_FLOAT_TYPE_P (expr))
14352         {
14353           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
14354           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
14355         }
14356       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
14357       if (TREE_CODE (expr) == RECORD_TYPE
14358           || TREE_CODE (expr) == UNION_TYPE
14359           || TREE_CODE (expr) == QUAL_UNION_TYPE)
14360         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
14361       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
14362       break;
14363     default:
14364       break;
14365     }
14366 }
14367
14368 /* Helper function for outputting the checksum of a tree T.  When
14369    debugging with gdb, you can "define mynext" to be "next" followed
14370    by "call debug_fold_checksum (op0)", then just trace down till the
14371    outputs differ.  */
14372
14373 void
14374 debug_fold_checksum (const_tree t)
14375 {
14376   int i;
14377   unsigned char checksum[16];
14378   struct md5_ctx ctx;
14379   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14380   
14381   md5_init_ctx (&ctx);
14382   fold_checksum_tree (t, &ctx, ht);
14383   md5_finish_ctx (&ctx, checksum);
14384   htab_empty (ht);
14385
14386   for (i = 0; i < 16; i++)
14387     fprintf (stderr, "%d ", checksum[i]);
14388
14389   fprintf (stderr, "\n");
14390 }
14391
14392 #endif
14393
14394 /* Fold a unary tree expression with code CODE of type TYPE with an
14395    operand OP0.  LOC is the location of the resulting expression.
14396    Return a folded expression if successful.  Otherwise, return a tree
14397    expression with code CODE of type TYPE with an operand OP0.  */
14398
14399 tree
14400 fold_build1_stat_loc (location_t loc,
14401                       enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
14402 {
14403   tree tem;
14404 #ifdef ENABLE_FOLD_CHECKING
14405   unsigned char checksum_before[16], checksum_after[16];
14406   struct md5_ctx ctx;
14407   htab_t ht;
14408
14409   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14410   md5_init_ctx (&ctx);
14411   fold_checksum_tree (op0, &ctx, ht);
14412   md5_finish_ctx (&ctx, checksum_before);
14413   htab_empty (ht);
14414 #endif
14415   
14416   tem = fold_unary_loc (loc, code, type, op0);
14417   if (!tem)
14418     {
14419       tem = build1_stat (code, type, op0 PASS_MEM_STAT);
14420       SET_EXPR_LOCATION (tem, loc);
14421     }
14422   
14423 #ifdef ENABLE_FOLD_CHECKING
14424   md5_init_ctx (&ctx);
14425   fold_checksum_tree (op0, &ctx, ht);
14426   md5_finish_ctx (&ctx, checksum_after);
14427   htab_delete (ht);
14428
14429   if (memcmp (checksum_before, checksum_after, 16))
14430     fold_check_failed (op0, tem);
14431 #endif
14432   return tem;
14433 }
14434
14435 /* Fold a binary tree expression with code CODE of type TYPE with
14436    operands OP0 and OP1.  LOC is the location of the resulting
14437    expression.  Return a folded expression if successful.  Otherwise,
14438    return a tree expression with code CODE of type TYPE with operands
14439    OP0 and OP1.  */
14440
14441 tree
14442 fold_build2_stat_loc (location_t loc,
14443                       enum tree_code code, tree type, tree op0, tree op1
14444                       MEM_STAT_DECL)
14445 {
14446   tree tem;
14447 #ifdef ENABLE_FOLD_CHECKING
14448   unsigned char checksum_before_op0[16],
14449                 checksum_before_op1[16],
14450                 checksum_after_op0[16],
14451                 checksum_after_op1[16];
14452   struct md5_ctx ctx;
14453   htab_t ht;
14454
14455   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14456   md5_init_ctx (&ctx);
14457   fold_checksum_tree (op0, &ctx, ht);
14458   md5_finish_ctx (&ctx, checksum_before_op0);
14459   htab_empty (ht);
14460
14461   md5_init_ctx (&ctx);
14462   fold_checksum_tree (op1, &ctx, ht);
14463   md5_finish_ctx (&ctx, checksum_before_op1);
14464   htab_empty (ht);
14465 #endif
14466
14467   tem = fold_binary_loc (loc, code, type, op0, op1);
14468   if (!tem)
14469     {
14470       tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
14471       SET_EXPR_LOCATION (tem, loc);
14472     }
14473   
14474 #ifdef ENABLE_FOLD_CHECKING
14475   md5_init_ctx (&ctx);
14476   fold_checksum_tree (op0, &ctx, ht);
14477   md5_finish_ctx (&ctx, checksum_after_op0);
14478   htab_empty (ht);
14479
14480   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14481     fold_check_failed (op0, tem);
14482   
14483   md5_init_ctx (&ctx);
14484   fold_checksum_tree (op1, &ctx, ht);
14485   md5_finish_ctx (&ctx, checksum_after_op1);
14486   htab_delete (ht);
14487
14488   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14489     fold_check_failed (op1, tem);
14490 #endif
14491   return tem;
14492 }
14493
14494 /* Fold a ternary tree expression with code CODE of type TYPE with
14495    operands OP0, OP1, and OP2.  Return a folded expression if
14496    successful.  Otherwise, return a tree expression with code CODE of
14497    type TYPE with operands OP0, OP1, and OP2.  */
14498
14499 tree
14500 fold_build3_stat_loc (location_t loc, enum tree_code code, tree type,
14501                       tree op0, tree op1, tree op2 MEM_STAT_DECL)
14502 {
14503   tree tem;
14504 #ifdef ENABLE_FOLD_CHECKING
14505   unsigned char checksum_before_op0[16],
14506                 checksum_before_op1[16],
14507                 checksum_before_op2[16],
14508                 checksum_after_op0[16],
14509                 checksum_after_op1[16],
14510                 checksum_after_op2[16];
14511   struct md5_ctx ctx;
14512   htab_t ht;
14513
14514   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14515   md5_init_ctx (&ctx);
14516   fold_checksum_tree (op0, &ctx, ht);
14517   md5_finish_ctx (&ctx, checksum_before_op0);
14518   htab_empty (ht);
14519
14520   md5_init_ctx (&ctx);
14521   fold_checksum_tree (op1, &ctx, ht);
14522   md5_finish_ctx (&ctx, checksum_before_op1);
14523   htab_empty (ht);
14524
14525   md5_init_ctx (&ctx);
14526   fold_checksum_tree (op2, &ctx, ht);
14527   md5_finish_ctx (&ctx, checksum_before_op2);
14528   htab_empty (ht);
14529 #endif
14530
14531   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14532   tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14533   if (!tem)
14534     {
14535       tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
14536       SET_EXPR_LOCATION (tem, loc);
14537     }
14538       
14539 #ifdef ENABLE_FOLD_CHECKING
14540   md5_init_ctx (&ctx);
14541   fold_checksum_tree (op0, &ctx, ht);
14542   md5_finish_ctx (&ctx, checksum_after_op0);
14543   htab_empty (ht);
14544
14545   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14546     fold_check_failed (op0, tem);
14547   
14548   md5_init_ctx (&ctx);
14549   fold_checksum_tree (op1, &ctx, ht);
14550   md5_finish_ctx (&ctx, checksum_after_op1);
14551   htab_empty (ht);
14552
14553   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14554     fold_check_failed (op1, tem);
14555   
14556   md5_init_ctx (&ctx);
14557   fold_checksum_tree (op2, &ctx, ht);
14558   md5_finish_ctx (&ctx, checksum_after_op2);
14559   htab_delete (ht);
14560
14561   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14562     fold_check_failed (op2, tem);
14563 #endif
14564   return tem;
14565 }
14566
14567 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14568    arguments in ARGARRAY, and a null static chain.
14569    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
14570    of type TYPE from the given operands as constructed by build_call_array.  */
14571
14572 tree
14573 fold_build_call_array_loc (location_t loc, tree type, tree fn,
14574                            int nargs, tree *argarray)
14575 {
14576   tree tem;
14577 #ifdef ENABLE_FOLD_CHECKING
14578   unsigned char checksum_before_fn[16],
14579                 checksum_before_arglist[16],
14580                 checksum_after_fn[16],
14581                 checksum_after_arglist[16];
14582   struct md5_ctx ctx;
14583   htab_t ht;
14584   int i;
14585
14586   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14587   md5_init_ctx (&ctx);
14588   fold_checksum_tree (fn, &ctx, ht);
14589   md5_finish_ctx (&ctx, checksum_before_fn);
14590   htab_empty (ht);
14591
14592   md5_init_ctx (&ctx);
14593   for (i = 0; i < nargs; i++)
14594     fold_checksum_tree (argarray[i], &ctx, ht);
14595   md5_finish_ctx (&ctx, checksum_before_arglist);
14596   htab_empty (ht);
14597 #endif
14598
14599   tem = fold_builtin_call_array (loc, type, fn, nargs, argarray);
14600       
14601 #ifdef ENABLE_FOLD_CHECKING
14602   md5_init_ctx (&ctx);
14603   fold_checksum_tree (fn, &ctx, ht);
14604   md5_finish_ctx (&ctx, checksum_after_fn);
14605   htab_empty (ht);
14606
14607   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14608     fold_check_failed (fn, tem);
14609   
14610   md5_init_ctx (&ctx);
14611   for (i = 0; i < nargs; i++)
14612     fold_checksum_tree (argarray[i], &ctx, ht);
14613   md5_finish_ctx (&ctx, checksum_after_arglist);
14614   htab_delete (ht);
14615
14616   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14617     fold_check_failed (NULL_TREE, tem);
14618 #endif
14619   return tem;
14620 }
14621
14622 /* Perform constant folding and related simplification of initializer
14623    expression EXPR.  These behave identically to "fold_buildN" but ignore
14624    potential run-time traps and exceptions that fold must preserve.  */
14625
14626 #define START_FOLD_INIT \
14627   int saved_signaling_nans = flag_signaling_nans;\
14628   int saved_trapping_math = flag_trapping_math;\
14629   int saved_rounding_math = flag_rounding_math;\
14630   int saved_trapv = flag_trapv;\
14631   int saved_folding_initializer = folding_initializer;\
14632   flag_signaling_nans = 0;\
14633   flag_trapping_math = 0;\
14634   flag_rounding_math = 0;\
14635   flag_trapv = 0;\
14636   folding_initializer = 1;
14637
14638 #define END_FOLD_INIT \
14639   flag_signaling_nans = saved_signaling_nans;\
14640   flag_trapping_math = saved_trapping_math;\
14641   flag_rounding_math = saved_rounding_math;\
14642   flag_trapv = saved_trapv;\
14643   folding_initializer = saved_folding_initializer;
14644
14645 tree
14646 fold_build1_initializer_loc (location_t loc, enum tree_code code,
14647                              tree type, tree op)
14648 {
14649   tree result;
14650   START_FOLD_INIT;
14651
14652   result = fold_build1_loc (loc, code, type, op);
14653
14654   END_FOLD_INIT;
14655   return result;
14656 }
14657
14658 tree
14659 fold_build2_initializer_loc (location_t loc, enum tree_code code,
14660                              tree type, tree op0, tree op1)
14661 {
14662   tree result;
14663   START_FOLD_INIT;
14664
14665   result = fold_build2_loc (loc, code, type, op0, op1);
14666
14667   END_FOLD_INIT;
14668   return result;
14669 }
14670
14671 tree
14672 fold_build3_initializer_loc (location_t loc, enum tree_code code,
14673                              tree type, tree op0, tree op1, tree op2)
14674 {
14675   tree result;
14676   START_FOLD_INIT;
14677
14678   result = fold_build3_loc (loc, code, type, op0, op1, op2);
14679
14680   END_FOLD_INIT;
14681   return result;
14682 }
14683
14684 tree
14685 fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn,
14686                                        int nargs, tree *argarray)
14687 {
14688   tree result;
14689   START_FOLD_INIT;
14690
14691   result = fold_build_call_array_loc (loc, type, fn, nargs, argarray);
14692
14693   END_FOLD_INIT;
14694   return result;
14695 }
14696
14697 #undef START_FOLD_INIT
14698 #undef END_FOLD_INIT
14699
14700 /* Determine if first argument is a multiple of second argument.  Return 0 if
14701    it is not, or we cannot easily determined it to be.
14702
14703    An example of the sort of thing we care about (at this point; this routine
14704    could surely be made more general, and expanded to do what the *_DIV_EXPR's
14705    fold cases do now) is discovering that
14706
14707      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14708
14709    is a multiple of
14710
14711      SAVE_EXPR (J * 8)
14712
14713    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14714
14715    This code also handles discovering that
14716
14717      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14718
14719    is a multiple of 8 so we don't have to worry about dealing with a
14720    possible remainder.
14721
14722    Note that we *look* inside a SAVE_EXPR only to determine how it was
14723    calculated; it is not safe for fold to do much of anything else with the
14724    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14725    at run time.  For example, the latter example above *cannot* be implemented
14726    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14727    evaluation time of the original SAVE_EXPR is not necessarily the same at
14728    the time the new expression is evaluated.  The only optimization of this
14729    sort that would be valid is changing
14730
14731      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14732
14733    divided by 8 to
14734
14735      SAVE_EXPR (I) * SAVE_EXPR (J)
14736
14737    (where the same SAVE_EXPR (J) is used in the original and the
14738    transformed version).  */
14739
14740 int
14741 multiple_of_p (tree type, const_tree top, const_tree bottom)
14742 {
14743   if (operand_equal_p (top, bottom, 0))
14744     return 1;
14745
14746   if (TREE_CODE (type) != INTEGER_TYPE)
14747     return 0;
14748
14749   switch (TREE_CODE (top))
14750     {
14751     case BIT_AND_EXPR:
14752       /* Bitwise and provides a power of two multiple.  If the mask is
14753          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
14754       if (!integer_pow2p (bottom))
14755         return 0;
14756       /* FALLTHRU */
14757
14758     case MULT_EXPR:
14759       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14760               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14761
14762     case PLUS_EXPR:
14763     case MINUS_EXPR:
14764       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14765               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14766
14767     case LSHIFT_EXPR:
14768       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14769         {
14770           tree op1, t1;
14771
14772           op1 = TREE_OPERAND (top, 1);
14773           /* const_binop may not detect overflow correctly,
14774              so check for it explicitly here.  */
14775           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
14776               > TREE_INT_CST_LOW (op1)
14777               && TREE_INT_CST_HIGH (op1) == 0
14778               && 0 != (t1 = fold_convert (type,
14779                                           const_binop (LSHIFT_EXPR,
14780                                                        size_one_node,
14781                                                        op1, 0)))
14782               && !TREE_OVERFLOW (t1))
14783             return multiple_of_p (type, t1, bottom);
14784         }
14785       return 0;
14786
14787     case NOP_EXPR:
14788       /* Can't handle conversions from non-integral or wider integral type.  */
14789       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14790           || (TYPE_PRECISION (type)
14791               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14792         return 0;
14793
14794       /* .. fall through ...  */
14795
14796     case SAVE_EXPR:
14797       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14798
14799     case INTEGER_CST:
14800       if (TREE_CODE (bottom) != INTEGER_CST
14801           || integer_zerop (bottom)
14802           || (TYPE_UNSIGNED (type)
14803               && (tree_int_cst_sgn (top) < 0
14804                   || tree_int_cst_sgn (bottom) < 0)))
14805         return 0;
14806       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
14807                                              top, bottom, 0));
14808
14809     default:
14810       return 0;
14811     }
14812 }
14813
14814 /* Return true if CODE or TYPE is known to be non-negative. */
14815
14816 static bool
14817 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14818 {
14819   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14820       && truth_value_p (code))
14821     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14822        have a signed:1 type (where the value is -1 and 0).  */
14823     return true;
14824   return false;
14825 }
14826
14827 /* Return true if (CODE OP0) is known to be non-negative.  If the return
14828    value is based on the assumption that signed overflow is undefined,
14829    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14830    *STRICT_OVERFLOW_P.  */
14831
14832 bool
14833 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14834                                 bool *strict_overflow_p)
14835 {
14836   if (TYPE_UNSIGNED (type))
14837     return true;
14838
14839   switch (code)
14840     {
14841     case ABS_EXPR:
14842       /* We can't return 1 if flag_wrapv is set because
14843          ABS_EXPR<INT_MIN> = INT_MIN.  */
14844       if (!INTEGRAL_TYPE_P (type))
14845         return true;
14846       if (TYPE_OVERFLOW_UNDEFINED (type))
14847         {
14848           *strict_overflow_p = true;
14849           return true;
14850         }
14851       break;
14852
14853     case NON_LVALUE_EXPR:
14854     case FLOAT_EXPR:
14855     case FIX_TRUNC_EXPR:
14856       return tree_expr_nonnegative_warnv_p (op0,
14857                                             strict_overflow_p);
14858
14859     case NOP_EXPR:
14860       {
14861         tree inner_type = TREE_TYPE (op0);
14862         tree outer_type = type;
14863
14864         if (TREE_CODE (outer_type) == REAL_TYPE)
14865           {
14866             if (TREE_CODE (inner_type) == REAL_TYPE)
14867               return tree_expr_nonnegative_warnv_p (op0,
14868                                                     strict_overflow_p);
14869             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14870               {
14871                 if (TYPE_UNSIGNED (inner_type))
14872                   return true;
14873                 return tree_expr_nonnegative_warnv_p (op0,
14874                                                       strict_overflow_p);
14875               }
14876           }
14877         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
14878           {
14879             if (TREE_CODE (inner_type) == REAL_TYPE)
14880               return tree_expr_nonnegative_warnv_p (op0,
14881                                                     strict_overflow_p);
14882             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14883               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14884                       && TYPE_UNSIGNED (inner_type);
14885           }
14886       }
14887       break;
14888
14889     default:
14890       return tree_simple_nonnegative_warnv_p (code, type);
14891     }
14892
14893   /* We don't know sign of `t', so be conservative and return false.  */
14894   return false;
14895 }
14896
14897 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
14898    value is based on the assumption that signed overflow is undefined,
14899    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14900    *STRICT_OVERFLOW_P.  */
14901
14902 bool
14903 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14904                                       tree op1, bool *strict_overflow_p)
14905 {
14906   if (TYPE_UNSIGNED (type))
14907     return true;
14908
14909   switch (code)
14910     {
14911     case POINTER_PLUS_EXPR:
14912     case PLUS_EXPR:
14913       if (FLOAT_TYPE_P (type))
14914         return (tree_expr_nonnegative_warnv_p (op0,
14915                                                strict_overflow_p)
14916                 && tree_expr_nonnegative_warnv_p (op1,
14917                                                   strict_overflow_p));
14918
14919       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14920          both unsigned and at least 2 bits shorter than the result.  */
14921       if (TREE_CODE (type) == INTEGER_TYPE
14922           && TREE_CODE (op0) == NOP_EXPR
14923           && TREE_CODE (op1) == NOP_EXPR)
14924         {
14925           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14926           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14927           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14928               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14929             {
14930               unsigned int prec = MAX (TYPE_PRECISION (inner1),
14931                                        TYPE_PRECISION (inner2)) + 1;
14932               return prec < TYPE_PRECISION (type);
14933             }
14934         }
14935       break;
14936
14937     case MULT_EXPR:
14938       if (FLOAT_TYPE_P (type))
14939         {
14940           /* x * x for floating point x is always non-negative.  */
14941           if (operand_equal_p (op0, op1, 0))
14942             return true;
14943           return (tree_expr_nonnegative_warnv_p (op0,
14944                                                  strict_overflow_p)
14945                   && tree_expr_nonnegative_warnv_p (op1,
14946                                                     strict_overflow_p));
14947         }
14948
14949       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14950          both unsigned and their total bits is shorter than the result.  */
14951       if (TREE_CODE (type) == INTEGER_TYPE
14952           && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
14953           && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
14954         {
14955           tree inner0 = (TREE_CODE (op0) == NOP_EXPR) 
14956             ? TREE_TYPE (TREE_OPERAND (op0, 0))
14957             : TREE_TYPE (op0);
14958           tree inner1 = (TREE_CODE (op1) == NOP_EXPR) 
14959             ? TREE_TYPE (TREE_OPERAND (op1, 0))
14960             : TREE_TYPE (op1);
14961
14962           bool unsigned0 = TYPE_UNSIGNED (inner0);
14963           bool unsigned1 = TYPE_UNSIGNED (inner1);
14964
14965           if (TREE_CODE (op0) == INTEGER_CST)
14966             unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
14967
14968           if (TREE_CODE (op1) == INTEGER_CST)
14969             unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
14970
14971           if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
14972               && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
14973             {
14974               unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
14975                 ? tree_int_cst_min_precision (op0, /*unsignedp=*/true)
14976                 : TYPE_PRECISION (inner0);
14977
14978               unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
14979                 ? tree_int_cst_min_precision (op1, /*unsignedp=*/true)
14980                 : TYPE_PRECISION (inner1);
14981
14982               return precision0 + precision1 < TYPE_PRECISION (type);
14983             }
14984         }
14985       return false;
14986
14987     case BIT_AND_EXPR:
14988     case MAX_EXPR:
14989       return (tree_expr_nonnegative_warnv_p (op0,
14990                                              strict_overflow_p)
14991               || tree_expr_nonnegative_warnv_p (op1,
14992                                                 strict_overflow_p));
14993
14994     case BIT_IOR_EXPR:
14995     case BIT_XOR_EXPR:
14996     case MIN_EXPR:
14997     case RDIV_EXPR:
14998     case TRUNC_DIV_EXPR:
14999     case CEIL_DIV_EXPR:
15000     case FLOOR_DIV_EXPR:
15001     case ROUND_DIV_EXPR:
15002       return (tree_expr_nonnegative_warnv_p (op0,
15003                                              strict_overflow_p)
15004               && tree_expr_nonnegative_warnv_p (op1,
15005                                                 strict_overflow_p));
15006
15007     case TRUNC_MOD_EXPR:
15008     case CEIL_MOD_EXPR:
15009     case FLOOR_MOD_EXPR:
15010     case ROUND_MOD_EXPR:
15011       return tree_expr_nonnegative_warnv_p (op0,
15012                                             strict_overflow_p);
15013     default:
15014       return tree_simple_nonnegative_warnv_p (code, type);
15015     }
15016
15017   /* We don't know sign of `t', so be conservative and return false.  */
15018   return false;
15019 }
15020
15021 /* Return true if T is known to be non-negative.  If the return
15022    value is based on the assumption that signed overflow is undefined,
15023    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15024    *STRICT_OVERFLOW_P.  */
15025
15026 bool
15027 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15028 {
15029   if (TYPE_UNSIGNED (TREE_TYPE (t)))
15030     return true;
15031
15032   switch (TREE_CODE (t))
15033     {
15034     case INTEGER_CST:
15035       return tree_int_cst_sgn (t) >= 0;
15036
15037     case REAL_CST:
15038       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
15039
15040     case FIXED_CST:
15041       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
15042
15043     case COND_EXPR:
15044       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15045                                              strict_overflow_p)
15046               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
15047                                                 strict_overflow_p));
15048     default:
15049       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15050                                                    TREE_TYPE (t));
15051     }
15052   /* We don't know sign of `t', so be conservative and return false.  */
15053   return false;
15054 }
15055
15056 /* Return true if T is known to be non-negative.  If the return
15057    value is based on the assumption that signed overflow is undefined,
15058    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15059    *STRICT_OVERFLOW_P.  */
15060
15061 bool
15062 tree_call_nonnegative_warnv_p (tree type, tree fndecl,
15063                                tree arg0, tree arg1, bool *strict_overflow_p)
15064 {
15065   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
15066     switch (DECL_FUNCTION_CODE (fndecl))
15067       {
15068         CASE_FLT_FN (BUILT_IN_ACOS):
15069         CASE_FLT_FN (BUILT_IN_ACOSH):
15070         CASE_FLT_FN (BUILT_IN_CABS):
15071         CASE_FLT_FN (BUILT_IN_COSH):
15072         CASE_FLT_FN (BUILT_IN_ERFC):
15073         CASE_FLT_FN (BUILT_IN_EXP):
15074         CASE_FLT_FN (BUILT_IN_EXP10):
15075         CASE_FLT_FN (BUILT_IN_EXP2):
15076         CASE_FLT_FN (BUILT_IN_FABS):
15077         CASE_FLT_FN (BUILT_IN_FDIM):
15078         CASE_FLT_FN (BUILT_IN_HYPOT):
15079         CASE_FLT_FN (BUILT_IN_POW10):
15080         CASE_INT_FN (BUILT_IN_FFS):
15081         CASE_INT_FN (BUILT_IN_PARITY):
15082         CASE_INT_FN (BUILT_IN_POPCOUNT):
15083       case BUILT_IN_BSWAP32:
15084       case BUILT_IN_BSWAP64:
15085         /* Always true.  */
15086         return true;
15087
15088         CASE_FLT_FN (BUILT_IN_SQRT):
15089         /* sqrt(-0.0) is -0.0.  */
15090         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
15091           return true;
15092         return tree_expr_nonnegative_warnv_p (arg0,
15093                                               strict_overflow_p);
15094
15095         CASE_FLT_FN (BUILT_IN_ASINH):
15096         CASE_FLT_FN (BUILT_IN_ATAN):
15097         CASE_FLT_FN (BUILT_IN_ATANH):
15098         CASE_FLT_FN (BUILT_IN_CBRT):
15099         CASE_FLT_FN (BUILT_IN_CEIL):
15100         CASE_FLT_FN (BUILT_IN_ERF):
15101         CASE_FLT_FN (BUILT_IN_EXPM1):
15102         CASE_FLT_FN (BUILT_IN_FLOOR):
15103         CASE_FLT_FN (BUILT_IN_FMOD):
15104         CASE_FLT_FN (BUILT_IN_FREXP):
15105         CASE_FLT_FN (BUILT_IN_LCEIL):
15106         CASE_FLT_FN (BUILT_IN_LDEXP):
15107         CASE_FLT_FN (BUILT_IN_LFLOOR):
15108         CASE_FLT_FN (BUILT_IN_LLCEIL):
15109         CASE_FLT_FN (BUILT_IN_LLFLOOR):
15110         CASE_FLT_FN (BUILT_IN_LLRINT):
15111         CASE_FLT_FN (BUILT_IN_LLROUND):
15112         CASE_FLT_FN (BUILT_IN_LRINT):
15113         CASE_FLT_FN (BUILT_IN_LROUND):
15114         CASE_FLT_FN (BUILT_IN_MODF):
15115         CASE_FLT_FN (BUILT_IN_NEARBYINT):
15116         CASE_FLT_FN (BUILT_IN_RINT):
15117         CASE_FLT_FN (BUILT_IN_ROUND):
15118         CASE_FLT_FN (BUILT_IN_SCALB):
15119         CASE_FLT_FN (BUILT_IN_SCALBLN):
15120         CASE_FLT_FN (BUILT_IN_SCALBN):
15121         CASE_FLT_FN (BUILT_IN_SIGNBIT):
15122         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
15123         CASE_FLT_FN (BUILT_IN_SINH):
15124         CASE_FLT_FN (BUILT_IN_TANH):
15125         CASE_FLT_FN (BUILT_IN_TRUNC):
15126         /* True if the 1st argument is nonnegative.  */
15127         return tree_expr_nonnegative_warnv_p (arg0,
15128                                               strict_overflow_p);
15129
15130         CASE_FLT_FN (BUILT_IN_FMAX):
15131         /* True if the 1st OR 2nd arguments are nonnegative.  */
15132         return (tree_expr_nonnegative_warnv_p (arg0,
15133                                                strict_overflow_p)
15134                 || (tree_expr_nonnegative_warnv_p (arg1,
15135                                                    strict_overflow_p)));
15136
15137         CASE_FLT_FN (BUILT_IN_FMIN):
15138         /* True if the 1st AND 2nd arguments are nonnegative.  */
15139         return (tree_expr_nonnegative_warnv_p (arg0,
15140                                                strict_overflow_p)
15141                 && (tree_expr_nonnegative_warnv_p (arg1,
15142                                                    strict_overflow_p)));
15143
15144         CASE_FLT_FN (BUILT_IN_COPYSIGN):
15145         /* True if the 2nd argument is nonnegative.  */
15146         return tree_expr_nonnegative_warnv_p (arg1,
15147                                               strict_overflow_p);
15148
15149         CASE_FLT_FN (BUILT_IN_POWI):
15150         /* True if the 1st argument is nonnegative or the second
15151            argument is an even integer.  */
15152         if (TREE_CODE (arg1) == INTEGER_CST
15153             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
15154           return true;
15155         return tree_expr_nonnegative_warnv_p (arg0,
15156                                               strict_overflow_p);
15157
15158         CASE_FLT_FN (BUILT_IN_POW):
15159         /* True if the 1st argument is nonnegative or the second
15160            argument is an even integer valued real.  */
15161         if (TREE_CODE (arg1) == REAL_CST)
15162           {
15163             REAL_VALUE_TYPE c;
15164             HOST_WIDE_INT n;
15165
15166             c = TREE_REAL_CST (arg1);
15167             n = real_to_integer (&c);
15168             if ((n & 1) == 0)
15169               {
15170                 REAL_VALUE_TYPE cint;
15171                 real_from_integer (&cint, VOIDmode, n,
15172                                    n < 0 ? -1 : 0, 0);
15173                 if (real_identical (&c, &cint))
15174                   return true;
15175               }
15176           }
15177         return tree_expr_nonnegative_warnv_p (arg0,
15178                                               strict_overflow_p);
15179
15180       default:
15181         break;
15182       }
15183   return tree_simple_nonnegative_warnv_p (CALL_EXPR,
15184                                           type);
15185 }
15186
15187 /* Return true if T is known to be non-negative.  If the return
15188    value is based on the assumption that signed overflow is undefined,
15189    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15190    *STRICT_OVERFLOW_P.  */
15191
15192 bool
15193 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15194 {
15195   enum tree_code code = TREE_CODE (t);
15196   if (TYPE_UNSIGNED (TREE_TYPE (t)))
15197     return true;
15198
15199   switch (code)
15200     {
15201     case TARGET_EXPR:
15202       {
15203         tree temp = TARGET_EXPR_SLOT (t);
15204         t = TARGET_EXPR_INITIAL (t);
15205
15206         /* If the initializer is non-void, then it's a normal expression
15207            that will be assigned to the slot.  */
15208         if (!VOID_TYPE_P (t))
15209           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
15210
15211         /* Otherwise, the initializer sets the slot in some way.  One common
15212            way is an assignment statement at the end of the initializer.  */
15213         while (1)
15214           {
15215             if (TREE_CODE (t) == BIND_EXPR)
15216               t = expr_last (BIND_EXPR_BODY (t));
15217             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
15218                      || TREE_CODE (t) == TRY_CATCH_EXPR)
15219               t = expr_last (TREE_OPERAND (t, 0));
15220             else if (TREE_CODE (t) == STATEMENT_LIST)
15221               t = expr_last (t);
15222             else
15223               break;
15224           }
15225         if (TREE_CODE (t) == MODIFY_EXPR
15226             && TREE_OPERAND (t, 0) == temp)
15227           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15228                                                 strict_overflow_p);
15229
15230         return false;
15231       }
15232
15233     case CALL_EXPR:
15234       {
15235         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
15236         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
15237
15238         return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
15239                                               get_callee_fndecl (t),
15240                                               arg0,
15241                                               arg1,
15242                                               strict_overflow_p);
15243       }
15244     case COMPOUND_EXPR:
15245     case MODIFY_EXPR:
15246       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15247                                             strict_overflow_p);
15248     case BIND_EXPR:
15249       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
15250                                             strict_overflow_p);
15251     case SAVE_EXPR:
15252       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
15253                                             strict_overflow_p);
15254
15255     default:
15256       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15257                                                    TREE_TYPE (t));
15258     }
15259
15260   /* We don't know sign of `t', so be conservative and return false.  */
15261   return false;
15262 }
15263
15264 /* Return true if T is known to be non-negative.  If the return
15265    value is based on the assumption that signed overflow is undefined,
15266    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15267    *STRICT_OVERFLOW_P.  */
15268
15269 bool
15270 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15271 {
15272   enum tree_code code;
15273   if (t == error_mark_node)
15274     return false;
15275
15276   code = TREE_CODE (t);
15277   switch (TREE_CODE_CLASS (code))
15278     {
15279     case tcc_binary:
15280     case tcc_comparison:
15281       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15282                                               TREE_TYPE (t),
15283                                               TREE_OPERAND (t, 0),
15284                                               TREE_OPERAND (t, 1),
15285                                               strict_overflow_p);
15286
15287     case tcc_unary:
15288       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15289                                              TREE_TYPE (t),
15290                                              TREE_OPERAND (t, 0),
15291                                              strict_overflow_p);
15292
15293     case tcc_constant:
15294     case tcc_declaration:
15295     case tcc_reference:
15296       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15297
15298     default:
15299       break;
15300     }
15301
15302   switch (code)
15303     {
15304     case TRUTH_AND_EXPR:
15305     case TRUTH_OR_EXPR:
15306     case TRUTH_XOR_EXPR:
15307       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15308                                               TREE_TYPE (t),
15309                                               TREE_OPERAND (t, 0),
15310                                               TREE_OPERAND (t, 1),
15311                                               strict_overflow_p);
15312     case TRUTH_NOT_EXPR:
15313       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15314                                              TREE_TYPE (t),
15315                                              TREE_OPERAND (t, 0),
15316                                              strict_overflow_p);
15317
15318     case COND_EXPR:
15319     case CONSTRUCTOR:
15320     case OBJ_TYPE_REF:
15321     case ASSERT_EXPR:
15322     case ADDR_EXPR:
15323     case WITH_SIZE_EXPR:
15324     case SSA_NAME:
15325       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15326
15327     default:
15328       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
15329     }
15330 }
15331
15332 /* Return true if `t' is known to be non-negative.  Handle warnings
15333    about undefined signed overflow.  */
15334
15335 bool
15336 tree_expr_nonnegative_p (tree t)
15337 {
15338   bool ret, strict_overflow_p;
15339
15340   strict_overflow_p = false;
15341   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
15342   if (strict_overflow_p)
15343     fold_overflow_warning (("assuming signed overflow does not occur when "
15344                             "determining that expression is always "
15345                             "non-negative"),
15346                            WARN_STRICT_OVERFLOW_MISC);
15347   return ret;
15348 }
15349
15350
15351 /* Return true when (CODE OP0) is an address and is known to be nonzero.
15352    For floating point we further ensure that T is not denormal.
15353    Similar logic is present in nonzero_address in rtlanal.h.
15354
15355    If the return value is based on the assumption that signed overflow
15356    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15357    change *STRICT_OVERFLOW_P.  */
15358
15359 bool
15360 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
15361                                  bool *strict_overflow_p)
15362 {
15363   switch (code)
15364     {
15365     case ABS_EXPR:
15366       return tree_expr_nonzero_warnv_p (op0,
15367                                         strict_overflow_p);
15368
15369     case NOP_EXPR:
15370       {
15371         tree inner_type = TREE_TYPE (op0);
15372         tree outer_type = type;
15373
15374         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
15375                 && tree_expr_nonzero_warnv_p (op0,
15376                                               strict_overflow_p));
15377       }
15378       break;
15379
15380     case NON_LVALUE_EXPR:
15381       return tree_expr_nonzero_warnv_p (op0,
15382                                         strict_overflow_p);
15383
15384     default:
15385       break;
15386   }
15387
15388   return false;
15389 }
15390
15391 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
15392    For floating point we further ensure that T is not denormal.
15393    Similar logic is present in nonzero_address in rtlanal.h.
15394
15395    If the return value is based on the assumption that signed overflow
15396    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15397    change *STRICT_OVERFLOW_P.  */
15398
15399 bool
15400 tree_binary_nonzero_warnv_p (enum tree_code code,
15401                              tree type,
15402                              tree op0,
15403                              tree op1, bool *strict_overflow_p)
15404 {
15405   bool sub_strict_overflow_p;
15406   switch (code)
15407     {
15408     case POINTER_PLUS_EXPR:
15409     case PLUS_EXPR:
15410       if (TYPE_OVERFLOW_UNDEFINED (type))
15411         {
15412           /* With the presence of negative values it is hard
15413              to say something.  */
15414           sub_strict_overflow_p = false;
15415           if (!tree_expr_nonnegative_warnv_p (op0,
15416                                               &sub_strict_overflow_p)
15417               || !tree_expr_nonnegative_warnv_p (op1,
15418                                                  &sub_strict_overflow_p))
15419             return false;
15420           /* One of operands must be positive and the other non-negative.  */
15421           /* We don't set *STRICT_OVERFLOW_P here: even if this value
15422              overflows, on a twos-complement machine the sum of two
15423              nonnegative numbers can never be zero.  */
15424           return (tree_expr_nonzero_warnv_p (op0,
15425                                              strict_overflow_p)
15426                   || tree_expr_nonzero_warnv_p (op1,
15427                                                 strict_overflow_p));
15428         }
15429       break;
15430
15431     case MULT_EXPR:
15432       if (TYPE_OVERFLOW_UNDEFINED (type))
15433         {
15434           if (tree_expr_nonzero_warnv_p (op0,
15435                                          strict_overflow_p)
15436               && tree_expr_nonzero_warnv_p (op1,
15437                                             strict_overflow_p))
15438             {
15439               *strict_overflow_p = true;
15440               return true;
15441             }
15442         }
15443       break;
15444
15445     case MIN_EXPR:
15446       sub_strict_overflow_p = false;
15447       if (tree_expr_nonzero_warnv_p (op0,
15448                                      &sub_strict_overflow_p)
15449           && tree_expr_nonzero_warnv_p (op1,
15450                                         &sub_strict_overflow_p))
15451         {
15452           if (sub_strict_overflow_p)
15453             *strict_overflow_p = true;
15454         }
15455       break;
15456
15457     case MAX_EXPR:
15458       sub_strict_overflow_p = false;
15459       if (tree_expr_nonzero_warnv_p (op0,
15460                                      &sub_strict_overflow_p))
15461         {
15462           if (sub_strict_overflow_p)
15463             *strict_overflow_p = true;
15464
15465           /* When both operands are nonzero, then MAX must be too.  */
15466           if (tree_expr_nonzero_warnv_p (op1,
15467                                          strict_overflow_p))
15468             return true;
15469
15470           /* MAX where operand 0 is positive is positive.  */
15471           return tree_expr_nonnegative_warnv_p (op0,
15472                                                strict_overflow_p);
15473         }
15474       /* MAX where operand 1 is positive is positive.  */
15475       else if (tree_expr_nonzero_warnv_p (op1,
15476                                           &sub_strict_overflow_p)
15477                && tree_expr_nonnegative_warnv_p (op1,
15478                                                  &sub_strict_overflow_p))
15479         {
15480           if (sub_strict_overflow_p)
15481             *strict_overflow_p = true;
15482           return true;
15483         }
15484       break;
15485
15486     case BIT_IOR_EXPR:
15487       return (tree_expr_nonzero_warnv_p (op1,
15488                                          strict_overflow_p)
15489               || tree_expr_nonzero_warnv_p (op0,
15490                                             strict_overflow_p));
15491
15492     default:
15493       break;
15494   }
15495
15496   return false;
15497 }
15498
15499 /* Return true when T is an address and is known to be nonzero.
15500    For floating point we further ensure that T is not denormal.
15501    Similar logic is present in nonzero_address in rtlanal.h.
15502
15503    If the return value is based on the assumption that signed overflow
15504    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15505    change *STRICT_OVERFLOW_P.  */
15506
15507 bool
15508 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15509 {
15510   bool sub_strict_overflow_p;
15511   switch (TREE_CODE (t))
15512     {
15513     case INTEGER_CST:
15514       return !integer_zerop (t);
15515
15516     case ADDR_EXPR:
15517       {
15518         tree base = get_base_address (TREE_OPERAND (t, 0));
15519
15520         if (!base)
15521           return false;
15522
15523         /* Weak declarations may link to NULL.  Other things may also be NULL
15524            so protect with -fdelete-null-pointer-checks; but not variables
15525            allocated on the stack.  */
15526         if (DECL_P (base)
15527             && (flag_delete_null_pointer_checks
15528                 || (TREE_CODE (base) == VAR_DECL && !TREE_STATIC (base))))
15529           return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base);
15530
15531         /* Constants are never weak.  */
15532         if (CONSTANT_CLASS_P (base))
15533           return true;
15534
15535         return false;
15536       }
15537
15538     case COND_EXPR:
15539       sub_strict_overflow_p = false;
15540       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15541                                      &sub_strict_overflow_p)
15542           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15543                                         &sub_strict_overflow_p))
15544         {
15545           if (sub_strict_overflow_p)
15546             *strict_overflow_p = true;
15547           return true;
15548         }
15549       break;
15550
15551     default:
15552       break;
15553     }
15554   return false;
15555 }
15556
15557 /* Return true when T is an address and is known to be nonzero.
15558    For floating point we further ensure that T is not denormal.
15559    Similar logic is present in nonzero_address in rtlanal.h.
15560
15561    If the return value is based on the assumption that signed overflow
15562    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15563    change *STRICT_OVERFLOW_P.  */
15564
15565 bool
15566 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15567 {
15568   tree type = TREE_TYPE (t);
15569   enum tree_code code;
15570
15571   /* Doing something useful for floating point would need more work.  */
15572   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
15573     return false;
15574
15575   code = TREE_CODE (t);
15576   switch (TREE_CODE_CLASS (code))
15577     {
15578     case tcc_unary:
15579       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15580                                               strict_overflow_p);
15581     case tcc_binary:
15582     case tcc_comparison:
15583       return tree_binary_nonzero_warnv_p (code, type,
15584                                                TREE_OPERAND (t, 0),
15585                                                TREE_OPERAND (t, 1),
15586                                                strict_overflow_p);
15587     case tcc_constant:
15588     case tcc_declaration:
15589     case tcc_reference:
15590       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15591
15592     default:
15593       break;
15594     }
15595
15596   switch (code)
15597     {
15598     case TRUTH_NOT_EXPR:
15599       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15600                                               strict_overflow_p);
15601
15602     case TRUTH_AND_EXPR:
15603     case TRUTH_OR_EXPR:
15604     case TRUTH_XOR_EXPR:
15605       return tree_binary_nonzero_warnv_p (code, type,
15606                                                TREE_OPERAND (t, 0),
15607                                                TREE_OPERAND (t, 1),
15608                                                strict_overflow_p);
15609
15610     case COND_EXPR:
15611     case CONSTRUCTOR:
15612     case OBJ_TYPE_REF:
15613     case ASSERT_EXPR:
15614     case ADDR_EXPR:
15615     case WITH_SIZE_EXPR:
15616     case SSA_NAME:
15617       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15618
15619     case COMPOUND_EXPR:
15620     case MODIFY_EXPR:
15621     case BIND_EXPR:
15622       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15623                                         strict_overflow_p);
15624
15625     case SAVE_EXPR:
15626       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
15627                                         strict_overflow_p);
15628
15629     case CALL_EXPR:
15630       return alloca_call_p (t);
15631
15632     default:
15633       break;
15634     }
15635   return false;
15636 }
15637
15638 /* Return true when T is an address and is known to be nonzero.
15639    Handle warnings about undefined signed overflow.  */
15640
15641 bool
15642 tree_expr_nonzero_p (tree t)
15643 {
15644   bool ret, strict_overflow_p;
15645
15646   strict_overflow_p = false;
15647   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
15648   if (strict_overflow_p)
15649     fold_overflow_warning (("assuming signed overflow does not occur when "
15650                             "determining that expression is always "
15651                             "non-zero"),
15652                            WARN_STRICT_OVERFLOW_MISC);
15653   return ret;
15654 }
15655
15656 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15657    attempt to fold the expression to a constant without modifying TYPE,
15658    OP0 or OP1.
15659
15660    If the expression could be simplified to a constant, then return
15661    the constant.  If the expression would not be simplified to a
15662    constant, then return NULL_TREE.  */
15663
15664 tree
15665 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15666 {
15667   tree tem = fold_binary (code, type, op0, op1);
15668   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15669 }
15670
15671 /* Given the components of a unary expression CODE, TYPE and OP0,
15672    attempt to fold the expression to a constant without modifying
15673    TYPE or OP0.
15674
15675    If the expression could be simplified to a constant, then return
15676    the constant.  If the expression would not be simplified to a
15677    constant, then return NULL_TREE.  */
15678
15679 tree
15680 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15681 {
15682   tree tem = fold_unary (code, type, op0);
15683   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15684 }
15685
15686 /* If EXP represents referencing an element in a constant string
15687    (either via pointer arithmetic or array indexing), return the
15688    tree representing the value accessed, otherwise return NULL.  */
15689
15690 tree
15691 fold_read_from_constant_string (tree exp)
15692 {
15693   if ((TREE_CODE (exp) == INDIRECT_REF
15694        || TREE_CODE (exp) == ARRAY_REF)
15695       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15696     {
15697       tree exp1 = TREE_OPERAND (exp, 0);
15698       tree index;
15699       tree string;
15700       location_t loc = EXPR_LOCATION (exp);
15701
15702       if (TREE_CODE (exp) == INDIRECT_REF)
15703         string = string_constant (exp1, &index);
15704       else
15705         {
15706           tree low_bound = array_ref_low_bound (exp);
15707           index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1));
15708
15709           /* Optimize the special-case of a zero lower bound.
15710
15711              We convert the low_bound to sizetype to avoid some problems
15712              with constant folding.  (E.g. suppose the lower bound is 1,
15713              and its mode is QI.  Without the conversion,l (ARRAY
15714              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15715              +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
15716           if (! integer_zerop (low_bound))
15717             index = size_diffop_loc (loc, index,
15718                                  fold_convert_loc (loc, sizetype, low_bound));
15719
15720           string = exp1;
15721         }
15722
15723       if (string
15724           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15725           && TREE_CODE (string) == STRING_CST
15726           && TREE_CODE (index) == INTEGER_CST
15727           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15728           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15729               == MODE_INT)
15730           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15731         return build_int_cst_type (TREE_TYPE (exp),
15732                                    (TREE_STRING_POINTER (string)
15733                                     [TREE_INT_CST_LOW (index)]));
15734     }
15735   return NULL;
15736 }
15737
15738 /* Return the tree for neg (ARG0) when ARG0 is known to be either
15739    an integer constant, real, or fixed-point constant.
15740
15741    TYPE is the type of the result.  */
15742
15743 static tree
15744 fold_negate_const (tree arg0, tree type)
15745 {
15746   tree t = NULL_TREE;
15747
15748   switch (TREE_CODE (arg0))
15749     {
15750     case INTEGER_CST:
15751       {
15752         unsigned HOST_WIDE_INT low;
15753         HOST_WIDE_INT high;
15754         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15755                                    TREE_INT_CST_HIGH (arg0),
15756                                    &low, &high);
15757         t = force_fit_type_double (type, low, high, 1,
15758                                    (overflow | TREE_OVERFLOW (arg0))
15759                                    && !TYPE_UNSIGNED (type));
15760         break;
15761       }
15762
15763     case REAL_CST:
15764       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15765       break;
15766
15767     case FIXED_CST:
15768       {
15769         FIXED_VALUE_TYPE f;
15770         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15771                                             &(TREE_FIXED_CST (arg0)), NULL,
15772                                             TYPE_SATURATING (type));
15773         t = build_fixed (type, f);
15774         /* Propagate overflow flags.  */
15775         if (overflow_p | TREE_OVERFLOW (arg0))
15776           TREE_OVERFLOW (t) = 1;
15777         break;
15778       }
15779
15780     default:
15781       gcc_unreachable ();
15782     }
15783
15784   return t;
15785 }
15786
15787 /* Return the tree for abs (ARG0) when ARG0 is known to be either
15788    an integer constant or real constant.
15789
15790    TYPE is the type of the result.  */
15791
15792 tree
15793 fold_abs_const (tree arg0, tree type)
15794 {
15795   tree t = NULL_TREE;
15796
15797   switch (TREE_CODE (arg0))
15798     {
15799     case INTEGER_CST:
15800       /* If the value is unsigned, then the absolute value is
15801          the same as the ordinary value.  */
15802       if (TYPE_UNSIGNED (type))
15803         t = arg0;
15804       /* Similarly, if the value is non-negative.  */
15805       else if (INT_CST_LT (integer_minus_one_node, arg0))
15806         t = arg0;
15807       /* If the value is negative, then the absolute value is
15808          its negation.  */
15809       else
15810         {
15811           unsigned HOST_WIDE_INT low;
15812           HOST_WIDE_INT high;
15813           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15814                                      TREE_INT_CST_HIGH (arg0),
15815                                      &low, &high);
15816           t = force_fit_type_double (type, low, high, -1,
15817                                      overflow | TREE_OVERFLOW (arg0));
15818         }
15819       break;
15820
15821     case REAL_CST:
15822       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15823         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15824       else
15825         t =  arg0;
15826       break;
15827
15828     default:
15829       gcc_unreachable ();
15830     }
15831
15832   return t;
15833 }
15834
15835 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
15836    constant.  TYPE is the type of the result.  */
15837
15838 static tree
15839 fold_not_const (tree arg0, tree type)
15840 {
15841   tree t = NULL_TREE;
15842
15843   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15844
15845   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
15846                              ~TREE_INT_CST_HIGH (arg0), 0,
15847                              TREE_OVERFLOW (arg0));
15848
15849   return t;
15850 }
15851
15852 /* Given CODE, a relational operator, the target type, TYPE and two
15853    constant operands OP0 and OP1, return the result of the
15854    relational operation.  If the result is not a compile time
15855    constant, then return NULL_TREE.  */
15856
15857 static tree
15858 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15859 {
15860   int result, invert;
15861
15862   /* From here on, the only cases we handle are when the result is
15863      known to be a constant.  */
15864
15865   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15866     {
15867       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15868       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15869
15870       /* Handle the cases where either operand is a NaN.  */
15871       if (real_isnan (c0) || real_isnan (c1))
15872         {
15873           switch (code)
15874             {
15875             case EQ_EXPR:
15876             case ORDERED_EXPR:
15877               result = 0;
15878               break;
15879
15880             case NE_EXPR:
15881             case UNORDERED_EXPR:
15882             case UNLT_EXPR:
15883             case UNLE_EXPR:
15884             case UNGT_EXPR:
15885             case UNGE_EXPR:
15886             case UNEQ_EXPR:
15887               result = 1;
15888               break;
15889
15890             case LT_EXPR:
15891             case LE_EXPR:
15892             case GT_EXPR:
15893             case GE_EXPR:
15894             case LTGT_EXPR:
15895               if (flag_trapping_math)
15896                 return NULL_TREE;
15897               result = 0;
15898               break;
15899
15900             default:
15901               gcc_unreachable ();
15902             }
15903
15904           return constant_boolean_node (result, type);
15905         }
15906
15907       return constant_boolean_node (real_compare (code, c0, c1), type);
15908     }
15909
15910   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15911     {
15912       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15913       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15914       return constant_boolean_node (fixed_compare (code, c0, c1), type);
15915     }
15916
15917   /* Handle equality/inequality of complex constants.  */
15918   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15919     {
15920       tree rcond = fold_relational_const (code, type,
15921                                           TREE_REALPART (op0),
15922                                           TREE_REALPART (op1));
15923       tree icond = fold_relational_const (code, type,
15924                                           TREE_IMAGPART (op0),
15925                                           TREE_IMAGPART (op1));
15926       if (code == EQ_EXPR)
15927         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
15928       else if (code == NE_EXPR)
15929         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
15930       else
15931         return NULL_TREE;
15932     }
15933
15934   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
15935
15936      To compute GT, swap the arguments and do LT.
15937      To compute GE, do LT and invert the result.
15938      To compute LE, swap the arguments, do LT and invert the result.
15939      To compute NE, do EQ and invert the result.
15940
15941      Therefore, the code below must handle only EQ and LT.  */
15942
15943   if (code == LE_EXPR || code == GT_EXPR)
15944     {
15945       tree tem = op0;
15946       op0 = op1;
15947       op1 = tem;
15948       code = swap_tree_comparison (code);
15949     }
15950
15951   /* Note that it is safe to invert for real values here because we
15952      have already handled the one case that it matters.  */
15953
15954   invert = 0;
15955   if (code == NE_EXPR || code == GE_EXPR)
15956     {
15957       invert = 1;
15958       code = invert_tree_comparison (code, false);
15959     }
15960
15961   /* Compute a result for LT or EQ if args permit;
15962      Otherwise return T.  */
15963   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15964     {
15965       if (code == EQ_EXPR)
15966         result = tree_int_cst_equal (op0, op1);
15967       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
15968         result = INT_CST_LT_UNSIGNED (op0, op1);
15969       else
15970         result = INT_CST_LT (op0, op1);
15971     }
15972   else
15973     return NULL_TREE;
15974
15975   if (invert)
15976     result ^= 1;
15977   return constant_boolean_node (result, type);
15978 }
15979
15980 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15981    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15982    itself.  */
15983
15984 tree
15985 fold_build_cleanup_point_expr (tree type, tree expr)
15986 {
15987   /* If the expression does not have side effects then we don't have to wrap
15988      it with a cleanup point expression.  */
15989   if (!TREE_SIDE_EFFECTS (expr))
15990     return expr;
15991
15992   /* If the expression is a return, check to see if the expression inside the
15993      return has no side effects or the right hand side of the modify expression
15994      inside the return. If either don't have side effects set we don't need to
15995      wrap the expression in a cleanup point expression.  Note we don't check the
15996      left hand side of the modify because it should always be a return decl.  */
15997   if (TREE_CODE (expr) == RETURN_EXPR)
15998     {
15999       tree op = TREE_OPERAND (expr, 0);
16000       if (!op || !TREE_SIDE_EFFECTS (op))
16001         return expr;
16002       op = TREE_OPERAND (op, 1);
16003       if (!TREE_SIDE_EFFECTS (op))
16004         return expr;
16005     }
16006   
16007   return build1 (CLEANUP_POINT_EXPR, type, expr);
16008 }
16009
16010 /* Given a pointer value OP0 and a type TYPE, return a simplified version
16011    of an indirection through OP0, or NULL_TREE if no simplification is
16012    possible.  */
16013
16014 tree
16015 fold_indirect_ref_1 (location_t loc, tree type, tree op0)
16016 {
16017   tree sub = op0;
16018   tree subtype;
16019
16020   STRIP_NOPS (sub);
16021   subtype = TREE_TYPE (sub);
16022   if (!POINTER_TYPE_P (subtype))
16023     return NULL_TREE;
16024
16025   if (TREE_CODE (sub) == ADDR_EXPR)
16026     {
16027       tree op = TREE_OPERAND (sub, 0);
16028       tree optype = TREE_TYPE (op);
16029       /* *&CONST_DECL -> to the value of the const decl.  */
16030       if (TREE_CODE (op) == CONST_DECL)
16031         return DECL_INITIAL (op);
16032       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
16033       if (type == optype)
16034         {
16035           tree fop = fold_read_from_constant_string (op);
16036           if (fop)
16037             return fop;
16038           else
16039             return op;
16040         }
16041       /* *(foo *)&fooarray => fooarray[0] */
16042       else if (TREE_CODE (optype) == ARRAY_TYPE
16043                && type == TREE_TYPE (optype))
16044         {
16045           tree type_domain = TYPE_DOMAIN (optype);
16046           tree min_val = size_zero_node;
16047           if (type_domain && TYPE_MIN_VALUE (type_domain))
16048             min_val = TYPE_MIN_VALUE (type_domain);
16049           op0 = build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
16050           SET_EXPR_LOCATION (op0, loc);
16051           return op0;
16052         }
16053       /* *(foo *)&complexfoo => __real__ complexfoo */
16054       else if (TREE_CODE (optype) == COMPLEX_TYPE
16055                && type == TREE_TYPE (optype))
16056         return fold_build1_loc (loc, REALPART_EXPR, type, op);
16057       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
16058       else if (TREE_CODE (optype) == VECTOR_TYPE
16059                && type == TREE_TYPE (optype))
16060         {
16061           tree part_width = TYPE_SIZE (type);
16062           tree index = bitsize_int (0);
16063           return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
16064         }
16065     }
16066
16067   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
16068   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
16069       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
16070     { 
16071       tree op00 = TREE_OPERAND (sub, 0);
16072       tree op01 = TREE_OPERAND (sub, 1);
16073       tree op00type;
16074       
16075       STRIP_NOPS (op00);
16076       op00type = TREE_TYPE (op00);
16077       if (TREE_CODE (op00) == ADDR_EXPR
16078           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
16079           && type == TREE_TYPE (TREE_TYPE (op00type)))
16080         { 
16081           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
16082           tree part_width = TYPE_SIZE (type);
16083           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
16084           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
16085           tree index = bitsize_int (indexi);
16086
16087           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
16088             return fold_build3_loc (loc,
16089                                 BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
16090                                 part_width, index);
16091         
16092         }
16093     }
16094
16095
16096   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
16097   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
16098       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
16099     {
16100       tree op00 = TREE_OPERAND (sub, 0);
16101       tree op01 = TREE_OPERAND (sub, 1);
16102       tree op00type;
16103
16104       STRIP_NOPS (op00);
16105       op00type = TREE_TYPE (op00);
16106       if (TREE_CODE (op00) == ADDR_EXPR
16107           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
16108           && type == TREE_TYPE (TREE_TYPE (op00type)))
16109         {
16110           tree size = TYPE_SIZE_UNIT (type);
16111           if (tree_int_cst_equal (size, op01))
16112             return fold_build1_loc (loc, IMAGPART_EXPR, type,
16113                                 TREE_OPERAND (op00, 0));
16114         }
16115     }
16116   
16117   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
16118   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
16119       && type == TREE_TYPE (TREE_TYPE (subtype)))
16120     {
16121       tree type_domain;
16122       tree min_val = size_zero_node;
16123       sub = build_fold_indirect_ref_loc (loc, sub);
16124       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
16125       if (type_domain && TYPE_MIN_VALUE (type_domain))
16126         min_val = TYPE_MIN_VALUE (type_domain);
16127       op0 = build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
16128       SET_EXPR_LOCATION (op0, loc);
16129       return op0;
16130     }
16131
16132   return NULL_TREE;
16133 }
16134
16135 /* Builds an expression for an indirection through T, simplifying some
16136    cases.  */
16137
16138 tree
16139 build_fold_indirect_ref_loc (location_t loc, tree t)
16140 {
16141   tree type = TREE_TYPE (TREE_TYPE (t));
16142   tree sub = fold_indirect_ref_1 (loc, type, t);
16143
16144   if (sub)
16145     return sub;
16146
16147   t = build1 (INDIRECT_REF, type, t);
16148   SET_EXPR_LOCATION (t, loc);
16149   return t;
16150 }
16151
16152 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
16153
16154 tree
16155 fold_indirect_ref_loc (location_t loc, tree t)
16156 {
16157   tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0));
16158
16159   if (sub)
16160     return sub;
16161   else
16162     return t;
16163 }
16164
16165 /* Strip non-trapping, non-side-effecting tree nodes from an expression
16166    whose result is ignored.  The type of the returned tree need not be
16167    the same as the original expression.  */
16168
16169 tree
16170 fold_ignored_result (tree t)
16171 {
16172   if (!TREE_SIDE_EFFECTS (t))
16173     return integer_zero_node;
16174
16175   for (;;)
16176     switch (TREE_CODE_CLASS (TREE_CODE (t)))
16177       {
16178       case tcc_unary:
16179         t = TREE_OPERAND (t, 0);
16180         break;
16181
16182       case tcc_binary:
16183       case tcc_comparison:
16184         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16185           t = TREE_OPERAND (t, 0);
16186         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
16187           t = TREE_OPERAND (t, 1);
16188         else
16189           return t;
16190         break;
16191
16192       case tcc_expression:
16193         switch (TREE_CODE (t))
16194           {
16195           case COMPOUND_EXPR:
16196             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16197               return t;
16198             t = TREE_OPERAND (t, 0);
16199             break;
16200
16201           case COND_EXPR:
16202             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
16203                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
16204               return t;
16205             t = TREE_OPERAND (t, 0);
16206             break;
16207
16208           default:
16209             return t;
16210           }
16211         break;
16212
16213       default:
16214         return t;
16215       }
16216 }
16217
16218 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
16219    This can only be applied to objects of a sizetype.  */
16220
16221 tree
16222 round_up_loc (location_t loc, tree value, int divisor)
16223 {
16224   tree div = NULL_TREE;
16225
16226   gcc_assert (divisor > 0);
16227   if (divisor == 1)
16228     return value;
16229
16230   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16231      have to do anything.  Only do this when we are not given a const,
16232      because in that case, this check is more expensive than just
16233      doing it.  */
16234   if (TREE_CODE (value) != INTEGER_CST)
16235     {
16236       div = build_int_cst (TREE_TYPE (value), divisor);
16237
16238       if (multiple_of_p (TREE_TYPE (value), value, div))
16239         return value;
16240     }
16241
16242   /* If divisor is a power of two, simplify this to bit manipulation.  */
16243   if (divisor == (divisor & -divisor))
16244     {
16245       if (TREE_CODE (value) == INTEGER_CST)
16246         {
16247           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
16248           unsigned HOST_WIDE_INT high;
16249           bool overflow_p;
16250
16251           if ((low & (divisor - 1)) == 0)
16252             return value;
16253
16254           overflow_p = TREE_OVERFLOW (value);
16255           high = TREE_INT_CST_HIGH (value);
16256           low &= ~(divisor - 1);
16257           low += divisor;
16258           if (low == 0)
16259             {
16260               high++;
16261               if (high == 0)
16262                 overflow_p = true;
16263             }
16264
16265           return force_fit_type_double (TREE_TYPE (value), low, high,
16266                                         -1, overflow_p);
16267         }
16268       else
16269         {
16270           tree t;
16271
16272           t = build_int_cst (TREE_TYPE (value), divisor - 1);
16273           value = size_binop_loc (loc, PLUS_EXPR, value, t);
16274           t = build_int_cst (TREE_TYPE (value), -divisor);
16275           value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16276         }
16277     }
16278   else
16279     {
16280       if (!div)
16281         div = build_int_cst (TREE_TYPE (value), divisor);
16282       value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div);
16283       value = size_binop_loc (loc, MULT_EXPR, value, div);
16284     }
16285
16286   return value;
16287 }
16288
16289 /* Likewise, but round down.  */
16290
16291 tree
16292 round_down_loc (location_t loc, tree value, int divisor)
16293 {
16294   tree div = NULL_TREE;
16295
16296   gcc_assert (divisor > 0);
16297   if (divisor == 1)
16298     return value;
16299
16300   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16301      have to do anything.  Only do this when we are not given a const,
16302      because in that case, this check is more expensive than just
16303      doing it.  */
16304   if (TREE_CODE (value) != INTEGER_CST)
16305     {
16306       div = build_int_cst (TREE_TYPE (value), divisor);
16307
16308       if (multiple_of_p (TREE_TYPE (value), value, div))
16309         return value;
16310     }
16311
16312   /* If divisor is a power of two, simplify this to bit manipulation.  */
16313   if (divisor == (divisor & -divisor))
16314     {
16315       tree t;
16316
16317       t = build_int_cst (TREE_TYPE (value), -divisor);
16318       value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16319     }
16320   else
16321     {
16322       if (!div)
16323         div = build_int_cst (TREE_TYPE (value), divisor);
16324       value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div);
16325       value = size_binop_loc (loc, MULT_EXPR, value, div);
16326     }
16327
16328   return value;
16329 }
16330
16331 /* Returns the pointer to the base of the object addressed by EXP and
16332    extracts the information about the offset of the access, storing it
16333    to PBITPOS and POFFSET.  */
16334
16335 static tree
16336 split_address_to_core_and_offset (tree exp,
16337                                   HOST_WIDE_INT *pbitpos, tree *poffset)
16338 {
16339   tree core;
16340   enum machine_mode mode;
16341   int unsignedp, volatilep;
16342   HOST_WIDE_INT bitsize;
16343   location_t loc = EXPR_LOCATION (exp);
16344
16345   if (TREE_CODE (exp) == ADDR_EXPR)
16346     {
16347       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
16348                                   poffset, &mode, &unsignedp, &volatilep,
16349                                   false);
16350       core = build_fold_addr_expr_loc (loc, core);
16351     }
16352   else
16353     {
16354       core = exp;
16355       *pbitpos = 0;
16356       *poffset = NULL_TREE;
16357     }
16358
16359   return core;
16360 }
16361
16362 /* Returns true if addresses of E1 and E2 differ by a constant, false
16363    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
16364
16365 bool
16366 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
16367 {
16368   tree core1, core2;
16369   HOST_WIDE_INT bitpos1, bitpos2;
16370   tree toffset1, toffset2, tdiff, type;
16371
16372   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
16373   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
16374
16375   if (bitpos1 % BITS_PER_UNIT != 0
16376       || bitpos2 % BITS_PER_UNIT != 0
16377       || !operand_equal_p (core1, core2, 0))
16378     return false;
16379
16380   if (toffset1 && toffset2)
16381     {
16382       type = TREE_TYPE (toffset1);
16383       if (type != TREE_TYPE (toffset2))
16384         toffset2 = fold_convert (type, toffset2);
16385
16386       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
16387       if (!cst_and_fits_in_hwi (tdiff))
16388         return false;
16389
16390       *diff = int_cst_value (tdiff);
16391     }
16392   else if (toffset1 || toffset2)
16393     {
16394       /* If only one of the offsets is non-constant, the difference cannot
16395          be a constant.  */
16396       return false;
16397     }
16398   else
16399     *diff = 0;
16400
16401   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
16402   return true;
16403 }
16404
16405 /* Simplify the floating point expression EXP when the sign of the
16406    result is not significant.  Return NULL_TREE if no simplification
16407    is possible.  */
16408
16409 tree
16410 fold_strip_sign_ops (tree exp)
16411 {
16412   tree arg0, arg1;
16413   location_t loc = EXPR_LOCATION (exp);
16414
16415   switch (TREE_CODE (exp))
16416     {
16417     case ABS_EXPR:
16418     case NEGATE_EXPR:
16419       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16420       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
16421
16422     case MULT_EXPR:
16423     case RDIV_EXPR:
16424       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
16425         return NULL_TREE;
16426       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16427       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16428       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
16429         return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp),
16430                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
16431                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
16432       break;
16433
16434     case COMPOUND_EXPR:
16435       arg0 = TREE_OPERAND (exp, 0);
16436       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16437       if (arg1)
16438         return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
16439       break;
16440       
16441     case COND_EXPR:
16442       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16443       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
16444       if (arg0 || arg1)
16445         return fold_build3_loc (loc,
16446                             COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
16447                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
16448                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
16449       break;
16450       
16451     case CALL_EXPR:
16452       {
16453         const enum built_in_function fcode = builtin_mathfn_code (exp);
16454         switch (fcode)
16455         {
16456         CASE_FLT_FN (BUILT_IN_COPYSIGN):
16457           /* Strip copysign function call, return the 1st argument. */
16458           arg0 = CALL_EXPR_ARG (exp, 0);
16459           arg1 = CALL_EXPR_ARG (exp, 1);
16460           return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1);
16461
16462         default:
16463           /* Strip sign ops from the argument of "odd" math functions.  */
16464           if (negate_mathfn_p (fcode))
16465             {
16466               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
16467               if (arg0)
16468                 return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0);
16469             }
16470           break;
16471         }
16472       }
16473       break;
16474
16475     default:
16476       break;
16477     }
16478   return NULL_TREE;
16479 }