OSDN Git Service

Replace tabs with spaces in .texi files.
[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 = TYPE_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   int uns;
885
886   /* The sign of the division is according to operand two, that
887      does the correct thing for POINTER_PLUS_EXPR where we want
888      a signed division.  */
889   uns = TYPE_UNSIGNED (TREE_TYPE (arg2));
890   if (TREE_CODE (TREE_TYPE (arg2)) == INTEGER_TYPE
891       && TYPE_IS_SIZETYPE (TREE_TYPE (arg2)))
892     uns = false;
893
894   int1l = TREE_INT_CST_LOW (arg1);
895   int1h = TREE_INT_CST_HIGH (arg1);
896   int2l = TREE_INT_CST_LOW (arg2);
897   int2h = TREE_INT_CST_HIGH (arg2);
898
899   div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
900                         &quol, &quoh, &reml, &remh);
901   if (remh != 0 || reml != 0)
902     return NULL_TREE;
903
904   return build_int_cst_wide (TREE_TYPE (arg1), quol, quoh);
905 }
906 \f
907 /* This is nonzero if we should defer warnings about undefined
908    overflow.  This facility exists because these warnings are a
909    special case.  The code to estimate loop iterations does not want
910    to issue any warnings, since it works with expressions which do not
911    occur in user code.  Various bits of cleanup code call fold(), but
912    only use the result if it has certain characteristics (e.g., is a
913    constant); that code only wants to issue a warning if the result is
914    used.  */
915
916 static int fold_deferring_overflow_warnings;
917
918 /* If a warning about undefined overflow is deferred, this is the
919    warning.  Note that this may cause us to turn two warnings into
920    one, but that is fine since it is sufficient to only give one
921    warning per expression.  */
922
923 static const char* fold_deferred_overflow_warning;
924
925 /* If a warning about undefined overflow is deferred, this is the
926    level at which the warning should be emitted.  */
927
928 static enum warn_strict_overflow_code fold_deferred_overflow_code;
929
930 /* Start deferring overflow warnings.  We could use a stack here to
931    permit nested calls, but at present it is not necessary.  */
932
933 void
934 fold_defer_overflow_warnings (void)
935 {
936   ++fold_deferring_overflow_warnings;
937 }
938
939 /* Stop deferring overflow warnings.  If there is a pending warning,
940    and ISSUE is true, then issue the warning if appropriate.  STMT is
941    the statement with which the warning should be associated (used for
942    location information); STMT may be NULL.  CODE is the level of the
943    warning--a warn_strict_overflow_code value.  This function will use
944    the smaller of CODE and the deferred code when deciding whether to
945    issue the warning.  CODE may be zero to mean to always use the
946    deferred code.  */
947
948 void
949 fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
950 {
951   const char *warnmsg;
952   location_t locus;
953
954   gcc_assert (fold_deferring_overflow_warnings > 0);
955   --fold_deferring_overflow_warnings;
956   if (fold_deferring_overflow_warnings > 0)
957     {
958       if (fold_deferred_overflow_warning != NULL
959           && code != 0
960           && code < (int) fold_deferred_overflow_code)
961         fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
962       return;
963     }
964
965   warnmsg = fold_deferred_overflow_warning;
966   fold_deferred_overflow_warning = NULL;
967
968   if (!issue || warnmsg == NULL)
969     return;
970
971   if (gimple_no_warning_p (stmt))
972     return;
973
974   /* Use the smallest code level when deciding to issue the
975      warning.  */
976   if (code == 0 || code > (int) fold_deferred_overflow_code)
977     code = fold_deferred_overflow_code;
978
979   if (!issue_strict_overflow_warning (code))
980     return;
981
982   if (stmt == NULL)
983     locus = input_location;
984   else
985     locus = gimple_location (stmt);
986   warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
987 }
988
989 /* Stop deferring overflow warnings, ignoring any deferred
990    warnings.  */
991
992 void
993 fold_undefer_and_ignore_overflow_warnings (void)
994 {
995   fold_undefer_overflow_warnings (false, NULL, 0);
996 }
997
998 /* Whether we are deferring overflow warnings.  */
999
1000 bool
1001 fold_deferring_overflow_warnings_p (void)
1002 {
1003   return fold_deferring_overflow_warnings > 0;
1004 }
1005
1006 /* This is called when we fold something based on the fact that signed
1007    overflow is undefined.  */
1008
1009 static void
1010 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1011 {
1012   if (fold_deferring_overflow_warnings > 0)
1013     {
1014       if (fold_deferred_overflow_warning == NULL
1015           || wc < fold_deferred_overflow_code)
1016         {
1017           fold_deferred_overflow_warning = gmsgid;
1018           fold_deferred_overflow_code = wc;
1019         }
1020     }
1021   else if (issue_strict_overflow_warning (wc))
1022     warning (OPT_Wstrict_overflow, gmsgid);
1023 }
1024 \f
1025 /* Return true if the built-in mathematical function specified by CODE
1026    is odd, i.e. -f(x) == f(-x).  */
1027
1028 static bool
1029 negate_mathfn_p (enum built_in_function code)
1030 {
1031   switch (code)
1032     {
1033     CASE_FLT_FN (BUILT_IN_ASIN):
1034     CASE_FLT_FN (BUILT_IN_ASINH):
1035     CASE_FLT_FN (BUILT_IN_ATAN):
1036     CASE_FLT_FN (BUILT_IN_ATANH):
1037     CASE_FLT_FN (BUILT_IN_CASIN):
1038     CASE_FLT_FN (BUILT_IN_CASINH):
1039     CASE_FLT_FN (BUILT_IN_CATAN):
1040     CASE_FLT_FN (BUILT_IN_CATANH):
1041     CASE_FLT_FN (BUILT_IN_CBRT):
1042     CASE_FLT_FN (BUILT_IN_CPROJ):
1043     CASE_FLT_FN (BUILT_IN_CSIN):
1044     CASE_FLT_FN (BUILT_IN_CSINH):
1045     CASE_FLT_FN (BUILT_IN_CTAN):
1046     CASE_FLT_FN (BUILT_IN_CTANH):
1047     CASE_FLT_FN (BUILT_IN_ERF):
1048     CASE_FLT_FN (BUILT_IN_LLROUND):
1049     CASE_FLT_FN (BUILT_IN_LROUND):
1050     CASE_FLT_FN (BUILT_IN_ROUND):
1051     CASE_FLT_FN (BUILT_IN_SIN):
1052     CASE_FLT_FN (BUILT_IN_SINH):
1053     CASE_FLT_FN (BUILT_IN_TAN):
1054     CASE_FLT_FN (BUILT_IN_TANH):
1055     CASE_FLT_FN (BUILT_IN_TRUNC):
1056       return true;
1057
1058     CASE_FLT_FN (BUILT_IN_LLRINT):
1059     CASE_FLT_FN (BUILT_IN_LRINT):
1060     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1061     CASE_FLT_FN (BUILT_IN_RINT):
1062       return !flag_rounding_math;
1063
1064     default:
1065       break;
1066     }
1067   return false;
1068 }
1069
1070 /* Check whether we may negate an integer constant T without causing
1071    overflow.  */
1072
1073 bool
1074 may_negate_without_overflow_p (const_tree t)
1075 {
1076   unsigned HOST_WIDE_INT val;
1077   unsigned int prec;
1078   tree type;
1079
1080   gcc_assert (TREE_CODE (t) == INTEGER_CST);
1081
1082   type = TREE_TYPE (t);
1083   if (TYPE_UNSIGNED (type))
1084     return false;
1085
1086   prec = TYPE_PRECISION (type);
1087   if (prec > HOST_BITS_PER_WIDE_INT)
1088     {
1089       if (TREE_INT_CST_LOW (t) != 0)
1090         return true;
1091       prec -= HOST_BITS_PER_WIDE_INT;
1092       val = TREE_INT_CST_HIGH (t);
1093     }
1094   else
1095     val = TREE_INT_CST_LOW (t);
1096   if (prec < HOST_BITS_PER_WIDE_INT)
1097     val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1098   return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1099 }
1100
1101 /* Determine whether an expression T can be cheaply negated using
1102    the function negate_expr without introducing undefined overflow.  */
1103
1104 static bool
1105 negate_expr_p (tree t)
1106 {
1107   tree type;
1108
1109   if (t == 0)
1110     return false;
1111
1112   type = TREE_TYPE (t);
1113
1114   STRIP_SIGN_NOPS (t);
1115   switch (TREE_CODE (t))
1116     {
1117     case INTEGER_CST:
1118       if (TYPE_OVERFLOW_WRAPS (type))
1119         return true;
1120
1121       /* Check that -CST will not overflow type.  */
1122       return may_negate_without_overflow_p (t);
1123     case BIT_NOT_EXPR:
1124       return (INTEGRAL_TYPE_P (type)
1125               && TYPE_OVERFLOW_WRAPS (type));
1126
1127     case FIXED_CST:
1128     case REAL_CST:
1129     case NEGATE_EXPR:
1130       return true;
1131
1132     case COMPLEX_CST:
1133       return negate_expr_p (TREE_REALPART (t))
1134              && negate_expr_p (TREE_IMAGPART (t));
1135
1136     case COMPLEX_EXPR:
1137       return negate_expr_p (TREE_OPERAND (t, 0))
1138              && negate_expr_p (TREE_OPERAND (t, 1));
1139
1140     case CONJ_EXPR:
1141       return negate_expr_p (TREE_OPERAND (t, 0));
1142
1143     case PLUS_EXPR:
1144       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1145           || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1146         return false;
1147       /* -(A + B) -> (-B) - A.  */
1148       if (negate_expr_p (TREE_OPERAND (t, 1))
1149           && reorder_operands_p (TREE_OPERAND (t, 0),
1150                                  TREE_OPERAND (t, 1)))
1151         return true;
1152       /* -(A + B) -> (-A) - B.  */
1153       return negate_expr_p (TREE_OPERAND (t, 0));
1154
1155     case MINUS_EXPR:
1156       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
1157       return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1158              && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1159              && reorder_operands_p (TREE_OPERAND (t, 0),
1160                                     TREE_OPERAND (t, 1));
1161
1162     case MULT_EXPR:
1163       if (TYPE_UNSIGNED (TREE_TYPE (t)))
1164         break;
1165
1166       /* Fall through.  */
1167
1168     case RDIV_EXPR:
1169       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1170         return negate_expr_p (TREE_OPERAND (t, 1))
1171                || negate_expr_p (TREE_OPERAND (t, 0));
1172       break;
1173
1174     case TRUNC_DIV_EXPR:
1175     case ROUND_DIV_EXPR:
1176     case FLOOR_DIV_EXPR:
1177     case CEIL_DIV_EXPR:
1178     case EXACT_DIV_EXPR:
1179       /* In general we can't negate A / B, because if A is INT_MIN and
1180          B is 1, we may turn this into INT_MIN / -1 which is undefined
1181          and actually traps on some architectures.  But if overflow is
1182          undefined, we can negate, because - (INT_MIN / 1) is an
1183          overflow.  */
1184       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1185           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1186         break;
1187       return negate_expr_p (TREE_OPERAND (t, 1))
1188              || negate_expr_p (TREE_OPERAND (t, 0));
1189
1190     case NOP_EXPR:
1191       /* Negate -((double)float) as (double)(-float).  */
1192       if (TREE_CODE (type) == REAL_TYPE)
1193         {
1194           tree tem = strip_float_extensions (t);
1195           if (tem != t)
1196             return negate_expr_p (tem);
1197         }
1198       break;
1199
1200     case CALL_EXPR:
1201       /* Negate -f(x) as f(-x).  */
1202       if (negate_mathfn_p (builtin_mathfn_code (t)))
1203         return negate_expr_p (CALL_EXPR_ARG (t, 0));
1204       break;
1205
1206     case RSHIFT_EXPR:
1207       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1208       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1209         {
1210           tree op1 = TREE_OPERAND (t, 1);
1211           if (TREE_INT_CST_HIGH (op1) == 0
1212               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1213                  == TREE_INT_CST_LOW (op1))
1214             return true;
1215         }
1216       break;
1217
1218     default:
1219       break;
1220     }
1221   return false;
1222 }
1223
1224 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1225    simplification is possible.
1226    If negate_expr_p would return true for T, NULL_TREE will never be
1227    returned.  */
1228
1229 static tree
1230 fold_negate_expr (location_t loc, tree t)
1231 {
1232   tree type = TREE_TYPE (t);
1233   tree tem;
1234
1235   switch (TREE_CODE (t))
1236     {
1237     /* Convert - (~A) to A + 1.  */
1238     case BIT_NOT_EXPR:
1239       if (INTEGRAL_TYPE_P (type))
1240         return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
1241                             build_int_cst (type, 1));
1242       break;
1243
1244     case INTEGER_CST:
1245       tem = fold_negate_const (t, type);
1246       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1247           || !TYPE_OVERFLOW_TRAPS (type))
1248         return tem;
1249       break;
1250
1251     case REAL_CST:
1252       tem = fold_negate_const (t, type);
1253       /* Two's complement FP formats, such as c4x, may overflow.  */
1254       if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1255         return tem;
1256       break;
1257
1258     case FIXED_CST:
1259       tem = fold_negate_const (t, type);
1260       return tem;
1261
1262     case COMPLEX_CST:
1263       {
1264         tree rpart = negate_expr (TREE_REALPART (t));
1265         tree ipart = negate_expr (TREE_IMAGPART (t));
1266
1267         if ((TREE_CODE (rpart) == REAL_CST
1268              && TREE_CODE (ipart) == REAL_CST)
1269             || (TREE_CODE (rpart) == INTEGER_CST
1270                 && TREE_CODE (ipart) == INTEGER_CST))
1271           return build_complex (type, rpart, ipart);
1272       }
1273       break;
1274
1275     case COMPLEX_EXPR:
1276       if (negate_expr_p (t))
1277         return fold_build2_loc (loc, COMPLEX_EXPR, type,
1278                             fold_negate_expr (loc, TREE_OPERAND (t, 0)),
1279                             fold_negate_expr (loc, TREE_OPERAND (t, 1)));
1280       break;
1281
1282     case CONJ_EXPR:
1283       if (negate_expr_p (t))
1284         return fold_build1_loc (loc, CONJ_EXPR, type,
1285                             fold_negate_expr (loc, TREE_OPERAND (t, 0)));
1286       break;
1287
1288     case NEGATE_EXPR:
1289       return TREE_OPERAND (t, 0);
1290
1291     case PLUS_EXPR:
1292       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1293           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1294         {
1295           /* -(A + B) -> (-B) - A.  */
1296           if (negate_expr_p (TREE_OPERAND (t, 1))
1297               && reorder_operands_p (TREE_OPERAND (t, 0),
1298                                      TREE_OPERAND (t, 1)))
1299             {
1300               tem = negate_expr (TREE_OPERAND (t, 1));
1301               return fold_build2_loc (loc, MINUS_EXPR, type,
1302                                   tem, TREE_OPERAND (t, 0));
1303             }
1304
1305           /* -(A + B) -> (-A) - B.  */
1306           if (negate_expr_p (TREE_OPERAND (t, 0)))
1307             {
1308               tem = negate_expr (TREE_OPERAND (t, 0));
1309               return fold_build2_loc (loc, MINUS_EXPR, type,
1310                                   tem, TREE_OPERAND (t, 1));
1311             }
1312         }
1313       break;
1314
1315     case MINUS_EXPR:
1316       /* - (A - B) -> B - A  */
1317       if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1318           && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1319           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1320         return fold_build2_loc (loc, MINUS_EXPR, type,
1321                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1322       break;
1323
1324     case MULT_EXPR:
1325       if (TYPE_UNSIGNED (type))
1326         break;
1327
1328       /* Fall through.  */
1329
1330     case RDIV_EXPR:
1331       if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1332         {
1333           tem = TREE_OPERAND (t, 1);
1334           if (negate_expr_p (tem))
1335             return fold_build2_loc (loc, TREE_CODE (t), type,
1336                                 TREE_OPERAND (t, 0), negate_expr (tem));
1337           tem = TREE_OPERAND (t, 0);
1338           if (negate_expr_p (tem))
1339             return fold_build2_loc (loc, TREE_CODE (t), type,
1340                                 negate_expr (tem), TREE_OPERAND (t, 1));
1341         }
1342       break;
1343
1344     case TRUNC_DIV_EXPR:
1345     case ROUND_DIV_EXPR:
1346     case FLOOR_DIV_EXPR:
1347     case CEIL_DIV_EXPR:
1348     case EXACT_DIV_EXPR:
1349       /* In general we can't negate A / B, because if A is INT_MIN and
1350          B is 1, we may turn this into INT_MIN / -1 which is undefined
1351          and actually traps on some architectures.  But if overflow is
1352          undefined, we can negate, because - (INT_MIN / 1) is an
1353          overflow.  */
1354       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1355         {
1356           const char * const warnmsg = G_("assuming signed overflow does not "
1357                                           "occur when negating a division");
1358           tem = TREE_OPERAND (t, 1);
1359           if (negate_expr_p (tem))
1360             {
1361               if (INTEGRAL_TYPE_P (type)
1362                   && (TREE_CODE (tem) != INTEGER_CST
1363                       || integer_onep (tem)))
1364                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1365               return fold_build2_loc (loc, TREE_CODE (t), type,
1366                                   TREE_OPERAND (t, 0), negate_expr (tem));
1367             }
1368           tem = TREE_OPERAND (t, 0);
1369           if (negate_expr_p (tem))
1370             {
1371               if (INTEGRAL_TYPE_P (type)
1372                   && (TREE_CODE (tem) != INTEGER_CST
1373                       || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1374                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1375               return fold_build2_loc (loc, TREE_CODE (t), type,
1376                                   negate_expr (tem), TREE_OPERAND (t, 1));
1377             }
1378         }
1379       break;
1380
1381     case NOP_EXPR:
1382       /* Convert -((double)float) into (double)(-float).  */
1383       if (TREE_CODE (type) == REAL_TYPE)
1384         {
1385           tem = strip_float_extensions (t);
1386           if (tem != t && negate_expr_p (tem))
1387             return fold_convert_loc (loc, type, negate_expr (tem));
1388         }
1389       break;
1390
1391     case CALL_EXPR:
1392       /* Negate -f(x) as f(-x).  */
1393       if (negate_mathfn_p (builtin_mathfn_code (t))
1394           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1395         {
1396           tree fndecl, arg;
1397
1398           fndecl = get_callee_fndecl (t);
1399           arg = negate_expr (CALL_EXPR_ARG (t, 0));
1400           return build_call_expr_loc (loc, fndecl, 1, arg);
1401         }
1402       break;
1403
1404     case RSHIFT_EXPR:
1405       /* Optimize -((int)x >> 31) into (unsigned)x >> 31.  */
1406       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1407         {
1408           tree op1 = TREE_OPERAND (t, 1);
1409           if (TREE_INT_CST_HIGH (op1) == 0
1410               && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1411                  == TREE_INT_CST_LOW (op1))
1412             {
1413               tree ntype = TYPE_UNSIGNED (type)
1414                            ? signed_type_for (type)
1415                            : unsigned_type_for (type);
1416               tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0));
1417               temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1);
1418               return fold_convert_loc (loc, type, temp);
1419             }
1420         }
1421       break;
1422
1423     default:
1424       break;
1425     }
1426
1427   return NULL_TREE;
1428 }
1429
1430 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1431    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
1432    return NULL_TREE. */
1433
1434 static tree
1435 negate_expr (tree t)
1436 {
1437   tree type, tem;
1438   location_t loc;
1439
1440   if (t == NULL_TREE)
1441     return NULL_TREE;
1442
1443   loc = EXPR_LOCATION (t);
1444   type = TREE_TYPE (t);
1445   STRIP_SIGN_NOPS (t);
1446
1447   tem = fold_negate_expr (loc, t);
1448   if (!tem)
1449     {
1450       tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1451       SET_EXPR_LOCATION (tem, loc);
1452     }
1453   return fold_convert_loc (loc, type, tem);
1454 }
1455 \f
1456 /* Split a tree IN into a constant, literal and variable parts that could be
1457    combined with CODE to make IN.  "constant" means an expression with
1458    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
1459    commutative arithmetic operation.  Store the constant part into *CONP,
1460    the literal in *LITP and return the variable part.  If a part isn't
1461    present, set it to null.  If the tree does not decompose in this way,
1462    return the entire tree as the variable part and the other parts as null.
1463
1464    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
1465    case, we negate an operand that was subtracted.  Except if it is a
1466    literal for which we use *MINUS_LITP instead.
1467
1468    If NEGATE_P is true, we are negating all of IN, again except a literal
1469    for which we use *MINUS_LITP instead.
1470
1471    If IN is itself a literal or constant, return it as appropriate.
1472
1473    Note that we do not guarantee that any of the three values will be the
1474    same type as IN, but they will have the same signedness and mode.  */
1475
1476 static tree
1477 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1478             tree *minus_litp, int negate_p)
1479 {
1480   tree var = 0;
1481
1482   *conp = 0;
1483   *litp = 0;
1484   *minus_litp = 0;
1485
1486   /* Strip any conversions that don't change the machine mode or signedness.  */
1487   STRIP_SIGN_NOPS (in);
1488
1489   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1490       || TREE_CODE (in) == FIXED_CST)
1491     *litp = in;
1492   else if (TREE_CODE (in) == code
1493            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1494                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1495                /* We can associate addition and subtraction together (even
1496                   though the C standard doesn't say so) for integers because
1497                   the value is not affected.  For reals, the value might be
1498                   affected, so we can't.  */
1499                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1500                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1501     {
1502       tree op0 = TREE_OPERAND (in, 0);
1503       tree op1 = TREE_OPERAND (in, 1);
1504       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1505       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1506
1507       /* First see if either of the operands is a literal, then a constant.  */
1508       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1509           || TREE_CODE (op0) == FIXED_CST)
1510         *litp = op0, op0 = 0;
1511       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1512                || TREE_CODE (op1) == FIXED_CST)
1513         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1514
1515       if (op0 != 0 && TREE_CONSTANT (op0))
1516         *conp = op0, op0 = 0;
1517       else if (op1 != 0 && TREE_CONSTANT (op1))
1518         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1519
1520       /* If we haven't dealt with either operand, this is not a case we can
1521          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
1522       if (op0 != 0 && op1 != 0)
1523         var = in;
1524       else if (op0 != 0)
1525         var = op0;
1526       else
1527         var = op1, neg_var_p = neg1_p;
1528
1529       /* Now do any needed negations.  */
1530       if (neg_litp_p)
1531         *minus_litp = *litp, *litp = 0;
1532       if (neg_conp_p)
1533         *conp = negate_expr (*conp);
1534       if (neg_var_p)
1535         var = negate_expr (var);
1536     }
1537   else if (TREE_CONSTANT (in))
1538     *conp = in;
1539   else
1540     var = in;
1541
1542   if (negate_p)
1543     {
1544       if (*litp)
1545         *minus_litp = *litp, *litp = 0;
1546       else if (*minus_litp)
1547         *litp = *minus_litp, *minus_litp = 0;
1548       *conp = negate_expr (*conp);
1549       var = negate_expr (var);
1550     }
1551
1552   return var;
1553 }
1554
1555 /* Re-associate trees split by the above function.  T1 and T2 are
1556    either expressions to associate or null.  Return the new
1557    expression, if any.  LOC is the location of the new expression.  If
1558    we build an operation, do it in TYPE and with CODE.  */
1559
1560 static tree
1561 associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type)
1562 {
1563   tree tem;
1564
1565   if (t1 == 0)
1566     return t2;
1567   else if (t2 == 0)
1568     return t1;
1569
1570   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1571      try to fold this since we will have infinite recursion.  But do
1572      deal with any NEGATE_EXPRs.  */
1573   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1574       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1575     {
1576       if (code == PLUS_EXPR)
1577         {
1578           if (TREE_CODE (t1) == NEGATE_EXPR)
1579             tem = build2 (MINUS_EXPR, type, fold_convert_loc (loc, type, t2),
1580                           fold_convert_loc (loc, type, TREE_OPERAND (t1, 0)));
1581           else if (TREE_CODE (t2) == NEGATE_EXPR)
1582             tem = build2 (MINUS_EXPR, type, fold_convert_loc (loc, type, t1),
1583                           fold_convert_loc (loc, type, TREE_OPERAND (t2, 0)));
1584           else if (integer_zerop (t2))
1585             return fold_convert_loc (loc, type, t1);
1586         }
1587       else if (code == MINUS_EXPR)
1588         {
1589           if (integer_zerop (t2))
1590             return fold_convert_loc (loc, type, t1);
1591         }
1592
1593       tem = build2 (code, type, fold_convert_loc (loc, type, t1),
1594                     fold_convert_loc (loc, type, t2));
1595       goto associate_trees_exit;
1596     }
1597
1598   return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
1599                       fold_convert_loc (loc, type, t2));
1600  associate_trees_exit:
1601   protected_set_expr_location (tem, loc);
1602   return tem;
1603 }
1604 \f
1605 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1606    for use in int_const_binop, size_binop and size_diffop.  */
1607
1608 static bool
1609 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1610 {
1611   if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1612     return false;
1613   if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1614     return false;
1615
1616   switch (code)
1617     {
1618     case LSHIFT_EXPR:
1619     case RSHIFT_EXPR:
1620     case LROTATE_EXPR:
1621     case RROTATE_EXPR:
1622       return true;
1623
1624     default:
1625       break;
1626     }
1627
1628   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1629          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1630          && TYPE_MODE (type1) == TYPE_MODE (type2);
1631 }
1632
1633
1634 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1635    to produce a new constant.  Return NULL_TREE if we don't know how
1636    to evaluate CODE at compile-time.
1637
1638    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1639
1640 tree
1641 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1642 {
1643   unsigned HOST_WIDE_INT int1l, int2l;
1644   HOST_WIDE_INT int1h, int2h;
1645   unsigned HOST_WIDE_INT low;
1646   HOST_WIDE_INT hi;
1647   unsigned HOST_WIDE_INT garbagel;
1648   HOST_WIDE_INT garbageh;
1649   tree t;
1650   tree type = TREE_TYPE (arg1);
1651   int uns = TYPE_UNSIGNED (type);
1652   int is_sizetype
1653     = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1654   int overflow = 0;
1655
1656   int1l = TREE_INT_CST_LOW (arg1);
1657   int1h = TREE_INT_CST_HIGH (arg1);
1658   int2l = TREE_INT_CST_LOW (arg2);
1659   int2h = TREE_INT_CST_HIGH (arg2);
1660
1661   switch (code)
1662     {
1663     case BIT_IOR_EXPR:
1664       low = int1l | int2l, hi = int1h | int2h;
1665       break;
1666
1667     case BIT_XOR_EXPR:
1668       low = int1l ^ int2l, hi = int1h ^ int2h;
1669       break;
1670
1671     case BIT_AND_EXPR:
1672       low = int1l & int2l, hi = int1h & int2h;
1673       break;
1674
1675     case RSHIFT_EXPR:
1676       int2l = -int2l;
1677     case LSHIFT_EXPR:
1678       /* It's unclear from the C standard whether shifts can overflow.
1679          The following code ignores overflow; perhaps a C standard
1680          interpretation ruling is needed.  */
1681       lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1682                      &low, &hi, !uns);
1683       break;
1684
1685     case RROTATE_EXPR:
1686       int2l = - int2l;
1687     case LROTATE_EXPR:
1688       lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1689                       &low, &hi);
1690       break;
1691
1692     case PLUS_EXPR:
1693       overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1694       break;
1695
1696     case MINUS_EXPR:
1697       neg_double (int2l, int2h, &low, &hi);
1698       add_double (int1l, int1h, low, hi, &low, &hi);
1699       overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1700       break;
1701
1702     case MULT_EXPR:
1703       overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1704       break;
1705
1706     case TRUNC_DIV_EXPR:
1707     case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1708     case EXACT_DIV_EXPR:
1709       /* This is a shortcut for a common special case.  */
1710       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1711           && !TREE_OVERFLOW (arg1)
1712           && !TREE_OVERFLOW (arg2)
1713           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1714         {
1715           if (code == CEIL_DIV_EXPR)
1716             int1l += int2l - 1;
1717
1718           low = int1l / int2l, hi = 0;
1719           break;
1720         }
1721
1722       /* ... fall through ...  */
1723
1724     case ROUND_DIV_EXPR:
1725       if (int2h == 0 && int2l == 0)
1726         return NULL_TREE;
1727       if (int2h == 0 && int2l == 1)
1728         {
1729           low = int1l, hi = int1h;
1730           break;
1731         }
1732       if (int1l == int2l && int1h == int2h
1733           && ! (int1l == 0 && int1h == 0))
1734         {
1735           low = 1, hi = 0;
1736           break;
1737         }
1738       overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1739                                        &low, &hi, &garbagel, &garbageh);
1740       break;
1741
1742     case TRUNC_MOD_EXPR:
1743     case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1744       /* This is a shortcut for a common special case.  */
1745       if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1746           && !TREE_OVERFLOW (arg1)
1747           && !TREE_OVERFLOW (arg2)
1748           && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1749         {
1750           if (code == CEIL_MOD_EXPR)
1751             int1l += int2l - 1;
1752           low = int1l % int2l, hi = 0;
1753           break;
1754         }
1755
1756       /* ... fall through ...  */
1757
1758     case ROUND_MOD_EXPR:
1759       if (int2h == 0 && int2l == 0)
1760         return NULL_TREE;
1761       overflow = div_and_round_double (code, uns,
1762                                        int1l, int1h, int2l, int2h,
1763                                        &garbagel, &garbageh, &low, &hi);
1764       break;
1765
1766     case MIN_EXPR:
1767     case MAX_EXPR:
1768       if (uns)
1769         low = (((unsigned HOST_WIDE_INT) int1h
1770                 < (unsigned HOST_WIDE_INT) int2h)
1771                || (((unsigned HOST_WIDE_INT) int1h
1772                     == (unsigned HOST_WIDE_INT) int2h)
1773                    && int1l < int2l));
1774       else
1775         low = (int1h < int2h
1776                || (int1h == int2h && int1l < int2l));
1777
1778       if (low == (code == MIN_EXPR))
1779         low = int1l, hi = int1h;
1780       else
1781         low = int2l, hi = int2h;
1782       break;
1783
1784     default:
1785       return NULL_TREE;
1786     }
1787
1788   if (notrunc)
1789     {
1790       t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1791
1792       /* Propagate overflow flags ourselves.  */
1793       if (((!uns || is_sizetype) && overflow)
1794           | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1795         {
1796           t = copy_node (t);
1797           TREE_OVERFLOW (t) = 1;
1798         }
1799     }
1800   else
1801     t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1802                                ((!uns || is_sizetype) && overflow)
1803                                | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1804
1805   return t;
1806 }
1807
1808 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1809    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1810    are the same kind of constant and the same machine mode.  Return zero if
1811    combining the constants is not allowed in the current operating mode.
1812
1813    If NOTRUNC is nonzero, do not truncate the result to fit the data type.  */
1814
1815 static tree
1816 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1817 {
1818   /* Sanity check for the recursive cases.  */
1819   if (!arg1 || !arg2)
1820     return NULL_TREE;
1821
1822   STRIP_NOPS (arg1);
1823   STRIP_NOPS (arg2);
1824
1825   if (TREE_CODE (arg1) == INTEGER_CST)
1826     return int_const_binop (code, arg1, arg2, notrunc);
1827
1828   if (TREE_CODE (arg1) == REAL_CST)
1829     {
1830       enum machine_mode mode;
1831       REAL_VALUE_TYPE d1;
1832       REAL_VALUE_TYPE d2;
1833       REAL_VALUE_TYPE value;
1834       REAL_VALUE_TYPE result;
1835       bool inexact;
1836       tree t, type;
1837
1838       /* The following codes are handled by real_arithmetic.  */
1839       switch (code)
1840         {
1841         case PLUS_EXPR:
1842         case MINUS_EXPR:
1843         case MULT_EXPR:
1844         case RDIV_EXPR:
1845         case MIN_EXPR:
1846         case MAX_EXPR:
1847           break;
1848
1849         default:
1850           return NULL_TREE;
1851         }
1852
1853       d1 = TREE_REAL_CST (arg1);
1854       d2 = TREE_REAL_CST (arg2);
1855
1856       type = TREE_TYPE (arg1);
1857       mode = TYPE_MODE (type);
1858
1859       /* Don't perform operation if we honor signaling NaNs and
1860          either operand is a NaN.  */
1861       if (HONOR_SNANS (mode)
1862           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1863         return NULL_TREE;
1864
1865       /* Don't perform operation if it would raise a division
1866          by zero exception.  */
1867       if (code == RDIV_EXPR
1868           && REAL_VALUES_EQUAL (d2, dconst0)
1869           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1870         return NULL_TREE;
1871
1872       /* If either operand is a NaN, just return it.  Otherwise, set up
1873          for floating-point trap; we return an overflow.  */
1874       if (REAL_VALUE_ISNAN (d1))
1875         return arg1;
1876       else if (REAL_VALUE_ISNAN (d2))
1877         return arg2;
1878
1879       inexact = real_arithmetic (&value, code, &d1, &d2);
1880       real_convert (&result, mode, &value);
1881
1882       /* Don't constant fold this floating point operation if
1883          the result has overflowed and flag_trapping_math.  */
1884       if (flag_trapping_math
1885           && MODE_HAS_INFINITIES (mode)
1886           && REAL_VALUE_ISINF (result)
1887           && !REAL_VALUE_ISINF (d1)
1888           && !REAL_VALUE_ISINF (d2))
1889         return NULL_TREE;
1890
1891       /* Don't constant fold this floating point operation if the
1892          result may dependent upon the run-time rounding mode and
1893          flag_rounding_math is set, or if GCC's software emulation
1894          is unable to accurately represent the result.  */
1895       if ((flag_rounding_math
1896            || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1897           && (inexact || !real_identical (&result, &value)))
1898         return NULL_TREE;
1899
1900       t = build_real (type, result);
1901
1902       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1903       return t;
1904     }
1905
1906   if (TREE_CODE (arg1) == FIXED_CST)
1907     {
1908       FIXED_VALUE_TYPE f1;
1909       FIXED_VALUE_TYPE f2;
1910       FIXED_VALUE_TYPE result;
1911       tree t, type;
1912       int sat_p;
1913       bool overflow_p;
1914
1915       /* The following codes are handled by fixed_arithmetic.  */
1916       switch (code)
1917         {
1918         case PLUS_EXPR:
1919         case MINUS_EXPR:
1920         case MULT_EXPR:
1921         case TRUNC_DIV_EXPR:
1922           f2 = TREE_FIXED_CST (arg2);
1923           break;
1924
1925         case LSHIFT_EXPR:
1926         case RSHIFT_EXPR:
1927           f2.data.high = TREE_INT_CST_HIGH (arg2);
1928           f2.data.low = TREE_INT_CST_LOW (arg2);
1929           f2.mode = SImode;
1930           break;
1931
1932         default:
1933           return NULL_TREE;
1934         }
1935
1936       f1 = TREE_FIXED_CST (arg1);
1937       type = TREE_TYPE (arg1);
1938       sat_p = TYPE_SATURATING (type);
1939       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1940       t = build_fixed (type, result);
1941       /* Propagate overflow flags.  */
1942       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1943         TREE_OVERFLOW (t) = 1;
1944       return t;
1945     }
1946
1947   if (TREE_CODE (arg1) == COMPLEX_CST)
1948     {
1949       tree type = TREE_TYPE (arg1);
1950       tree r1 = TREE_REALPART (arg1);
1951       tree i1 = TREE_IMAGPART (arg1);
1952       tree r2 = TREE_REALPART (arg2);
1953       tree i2 = TREE_IMAGPART (arg2);
1954       tree real, imag;
1955
1956       switch (code)
1957         {
1958         case PLUS_EXPR:
1959         case MINUS_EXPR:
1960           real = const_binop (code, r1, r2, notrunc);
1961           imag = const_binop (code, i1, i2, notrunc);
1962           break;
1963
1964         case MULT_EXPR:
1965           if (COMPLEX_FLOAT_TYPE_P (type))
1966             return do_mpc_arg2 (arg1, arg2, type,
1967                                 /* do_nonfinite= */ folding_initializer,
1968                                 mpc_mul);
1969
1970           real = const_binop (MINUS_EXPR,
1971                               const_binop (MULT_EXPR, r1, r2, notrunc),
1972                               const_binop (MULT_EXPR, i1, i2, notrunc),
1973                               notrunc);
1974           imag = const_binop (PLUS_EXPR,
1975                               const_binop (MULT_EXPR, r1, i2, notrunc),
1976                               const_binop (MULT_EXPR, i1, r2, notrunc),
1977                               notrunc);
1978           break;
1979
1980         case RDIV_EXPR:
1981           if (COMPLEX_FLOAT_TYPE_P (type))
1982             return do_mpc_arg2 (arg1, arg2, type,
1983                                 /* do_nonfinite= */ folding_initializer,
1984                                 mpc_div);
1985           /* Fallthru ... */
1986         case TRUNC_DIV_EXPR:
1987         case CEIL_DIV_EXPR:
1988         case FLOOR_DIV_EXPR:
1989         case ROUND_DIV_EXPR:
1990           if (flag_complex_method == 0)
1991           {
1992             /* Keep this algorithm in sync with
1993                tree-complex.c:expand_complex_div_straight().
1994
1995                Expand complex division to scalars, straightforward algorithm.
1996                a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
1997                t = br*br + bi*bi
1998             */
1999             tree magsquared
2000               = const_binop (PLUS_EXPR,
2001                              const_binop (MULT_EXPR, r2, r2, notrunc),
2002                              const_binop (MULT_EXPR, i2, i2, notrunc),
2003                              notrunc);
2004             tree t1
2005               = const_binop (PLUS_EXPR,
2006                              const_binop (MULT_EXPR, r1, r2, notrunc),
2007                              const_binop (MULT_EXPR, i1, i2, notrunc),
2008                              notrunc);
2009             tree t2
2010               = const_binop (MINUS_EXPR,
2011                              const_binop (MULT_EXPR, i1, r2, notrunc),
2012                              const_binop (MULT_EXPR, r1, i2, notrunc),
2013                              notrunc);
2014
2015             real = const_binop (code, t1, magsquared, notrunc);
2016             imag = const_binop (code, t2, magsquared, notrunc);
2017           }
2018           else
2019           {
2020             /* Keep this algorithm in sync with
2021                tree-complex.c:expand_complex_div_wide().
2022
2023                Expand complex division to scalars, modified algorithm to minimize
2024                overflow with wide input ranges.  */
2025             tree compare = fold_build2 (LT_EXPR, boolean_type_node,
2026                                         fold_abs_const (r2, TREE_TYPE (type)),
2027                                         fold_abs_const (i2, TREE_TYPE (type)));
2028
2029             if (integer_nonzerop (compare))
2030               {
2031                 /* In the TRUE branch, we compute
2032                    ratio = br/bi;
2033                    div = (br * ratio) + bi;
2034                    tr = (ar * ratio) + ai;
2035                    ti = (ai * ratio) - ar;
2036                    tr = tr / div;
2037                    ti = ti / div;  */
2038                 tree ratio = const_binop (code, r2, i2, notrunc);
2039                 tree div = const_binop (PLUS_EXPR, i2,
2040                                         const_binop (MULT_EXPR, r2, ratio,
2041                                                      notrunc),
2042                                         notrunc);
2043                 real = const_binop (MULT_EXPR, r1, ratio, notrunc);
2044                 real = const_binop (PLUS_EXPR, real, i1, notrunc);
2045                 real = const_binop (code, real, div, notrunc);
2046
2047                 imag = const_binop (MULT_EXPR, i1, ratio, notrunc);
2048                 imag = const_binop (MINUS_EXPR, imag, r1, notrunc);
2049                 imag = const_binop (code, imag, div, notrunc);
2050               }
2051             else
2052               {
2053                 /* In the FALSE branch, we compute
2054                    ratio = d/c;
2055                    divisor = (d * ratio) + c;
2056                    tr = (b * ratio) + a;
2057                    ti = b - (a * ratio);
2058                    tr = tr / div;
2059                    ti = ti / div;  */
2060                 tree ratio = const_binop (code, i2, r2, notrunc);
2061                 tree div = const_binop (PLUS_EXPR, r2,
2062                                         const_binop (MULT_EXPR, i2, ratio,
2063                                                      notrunc),
2064                                         notrunc);
2065
2066                 real = const_binop (MULT_EXPR, i1, ratio, notrunc);
2067                 real = const_binop (PLUS_EXPR, real, r1, notrunc);
2068                 real = const_binop (code, real, div, notrunc);
2069
2070                 imag = const_binop (MULT_EXPR, r1, ratio, notrunc);
2071                 imag = const_binop (MINUS_EXPR, i1, imag, notrunc);
2072                 imag = const_binop (code, imag, div, notrunc);
2073               }
2074           }
2075           break;
2076
2077         default:
2078           return NULL_TREE;
2079         }
2080
2081       if (real && imag)
2082         return build_complex (type, real, imag);
2083     }
2084
2085   if (TREE_CODE (arg1) == VECTOR_CST)
2086     {
2087       tree type = TREE_TYPE(arg1);
2088       int count = TYPE_VECTOR_SUBPARTS (type), i;
2089       tree elements1, elements2, list = NULL_TREE;
2090
2091       if(TREE_CODE(arg2) != VECTOR_CST)
2092         return NULL_TREE;
2093
2094       elements1 = TREE_VECTOR_CST_ELTS (arg1);
2095       elements2 = TREE_VECTOR_CST_ELTS (arg2);
2096
2097       for (i = 0; i < count; i++)
2098         {
2099           tree elem1, elem2, elem;
2100
2101           /* The trailing elements can be empty and should be treated as 0 */
2102           if(!elements1)
2103             elem1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2104           else
2105             {
2106               elem1 = TREE_VALUE(elements1);
2107               elements1 = TREE_CHAIN (elements1);
2108             }
2109
2110           if(!elements2)
2111             elem2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2112           else
2113             {
2114               elem2 = TREE_VALUE(elements2);
2115               elements2 = TREE_CHAIN (elements2);
2116             }
2117
2118           elem = const_binop (code, elem1, elem2, notrunc);
2119
2120           /* It is possible that const_binop cannot handle the given
2121             code and return NULL_TREE */
2122           if(elem == NULL_TREE)
2123             return NULL_TREE;
2124
2125           list = tree_cons (NULL_TREE, elem, list);
2126         }
2127       return build_vector(type, nreverse(list));
2128     }
2129   return NULL_TREE;
2130 }
2131
2132 /* Create a size type INT_CST node with NUMBER sign extended.  KIND
2133    indicates which particular sizetype to create.  */
2134
2135 tree
2136 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2137 {
2138   return build_int_cst (sizetype_tab[(int) kind], number);
2139 }
2140 \f
2141 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
2142    is a tree code.  The type of the result is taken from the operands.
2143    Both must be equivalent integer types, ala int_binop_types_match_p.
2144    If the operands are constant, so is the result.  */
2145
2146 tree
2147 size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1)
2148 {
2149   tree type = TREE_TYPE (arg0);
2150
2151   if (arg0 == error_mark_node || arg1 == error_mark_node)
2152     return error_mark_node;
2153
2154   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2155                                        TREE_TYPE (arg1)));
2156
2157   /* Handle the special case of two integer constants faster.  */
2158   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2159     {
2160       /* And some specific cases even faster than that.  */
2161       if (code == PLUS_EXPR)
2162         {
2163           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2164             return arg1;
2165           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2166             return arg0;
2167         }
2168       else if (code == MINUS_EXPR)
2169         {
2170           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2171             return arg0;
2172         }
2173       else if (code == MULT_EXPR)
2174         {
2175           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2176             return arg1;
2177         }
2178
2179       /* Handle general case of two integer constants.  */
2180       return int_const_binop (code, arg0, arg1, 0);
2181     }
2182
2183   return fold_build2_loc (loc, code, type, arg0, arg1);
2184 }
2185
2186 /* Given two values, either both of sizetype or both of bitsizetype,
2187    compute the difference between the two values.  Return the value
2188    in signed type corresponding to the type of the operands.  */
2189
2190 tree
2191 size_diffop_loc (location_t loc, tree arg0, tree arg1)
2192 {
2193   tree type = TREE_TYPE (arg0);
2194   tree ctype;
2195
2196   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2197                                        TREE_TYPE (arg1)));
2198
2199   /* If the type is already signed, just do the simple thing.  */
2200   if (!TYPE_UNSIGNED (type))
2201     return size_binop_loc (loc, MINUS_EXPR, arg0, arg1);
2202
2203   if (type == sizetype)
2204     ctype = ssizetype;
2205   else if (type == bitsizetype)
2206     ctype = sbitsizetype;
2207   else
2208     ctype = signed_type_for (type);
2209
2210   /* If either operand is not a constant, do the conversions to the signed
2211      type and subtract.  The hardware will do the right thing with any
2212      overflow in the subtraction.  */
2213   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2214     return size_binop_loc (loc, MINUS_EXPR,
2215                            fold_convert_loc (loc, ctype, arg0),
2216                            fold_convert_loc (loc, ctype, arg1));
2217
2218   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2219      Otherwise, subtract the other way, convert to CTYPE (we know that can't
2220      overflow) and negate (which can't either).  Special-case a result
2221      of zero while we're here.  */
2222   if (tree_int_cst_equal (arg0, arg1))
2223     return build_int_cst (ctype, 0);
2224   else if (tree_int_cst_lt (arg1, arg0))
2225     return fold_convert_loc (loc, ctype,
2226                              size_binop_loc (loc, MINUS_EXPR, arg0, arg1));
2227   else
2228     return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0),
2229                            fold_convert_loc (loc, ctype,
2230                                              size_binop_loc (loc,
2231                                                              MINUS_EXPR,
2232                                                              arg1, arg0)));
2233 }
2234 \f
2235 /* A subroutine of fold_convert_const handling conversions of an
2236    INTEGER_CST to another integer type.  */
2237
2238 static tree
2239 fold_convert_const_int_from_int (tree type, const_tree arg1)
2240 {
2241   tree t;
2242
2243   /* Given an integer constant, make new constant with new type,
2244      appropriately sign-extended or truncated.  */
2245   t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2246                              TREE_INT_CST_HIGH (arg1),
2247                              /* Don't set the overflow when
2248                                 converting from a pointer,  */
2249                              !POINTER_TYPE_P (TREE_TYPE (arg1))
2250                              /* or to a sizetype with same signedness
2251                                 and the precision is unchanged.
2252                                 ???  sizetype is always sign-extended,
2253                                 but its signedness depends on the
2254                                 frontend.  Thus we see spurious overflows
2255                                 here if we do not check this.  */
2256                              && !((TYPE_PRECISION (TREE_TYPE (arg1))
2257                                    == TYPE_PRECISION (type))
2258                                   && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2259                                       == TYPE_UNSIGNED (type))
2260                                   && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2261                                        && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2262                                       || (TREE_CODE (type) == INTEGER_TYPE
2263                                           && TYPE_IS_SIZETYPE (type)))),
2264                              (TREE_INT_CST_HIGH (arg1) < 0
2265                               && (TYPE_UNSIGNED (type)
2266                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2267                              | TREE_OVERFLOW (arg1));
2268
2269   return t;
2270 }
2271
2272 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2273    to an integer type.  */
2274
2275 static tree
2276 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2277 {
2278   int overflow = 0;
2279   tree t;
2280
2281   /* The following code implements the floating point to integer
2282      conversion rules required by the Java Language Specification,
2283      that IEEE NaNs are mapped to zero and values that overflow
2284      the target precision saturate, i.e. values greater than
2285      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2286      are mapped to INT_MIN.  These semantics are allowed by the
2287      C and C++ standards that simply state that the behavior of
2288      FP-to-integer conversion is unspecified upon overflow.  */
2289
2290   HOST_WIDE_INT high, low;
2291   REAL_VALUE_TYPE r;
2292   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2293
2294   switch (code)
2295     {
2296     case FIX_TRUNC_EXPR:
2297       real_trunc (&r, VOIDmode, &x);
2298       break;
2299
2300     default:
2301       gcc_unreachable ();
2302     }
2303
2304   /* If R is NaN, return zero and show we have an overflow.  */
2305   if (REAL_VALUE_ISNAN (r))
2306     {
2307       overflow = 1;
2308       high = 0;
2309       low = 0;
2310     }
2311
2312   /* See if R is less than the lower bound or greater than the
2313      upper bound.  */
2314
2315   if (! overflow)
2316     {
2317       tree lt = TYPE_MIN_VALUE (type);
2318       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2319       if (REAL_VALUES_LESS (r, l))
2320         {
2321           overflow = 1;
2322           high = TREE_INT_CST_HIGH (lt);
2323           low = TREE_INT_CST_LOW (lt);
2324         }
2325     }
2326
2327   if (! overflow)
2328     {
2329       tree ut = TYPE_MAX_VALUE (type);
2330       if (ut)
2331         {
2332           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2333           if (REAL_VALUES_LESS (u, r))
2334             {
2335               overflow = 1;
2336               high = TREE_INT_CST_HIGH (ut);
2337               low = TREE_INT_CST_LOW (ut);
2338             }
2339         }
2340     }
2341
2342   if (! overflow)
2343     REAL_VALUE_TO_INT (&low, &high, r);
2344
2345   t = force_fit_type_double (type, low, high, -1,
2346                              overflow | TREE_OVERFLOW (arg1));
2347   return t;
2348 }
2349
2350 /* A subroutine of fold_convert_const handling conversions of a
2351    FIXED_CST to an integer type.  */
2352
2353 static tree
2354 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2355 {
2356   tree t;
2357   double_int temp, temp_trunc;
2358   unsigned int mode;
2359
2360   /* Right shift FIXED_CST to temp by fbit.  */
2361   temp = TREE_FIXED_CST (arg1).data;
2362   mode = TREE_FIXED_CST (arg1).mode;
2363   if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2364     {
2365       lshift_double (temp.low, temp.high,
2366                      - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2367                      &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2368
2369       /* Left shift temp to temp_trunc by fbit.  */
2370       lshift_double (temp.low, temp.high,
2371                      GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2372                      &temp_trunc.low, &temp_trunc.high,
2373                      SIGNED_FIXED_POINT_MODE_P (mode));
2374     }
2375   else
2376     {
2377       temp.low = 0;
2378       temp.high = 0;
2379       temp_trunc.low = 0;
2380       temp_trunc.high = 0;
2381     }
2382
2383   /* If FIXED_CST is negative, we need to round the value toward 0.
2384      By checking if the fractional bits are not zero to add 1 to temp.  */
2385   if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2386       && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2387     {
2388       double_int one;
2389       one.low = 1;
2390       one.high = 0;
2391       temp = double_int_add (temp, one);
2392     }
2393
2394   /* Given a fixed-point constant, make new constant with new type,
2395      appropriately sign-extended or truncated.  */
2396   t = force_fit_type_double (type, temp.low, temp.high, -1,
2397                              (temp.high < 0
2398                               && (TYPE_UNSIGNED (type)
2399                                   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2400                              | TREE_OVERFLOW (arg1));
2401
2402   return t;
2403 }
2404
2405 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2406    to another floating point type.  */
2407
2408 static tree
2409 fold_convert_const_real_from_real (tree type, const_tree arg1)
2410 {
2411   REAL_VALUE_TYPE value;
2412   tree t;
2413
2414   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2415   t = build_real (type, value);
2416
2417   /* If converting an infinity or NAN to a representation that doesn't
2418      have one, set the overflow bit so that we can produce some kind of
2419      error message at the appropriate point if necessary.  It's not the
2420      most user-friendly message, but it's better than nothing.  */
2421   if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
2422       && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
2423     TREE_OVERFLOW (t) = 1;
2424   else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
2425            && !MODE_HAS_NANS (TYPE_MODE (type)))
2426     TREE_OVERFLOW (t) = 1;
2427   /* Regular overflow, conversion produced an infinity in a mode that
2428      can't represent them.  */
2429   else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
2430            && REAL_VALUE_ISINF (value)
2431            && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
2432     TREE_OVERFLOW (t) = 1;
2433   else
2434     TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2435   return t;
2436 }
2437
2438 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2439    to a floating point type.  */
2440
2441 static tree
2442 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2443 {
2444   REAL_VALUE_TYPE value;
2445   tree t;
2446
2447   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2448   t = build_real (type, value);
2449
2450   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2451   return t;
2452 }
2453
2454 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2455    to another fixed-point type.  */
2456
2457 static tree
2458 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2459 {
2460   FIXED_VALUE_TYPE value;
2461   tree t;
2462   bool overflow_p;
2463
2464   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2465                               TYPE_SATURATING (type));
2466   t = build_fixed (type, value);
2467
2468   /* Propagate overflow flags.  */
2469   if (overflow_p | TREE_OVERFLOW (arg1))
2470     TREE_OVERFLOW (t) = 1;
2471   return t;
2472 }
2473
2474 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2475    to a fixed-point type.  */
2476
2477 static tree
2478 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2479 {
2480   FIXED_VALUE_TYPE value;
2481   tree t;
2482   bool overflow_p;
2483
2484   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2485                                        TREE_INT_CST (arg1),
2486                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2487                                        TYPE_SATURATING (type));
2488   t = build_fixed (type, value);
2489
2490   /* Propagate overflow flags.  */
2491   if (overflow_p | TREE_OVERFLOW (arg1))
2492     TREE_OVERFLOW (t) = 1;
2493   return t;
2494 }
2495
2496 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2497    to a fixed-point type.  */
2498
2499 static tree
2500 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2501 {
2502   FIXED_VALUE_TYPE value;
2503   tree t;
2504   bool overflow_p;
2505
2506   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2507                                         &TREE_REAL_CST (arg1),
2508                                         TYPE_SATURATING (type));
2509   t = build_fixed (type, value);
2510
2511   /* Propagate overflow flags.  */
2512   if (overflow_p | TREE_OVERFLOW (arg1))
2513     TREE_OVERFLOW (t) = 1;
2514   return t;
2515 }
2516
2517 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2518    type TYPE.  If no simplification can be done return NULL_TREE.  */
2519
2520 static tree
2521 fold_convert_const (enum tree_code code, tree type, tree arg1)
2522 {
2523   if (TREE_TYPE (arg1) == type)
2524     return arg1;
2525
2526   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
2527       || TREE_CODE (type) == OFFSET_TYPE)
2528     {
2529       if (TREE_CODE (arg1) == INTEGER_CST)
2530         return fold_convert_const_int_from_int (type, arg1);
2531       else if (TREE_CODE (arg1) == REAL_CST)
2532         return fold_convert_const_int_from_real (code, type, arg1);
2533       else if (TREE_CODE (arg1) == FIXED_CST)
2534         return fold_convert_const_int_from_fixed (type, arg1);
2535     }
2536   else if (TREE_CODE (type) == REAL_TYPE)
2537     {
2538       if (TREE_CODE (arg1) == INTEGER_CST)
2539         return build_real_from_int_cst (type, arg1);
2540       else if (TREE_CODE (arg1) == REAL_CST)
2541         return fold_convert_const_real_from_real (type, arg1);
2542       else if (TREE_CODE (arg1) == FIXED_CST)
2543         return fold_convert_const_real_from_fixed (type, arg1);
2544     }
2545   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2546     {
2547       if (TREE_CODE (arg1) == FIXED_CST)
2548         return fold_convert_const_fixed_from_fixed (type, arg1);
2549       else if (TREE_CODE (arg1) == INTEGER_CST)
2550         return fold_convert_const_fixed_from_int (type, arg1);
2551       else if (TREE_CODE (arg1) == REAL_CST)
2552         return fold_convert_const_fixed_from_real (type, arg1);
2553     }
2554   return NULL_TREE;
2555 }
2556
2557 /* Construct a vector of zero elements of vector type TYPE.  */
2558
2559 static tree
2560 build_zero_vector (tree type)
2561 {
2562   tree elem, list;
2563   int i, units;
2564
2565   elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2566   units = TYPE_VECTOR_SUBPARTS (type);
2567
2568   list = NULL_TREE;
2569   for (i = 0; i < units; i++)
2570     list = tree_cons (NULL_TREE, elem, list);
2571   return build_vector (type, list);
2572 }
2573
2574 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2575
2576 bool
2577 fold_convertible_p (const_tree type, const_tree arg)
2578 {
2579   tree orig = TREE_TYPE (arg);
2580
2581   if (type == orig)
2582     return true;
2583
2584   if (TREE_CODE (arg) == ERROR_MARK
2585       || TREE_CODE (type) == ERROR_MARK
2586       || TREE_CODE (orig) == ERROR_MARK)
2587     return false;
2588
2589   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2590     return true;
2591
2592   switch (TREE_CODE (type))
2593     {
2594     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2595     case POINTER_TYPE: case REFERENCE_TYPE:
2596     case OFFSET_TYPE:
2597       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2598           || TREE_CODE (orig) == OFFSET_TYPE)
2599         return true;
2600       return (TREE_CODE (orig) == VECTOR_TYPE
2601               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2602
2603     case REAL_TYPE:
2604     case FIXED_POINT_TYPE:
2605     case COMPLEX_TYPE:
2606     case VECTOR_TYPE:
2607     case VOID_TYPE:
2608       return TREE_CODE (type) == TREE_CODE (orig);
2609
2610     default:
2611       return false;
2612     }
2613 }
2614
2615 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2616    simple conversions in preference to calling the front-end's convert.  */
2617
2618 tree
2619 fold_convert_loc (location_t loc, tree type, tree arg)
2620 {
2621   tree orig = TREE_TYPE (arg);
2622   tree tem;
2623
2624   if (type == orig)
2625     return arg;
2626
2627   if (TREE_CODE (arg) == ERROR_MARK
2628       || TREE_CODE (type) == ERROR_MARK
2629       || TREE_CODE (orig) == ERROR_MARK)
2630     return error_mark_node;
2631
2632   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2633     return fold_build1_loc (loc, NOP_EXPR, type, arg);
2634
2635   switch (TREE_CODE (type))
2636     {
2637     case POINTER_TYPE:
2638     case REFERENCE_TYPE:
2639       /* Handle conversions between pointers to different address spaces.  */
2640       if (POINTER_TYPE_P (orig)
2641           && (TYPE_ADDR_SPACE (TREE_TYPE (type))
2642               != TYPE_ADDR_SPACE (TREE_TYPE (orig))))
2643         return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg);
2644       /* fall through */
2645
2646     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2647     case OFFSET_TYPE:
2648       if (TREE_CODE (arg) == INTEGER_CST)
2649         {
2650           tem = fold_convert_const (NOP_EXPR, type, arg);
2651           if (tem != NULL_TREE)
2652             return tem;
2653         }
2654       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2655           || TREE_CODE (orig) == OFFSET_TYPE)
2656         return fold_build1_loc (loc, NOP_EXPR, type, arg);
2657       if (TREE_CODE (orig) == COMPLEX_TYPE)
2658         return fold_convert_loc (loc, type,
2659                              fold_build1_loc (loc, REALPART_EXPR,
2660                                           TREE_TYPE (orig), arg));
2661       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2662                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2663       return fold_build1_loc (loc, NOP_EXPR, type, arg);
2664
2665     case REAL_TYPE:
2666       if (TREE_CODE (arg) == INTEGER_CST)
2667         {
2668           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2669           if (tem != NULL_TREE)
2670             return tem;
2671         }
2672       else if (TREE_CODE (arg) == REAL_CST)
2673         {
2674           tem = fold_convert_const (NOP_EXPR, type, arg);
2675           if (tem != NULL_TREE)
2676             return tem;
2677         }
2678       else if (TREE_CODE (arg) == FIXED_CST)
2679         {
2680           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2681           if (tem != NULL_TREE)
2682             return tem;
2683         }
2684
2685       switch (TREE_CODE (orig))
2686         {
2687         case INTEGER_TYPE:
2688         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2689         case POINTER_TYPE: case REFERENCE_TYPE:
2690           return fold_build1_loc (loc, FLOAT_EXPR, type, arg);
2691
2692         case REAL_TYPE:
2693           return fold_build1_loc (loc, NOP_EXPR, type, arg);
2694
2695         case FIXED_POINT_TYPE:
2696           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2697
2698         case COMPLEX_TYPE:
2699           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2700           return fold_convert_loc (loc, type, tem);
2701
2702         default:
2703           gcc_unreachable ();
2704         }
2705
2706     case FIXED_POINT_TYPE:
2707       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2708           || TREE_CODE (arg) == REAL_CST)
2709         {
2710           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2711           if (tem != NULL_TREE)
2712             goto fold_convert_exit;
2713         }
2714
2715       switch (TREE_CODE (orig))
2716         {
2717         case FIXED_POINT_TYPE:
2718         case INTEGER_TYPE:
2719         case ENUMERAL_TYPE:
2720         case BOOLEAN_TYPE:
2721         case REAL_TYPE:
2722           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2723
2724         case COMPLEX_TYPE:
2725           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2726           return fold_convert_loc (loc, type, tem);
2727
2728         default:
2729           gcc_unreachable ();
2730         }
2731
2732     case COMPLEX_TYPE:
2733       switch (TREE_CODE (orig))
2734         {
2735         case INTEGER_TYPE:
2736         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2737         case POINTER_TYPE: case REFERENCE_TYPE:
2738         case REAL_TYPE:
2739         case FIXED_POINT_TYPE:
2740           return fold_build2_loc (loc, COMPLEX_EXPR, type,
2741                               fold_convert_loc (loc, TREE_TYPE (type), arg),
2742                               fold_convert_loc (loc, TREE_TYPE (type),
2743                                             integer_zero_node));
2744         case COMPLEX_TYPE:
2745           {
2746             tree rpart, ipart;
2747
2748             if (TREE_CODE (arg) == COMPLEX_EXPR)
2749               {
2750                 rpart = fold_convert_loc (loc, TREE_TYPE (type),
2751                                       TREE_OPERAND (arg, 0));
2752                 ipart = fold_convert_loc (loc, TREE_TYPE (type),
2753                                       TREE_OPERAND (arg, 1));
2754                 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2755               }
2756
2757             arg = save_expr (arg);
2758             rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2759             ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg);
2760             rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart);
2761             ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart);
2762             return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2763           }
2764
2765         default:
2766           gcc_unreachable ();
2767         }
2768
2769     case VECTOR_TYPE:
2770       if (integer_zerop (arg))
2771         return build_zero_vector (type);
2772       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2773       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2774                   || TREE_CODE (orig) == VECTOR_TYPE);
2775       return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg);
2776
2777     case VOID_TYPE:
2778       tem = fold_ignored_result (arg);
2779       if (TREE_CODE (tem) == MODIFY_EXPR)
2780         goto fold_convert_exit;
2781       return fold_build1_loc (loc, NOP_EXPR, type, tem);
2782
2783     default:
2784       gcc_unreachable ();
2785     }
2786  fold_convert_exit:
2787   protected_set_expr_location (tem, loc);
2788   return tem;
2789 }
2790 \f
2791 /* Return false if expr can be assumed not to be an lvalue, true
2792    otherwise.  */
2793
2794 static bool
2795 maybe_lvalue_p (const_tree x)
2796 {
2797   /* We only need to wrap lvalue tree codes.  */
2798   switch (TREE_CODE (x))
2799   {
2800   case VAR_DECL:
2801   case PARM_DECL:
2802   case RESULT_DECL:
2803   case LABEL_DECL:
2804   case FUNCTION_DECL:
2805   case SSA_NAME:
2806
2807   case COMPONENT_REF:
2808   case INDIRECT_REF:
2809   case ALIGN_INDIRECT_REF:
2810   case MISALIGNED_INDIRECT_REF:
2811   case ARRAY_REF:
2812   case ARRAY_RANGE_REF:
2813   case BIT_FIELD_REF:
2814   case OBJ_TYPE_REF:
2815
2816   case REALPART_EXPR:
2817   case IMAGPART_EXPR:
2818   case PREINCREMENT_EXPR:
2819   case PREDECREMENT_EXPR:
2820   case SAVE_EXPR:
2821   case TRY_CATCH_EXPR:
2822   case WITH_CLEANUP_EXPR:
2823   case COMPOUND_EXPR:
2824   case MODIFY_EXPR:
2825   case TARGET_EXPR:
2826   case COND_EXPR:
2827   case BIND_EXPR:
2828     break;
2829
2830   default:
2831     /* Assume the worst for front-end tree codes.  */
2832     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2833       break;
2834     return false;
2835   }
2836
2837   return true;
2838 }
2839
2840 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2841
2842 tree
2843 non_lvalue_loc (location_t loc, tree x)
2844 {
2845   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2846      us.  */
2847   if (in_gimple_form)
2848     return x;
2849
2850   if (! maybe_lvalue_p (x))
2851     return x;
2852   x = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2853   SET_EXPR_LOCATION (x, loc);
2854   return x;
2855 }
2856
2857 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2858    Zero means allow extended lvalues.  */
2859
2860 int pedantic_lvalues;
2861
2862 /* When pedantic, return an expr equal to X but certainly not valid as a
2863    pedantic lvalue.  Otherwise, return X.  */
2864
2865 static tree
2866 pedantic_non_lvalue_loc (location_t loc, tree x)
2867 {
2868   if (pedantic_lvalues)
2869     return non_lvalue_loc (loc, x);
2870   protected_set_expr_location (x, loc);
2871   return x;
2872 }
2873 \f
2874 /* Given a tree comparison code, return the code that is the logical inverse
2875    of the given code.  It is not safe to do this for floating-point
2876    comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2877    as well: if reversing the comparison is unsafe, return ERROR_MARK.  */
2878
2879 enum tree_code
2880 invert_tree_comparison (enum tree_code code, bool honor_nans)
2881 {
2882   if (honor_nans && flag_trapping_math)
2883     return ERROR_MARK;
2884
2885   switch (code)
2886     {
2887     case EQ_EXPR:
2888       return NE_EXPR;
2889     case NE_EXPR:
2890       return EQ_EXPR;
2891     case GT_EXPR:
2892       return honor_nans ? UNLE_EXPR : LE_EXPR;
2893     case GE_EXPR:
2894       return honor_nans ? UNLT_EXPR : LT_EXPR;
2895     case LT_EXPR:
2896       return honor_nans ? UNGE_EXPR : GE_EXPR;
2897     case LE_EXPR:
2898       return honor_nans ? UNGT_EXPR : GT_EXPR;
2899     case LTGT_EXPR:
2900       return UNEQ_EXPR;
2901     case UNEQ_EXPR:
2902       return LTGT_EXPR;
2903     case UNGT_EXPR:
2904       return LE_EXPR;
2905     case UNGE_EXPR:
2906       return LT_EXPR;
2907     case UNLT_EXPR:
2908       return GE_EXPR;
2909     case UNLE_EXPR:
2910       return GT_EXPR;
2911     case ORDERED_EXPR:
2912       return UNORDERED_EXPR;
2913     case UNORDERED_EXPR:
2914       return ORDERED_EXPR;
2915     default:
2916       gcc_unreachable ();
2917     }
2918 }
2919
2920 /* Similar, but return the comparison that results if the operands are
2921    swapped.  This is safe for floating-point.  */
2922
2923 enum tree_code
2924 swap_tree_comparison (enum tree_code code)
2925 {
2926   switch (code)
2927     {
2928     case EQ_EXPR:
2929     case NE_EXPR:
2930     case ORDERED_EXPR:
2931     case UNORDERED_EXPR:
2932     case LTGT_EXPR:
2933     case UNEQ_EXPR:
2934       return code;
2935     case GT_EXPR:
2936       return LT_EXPR;
2937     case GE_EXPR:
2938       return LE_EXPR;
2939     case LT_EXPR:
2940       return GT_EXPR;
2941     case LE_EXPR:
2942       return GE_EXPR;
2943     case UNGT_EXPR:
2944       return UNLT_EXPR;
2945     case UNGE_EXPR:
2946       return UNLE_EXPR;
2947     case UNLT_EXPR:
2948       return UNGT_EXPR;
2949     case UNLE_EXPR:
2950       return UNGE_EXPR;
2951     default:
2952       gcc_unreachable ();
2953     }
2954 }
2955
2956
2957 /* Convert a comparison tree code from an enum tree_code representation
2958    into a compcode bit-based encoding.  This function is the inverse of
2959    compcode_to_comparison.  */
2960
2961 static enum comparison_code
2962 comparison_to_compcode (enum tree_code code)
2963 {
2964   switch (code)
2965     {
2966     case LT_EXPR:
2967       return COMPCODE_LT;
2968     case EQ_EXPR:
2969       return COMPCODE_EQ;
2970     case LE_EXPR:
2971       return COMPCODE_LE;
2972     case GT_EXPR:
2973       return COMPCODE_GT;
2974     case NE_EXPR:
2975       return COMPCODE_NE;
2976     case GE_EXPR:
2977       return COMPCODE_GE;
2978     case ORDERED_EXPR:
2979       return COMPCODE_ORD;
2980     case UNORDERED_EXPR:
2981       return COMPCODE_UNORD;
2982     case UNLT_EXPR:
2983       return COMPCODE_UNLT;
2984     case UNEQ_EXPR:
2985       return COMPCODE_UNEQ;
2986     case UNLE_EXPR:
2987       return COMPCODE_UNLE;
2988     case UNGT_EXPR:
2989       return COMPCODE_UNGT;
2990     case LTGT_EXPR:
2991       return COMPCODE_LTGT;
2992     case UNGE_EXPR:
2993       return COMPCODE_UNGE;
2994     default:
2995       gcc_unreachable ();
2996     }
2997 }
2998
2999 /* Convert a compcode bit-based encoding of a comparison operator back
3000    to GCC's enum tree_code representation.  This function is the
3001    inverse of comparison_to_compcode.  */
3002
3003 static enum tree_code
3004 compcode_to_comparison (enum comparison_code code)
3005 {
3006   switch (code)
3007     {
3008     case COMPCODE_LT:
3009       return LT_EXPR;
3010     case COMPCODE_EQ:
3011       return EQ_EXPR;
3012     case COMPCODE_LE:
3013       return LE_EXPR;
3014     case COMPCODE_GT:
3015       return GT_EXPR;
3016     case COMPCODE_NE:
3017       return NE_EXPR;
3018     case COMPCODE_GE:
3019       return GE_EXPR;
3020     case COMPCODE_ORD:
3021       return ORDERED_EXPR;
3022     case COMPCODE_UNORD:
3023       return UNORDERED_EXPR;
3024     case COMPCODE_UNLT:
3025       return UNLT_EXPR;
3026     case COMPCODE_UNEQ:
3027       return UNEQ_EXPR;
3028     case COMPCODE_UNLE:
3029       return UNLE_EXPR;
3030     case COMPCODE_UNGT:
3031       return UNGT_EXPR;
3032     case COMPCODE_LTGT:
3033       return LTGT_EXPR;
3034     case COMPCODE_UNGE:
3035       return UNGE_EXPR;
3036     default:
3037       gcc_unreachable ();
3038     }
3039 }
3040
3041 /* Return a tree for the comparison which is the combination of
3042    doing the AND or OR (depending on CODE) of the two operations LCODE
3043    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
3044    the possibility of trapping if the mode has NaNs, and return NULL_TREE
3045    if this makes the transformation invalid.  */
3046
3047 tree
3048 combine_comparisons (location_t loc,
3049                      enum tree_code code, enum tree_code lcode,
3050                      enum tree_code rcode, tree truth_type,
3051                      tree ll_arg, tree lr_arg)
3052 {
3053   bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
3054   enum comparison_code lcompcode = comparison_to_compcode (lcode);
3055   enum comparison_code rcompcode = comparison_to_compcode (rcode);
3056   int compcode;
3057
3058   switch (code)
3059     {
3060     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
3061       compcode = lcompcode & rcompcode;
3062       break;
3063
3064     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
3065       compcode = lcompcode | rcompcode;
3066       break;
3067
3068     default:
3069       return NULL_TREE;
3070     }
3071
3072   if (!honor_nans)
3073     {
3074       /* Eliminate unordered comparisons, as well as LTGT and ORD
3075          which are not used unless the mode has NaNs.  */
3076       compcode &= ~COMPCODE_UNORD;
3077       if (compcode == COMPCODE_LTGT)
3078         compcode = COMPCODE_NE;
3079       else if (compcode == COMPCODE_ORD)
3080         compcode = COMPCODE_TRUE;
3081     }
3082    else if (flag_trapping_math)
3083      {
3084         /* Check that the original operation and the optimized ones will trap
3085            under the same condition.  */
3086         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
3087                      && (lcompcode != COMPCODE_EQ)
3088                      && (lcompcode != COMPCODE_ORD);
3089         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
3090                      && (rcompcode != COMPCODE_EQ)
3091                      && (rcompcode != COMPCODE_ORD);
3092         bool trap = (compcode & COMPCODE_UNORD) == 0
3093                     && (compcode != COMPCODE_EQ)
3094                     && (compcode != COMPCODE_ORD);
3095
3096         /* In a short-circuited boolean expression the LHS might be
3097            such that the RHS, if evaluated, will never trap.  For
3098            example, in ORD (x, y) && (x < y), we evaluate the RHS only
3099            if neither x nor y is NaN.  (This is a mixed blessing: for
3100            example, the expression above will never trap, hence
3101            optimizing it to x < y would be invalid).  */
3102         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
3103             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
3104           rtrap = false;
3105
3106         /* If the comparison was short-circuited, and only the RHS
3107            trapped, we may now generate a spurious trap.  */
3108         if (rtrap && !ltrap
3109             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3110           return NULL_TREE;
3111
3112         /* If we changed the conditions that cause a trap, we lose.  */
3113         if ((ltrap || rtrap) != trap)
3114           return NULL_TREE;
3115       }
3116
3117   if (compcode == COMPCODE_TRUE)
3118     return constant_boolean_node (true, truth_type);
3119   else if (compcode == COMPCODE_FALSE)
3120     return constant_boolean_node (false, truth_type);
3121   else
3122     {
3123       enum tree_code tcode;
3124
3125       tcode = compcode_to_comparison ((enum comparison_code) compcode);
3126       return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg);
3127     }
3128 }
3129 \f
3130 /* Return nonzero if two operands (typically of the same tree node)
3131    are necessarily equal.  If either argument has side-effects this
3132    function returns zero.  FLAGS modifies behavior as follows:
3133
3134    If OEP_ONLY_CONST is set, only return nonzero for constants.
3135    This function tests whether the operands are indistinguishable;
3136    it does not test whether they are equal using C's == operation.
3137    The distinction is important for IEEE floating point, because
3138    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3139    (2) two NaNs may be indistinguishable, but NaN!=NaN.
3140
3141    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3142    even though it may hold multiple values during a function.
3143    This is because a GCC tree node guarantees that nothing else is
3144    executed between the evaluation of its "operands" (which may often
3145    be evaluated in arbitrary order).  Hence if the operands themselves
3146    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3147    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
3148    unset means assuming isochronic (or instantaneous) tree equivalence.
3149    Unless comparing arbitrary expression trees, such as from different
3150    statements, this flag can usually be left unset.
3151
3152    If OEP_PURE_SAME is set, then pure functions with identical arguments
3153    are considered the same.  It is used when the caller has other ways
3154    to ensure that global memory is unchanged in between.  */
3155
3156 int
3157 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3158 {
3159   /* If either is ERROR_MARK, they aren't equal.  */
3160   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3161     return 0;
3162
3163   /* Check equality of integer constants before bailing out due to
3164      precision differences.  */
3165   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
3166     return tree_int_cst_equal (arg0, arg1);
3167
3168   /* If both types don't have the same signedness, then we can't consider
3169      them equal.  We must check this before the STRIP_NOPS calls
3170      because they may change the signedness of the arguments.  As pointers
3171      strictly don't have a signedness, require either two pointers or
3172      two non-pointers as well.  */
3173   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
3174       || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
3175     return 0;
3176
3177   /* We cannot consider pointers to different address space equal.  */
3178   if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1))
3179       && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))
3180           != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))))
3181     return 0;
3182
3183   /* If both types don't have the same precision, then it is not safe
3184      to strip NOPs.  */
3185   if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3186     return 0;
3187
3188   STRIP_NOPS (arg0);
3189   STRIP_NOPS (arg1);
3190
3191   /* In case both args are comparisons but with different comparison
3192      code, try to swap the comparison operands of one arg to produce
3193      a match and compare that variant.  */
3194   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3195       && COMPARISON_CLASS_P (arg0)
3196       && COMPARISON_CLASS_P (arg1))
3197     {
3198       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3199
3200       if (TREE_CODE (arg0) == swap_code)
3201         return operand_equal_p (TREE_OPERAND (arg0, 0),
3202                                 TREE_OPERAND (arg1, 1), flags)
3203                && operand_equal_p (TREE_OPERAND (arg0, 1),
3204                                    TREE_OPERAND (arg1, 0), flags);
3205     }
3206
3207   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3208       /* This is needed for conversions and for COMPONENT_REF.
3209          Might as well play it safe and always test this.  */
3210       || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3211       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3212       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3213     return 0;
3214
3215   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3216      We don't care about side effects in that case because the SAVE_EXPR
3217      takes care of that for us. In all other cases, two expressions are
3218      equal if they have no side effects.  If we have two identical
3219      expressions with side effects that should be treated the same due
3220      to the only side effects being identical SAVE_EXPR's, that will
3221      be detected in the recursive calls below.  */
3222   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3223       && (TREE_CODE (arg0) == SAVE_EXPR
3224           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3225     return 1;
3226
3227   /* Next handle constant cases, those for which we can return 1 even
3228      if ONLY_CONST is set.  */
3229   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3230     switch (TREE_CODE (arg0))
3231       {
3232       case INTEGER_CST:
3233         return tree_int_cst_equal (arg0, arg1);
3234
3235       case FIXED_CST:
3236         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3237                                        TREE_FIXED_CST (arg1));
3238
3239       case REAL_CST:
3240         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3241                                    TREE_REAL_CST (arg1)))
3242           return 1;
3243
3244
3245         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3246           {
3247             /* If we do not distinguish between signed and unsigned zero,
3248                consider them equal.  */
3249             if (real_zerop (arg0) && real_zerop (arg1))
3250               return 1;
3251           }
3252         return 0;
3253
3254       case VECTOR_CST:
3255         {
3256           tree v1, v2;
3257
3258           v1 = TREE_VECTOR_CST_ELTS (arg0);
3259           v2 = TREE_VECTOR_CST_ELTS (arg1);
3260           while (v1 && v2)
3261             {
3262               if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3263                                     flags))
3264                 return 0;
3265               v1 = TREE_CHAIN (v1);
3266               v2 = TREE_CHAIN (v2);
3267             }
3268
3269           return v1 == v2;
3270         }
3271
3272       case COMPLEX_CST:
3273         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3274                                  flags)
3275                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3276                                     flags));
3277
3278       case STRING_CST:
3279         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3280                 && ! memcmp (TREE_STRING_POINTER (arg0),
3281                               TREE_STRING_POINTER (arg1),
3282                               TREE_STRING_LENGTH (arg0)));
3283
3284       case ADDR_EXPR:
3285         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3286                                 0);
3287       default:
3288         break;
3289       }
3290
3291   if (flags & OEP_ONLY_CONST)
3292     return 0;
3293
3294 /* Define macros to test an operand from arg0 and arg1 for equality and a
3295    variant that allows null and views null as being different from any
3296    non-null value.  In the latter case, if either is null, the both
3297    must be; otherwise, do the normal comparison.  */
3298 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
3299                                     TREE_OPERAND (arg1, N), flags)
3300
3301 #define OP_SAME_WITH_NULL(N)                            \
3302   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3303    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3304
3305   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3306     {
3307     case tcc_unary:
3308       /* Two conversions are equal only if signedness and modes match.  */
3309       switch (TREE_CODE (arg0))
3310         {
3311         CASE_CONVERT:
3312         case FIX_TRUNC_EXPR:
3313           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3314               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3315             return 0;
3316           break;
3317         default:
3318           break;
3319         }
3320
3321       return OP_SAME (0);
3322
3323
3324     case tcc_comparison:
3325     case tcc_binary:
3326       if (OP_SAME (0) && OP_SAME (1))
3327         return 1;
3328
3329       /* For commutative ops, allow the other order.  */
3330       return (commutative_tree_code (TREE_CODE (arg0))
3331               && operand_equal_p (TREE_OPERAND (arg0, 0),
3332                                   TREE_OPERAND (arg1, 1), flags)
3333               && operand_equal_p (TREE_OPERAND (arg0, 1),
3334                                   TREE_OPERAND (arg1, 0), flags));
3335
3336     case tcc_reference:
3337       /* If either of the pointer (or reference) expressions we are
3338          dereferencing contain a side effect, these cannot be equal.  */
3339       if (TREE_SIDE_EFFECTS (arg0)
3340           || TREE_SIDE_EFFECTS (arg1))
3341         return 0;
3342
3343       switch (TREE_CODE (arg0))
3344         {
3345         case INDIRECT_REF:
3346         case ALIGN_INDIRECT_REF:
3347         case MISALIGNED_INDIRECT_REF:
3348         case REALPART_EXPR:
3349         case IMAGPART_EXPR:
3350           return OP_SAME (0);
3351
3352         case ARRAY_REF:
3353         case ARRAY_RANGE_REF:
3354           /* Operands 2 and 3 may be null.
3355              Compare the array index by value if it is constant first as we
3356              may have different types but same value here.  */
3357           return (OP_SAME (0)
3358                   && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3359                                           TREE_OPERAND (arg1, 1))
3360                       || OP_SAME (1))
3361                   && OP_SAME_WITH_NULL (2)
3362                   && OP_SAME_WITH_NULL (3));
3363
3364         case COMPONENT_REF:
3365           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3366              may be NULL when we're called to compare MEM_EXPRs.  */
3367           return OP_SAME_WITH_NULL (0)
3368                  && OP_SAME (1)
3369                  && OP_SAME_WITH_NULL (2);
3370
3371         case BIT_FIELD_REF:
3372           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3373
3374         default:
3375           return 0;
3376         }
3377
3378     case tcc_expression:
3379       switch (TREE_CODE (arg0))
3380         {
3381         case ADDR_EXPR:
3382         case TRUTH_NOT_EXPR:
3383           return OP_SAME (0);
3384
3385         case TRUTH_ANDIF_EXPR:
3386         case TRUTH_ORIF_EXPR:
3387           return OP_SAME (0) && OP_SAME (1);
3388
3389         case TRUTH_AND_EXPR:
3390         case TRUTH_OR_EXPR:
3391         case TRUTH_XOR_EXPR:
3392           if (OP_SAME (0) && OP_SAME (1))
3393             return 1;
3394
3395           /* Otherwise take into account this is a commutative operation.  */
3396           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3397                                    TREE_OPERAND (arg1, 1), flags)
3398                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3399                                       TREE_OPERAND (arg1, 0), flags));
3400
3401         case COND_EXPR:
3402           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3403
3404         default:
3405           return 0;
3406         }
3407
3408     case tcc_vl_exp:
3409       switch (TREE_CODE (arg0))
3410         {
3411         case CALL_EXPR:
3412           /* If the CALL_EXPRs call different functions, then they
3413              clearly can not be equal.  */
3414           if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3415                                  flags))
3416             return 0;
3417
3418           {
3419             unsigned int cef = call_expr_flags (arg0);
3420             if (flags & OEP_PURE_SAME)
3421               cef &= ECF_CONST | ECF_PURE;
3422             else
3423               cef &= ECF_CONST;
3424             if (!cef)
3425               return 0;
3426           }
3427
3428           /* Now see if all the arguments are the same.  */
3429           {
3430             const_call_expr_arg_iterator iter0, iter1;
3431             const_tree a0, a1;
3432             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3433                    a1 = first_const_call_expr_arg (arg1, &iter1);
3434                  a0 && a1;
3435                  a0 = next_const_call_expr_arg (&iter0),
3436                    a1 = next_const_call_expr_arg (&iter1))
3437               if (! operand_equal_p (a0, a1, flags))
3438                 return 0;
3439
3440             /* If we get here and both argument lists are exhausted
3441                then the CALL_EXPRs are equal.  */
3442             return ! (a0 || a1);
3443           }
3444         default:
3445           return 0;
3446         }
3447
3448     case tcc_declaration:
3449       /* Consider __builtin_sqrt equal to sqrt.  */
3450       return (TREE_CODE (arg0) == FUNCTION_DECL
3451               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3452               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3453               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3454
3455     default:
3456       return 0;
3457     }
3458
3459 #undef OP_SAME
3460 #undef OP_SAME_WITH_NULL
3461 }
3462 \f
3463 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3464    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3465
3466    When in doubt, return 0.  */
3467
3468 static int
3469 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3470 {
3471   int unsignedp1, unsignedpo;
3472   tree primarg0, primarg1, primother;
3473   unsigned int correct_width;
3474
3475   if (operand_equal_p (arg0, arg1, 0))
3476     return 1;
3477
3478   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3479       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3480     return 0;
3481
3482   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3483      and see if the inner values are the same.  This removes any
3484      signedness comparison, which doesn't matter here.  */
3485   primarg0 = arg0, primarg1 = arg1;
3486   STRIP_NOPS (primarg0);
3487   STRIP_NOPS (primarg1);
3488   if (operand_equal_p (primarg0, primarg1, 0))
3489     return 1;
3490
3491   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3492      actual comparison operand, ARG0.
3493
3494      First throw away any conversions to wider types
3495      already present in the operands.  */
3496
3497   primarg1 = get_narrower (arg1, &unsignedp1);
3498   primother = get_narrower (other, &unsignedpo);
3499
3500   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3501   if (unsignedp1 == unsignedpo
3502       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3503       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3504     {
3505       tree type = TREE_TYPE (arg0);
3506
3507       /* Make sure shorter operand is extended the right way
3508          to match the longer operand.  */
3509       primarg1 = fold_convert (signed_or_unsigned_type_for
3510                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3511
3512       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3513         return 1;
3514     }
3515
3516   return 0;
3517 }
3518 \f
3519 /* See if ARG is an expression that is either a comparison or is performing
3520    arithmetic on comparisons.  The comparisons must only be comparing
3521    two different values, which will be stored in *CVAL1 and *CVAL2; if
3522    they are nonzero it means that some operands have already been found.
3523    No variables may be used anywhere else in the expression except in the
3524    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3525    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3526
3527    If this is true, return 1.  Otherwise, return zero.  */
3528
3529 static int
3530 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3531 {
3532   enum tree_code code = TREE_CODE (arg);
3533   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3534
3535   /* We can handle some of the tcc_expression cases here.  */
3536   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3537     tclass = tcc_unary;
3538   else if (tclass == tcc_expression
3539            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3540                || code == COMPOUND_EXPR))
3541     tclass = tcc_binary;
3542
3543   else if (tclass == tcc_expression && code == SAVE_EXPR
3544            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3545     {
3546       /* If we've already found a CVAL1 or CVAL2, this expression is
3547          two complex to handle.  */
3548       if (*cval1 || *cval2)
3549         return 0;
3550
3551       tclass = tcc_unary;
3552       *save_p = 1;
3553     }
3554
3555   switch (tclass)
3556     {
3557     case tcc_unary:
3558       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3559
3560     case tcc_binary:
3561       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3562               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3563                                       cval1, cval2, save_p));
3564
3565     case tcc_constant:
3566       return 1;
3567
3568     case tcc_expression:
3569       if (code == COND_EXPR)
3570         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3571                                      cval1, cval2, save_p)
3572                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3573                                         cval1, cval2, save_p)
3574                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3575                                         cval1, cval2, save_p));
3576       return 0;
3577
3578     case tcc_comparison:
3579       /* First see if we can handle the first operand, then the second.  For
3580          the second operand, we know *CVAL1 can't be zero.  It must be that
3581          one side of the comparison is each of the values; test for the
3582          case where this isn't true by failing if the two operands
3583          are the same.  */
3584
3585       if (operand_equal_p (TREE_OPERAND (arg, 0),
3586                            TREE_OPERAND (arg, 1), 0))
3587         return 0;
3588
3589       if (*cval1 == 0)
3590         *cval1 = TREE_OPERAND (arg, 0);
3591       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3592         ;
3593       else if (*cval2 == 0)
3594         *cval2 = TREE_OPERAND (arg, 0);
3595       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3596         ;
3597       else
3598         return 0;
3599
3600       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3601         ;
3602       else if (*cval2 == 0)
3603         *cval2 = TREE_OPERAND (arg, 1);
3604       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3605         ;
3606       else
3607         return 0;
3608
3609       return 1;
3610
3611     default:
3612       return 0;
3613     }
3614 }
3615 \f
3616 /* ARG is a tree that is known to contain just arithmetic operations and
3617    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3618    any occurrence of OLD0 as an operand of a comparison and likewise for
3619    NEW1 and OLD1.  */
3620
3621 static tree
3622 eval_subst (location_t loc, tree arg, tree old0, tree new0,
3623             tree old1, tree new1)
3624 {
3625   tree type = TREE_TYPE (arg);
3626   enum tree_code code = TREE_CODE (arg);
3627   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3628
3629   /* We can handle some of the tcc_expression cases here.  */
3630   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3631     tclass = tcc_unary;
3632   else if (tclass == tcc_expression
3633            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3634     tclass = tcc_binary;
3635
3636   switch (tclass)
3637     {
3638     case tcc_unary:
3639       return fold_build1_loc (loc, code, type,
3640                           eval_subst (loc, TREE_OPERAND (arg, 0),
3641                                       old0, new0, old1, new1));
3642
3643     case tcc_binary:
3644       return fold_build2_loc (loc, code, type,
3645                           eval_subst (loc, TREE_OPERAND (arg, 0),
3646                                       old0, new0, old1, new1),
3647                           eval_subst (loc, TREE_OPERAND (arg, 1),
3648                                       old0, new0, old1, new1));
3649
3650     case tcc_expression:
3651       switch (code)
3652         {
3653         case SAVE_EXPR:
3654           return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0,
3655                              old1, new1);
3656
3657         case COMPOUND_EXPR:
3658           return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0,
3659                              old1, new1);
3660
3661         case COND_EXPR:
3662           return fold_build3_loc (loc, code, type,
3663                               eval_subst (loc, TREE_OPERAND (arg, 0),
3664                                           old0, new0, old1, new1),
3665                               eval_subst (loc, TREE_OPERAND (arg, 1),
3666                                           old0, new0, old1, new1),
3667                               eval_subst (loc, TREE_OPERAND (arg, 2),
3668                                           old0, new0, old1, new1));
3669         default:
3670           break;
3671         }
3672       /* Fall through - ???  */
3673
3674     case tcc_comparison:
3675       {
3676         tree arg0 = TREE_OPERAND (arg, 0);
3677         tree arg1 = TREE_OPERAND (arg, 1);
3678
3679         /* We need to check both for exact equality and tree equality.  The
3680            former will be true if the operand has a side-effect.  In that
3681            case, we know the operand occurred exactly once.  */
3682
3683         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3684           arg0 = new0;
3685         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3686           arg0 = new1;
3687
3688         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3689           arg1 = new0;
3690         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3691           arg1 = new1;
3692
3693         return fold_build2_loc (loc, code, type, arg0, arg1);
3694       }
3695
3696     default:
3697       return arg;
3698     }
3699 }
3700 \f
3701 /* Return a tree for the case when the result of an expression is RESULT
3702    converted to TYPE and OMITTED was previously an operand of the expression
3703    but is now not needed (e.g., we folded OMITTED * 0).
3704
3705    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3706    the conversion of RESULT to TYPE.  */
3707
3708 tree
3709 omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted)
3710 {
3711   tree t = fold_convert_loc (loc, type, result);
3712
3713   /* If the resulting operand is an empty statement, just return the omitted
3714      statement casted to void. */
3715   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3716     {
3717       t = build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3718       goto omit_one_operand_exit;
3719     }
3720
3721   if (TREE_SIDE_EFFECTS (omitted))
3722     {
3723       t = build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3724       goto omit_one_operand_exit;
3725     }
3726
3727   return non_lvalue_loc (loc, t);
3728
3729  omit_one_operand_exit:
3730   protected_set_expr_location (t, loc);
3731   return t;
3732 }
3733
3734 /* Similar, but call pedantic_non_lvalue instead of non_lvalue.  */
3735
3736 static tree
3737 pedantic_omit_one_operand_loc (location_t loc, tree type, tree result,
3738                                tree omitted)
3739 {
3740   tree t = fold_convert_loc (loc, type, result);
3741
3742   /* If the resulting operand is an empty statement, just return the omitted
3743      statement casted to void. */
3744   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3745     {
3746       t = build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3747       goto pedantic_omit_one_operand_exit;
3748     }
3749
3750   if (TREE_SIDE_EFFECTS (omitted))
3751     {
3752       t = build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3753       goto pedantic_omit_one_operand_exit;
3754     }
3755
3756   return pedantic_non_lvalue_loc (loc, t);
3757
3758  pedantic_omit_one_operand_exit:
3759   protected_set_expr_location (t, loc);
3760   return t;
3761 }
3762
3763 /* Return a tree for the case when the result of an expression is RESULT
3764    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3765    of the expression but are now not needed.
3766
3767    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3768    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3769    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3770    just do the conversion of RESULT to TYPE.  */
3771
3772 tree
3773 omit_two_operands_loc (location_t loc, tree type, tree result,
3774                    tree omitted1, tree omitted2)
3775 {
3776   tree t = fold_convert_loc (loc, type, result);
3777
3778   if (TREE_SIDE_EFFECTS (omitted2))
3779     {
3780       t = build2 (COMPOUND_EXPR, type, omitted2, t);
3781       SET_EXPR_LOCATION (t, loc);
3782     }
3783   if (TREE_SIDE_EFFECTS (omitted1))
3784     {
3785       t = build2 (COMPOUND_EXPR, type, omitted1, t);
3786       SET_EXPR_LOCATION (t, loc);
3787     }
3788
3789   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t;
3790 }
3791
3792 \f
3793 /* Return a simplified tree node for the truth-negation of ARG.  This
3794    never alters ARG itself.  We assume that ARG is an operation that
3795    returns a truth value (0 or 1).
3796
3797    FIXME: one would think we would fold the result, but it causes
3798    problems with the dominator optimizer.  */
3799
3800 tree
3801 fold_truth_not_expr (location_t loc, tree arg)
3802 {
3803   tree t, type = TREE_TYPE (arg);
3804   enum tree_code code = TREE_CODE (arg);
3805   location_t loc1, loc2;
3806
3807   /* If this is a comparison, we can simply invert it, except for
3808      floating-point non-equality comparisons, in which case we just
3809      enclose a TRUTH_NOT_EXPR around what we have.  */
3810
3811   if (TREE_CODE_CLASS (code) == tcc_comparison)
3812     {
3813       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3814       if (FLOAT_TYPE_P (op_type)
3815           && flag_trapping_math
3816           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3817           && code != NE_EXPR && code != EQ_EXPR)
3818         return NULL_TREE;
3819
3820       code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (op_type)));
3821       if (code == ERROR_MARK)
3822         return NULL_TREE;
3823
3824       t = build2 (code, type, TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3825       SET_EXPR_LOCATION (t, loc);
3826       return t;
3827     }
3828
3829   switch (code)
3830     {
3831     case INTEGER_CST:
3832       return constant_boolean_node (integer_zerop (arg), type);
3833
3834     case TRUTH_AND_EXPR:
3835       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3836       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3837       if (loc1 == UNKNOWN_LOCATION)
3838         loc1 = loc;
3839       if (loc2 == UNKNOWN_LOCATION)
3840         loc2 = loc;
3841       t = build2 (TRUTH_OR_EXPR, type,
3842                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3843                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3844       break;
3845
3846     case TRUTH_OR_EXPR:
3847       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3848       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3849       if (loc1 == UNKNOWN_LOCATION)
3850         loc1 = loc;
3851       if (loc2 == UNKNOWN_LOCATION)
3852         loc2 = loc;
3853       t = build2 (TRUTH_AND_EXPR, type,
3854                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3855                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3856       break;
3857
3858     case TRUTH_XOR_EXPR:
3859       /* Here we can invert either operand.  We invert the first operand
3860          unless the second operand is a TRUTH_NOT_EXPR in which case our
3861          result is the XOR of the first operand with the inside of the
3862          negation of the second operand.  */
3863
3864       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3865         t = build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3866                     TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3867       else
3868         t = build2 (TRUTH_XOR_EXPR, type,
3869                     invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)),
3870                     TREE_OPERAND (arg, 1));
3871       break;
3872
3873     case TRUTH_ANDIF_EXPR:
3874       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3875       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3876       if (loc1 == UNKNOWN_LOCATION)
3877         loc1 = loc;
3878       if (loc2 == UNKNOWN_LOCATION)
3879         loc2 = loc;
3880       t = build2 (TRUTH_ORIF_EXPR, type,
3881                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3882                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3883       break;
3884
3885     case TRUTH_ORIF_EXPR:
3886       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3887       loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3888       if (loc1 == UNKNOWN_LOCATION)
3889         loc1 = loc;
3890       if (loc2 == UNKNOWN_LOCATION)
3891         loc2 = loc;
3892       t = build2 (TRUTH_ANDIF_EXPR, type,
3893                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3894                   invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3895       break;
3896
3897     case TRUTH_NOT_EXPR:
3898       return TREE_OPERAND (arg, 0);
3899
3900     case COND_EXPR:
3901       {
3902         tree arg1 = TREE_OPERAND (arg, 1);
3903         tree arg2 = TREE_OPERAND (arg, 2);
3904
3905         loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3906         loc2 = EXPR_LOCATION (TREE_OPERAND (arg, 2));
3907         if (loc1 == UNKNOWN_LOCATION)
3908           loc1 = loc;
3909         if (loc2 == UNKNOWN_LOCATION)
3910           loc2 = loc;
3911
3912         /* A COND_EXPR may have a throw as one operand, which
3913            then has void type.  Just leave void operands
3914            as they are.  */
3915         t = build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3916                     VOID_TYPE_P (TREE_TYPE (arg1))
3917                     ? arg1 : invert_truthvalue_loc (loc1, arg1),
3918                     VOID_TYPE_P (TREE_TYPE (arg2))
3919                     ? arg2 : invert_truthvalue_loc (loc2, arg2));
3920         break;
3921       }
3922
3923     case COMPOUND_EXPR:
3924       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 1));
3925       if (loc1 == UNKNOWN_LOCATION)
3926         loc1 = loc;
3927       t = build2 (COMPOUND_EXPR, type,
3928                   TREE_OPERAND (arg, 0),
3929                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)));
3930       break;
3931
3932     case NON_LVALUE_EXPR:
3933       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3934       if (loc1 == UNKNOWN_LOCATION)
3935         loc1 = loc;
3936       return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0));
3937
3938     CASE_CONVERT:
3939       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3940         {
3941           t = build1 (TRUTH_NOT_EXPR, type, arg);
3942           break;
3943         }
3944
3945       /* ... fall through ...  */
3946
3947     case FLOAT_EXPR:
3948       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3949       if (loc1 == UNKNOWN_LOCATION)
3950         loc1 = loc;
3951       t = build1 (TREE_CODE (arg), type,
3952                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3953       break;
3954
3955     case BIT_AND_EXPR:
3956       if (!integer_onep (TREE_OPERAND (arg, 1)))
3957         return NULL_TREE;
3958       t = build2 (EQ_EXPR, type, arg, build_int_cst (type, 0));
3959       break;
3960
3961     case SAVE_EXPR:
3962       t = build1 (TRUTH_NOT_EXPR, type, arg);
3963       break;
3964
3965     case CLEANUP_POINT_EXPR:
3966       loc1 = EXPR_LOCATION (TREE_OPERAND (arg, 0));
3967       if (loc1 == UNKNOWN_LOCATION)
3968         loc1 = loc;
3969       t = build1 (CLEANUP_POINT_EXPR, type,
3970                   invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3971       break;
3972
3973     default:
3974       t = NULL_TREE;
3975       break;
3976     }
3977
3978   if (t)
3979     SET_EXPR_LOCATION (t, loc);
3980
3981   return t;
3982 }
3983
3984 /* Return a simplified tree node for the truth-negation of ARG.  This
3985    never alters ARG itself.  We assume that ARG is an operation that
3986    returns a truth value (0 or 1).
3987
3988    FIXME: one would think we would fold the result, but it causes
3989    problems with the dominator optimizer.  */
3990
3991 tree
3992 invert_truthvalue_loc (location_t loc, tree arg)
3993 {
3994   tree tem;
3995
3996   if (TREE_CODE (arg) == ERROR_MARK)
3997     return arg;
3998
3999   tem = fold_truth_not_expr (loc, arg);
4000   if (!tem)
4001     {
4002       tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
4003       SET_EXPR_LOCATION (tem, loc);
4004     }
4005
4006   return tem;
4007 }
4008
4009 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
4010    operands are another bit-wise operation with a common input.  If so,
4011    distribute the bit operations to save an operation and possibly two if
4012    constants are involved.  For example, convert
4013         (A | B) & (A | C) into A | (B & C)
4014    Further simplification will occur if B and C are constants.
4015
4016    If this optimization cannot be done, 0 will be returned.  */
4017
4018 static tree
4019 distribute_bit_expr (location_t loc, enum tree_code code, tree type,
4020                      tree arg0, tree arg1)
4021 {
4022   tree common;
4023   tree left, right;
4024
4025   if (TREE_CODE (arg0) != TREE_CODE (arg1)
4026       || TREE_CODE (arg0) == code
4027       || (TREE_CODE (arg0) != BIT_AND_EXPR
4028           && TREE_CODE (arg0) != BIT_IOR_EXPR))
4029     return 0;
4030
4031   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
4032     {
4033       common = TREE_OPERAND (arg0, 0);
4034       left = TREE_OPERAND (arg0, 1);
4035       right = TREE_OPERAND (arg1, 1);
4036     }
4037   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
4038     {
4039       common = TREE_OPERAND (arg0, 0);
4040       left = TREE_OPERAND (arg0, 1);
4041       right = TREE_OPERAND (arg1, 0);
4042     }
4043   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
4044     {
4045       common = TREE_OPERAND (arg0, 1);
4046       left = TREE_OPERAND (arg0, 0);
4047       right = TREE_OPERAND (arg1, 1);
4048     }
4049   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
4050     {
4051       common = TREE_OPERAND (arg0, 1);
4052       left = TREE_OPERAND (arg0, 0);
4053       right = TREE_OPERAND (arg1, 0);
4054     }
4055   else
4056     return 0;
4057
4058   common = fold_convert_loc (loc, type, common);
4059   left = fold_convert_loc (loc, type, left);
4060   right = fold_convert_loc (loc, type, right);
4061   return fold_build2_loc (loc, TREE_CODE (arg0), type, common,
4062                       fold_build2_loc (loc, code, type, left, right));
4063 }
4064
4065 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
4066    with code CODE.  This optimization is unsafe.  */
4067 static tree
4068 distribute_real_division (location_t loc, enum tree_code code, tree type,
4069                           tree arg0, tree arg1)
4070 {
4071   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
4072   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
4073
4074   /* (A / C) +- (B / C) -> (A +- B) / C.  */
4075   if (mul0 == mul1
4076       && operand_equal_p (TREE_OPERAND (arg0, 1),
4077                        TREE_OPERAND (arg1, 1), 0))
4078     return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type,
4079                         fold_build2_loc (loc, code, type,
4080                                      TREE_OPERAND (arg0, 0),
4081                                      TREE_OPERAND (arg1, 0)),
4082                         TREE_OPERAND (arg0, 1));
4083
4084   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
4085   if (operand_equal_p (TREE_OPERAND (arg0, 0),
4086                        TREE_OPERAND (arg1, 0), 0)
4087       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
4088       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
4089     {
4090       REAL_VALUE_TYPE r0, r1;
4091       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
4092       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
4093       if (!mul0)
4094         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
4095       if (!mul1)
4096         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
4097       real_arithmetic (&r0, code, &r0, &r1);
4098       return fold_build2_loc (loc, MULT_EXPR, type,
4099                           TREE_OPERAND (arg0, 0),
4100                           build_real (type, r0));
4101     }
4102
4103   return NULL_TREE;
4104 }
4105 \f
4106 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
4107    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
4108
4109 static tree
4110 make_bit_field_ref (location_t loc, tree inner, tree type,
4111                     HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp)
4112 {
4113   tree result, bftype;
4114
4115   if (bitpos == 0)
4116     {
4117       tree size = TYPE_SIZE (TREE_TYPE (inner));
4118       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
4119            || POINTER_TYPE_P (TREE_TYPE (inner)))
4120           && host_integerp (size, 0)
4121           && tree_low_cst (size, 0) == bitsize)
4122         return fold_convert_loc (loc, type, inner);
4123     }
4124
4125   bftype = type;
4126   if (TYPE_PRECISION (bftype) != bitsize
4127       || TYPE_UNSIGNED (bftype) == !unsignedp)
4128     bftype = build_nonstandard_integer_type (bitsize, 0);
4129
4130   result = build3 (BIT_FIELD_REF, bftype, inner,
4131                    size_int (bitsize), bitsize_int (bitpos));
4132   SET_EXPR_LOCATION (result, loc);
4133
4134   if (bftype != type)
4135     result = fold_convert_loc (loc, type, result);
4136
4137   return result;
4138 }
4139
4140 /* Optimize a bit-field compare.
4141
4142    There are two cases:  First is a compare against a constant and the
4143    second is a comparison of two items where the fields are at the same
4144    bit position relative to the start of a chunk (byte, halfword, word)
4145    large enough to contain it.  In these cases we can avoid the shift
4146    implicit in bitfield extractions.
4147
4148    For constants, we emit a compare of the shifted constant with the
4149    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
4150    compared.  For two fields at the same position, we do the ANDs with the
4151    similar mask and compare the result of the ANDs.
4152
4153    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
4154    COMPARE_TYPE is the type of the comparison, and LHS and RHS
4155    are the left and right operands of the comparison, respectively.
4156
4157    If the optimization described above can be done, we return the resulting
4158    tree.  Otherwise we return zero.  */
4159
4160 static tree
4161 optimize_bit_field_compare (location_t loc, enum tree_code code,
4162                             tree compare_type, tree lhs, tree rhs)
4163 {
4164   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
4165   tree type = TREE_TYPE (lhs);
4166   tree signed_type, unsigned_type;
4167   int const_p = TREE_CODE (rhs) == INTEGER_CST;
4168   enum machine_mode lmode, rmode, nmode;
4169   int lunsignedp, runsignedp;
4170   int lvolatilep = 0, rvolatilep = 0;
4171   tree linner, rinner = NULL_TREE;
4172   tree mask;
4173   tree offset;
4174
4175   /* Get all the information about the extractions being done.  If the bit size
4176      if the same as the size of the underlying object, we aren't doing an
4177      extraction at all and so can do nothing.  We also don't want to
4178      do anything if the inner expression is a PLACEHOLDER_EXPR since we
4179      then will no longer be able to replace it.  */
4180   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
4181                                 &lunsignedp, &lvolatilep, false);
4182   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
4183       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
4184     return 0;
4185
4186  if (!const_p)
4187    {
4188      /* If this is not a constant, we can only do something if bit positions,
4189         sizes, and signedness are the same.  */
4190      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
4191                                    &runsignedp, &rvolatilep, false);
4192
4193      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
4194          || lunsignedp != runsignedp || offset != 0
4195          || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
4196        return 0;
4197    }
4198
4199   /* See if we can find a mode to refer to this field.  We should be able to,
4200      but fail if we can't.  */
4201   nmode = get_best_mode (lbitsize, lbitpos,
4202                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
4203                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
4204                                 TYPE_ALIGN (TREE_TYPE (rinner))),
4205                          word_mode, lvolatilep || rvolatilep);
4206   if (nmode == VOIDmode)
4207     return 0;
4208
4209   /* Set signed and unsigned types of the precision of this mode for the
4210      shifts below.  */
4211   signed_type = lang_hooks.types.type_for_mode (nmode, 0);
4212   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
4213
4214   /* Compute the bit position and size for the new reference and our offset
4215      within it. If the new reference is the same size as the original, we
4216      won't optimize anything, so return zero.  */
4217   nbitsize = GET_MODE_BITSIZE (nmode);
4218   nbitpos = lbitpos & ~ (nbitsize - 1);
4219   lbitpos -= nbitpos;
4220   if (nbitsize == lbitsize)
4221     return 0;
4222
4223   if (BYTES_BIG_ENDIAN)
4224     lbitpos = nbitsize - lbitsize - lbitpos;
4225
4226   /* Make the mask to be used against the extracted field.  */
4227   mask = build_int_cst_type (unsigned_type, -1);
4228   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
4229   mask = const_binop (RSHIFT_EXPR, mask,
4230                       size_int (nbitsize - lbitsize - lbitpos), 0);
4231
4232   if (! const_p)
4233     /* If not comparing with constant, just rework the comparison
4234        and return.  */
4235     return fold_build2_loc (loc, code, compare_type,
4236                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4237                                      make_bit_field_ref (loc, linner,
4238                                                          unsigned_type,
4239                                                          nbitsize, nbitpos,
4240                                                          1),
4241                                      mask),
4242                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4243                                      make_bit_field_ref (loc, rinner,
4244                                                          unsigned_type,
4245                                                          nbitsize, nbitpos,
4246                                                          1),
4247                                      mask));
4248
4249   /* Otherwise, we are handling the constant case. See if the constant is too
4250      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
4251      this not only for its own sake, but to avoid having to test for this
4252      error case below.  If we didn't, we might generate wrong code.
4253
4254      For unsigned fields, the constant shifted right by the field length should
4255      be all zero.  For signed fields, the high-order bits should agree with
4256      the sign bit.  */
4257
4258   if (lunsignedp)
4259     {
4260       if (! integer_zerop (const_binop (RSHIFT_EXPR,
4261                                         fold_convert_loc (loc,
4262                                                           unsigned_type, rhs),
4263                                         size_int (lbitsize), 0)))
4264         {
4265           warning (0, "comparison is always %d due to width of bit-field",
4266                    code == NE_EXPR);
4267           return constant_boolean_node (code == NE_EXPR, compare_type);
4268         }
4269     }
4270   else
4271     {
4272       tree tem = const_binop (RSHIFT_EXPR,
4273                               fold_convert_loc (loc, signed_type, rhs),
4274                               size_int (lbitsize - 1), 0);
4275       if (! integer_zerop (tem) && ! integer_all_onesp (tem))
4276         {
4277           warning (0, "comparison is always %d due to width of bit-field",
4278                    code == NE_EXPR);
4279           return constant_boolean_node (code == NE_EXPR, compare_type);
4280         }
4281     }
4282
4283   /* Single-bit compares should always be against zero.  */
4284   if (lbitsize == 1 && ! integer_zerop (rhs))
4285     {
4286       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
4287       rhs = build_int_cst (type, 0);
4288     }
4289
4290   /* Make a new bitfield reference, shift the constant over the
4291      appropriate number of bits and mask it with the computed mask
4292      (in case this was a signed field).  If we changed it, make a new one.  */
4293   lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1);
4294   if (lvolatilep)
4295     {
4296       TREE_SIDE_EFFECTS (lhs) = 1;
4297       TREE_THIS_VOLATILE (lhs) = 1;
4298     }
4299
4300   rhs = const_binop (BIT_AND_EXPR,
4301                      const_binop (LSHIFT_EXPR,
4302                                   fold_convert_loc (loc, unsigned_type, rhs),
4303                                   size_int (lbitpos), 0),
4304                      mask, 0);
4305
4306   lhs = build2 (code, compare_type,
4307                 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
4308                 rhs);
4309   SET_EXPR_LOCATION (lhs, loc);
4310   return lhs;
4311 }
4312 \f
4313 /* Subroutine for fold_truthop: decode a field reference.
4314
4315    If EXP is a comparison reference, we return the innermost reference.
4316
4317    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
4318    set to the starting bit number.
4319
4320    If the innermost field can be completely contained in a mode-sized
4321    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
4322
4323    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
4324    otherwise it is not changed.
4325
4326    *PUNSIGNEDP is set to the signedness of the field.
4327
4328    *PMASK is set to the mask used.  This is either contained in a
4329    BIT_AND_EXPR or derived from the width of the field.
4330
4331    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
4332
4333    Return 0 if this is not a component reference or is one that we can't
4334    do anything with.  */
4335
4336 static tree
4337 decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
4338                         HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
4339                         int *punsignedp, int *pvolatilep,
4340                         tree *pmask, tree *pand_mask)
4341 {
4342   tree outer_type = 0;
4343   tree and_mask = 0;
4344   tree mask, inner, offset;
4345   tree unsigned_type;
4346   unsigned int precision;
4347
4348   /* All the optimizations using this function assume integer fields.
4349      There are problems with FP fields since the type_for_size call
4350      below can fail for, e.g., XFmode.  */
4351   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
4352     return 0;
4353
4354   /* We are interested in the bare arrangement of bits, so strip everything
4355      that doesn't affect the machine mode.  However, record the type of the
4356      outermost expression if it may matter below.  */
4357   if (CONVERT_EXPR_P (exp)
4358       || TREE_CODE (exp) == NON_LVALUE_EXPR)
4359     outer_type = TREE_TYPE (exp);
4360   STRIP_NOPS (exp);
4361
4362   if (TREE_CODE (exp) == BIT_AND_EXPR)
4363     {
4364       and_mask = TREE_OPERAND (exp, 1);
4365       exp = TREE_OPERAND (exp, 0);
4366       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
4367       if (TREE_CODE (and_mask) != INTEGER_CST)
4368         return 0;
4369     }
4370
4371   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
4372                                punsignedp, pvolatilep, false);
4373   if ((inner == exp && and_mask == 0)
4374       || *pbitsize < 0 || offset != 0
4375       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
4376     return 0;
4377
4378   /* If the number of bits in the reference is the same as the bitsize of
4379      the outer type, then the outer type gives the signedness. Otherwise
4380      (in case of a small bitfield) the signedness is unchanged.  */
4381   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
4382     *punsignedp = TYPE_UNSIGNED (outer_type);
4383
4384   /* Compute the mask to access the bitfield.  */
4385   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
4386   precision = TYPE_PRECISION (unsigned_type);
4387
4388   mask = build_int_cst_type (unsigned_type, -1);
4389
4390   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4391   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
4392
4393   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
4394   if (and_mask != 0)
4395     mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
4396                         fold_convert_loc (loc, unsigned_type, and_mask), mask);
4397
4398   *pmask = mask;
4399   *pand_mask = and_mask;
4400   return inner;
4401 }
4402
4403 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
4404    bit positions.  */
4405
4406 static int
4407 all_ones_mask_p (const_tree mask, int size)
4408 {
4409   tree type = TREE_TYPE (mask);
4410   unsigned int precision = TYPE_PRECISION (type);
4411   tree tmask;
4412
4413   tmask = build_int_cst_type (signed_type_for (type), -1);
4414
4415   return
4416     tree_int_cst_equal (mask,
4417                         const_binop (RSHIFT_EXPR,
4418                                      const_binop (LSHIFT_EXPR, tmask,
4419                                                   size_int (precision - size),
4420                                                   0),
4421                                      size_int (precision - size), 0));
4422 }
4423
4424 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
4425    represents the sign bit of EXP's type.  If EXP represents a sign
4426    or zero extension, also test VAL against the unextended type.
4427    The return value is the (sub)expression whose sign bit is VAL,
4428    or NULL_TREE otherwise.  */
4429
4430 static tree
4431 sign_bit_p (tree exp, const_tree val)
4432 {
4433   unsigned HOST_WIDE_INT mask_lo, lo;
4434   HOST_WIDE_INT mask_hi, hi;
4435   int width;
4436   tree t;
4437
4438   /* Tree EXP must have an integral type.  */
4439   t = TREE_TYPE (exp);
4440   if (! INTEGRAL_TYPE_P (t))
4441     return NULL_TREE;
4442
4443   /* Tree VAL must be an integer constant.  */
4444   if (TREE_CODE (val) != INTEGER_CST
4445       || TREE_OVERFLOW (val))
4446     return NULL_TREE;
4447
4448   width = TYPE_PRECISION (t);
4449   if (width > HOST_BITS_PER_WIDE_INT)
4450     {
4451       hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
4452       lo = 0;
4453
4454       mask_hi = ((unsigned HOST_WIDE_INT) -1
4455                  >> (2 * HOST_BITS_PER_WIDE_INT - width));
4456       mask_lo = -1;
4457     }
4458   else
4459     {
4460       hi = 0;
4461       lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
4462
4463       mask_hi = 0;
4464       mask_lo = ((unsigned HOST_WIDE_INT) -1
4465                  >> (HOST_BITS_PER_WIDE_INT - width));
4466     }
4467
4468   /* We mask off those bits beyond TREE_TYPE (exp) so that we can
4469      treat VAL as if it were unsigned.  */
4470   if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
4471       && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
4472     return exp;
4473
4474   /* Handle extension from a narrower type.  */
4475   if (TREE_CODE (exp) == NOP_EXPR
4476       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4477     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4478
4479   return NULL_TREE;
4480 }
4481
4482 /* Subroutine for fold_truthop: determine if an operand is simple enough
4483    to be evaluated unconditionally.  */
4484
4485 static int
4486 simple_operand_p (const_tree exp)
4487 {
4488   /* Strip any conversions that don't change the machine mode.  */
4489   STRIP_NOPS (exp);
4490
4491   return (CONSTANT_CLASS_P (exp)
4492           || TREE_CODE (exp) == SSA_NAME
4493           || (DECL_P (exp)
4494               && ! TREE_ADDRESSABLE (exp)
4495               && ! TREE_THIS_VOLATILE (exp)
4496               && ! DECL_NONLOCAL (exp)
4497               /* Don't regard global variables as simple.  They may be
4498                  allocated in ways unknown to the compiler (shared memory,
4499                  #pragma weak, etc).  */
4500               && ! TREE_PUBLIC (exp)
4501               && ! DECL_EXTERNAL (exp)
4502               /* Loading a static variable is unduly expensive, but global
4503                  registers aren't expensive.  */
4504               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4505 }
4506 \f
4507 /* The following functions are subroutines to fold_range_test and allow it to
4508    try to change a logical combination of comparisons into a range test.
4509
4510    For example, both
4511         X == 2 || X == 3 || X == 4 || X == 5
4512    and
4513         X >= 2 && X <= 5
4514    are converted to
4515         (unsigned) (X - 2) <= 3
4516
4517    We describe each set of comparisons as being either inside or outside
4518    a range, using a variable named like IN_P, and then describe the
4519    range with a lower and upper bound.  If one of the bounds is omitted,
4520    it represents either the highest or lowest value of the type.
4521
4522    In the comments below, we represent a range by two numbers in brackets
4523    preceded by a "+" to designate being inside that range, or a "-" to
4524    designate being outside that range, so the condition can be inverted by
4525    flipping the prefix.  An omitted bound is represented by a "-".  For
4526    example, "- [-, 10]" means being outside the range starting at the lowest
4527    possible value and ending at 10, in other words, being greater than 10.
4528    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4529    always false.
4530
4531    We set up things so that the missing bounds are handled in a consistent
4532    manner so neither a missing bound nor "true" and "false" need to be
4533    handled using a special case.  */
4534
4535 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4536    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4537    and UPPER1_P are nonzero if the respective argument is an upper bound
4538    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4539    must be specified for a comparison.  ARG1 will be converted to ARG0's
4540    type if both are specified.  */
4541
4542 static tree
4543 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4544              tree arg1, int upper1_p)
4545 {
4546   tree tem;
4547   int result;
4548   int sgn0, sgn1;
4549
4550   /* If neither arg represents infinity, do the normal operation.
4551      Else, if not a comparison, return infinity.  Else handle the special
4552      comparison rules. Note that most of the cases below won't occur, but
4553      are handled for consistency.  */
4554
4555   if (arg0 != 0 && arg1 != 0)
4556     {
4557       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4558                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4559       STRIP_NOPS (tem);
4560       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4561     }
4562
4563   if (TREE_CODE_CLASS (code) != tcc_comparison)
4564     return 0;
4565
4566   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4567      for neither.  In real maths, we cannot assume open ended ranges are
4568      the same. But, this is computer arithmetic, where numbers are finite.
4569      We can therefore make the transformation of any unbounded range with
4570      the value Z, Z being greater than any representable number. This permits
4571      us to treat unbounded ranges as equal.  */
4572   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4573   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4574   switch (code)
4575     {
4576     case EQ_EXPR:
4577       result = sgn0 == sgn1;
4578       break;
4579     case NE_EXPR:
4580       result = sgn0 != sgn1;
4581       break;
4582     case LT_EXPR:
4583       result = sgn0 < sgn1;
4584       break;
4585     case LE_EXPR:
4586       result = sgn0 <= sgn1;
4587       break;
4588     case GT_EXPR:
4589       result = sgn0 > sgn1;
4590       break;
4591     case GE_EXPR:
4592       result = sgn0 >= sgn1;
4593       break;
4594     default:
4595       gcc_unreachable ();
4596     }
4597
4598   return constant_boolean_node (result, type);
4599 }
4600 \f
4601 /* Given EXP, a logical expression, set the range it is testing into
4602    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4603    actually being tested.  *PLOW and *PHIGH will be made of the same
4604    type as the returned expression.  If EXP is not a comparison, we
4605    will most likely not be returning a useful value and range.  Set
4606    *STRICT_OVERFLOW_P to true if the return value is only valid
4607    because signed overflow is undefined; otherwise, do not change
4608    *STRICT_OVERFLOW_P.  */
4609
4610 tree
4611 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4612             bool *strict_overflow_p)
4613 {
4614   enum tree_code code;
4615   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4616   tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4617   int in_p, n_in_p;
4618   tree low, high, n_low, n_high;
4619   location_t loc = EXPR_LOCATION (exp);
4620
4621   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4622      and see if we can refine the range.  Some of the cases below may not
4623      happen, but it doesn't seem worth worrying about this.  We "continue"
4624      the outer loop when we've changed something; otherwise we "break"
4625      the switch, which will "break" the while.  */
4626
4627   in_p = 0;
4628   low = high = build_int_cst (TREE_TYPE (exp), 0);
4629
4630   while (1)
4631     {
4632       code = TREE_CODE (exp);
4633       exp_type = TREE_TYPE (exp);
4634
4635       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4636         {
4637           if (TREE_OPERAND_LENGTH (exp) > 0)
4638             arg0 = TREE_OPERAND (exp, 0);
4639           if (TREE_CODE_CLASS (code) == tcc_comparison
4640               || TREE_CODE_CLASS (code) == tcc_unary
4641               || TREE_CODE_CLASS (code) == tcc_binary)
4642             arg0_type = TREE_TYPE (arg0);
4643           if (TREE_CODE_CLASS (code) == tcc_binary
4644               || TREE_CODE_CLASS (code) == tcc_comparison
4645               || (TREE_CODE_CLASS (code) == tcc_expression
4646                   && TREE_OPERAND_LENGTH (exp) > 1))
4647             arg1 = TREE_OPERAND (exp, 1);
4648         }
4649
4650       switch (code)
4651         {
4652         case TRUTH_NOT_EXPR:
4653           in_p = ! in_p, exp = arg0;
4654           continue;
4655
4656         case EQ_EXPR: case NE_EXPR:
4657         case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4658           /* We can only do something if the range is testing for zero
4659              and if the second operand is an integer constant.  Note that
4660              saying something is "in" the range we make is done by
4661              complementing IN_P since it will set in the initial case of
4662              being not equal to zero; "out" is leaving it alone.  */
4663           if (low == 0 || high == 0
4664               || ! integer_zerop (low) || ! integer_zerop (high)
4665               || TREE_CODE (arg1) != INTEGER_CST)
4666             break;
4667
4668           switch (code)
4669             {
4670             case NE_EXPR:  /* - [c, c]  */
4671               low = high = arg1;
4672               break;
4673             case EQ_EXPR:  /* + [c, c]  */
4674               in_p = ! in_p, low = high = arg1;
4675               break;
4676             case GT_EXPR:  /* - [-, c] */
4677               low = 0, high = arg1;
4678               break;
4679             case GE_EXPR:  /* + [c, -] */
4680               in_p = ! in_p, low = arg1, high = 0;
4681               break;
4682             case LT_EXPR:  /* - [c, -] */
4683               low = arg1, high = 0;
4684               break;
4685             case LE_EXPR:  /* + [-, c] */
4686               in_p = ! in_p, low = 0, high = arg1;
4687               break;
4688             default:
4689               gcc_unreachable ();
4690             }
4691
4692           /* If this is an unsigned comparison, we also know that EXP is
4693              greater than or equal to zero.  We base the range tests we make
4694              on that fact, so we record it here so we can parse existing
4695              range tests.  We test arg0_type since often the return type
4696              of, e.g. EQ_EXPR, is boolean.  */
4697           if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4698             {
4699               if (! merge_ranges (&n_in_p, &n_low, &n_high,
4700                                   in_p, low, high, 1,
4701                                   build_int_cst (arg0_type, 0),
4702                                   NULL_TREE))
4703                 break;
4704
4705               in_p = n_in_p, low = n_low, high = n_high;
4706
4707               /* If the high bound is missing, but we have a nonzero low
4708                  bound, reverse the range so it goes from zero to the low bound
4709                  minus 1.  */
4710               if (high == 0 && low && ! integer_zerop (low))
4711                 {
4712                   in_p = ! in_p;
4713                   high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4714                                       integer_one_node, 0);
4715                   low = build_int_cst (arg0_type, 0);
4716                 }
4717             }
4718
4719           exp = arg0;
4720           continue;
4721
4722         case NEGATE_EXPR:
4723           /* (-x) IN [a,b] -> x in [-b, -a]  */
4724           n_low = range_binop (MINUS_EXPR, exp_type,
4725                                build_int_cst (exp_type, 0),
4726                                0, high, 1);
4727           n_high = range_binop (MINUS_EXPR, exp_type,
4728                                 build_int_cst (exp_type, 0),
4729                                 0, low, 0);
4730           low = n_low, high = n_high;
4731           exp = arg0;
4732           continue;
4733
4734         case BIT_NOT_EXPR:
4735           /* ~ X -> -X - 1  */
4736           exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4737                         build_int_cst (exp_type, 1));
4738           SET_EXPR_LOCATION (exp, loc);
4739           continue;
4740
4741         case PLUS_EXPR:  case MINUS_EXPR:
4742           if (TREE_CODE (arg1) != INTEGER_CST)
4743             break;
4744
4745           /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4746              move a constant to the other side.  */
4747           if (!TYPE_UNSIGNED (arg0_type)
4748               && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4749             break;
4750
4751           /* If EXP is signed, any overflow in the computation is undefined,
4752              so we don't worry about it so long as our computations on
4753              the bounds don't overflow.  For unsigned, overflow is defined
4754              and this is exactly the right thing.  */
4755           n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4756                                arg0_type, low, 0, arg1, 0);
4757           n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4758                                 arg0_type, high, 1, arg1, 0);
4759           if ((n_low != 0 && TREE_OVERFLOW (n_low))
4760               || (n_high != 0 && TREE_OVERFLOW (n_high)))
4761             break;
4762
4763           if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4764             *strict_overflow_p = true;
4765
4766           /* Check for an unsigned range which has wrapped around the maximum
4767              value thus making n_high < n_low, and normalize it.  */
4768           if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4769             {
4770               low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4771                                  integer_one_node, 0);
4772               high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4773                                   integer_one_node, 0);
4774
4775               /* If the range is of the form +/- [ x+1, x ], we won't
4776                  be able to normalize it.  But then, it represents the
4777                  whole range or the empty set, so make it
4778                  +/- [ -, - ].  */
4779               if (tree_int_cst_equal (n_low, low)
4780                   && tree_int_cst_equal (n_high, high))
4781                 low = high = 0;
4782               else
4783                 in_p = ! in_p;
4784             }
4785           else
4786             low = n_low, high = n_high;
4787
4788           exp = arg0;
4789           continue;
4790
4791         CASE_CONVERT: case NON_LVALUE_EXPR:
4792           if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4793             break;
4794
4795           if (! INTEGRAL_TYPE_P (arg0_type)
4796               || (low != 0 && ! int_fits_type_p (low, arg0_type))
4797               || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4798             break;
4799
4800           n_low = low, n_high = high;
4801
4802           if (n_low != 0)
4803             n_low = fold_convert_loc (loc, arg0_type, n_low);
4804
4805           if (n_high != 0)
4806             n_high = fold_convert_loc (loc, arg0_type, n_high);
4807
4808
4809           /* If we're converting arg0 from an unsigned type, to exp,
4810              a signed type,  we will be doing the comparison as unsigned.
4811              The tests above have already verified that LOW and HIGH
4812              are both positive.
4813
4814              So we have to ensure that we will handle large unsigned
4815              values the same way that the current signed bounds treat
4816              negative values.  */
4817
4818           if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4819             {
4820               tree high_positive;
4821               tree equiv_type;
4822               /* For fixed-point modes, we need to pass the saturating flag
4823                  as the 2nd parameter.  */
4824               if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4825                 equiv_type = lang_hooks.types.type_for_mode
4826                              (TYPE_MODE (arg0_type),
4827                               TYPE_SATURATING (arg0_type));
4828               else
4829                 equiv_type = lang_hooks.types.type_for_mode
4830                              (TYPE_MODE (arg0_type), 1);
4831
4832               /* A range without an upper bound is, naturally, unbounded.
4833                  Since convert would have cropped a very large value, use
4834                  the max value for the destination type.  */
4835               high_positive
4836                 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4837                 : TYPE_MAX_VALUE (arg0_type);
4838
4839               if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4840                 high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type,
4841                                              fold_convert_loc (loc, arg0_type,
4842                                                                high_positive),
4843                                              build_int_cst (arg0_type, 1));
4844
4845               /* If the low bound is specified, "and" the range with the
4846                  range for which the original unsigned value will be
4847                  positive.  */
4848               if (low != 0)
4849                 {
4850                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4851                                       1, n_low, n_high, 1,
4852                                       fold_convert_loc (loc, arg0_type,
4853                                                         integer_zero_node),
4854                                       high_positive))
4855                     break;
4856
4857                   in_p = (n_in_p == in_p);
4858                 }
4859               else
4860                 {
4861                   /* Otherwise, "or" the range with the range of the input
4862                      that will be interpreted as negative.  */
4863                   if (! merge_ranges (&n_in_p, &n_low, &n_high,
4864                                       0, n_low, n_high, 1,
4865                                       fold_convert_loc (loc, arg0_type,
4866                                                         integer_zero_node),
4867                                       high_positive))
4868                     break;
4869
4870                   in_p = (in_p != n_in_p);
4871                 }
4872             }
4873
4874           exp = arg0;
4875           low = n_low, high = n_high;
4876           continue;
4877
4878         default:
4879           break;
4880         }
4881
4882       break;
4883     }
4884
4885   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4886   if (TREE_CODE (exp) == INTEGER_CST)
4887     {
4888       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4889                                                  exp, 0, low, 0))
4890                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4891                                                     exp, 1, high, 1)));
4892       low = high = 0;
4893       exp = 0;
4894     }
4895
4896   *pin_p = in_p, *plow = low, *phigh = high;
4897   return exp;
4898 }
4899 \f
4900 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4901    type, TYPE, return an expression to test if EXP is in (or out of, depending
4902    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4903
4904 tree
4905 build_range_check (location_t loc, tree type, tree exp, int in_p,
4906                    tree low, tree high)
4907 {
4908   tree etype = TREE_TYPE (exp), value;
4909
4910 #ifdef HAVE_canonicalize_funcptr_for_compare
4911   /* Disable this optimization for function pointer expressions
4912      on targets that require function pointer canonicalization.  */
4913   if (HAVE_canonicalize_funcptr_for_compare
4914       && TREE_CODE (etype) == POINTER_TYPE
4915       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4916     return NULL_TREE;
4917 #endif
4918
4919   if (! in_p)
4920     {
4921       value = build_range_check (loc, type, exp, 1, low, high);
4922       if (value != 0)
4923         return invert_truthvalue_loc (loc, value);
4924
4925       return 0;
4926     }
4927
4928   if (low == 0 && high == 0)
4929     return build_int_cst (type, 1);
4930
4931   if (low == 0)
4932     return fold_build2_loc (loc, LE_EXPR, type, exp,
4933                         fold_convert_loc (loc, etype, high));
4934
4935   if (high == 0)
4936     return fold_build2_loc (loc, GE_EXPR, type, exp,
4937                         fold_convert_loc (loc, etype, low));
4938
4939   if (operand_equal_p (low, high, 0))
4940     return fold_build2_loc (loc, EQ_EXPR, type, exp,
4941                         fold_convert_loc (loc, etype, low));
4942
4943   if (integer_zerop (low))
4944     {
4945       if (! TYPE_UNSIGNED (etype))
4946         {
4947           etype = unsigned_type_for (etype);
4948           high = fold_convert_loc (loc, etype, high);
4949           exp = fold_convert_loc (loc, etype, exp);
4950         }
4951       return build_range_check (loc, type, exp, 1, 0, high);
4952     }
4953
4954   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4955   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4956     {
4957       unsigned HOST_WIDE_INT lo;
4958       HOST_WIDE_INT hi;
4959       int prec;
4960
4961       prec = TYPE_PRECISION (etype);
4962       if (prec <= HOST_BITS_PER_WIDE_INT)
4963         {
4964           hi = 0;
4965           lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4966         }
4967       else
4968         {
4969           hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4970           lo = (unsigned HOST_WIDE_INT) -1;
4971         }
4972
4973       if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4974         {
4975           if (TYPE_UNSIGNED (etype))
4976             {
4977               tree signed_etype = signed_type_for (etype);
4978               if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4979                 etype
4980                   = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4981               else
4982                 etype = signed_etype;
4983               exp = fold_convert_loc (loc, etype, exp);
4984             }
4985           return fold_build2_loc (loc, GT_EXPR, type, exp,
4986                               build_int_cst (etype, 0));
4987         }
4988     }
4989
4990   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4991      This requires wrap-around arithmetics for the type of the expression.
4992      First make sure that arithmetics in this type is valid, then make sure
4993      that it wraps around.  */
4994   if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE)
4995     etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4996                                             TYPE_UNSIGNED (etype));
4997
4998   if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype))
4999     {
5000       tree utype, minv, maxv;
5001
5002       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
5003          for the type in question, as we rely on this here.  */
5004       utype = unsigned_type_for (etype);
5005       maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype));
5006       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
5007                           integer_one_node, 1);
5008       minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype));
5009
5010       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
5011                                       minv, 1, maxv, 1)))
5012         etype = utype;
5013       else
5014         return 0;
5015     }
5016
5017   high = fold_convert_loc (loc, etype, high);
5018   low = fold_convert_loc (loc, etype, low);
5019   exp = fold_convert_loc (loc, etype, exp);
5020
5021   value = const_binop (MINUS_EXPR, high, low, 0);
5022
5023
5024   if (POINTER_TYPE_P (etype))
5025     {
5026       if (value != 0 && !TREE_OVERFLOW (value))
5027         {
5028           low = fold_convert_loc (loc, sizetype, low);
5029           low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
5030           return build_range_check (loc, type,
5031                                     fold_build2_loc (loc, POINTER_PLUS_EXPR,
5032                                                  etype, exp, low),
5033                                     1, build_int_cst (etype, 0), value);
5034         }
5035       return 0;
5036     }
5037
5038   if (value != 0 && !TREE_OVERFLOW (value))
5039     return build_range_check (loc, type,
5040                               fold_build2_loc (loc, MINUS_EXPR, etype, exp, low),
5041                               1, build_int_cst (etype, 0), value);
5042
5043   return 0;
5044 }
5045 \f
5046 /* Return the predecessor of VAL in its type, handling the infinite case.  */
5047
5048 static tree
5049 range_predecessor (tree val)
5050 {
5051   tree type = TREE_TYPE (val);
5052
5053   if (INTEGRAL_TYPE_P (type)
5054       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
5055     return 0;
5056   else
5057     return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
5058 }
5059
5060 /* Return the successor of VAL in its type, handling the infinite case.  */
5061
5062 static tree
5063 range_successor (tree val)
5064 {
5065   tree type = TREE_TYPE (val);
5066
5067   if (INTEGRAL_TYPE_P (type)
5068       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
5069     return 0;
5070   else
5071     return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
5072 }
5073
5074 /* Given two ranges, see if we can merge them into one.  Return 1 if we
5075    can, 0 if we can't.  Set the output range into the specified parameters.  */
5076
5077 bool
5078 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
5079               tree high0, int in1_p, tree low1, tree high1)
5080 {
5081   int no_overlap;
5082   int subset;
5083   int temp;
5084   tree tem;
5085   int in_p;
5086   tree low, high;
5087   int lowequal = ((low0 == 0 && low1 == 0)
5088                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
5089                                                 low0, 0, low1, 0)));
5090   int highequal = ((high0 == 0 && high1 == 0)
5091                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
5092                                                  high0, 1, high1, 1)));
5093
5094   /* Make range 0 be the range that starts first, or ends last if they
5095      start at the same value.  Swap them if it isn't.  */
5096   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
5097                                  low0, 0, low1, 0))
5098       || (lowequal
5099           && integer_onep (range_binop (GT_EXPR, integer_type_node,
5100                                         high1, 1, high0, 1))))
5101     {
5102       temp = in0_p, in0_p = in1_p, in1_p = temp;
5103       tem = low0, low0 = low1, low1 = tem;
5104       tem = high0, high0 = high1, high1 = tem;
5105     }
5106
5107   /* Now flag two cases, whether the ranges are disjoint or whether the
5108      second range is totally subsumed in the first.  Note that the tests
5109      below are simplified by the ones above.  */
5110   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
5111                                           high0, 1, low1, 0));
5112   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
5113                                       high1, 1, high0, 1));
5114
5115   /* We now have four cases, depending on whether we are including or
5116      excluding the two ranges.  */
5117   if (in0_p && in1_p)
5118     {
5119       /* If they don't overlap, the result is false.  If the second range
5120          is a subset it is the result.  Otherwise, the range is from the start
5121          of the second to the end of the first.  */
5122       if (no_overlap)
5123         in_p = 0, low = high = 0;
5124       else if (subset)
5125         in_p = 1, low = low1, high = high1;
5126       else
5127         in_p = 1, low = low1, high = high0;
5128     }
5129
5130   else if (in0_p && ! in1_p)
5131     {
5132       /* If they don't overlap, the result is the first range.  If they are
5133          equal, the result is false.  If the second range is a subset of the
5134          first, and the ranges begin at the same place, we go from just after
5135          the end of the second range to the end of the first.  If the second
5136          range is not a subset of the first, or if it is a subset and both
5137          ranges end at the same place, the range starts at the start of the
5138          first range and ends just before the second range.
5139          Otherwise, we can't describe this as a single range.  */
5140       if (no_overlap)
5141         in_p = 1, low = low0, high = high0;
5142       else if (lowequal && highequal)
5143         in_p = 0, low = high = 0;
5144       else if (subset && lowequal)
5145         {
5146           low = range_successor (high1);
5147           high = high0;
5148           in_p = 1;
5149           if (low == 0)
5150             {
5151               /* We are in the weird situation where high0 > high1 but
5152                  high1 has no successor.  Punt.  */
5153               return 0;
5154             }
5155         }
5156       else if (! subset || highequal)
5157         {
5158           low = low0;
5159           high = range_predecessor (low1);
5160           in_p = 1;
5161           if (high == 0)
5162             {
5163               /* low0 < low1 but low1 has no predecessor.  Punt.  */
5164               return 0;
5165             }
5166         }
5167       else
5168         return 0;
5169     }
5170
5171   else if (! in0_p && in1_p)
5172     {
5173       /* If they don't overlap, the result is the second range.  If the second
5174          is a subset of the first, the result is false.  Otherwise,
5175          the range starts just after the first range and ends at the
5176          end of the second.  */
5177       if (no_overlap)
5178         in_p = 1, low = low1, high = high1;
5179       else if (subset || highequal)
5180         in_p = 0, low = high = 0;
5181       else
5182         {
5183           low = range_successor (high0);
5184           high = high1;
5185           in_p = 1;
5186           if (low == 0)
5187             {
5188               /* high1 > high0 but high0 has no successor.  Punt.  */
5189               return 0;
5190             }
5191         }
5192     }
5193
5194   else
5195     {
5196       /* The case where we are excluding both ranges.  Here the complex case
5197          is if they don't overlap.  In that case, the only time we have a
5198          range is if they are adjacent.  If the second is a subset of the
5199          first, the result is the first.  Otherwise, the range to exclude
5200          starts at the beginning of the first range and ends at the end of the
5201          second.  */
5202       if (no_overlap)
5203         {
5204           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
5205                                          range_successor (high0),
5206                                          1, low1, 0)))
5207             in_p = 0, low = low0, high = high1;
5208           else
5209             {
5210               /* Canonicalize - [min, x] into - [-, x].  */
5211               if (low0 && TREE_CODE (low0) == INTEGER_CST)
5212                 switch (TREE_CODE (TREE_TYPE (low0)))
5213                   {
5214                   case ENUMERAL_TYPE:
5215                     if (TYPE_PRECISION (TREE_TYPE (low0))
5216                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
5217                       break;
5218                     /* FALLTHROUGH */
5219                   case INTEGER_TYPE:
5220                     if (tree_int_cst_equal (low0,
5221                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
5222                       low0 = 0;
5223                     break;
5224                   case POINTER_TYPE:
5225                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
5226                         && integer_zerop (low0))
5227                       low0 = 0;
5228                     break;
5229                   default:
5230                     break;
5231                   }
5232
5233               /* Canonicalize - [x, max] into - [x, -].  */
5234               if (high1 && TREE_CODE (high1) == INTEGER_CST)
5235                 switch (TREE_CODE (TREE_TYPE (high1)))
5236                   {
5237                   case ENUMERAL_TYPE:
5238                     if (TYPE_PRECISION (TREE_TYPE (high1))
5239                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
5240                       break;
5241                     /* FALLTHROUGH */
5242                   case INTEGER_TYPE:
5243                     if (tree_int_cst_equal (high1,
5244                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
5245                       high1 = 0;
5246                     break;
5247                   case POINTER_TYPE:
5248                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
5249                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
5250                                                        high1, 1,
5251                                                        integer_one_node, 1)))
5252                       high1 = 0;
5253                     break;
5254                   default:
5255                     break;
5256                   }
5257
5258               /* The ranges might be also adjacent between the maximum and
5259                  minimum values of the given type.  For
5260                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
5261                  return + [x + 1, y - 1].  */
5262               if (low0 == 0 && high1 == 0)
5263                 {
5264                   low = range_successor (high0);
5265                   high = range_predecessor (low1);
5266                   if (low == 0 || high == 0)
5267                     return 0;
5268
5269                   in_p = 1;
5270                 }
5271               else
5272                 return 0;
5273             }
5274         }
5275       else if (subset)
5276         in_p = 0, low = low0, high = high0;
5277       else
5278         in_p = 0, low = low0, high = high1;
5279     }
5280
5281   *pin_p = in_p, *plow = low, *phigh = high;
5282   return 1;
5283 }
5284 \f
5285
5286 /* Subroutine of fold, looking inside expressions of the form
5287    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
5288    of the COND_EXPR.  This function is being used also to optimize
5289    A op B ? C : A, by reversing the comparison first.
5290
5291    Return a folded expression whose code is not a COND_EXPR
5292    anymore, or NULL_TREE if no folding opportunity is found.  */
5293
5294 static tree
5295 fold_cond_expr_with_comparison (location_t loc, tree type,
5296                                 tree arg0, tree arg1, tree arg2)
5297 {
5298   enum tree_code comp_code = TREE_CODE (arg0);
5299   tree arg00 = TREE_OPERAND (arg0, 0);
5300   tree arg01 = TREE_OPERAND (arg0, 1);
5301   tree arg1_type = TREE_TYPE (arg1);
5302   tree tem;
5303
5304   STRIP_NOPS (arg1);
5305   STRIP_NOPS (arg2);
5306
5307   /* If we have A op 0 ? A : -A, consider applying the following
5308      transformations:
5309
5310      A == 0? A : -A    same as -A
5311      A != 0? A : -A    same as A
5312      A >= 0? A : -A    same as abs (A)
5313      A > 0?  A : -A    same as abs (A)
5314      A <= 0? A : -A    same as -abs (A)
5315      A < 0?  A : -A    same as -abs (A)
5316
5317      None of these transformations work for modes with signed
5318      zeros.  If A is +/-0, the first two transformations will
5319      change the sign of the result (from +0 to -0, or vice
5320      versa).  The last four will fix the sign of the result,
5321      even though the original expressions could be positive or
5322      negative, depending on the sign of A.
5323
5324      Note that all these transformations are correct if A is
5325      NaN, since the two alternatives (A and -A) are also NaNs.  */
5326   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5327       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
5328           ? real_zerop (arg01)
5329           : integer_zerop (arg01))
5330       && ((TREE_CODE (arg2) == NEGATE_EXPR
5331            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
5332              /* In the case that A is of the form X-Y, '-A' (arg2) may
5333                 have already been folded to Y-X, check for that. */
5334           || (TREE_CODE (arg1) == MINUS_EXPR
5335               && TREE_CODE (arg2) == MINUS_EXPR
5336               && operand_equal_p (TREE_OPERAND (arg1, 0),
5337                                   TREE_OPERAND (arg2, 1), 0)
5338               && operand_equal_p (TREE_OPERAND (arg1, 1),
5339                                   TREE_OPERAND (arg2, 0), 0))))
5340     switch (comp_code)
5341       {
5342       case EQ_EXPR:
5343       case UNEQ_EXPR:
5344         tem = fold_convert_loc (loc, arg1_type, arg1);
5345         return pedantic_non_lvalue_loc (loc,
5346                                     fold_convert_loc (loc, type,
5347                                                   negate_expr (tem)));
5348       case NE_EXPR:
5349       case LTGT_EXPR:
5350         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5351       case UNGE_EXPR:
5352       case UNGT_EXPR:
5353         if (flag_trapping_math)
5354           break;
5355         /* Fall through.  */
5356       case GE_EXPR:
5357       case GT_EXPR:
5358         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5359           arg1 = fold_convert_loc (loc, signed_type_for
5360                                (TREE_TYPE (arg1)), arg1);
5361         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
5362         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5363       case UNLE_EXPR:
5364       case UNLT_EXPR:
5365         if (flag_trapping_math)
5366           break;
5367       case LE_EXPR:
5368       case LT_EXPR:
5369         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
5370           arg1 = fold_convert_loc (loc, signed_type_for
5371                                (TREE_TYPE (arg1)), arg1);
5372         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
5373         return negate_expr (fold_convert_loc (loc, type, tem));
5374       default:
5375         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5376         break;
5377       }
5378
5379   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
5380      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
5381      both transformations are correct when A is NaN: A != 0
5382      is then true, and A == 0 is false.  */
5383
5384   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5385       && integer_zerop (arg01) && integer_zerop (arg2))
5386     {
5387       if (comp_code == NE_EXPR)
5388         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5389       else if (comp_code == EQ_EXPR)
5390         return build_int_cst (type, 0);
5391     }
5392
5393   /* Try some transformations of A op B ? A : B.
5394
5395      A == B? A : B    same as B
5396      A != B? A : B    same as A
5397      A >= B? A : B    same as max (A, B)
5398      A > B?  A : B    same as max (B, A)
5399      A <= B? A : B    same as min (A, B)
5400      A < B?  A : B    same as min (B, A)
5401
5402      As above, these transformations don't work in the presence
5403      of signed zeros.  For example, if A and B are zeros of
5404      opposite sign, the first two transformations will change
5405      the sign of the result.  In the last four, the original
5406      expressions give different results for (A=+0, B=-0) and
5407      (A=-0, B=+0), but the transformed expressions do not.
5408
5409      The first two transformations are correct if either A or B
5410      is a NaN.  In the first transformation, the condition will
5411      be false, and B will indeed be chosen.  In the case of the
5412      second transformation, the condition A != B will be true,
5413      and A will be chosen.
5414
5415      The conversions to max() and min() are not correct if B is
5416      a number and A is not.  The conditions in the original
5417      expressions will be false, so all four give B.  The min()
5418      and max() versions would give a NaN instead.  */
5419   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
5420       && operand_equal_for_comparison_p (arg01, arg2, arg00)
5421       /* Avoid these transformations if the COND_EXPR may be used
5422          as an lvalue in the C++ front-end.  PR c++/19199.  */
5423       && (in_gimple_form
5424           || (strcmp (lang_hooks.name, "GNU C++") != 0
5425               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
5426           || ! maybe_lvalue_p (arg1)
5427           || ! maybe_lvalue_p (arg2)))
5428     {
5429       tree comp_op0 = arg00;
5430       tree comp_op1 = arg01;
5431       tree comp_type = TREE_TYPE (comp_op0);
5432
5433       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
5434       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
5435         {
5436           comp_type = type;
5437           comp_op0 = arg1;
5438           comp_op1 = arg2;
5439         }
5440
5441       switch (comp_code)
5442         {
5443         case EQ_EXPR:
5444           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2));
5445         case NE_EXPR:
5446           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5447         case LE_EXPR:
5448         case LT_EXPR:
5449         case UNLE_EXPR:
5450         case UNLT_EXPR:
5451           /* In C++ a ?: expression can be an lvalue, so put the
5452              operand which will be used if they are equal first
5453              so that we can convert this back to the
5454              corresponding COND_EXPR.  */
5455           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5456             {
5457               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5458               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5459               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
5460                     ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1)
5461                     : fold_build2_loc (loc, MIN_EXPR, comp_type,
5462                                    comp_op1, comp_op0);
5463               return pedantic_non_lvalue_loc (loc,
5464                                           fold_convert_loc (loc, type, tem));
5465             }
5466           break;
5467         case GE_EXPR:
5468         case GT_EXPR:
5469         case UNGE_EXPR:
5470         case UNGT_EXPR:
5471           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5472             {
5473               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5474               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5475               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5476                     ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1)
5477                     : fold_build2_loc (loc, MAX_EXPR, comp_type,
5478                                    comp_op1, comp_op0);
5479               return pedantic_non_lvalue_loc (loc,
5480                                           fold_convert_loc (loc, type, tem));
5481             }
5482           break;
5483         case UNEQ_EXPR:
5484           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5485             return pedantic_non_lvalue_loc (loc,
5486                                         fold_convert_loc (loc, type, arg2));
5487           break;
5488         case LTGT_EXPR:
5489           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5490             return pedantic_non_lvalue_loc (loc,
5491                                         fold_convert_loc (loc, type, arg1));
5492           break;
5493         default:
5494           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5495           break;
5496         }
5497     }
5498
5499   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5500      we might still be able to simplify this.  For example,
5501      if C1 is one less or one more than C2, this might have started
5502      out as a MIN or MAX and been transformed by this function.
5503      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5504
5505   if (INTEGRAL_TYPE_P (type)
5506       && TREE_CODE (arg01) == INTEGER_CST
5507       && TREE_CODE (arg2) == INTEGER_CST)
5508     switch (comp_code)
5509       {
5510       case EQ_EXPR:
5511         if (TREE_CODE (arg1) == INTEGER_CST)
5512           break;
5513         /* We can replace A with C1 in this case.  */
5514         arg1 = fold_convert_loc (loc, type, arg01);
5515         return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2);
5516
5517       case LT_EXPR:
5518         /* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for
5519            MIN_EXPR, to preserve the signedness of the comparison.  */
5520         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5521                                OEP_ONLY_CONST)
5522             && operand_equal_p (arg01,
5523                                 const_binop (PLUS_EXPR, arg2,
5524                                              build_int_cst (type, 1), 0),
5525                                 OEP_ONLY_CONST))
5526           {
5527             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5528                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5529                                                      arg2));
5530             return pedantic_non_lvalue_loc (loc,
5531                                             fold_convert_loc (loc, type, tem));
5532           }
5533         break;
5534
5535       case LE_EXPR:
5536         /* If C1 is C2 - 1, this is min(A, C2), with the same care
5537            as above.  */
5538         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5539                                OEP_ONLY_CONST)
5540             && operand_equal_p (arg01,
5541                                 const_binop (MINUS_EXPR, arg2,
5542                                              build_int_cst (type, 1), 0),
5543                                 OEP_ONLY_CONST))
5544           {
5545             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5546                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5547                                                      arg2));
5548             return pedantic_non_lvalue_loc (loc,
5549                                             fold_convert_loc (loc, type, tem));
5550           }
5551         break;
5552
5553       case GT_EXPR:
5554         /* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
5555            MAX_EXPR, to preserve the signedness of the comparison.  */
5556         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5557                                OEP_ONLY_CONST)
5558             && operand_equal_p (arg01,
5559                                 const_binop (MINUS_EXPR, arg2,
5560                                              build_int_cst (type, 1), 0),
5561                                 OEP_ONLY_CONST))
5562           {
5563             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5564                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5565                                                      arg2));
5566             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5567           }
5568         break;
5569
5570       case GE_EXPR:
5571         /* If C1 is C2 + 1, this is max(A, C2), with the same care as above.  */
5572         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5573                                OEP_ONLY_CONST)
5574             && operand_equal_p (arg01,
5575                                 const_binop (PLUS_EXPR, arg2,
5576                                              build_int_cst (type, 1), 0),
5577                                 OEP_ONLY_CONST))
5578           {
5579             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5580                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5581                                                      arg2));
5582             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5583           }
5584         break;
5585       case NE_EXPR:
5586         break;
5587       default:
5588         gcc_unreachable ();
5589       }
5590
5591   return NULL_TREE;
5592 }
5593
5594
5595 \f
5596 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5597 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
5598   (BRANCH_COST (optimize_function_for_speed_p (cfun), \
5599                 false) >= 2)
5600 #endif
5601
5602 /* EXP is some logical combination of boolean tests.  See if we can
5603    merge it into some range test.  Return the new tree if so.  */
5604
5605 static tree
5606 fold_range_test (location_t loc, enum tree_code code, tree type,
5607                  tree op0, tree op1)
5608 {
5609   int or_op = (code == TRUTH_ORIF_EXPR
5610                || code == TRUTH_OR_EXPR);
5611   int in0_p, in1_p, in_p;
5612   tree low0, low1, low, high0, high1, high;
5613   bool strict_overflow_p = false;
5614   tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5615   tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5616   tree tem;
5617   const char * const warnmsg = G_("assuming signed overflow does not occur "
5618                                   "when simplifying range test");
5619
5620   /* If this is an OR operation, invert both sides; we will invert
5621      again at the end.  */
5622   if (or_op)
5623     in0_p = ! in0_p, in1_p = ! in1_p;
5624
5625   /* If both expressions are the same, if we can merge the ranges, and we
5626      can build the range test, return it or it inverted.  If one of the
5627      ranges is always true or always false, consider it to be the same
5628      expression as the other.  */
5629   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5630       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5631                        in1_p, low1, high1)
5632       && 0 != (tem = (build_range_check (UNKNOWN_LOCATION, type,
5633                                          lhs != 0 ? lhs
5634                                          : rhs != 0 ? rhs : integer_zero_node,
5635                                          in_p, low, high))))
5636     {
5637       if (strict_overflow_p)
5638         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5639       return or_op ? invert_truthvalue_loc (loc, tem) : tem;
5640     }
5641
5642   /* On machines where the branch cost is expensive, if this is a
5643      short-circuited branch and the underlying object on both sides
5644      is the same, make a non-short-circuit operation.  */
5645   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5646            && lhs != 0 && rhs != 0
5647            && (code == TRUTH_ANDIF_EXPR
5648                || code == TRUTH_ORIF_EXPR)
5649            && operand_equal_p (lhs, rhs, 0))
5650     {
5651       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5652          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5653          which cases we can't do this.  */
5654       if (simple_operand_p (lhs))
5655         {
5656           tem = build2 (code == TRUTH_ANDIF_EXPR
5657                         ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5658                         type, op0, op1);
5659           SET_EXPR_LOCATION (tem, loc);
5660           return tem;
5661         }
5662
5663       else if (lang_hooks.decls.global_bindings_p () == 0
5664                && ! CONTAINS_PLACEHOLDER_P (lhs))
5665         {
5666           tree common = save_expr (lhs);
5667
5668           if (0 != (lhs = build_range_check (loc, type, common,
5669                                              or_op ? ! in0_p : in0_p,
5670                                              low0, high0))
5671               && (0 != (rhs = build_range_check (loc, type, common,
5672                                                  or_op ? ! in1_p : in1_p,
5673                                                  low1, high1))))
5674             {
5675               if (strict_overflow_p)
5676                 fold_overflow_warning (warnmsg,
5677                                        WARN_STRICT_OVERFLOW_COMPARISON);
5678               tem = build2 (code == TRUTH_ANDIF_EXPR
5679                             ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5680                             type, lhs, rhs);
5681               SET_EXPR_LOCATION (tem, loc);
5682               return tem;
5683             }
5684         }
5685     }
5686
5687   return 0;
5688 }
5689 \f
5690 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5691    bit value.  Arrange things so the extra bits will be set to zero if and
5692    only if C is signed-extended to its full width.  If MASK is nonzero,
5693    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5694
5695 static tree
5696 unextend (tree c, int p, int unsignedp, tree mask)
5697 {
5698   tree type = TREE_TYPE (c);
5699   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5700   tree temp;
5701
5702   if (p == modesize || unsignedp)
5703     return c;
5704
5705   /* We work by getting just the sign bit into the low-order bit, then
5706      into the high-order bit, then sign-extend.  We then XOR that value
5707      with C.  */
5708   temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5709   temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5710
5711   /* We must use a signed type in order to get an arithmetic right shift.
5712      However, we must also avoid introducing accidental overflows, so that
5713      a subsequent call to integer_zerop will work.  Hence we must
5714      do the type conversion here.  At this point, the constant is either
5715      zero or one, and the conversion to a signed type can never overflow.
5716      We could get an overflow if this conversion is done anywhere else.  */
5717   if (TYPE_UNSIGNED (type))
5718     temp = fold_convert (signed_type_for (type), temp);
5719
5720   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5721   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5722   if (mask != 0)
5723     temp = const_binop (BIT_AND_EXPR, temp,
5724                         fold_convert (TREE_TYPE (c), mask),
5725                         0);
5726   /* If necessary, convert the type back to match the type of C.  */
5727   if (TYPE_UNSIGNED (type))
5728     temp = fold_convert (type, temp);
5729
5730   return fold_convert (type,
5731                        const_binop (BIT_XOR_EXPR, c, temp, 0));
5732 }
5733 \f
5734 /* Find ways of folding logical expressions of LHS and RHS:
5735    Try to merge two comparisons to the same innermost item.
5736    Look for range tests like "ch >= '0' && ch <= '9'".
5737    Look for combinations of simple terms on machines with expensive branches
5738    and evaluate the RHS unconditionally.
5739
5740    For example, if we have p->a == 2 && p->b == 4 and we can make an
5741    object large enough to span both A and B, we can do this with a comparison
5742    against the object ANDed with the a mask.
5743
5744    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5745    operations to do this with one comparison.
5746
5747    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5748    function and the one above.
5749
5750    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5751    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5752
5753    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5754    two operands.
5755
5756    We return the simplified tree or 0 if no optimization is possible.  */
5757
5758 static tree
5759 fold_truthop (location_t loc, enum tree_code code, tree truth_type,
5760               tree lhs, tree rhs)
5761 {
5762   /* If this is the "or" of two comparisons, we can do something if
5763      the comparisons are NE_EXPR.  If this is the "and", we can do something
5764      if the comparisons are EQ_EXPR.  I.e.,
5765         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5766
5767      WANTED_CODE is this operation code.  For single bit fields, we can
5768      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5769      comparison for one-bit fields.  */
5770
5771   enum tree_code wanted_code;
5772   enum tree_code lcode, rcode;
5773   tree ll_arg, lr_arg, rl_arg, rr_arg;
5774   tree ll_inner, lr_inner, rl_inner, rr_inner;
5775   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5776   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5777   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5778   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5779   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5780   enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5781   enum machine_mode lnmode, rnmode;
5782   tree ll_mask, lr_mask, rl_mask, rr_mask;
5783   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5784   tree l_const, r_const;
5785   tree lntype, rntype, result;
5786   HOST_WIDE_INT first_bit, end_bit;
5787   int volatilep;
5788   tree orig_lhs = lhs, orig_rhs = rhs;
5789   enum tree_code orig_code = code;
5790
5791   /* Start by getting the comparison codes.  Fail if anything is volatile.
5792      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5793      it were surrounded with a NE_EXPR.  */
5794
5795   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5796     return 0;
5797
5798   lcode = TREE_CODE (lhs);
5799   rcode = TREE_CODE (rhs);
5800
5801   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5802     {
5803       lhs = build2 (NE_EXPR, truth_type, lhs,
5804                     build_int_cst (TREE_TYPE (lhs), 0));
5805       lcode = NE_EXPR;
5806     }
5807
5808   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5809     {
5810       rhs = build2 (NE_EXPR, truth_type, rhs,
5811                     build_int_cst (TREE_TYPE (rhs), 0));
5812       rcode = NE_EXPR;
5813     }
5814
5815   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5816       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5817     return 0;
5818
5819   ll_arg = TREE_OPERAND (lhs, 0);
5820   lr_arg = TREE_OPERAND (lhs, 1);
5821   rl_arg = TREE_OPERAND (rhs, 0);
5822   rr_arg = TREE_OPERAND (rhs, 1);
5823
5824   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5825   if (simple_operand_p (ll_arg)
5826       && simple_operand_p (lr_arg))
5827     {
5828       tree result;
5829       if (operand_equal_p (ll_arg, rl_arg, 0)
5830           && operand_equal_p (lr_arg, rr_arg, 0))
5831         {
5832           result = combine_comparisons (loc, code, lcode, rcode,
5833                                         truth_type, ll_arg, lr_arg);
5834           if (result)
5835             return result;
5836         }
5837       else if (operand_equal_p (ll_arg, rr_arg, 0)
5838                && operand_equal_p (lr_arg, rl_arg, 0))
5839         {
5840           result = combine_comparisons (loc, code, lcode,
5841                                         swap_tree_comparison (rcode),
5842                                         truth_type, ll_arg, lr_arg);
5843           if (result)
5844             return result;
5845         }
5846     }
5847
5848   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5849           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5850
5851   /* If the RHS can be evaluated unconditionally and its operands are
5852      simple, it wins to evaluate the RHS unconditionally on machines
5853      with expensive branches.  In this case, this isn't a comparison
5854      that can be merged.  Avoid doing this if the RHS is a floating-point
5855      comparison since those can trap.  */
5856
5857   if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5858                    false) >= 2
5859       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5860       && simple_operand_p (rl_arg)
5861       && simple_operand_p (rr_arg))
5862     {
5863       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5864       if (code == TRUTH_OR_EXPR
5865           && lcode == NE_EXPR && integer_zerop (lr_arg)
5866           && rcode == NE_EXPR && integer_zerop (rr_arg)
5867           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5868           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5869         {
5870           result = build2 (NE_EXPR, truth_type,
5871                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5872                                    ll_arg, rl_arg),
5873                            build_int_cst (TREE_TYPE (ll_arg), 0));
5874           goto fold_truthop_exit;
5875         }
5876
5877       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5878       if (code == TRUTH_AND_EXPR
5879           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5880           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5881           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5882           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5883         {
5884           result = build2 (EQ_EXPR, truth_type,
5885                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5886                                    ll_arg, rl_arg),
5887                            build_int_cst (TREE_TYPE (ll_arg), 0));
5888           goto fold_truthop_exit;
5889         }
5890
5891       if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5892         {
5893           if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5894             {
5895               result = build2 (code, truth_type, lhs, rhs);
5896               goto fold_truthop_exit;
5897             }
5898           return NULL_TREE;
5899         }
5900     }
5901
5902   /* See if the comparisons can be merged.  Then get all the parameters for
5903      each side.  */
5904
5905   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5906       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5907     return 0;
5908
5909   volatilep = 0;
5910   ll_inner = decode_field_reference (loc, ll_arg,
5911                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5912                                      &ll_unsignedp, &volatilep, &ll_mask,
5913                                      &ll_and_mask);
5914   lr_inner = decode_field_reference (loc, lr_arg,
5915                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5916                                      &lr_unsignedp, &volatilep, &lr_mask,
5917                                      &lr_and_mask);
5918   rl_inner = decode_field_reference (loc, rl_arg,
5919                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5920                                      &rl_unsignedp, &volatilep, &rl_mask,
5921                                      &rl_and_mask);
5922   rr_inner = decode_field_reference (loc, rr_arg,
5923                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5924                                      &rr_unsignedp, &volatilep, &rr_mask,
5925                                      &rr_and_mask);
5926
5927   /* It must be true that the inner operation on the lhs of each
5928      comparison must be the same if we are to be able to do anything.
5929      Then see if we have constants.  If not, the same must be true for
5930      the rhs's.  */
5931   if (volatilep || ll_inner == 0 || rl_inner == 0
5932       || ! operand_equal_p (ll_inner, rl_inner, 0))
5933     return 0;
5934
5935   if (TREE_CODE (lr_arg) == INTEGER_CST
5936       && TREE_CODE (rr_arg) == INTEGER_CST)
5937     l_const = lr_arg, r_const = rr_arg;
5938   else if (lr_inner == 0 || rr_inner == 0
5939            || ! operand_equal_p (lr_inner, rr_inner, 0))
5940     return 0;
5941   else
5942     l_const = r_const = 0;
5943
5944   /* If either comparison code is not correct for our logical operation,
5945      fail.  However, we can convert a one-bit comparison against zero into
5946      the opposite comparison against that bit being set in the field.  */
5947
5948   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5949   if (lcode != wanted_code)
5950     {
5951       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5952         {
5953           /* Make the left operand unsigned, since we are only interested
5954              in the value of one bit.  Otherwise we are doing the wrong
5955              thing below.  */
5956           ll_unsignedp = 1;
5957           l_const = ll_mask;
5958         }
5959       else
5960         return 0;
5961     }
5962
5963   /* This is analogous to the code for l_const above.  */
5964   if (rcode != wanted_code)
5965     {
5966       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5967         {
5968           rl_unsignedp = 1;
5969           r_const = rl_mask;
5970         }
5971       else
5972         return 0;
5973     }
5974
5975   /* See if we can find a mode that contains both fields being compared on
5976      the left.  If we can't, fail.  Otherwise, update all constants and masks
5977      to be relative to a field of that size.  */
5978   first_bit = MIN (ll_bitpos, rl_bitpos);
5979   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5980   lnmode = get_best_mode (end_bit - first_bit, first_bit,
5981                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5982                           volatilep);
5983   if (lnmode == VOIDmode)
5984     return 0;
5985
5986   lnbitsize = GET_MODE_BITSIZE (lnmode);
5987   lnbitpos = first_bit & ~ (lnbitsize - 1);
5988   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5989   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5990
5991   if (BYTES_BIG_ENDIAN)
5992     {
5993       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5994       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5995     }
5996
5997   ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask),
5998                          size_int (xll_bitpos), 0);
5999   rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask),
6000                          size_int (xrl_bitpos), 0);
6001
6002   if (l_const)
6003     {
6004       l_const = fold_convert_loc (loc, lntype, l_const);
6005       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
6006       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
6007       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
6008                                         fold_build1_loc (loc, BIT_NOT_EXPR,
6009                                                      lntype, ll_mask),
6010                                         0)))
6011         {
6012           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
6013
6014           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
6015         }
6016     }
6017   if (r_const)
6018     {
6019       r_const = fold_convert_loc (loc, lntype, r_const);
6020       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
6021       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
6022       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
6023                                         fold_build1_loc (loc, BIT_NOT_EXPR,
6024                                                      lntype, rl_mask),
6025                                         0)))
6026         {
6027           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
6028
6029           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
6030         }
6031     }
6032
6033   /* If the right sides are not constant, do the same for it.  Also,
6034      disallow this optimization if a size or signedness mismatch occurs
6035      between the left and right sides.  */
6036   if (l_const == 0)
6037     {
6038       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
6039           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
6040           /* Make sure the two fields on the right
6041              correspond to the left without being swapped.  */
6042           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
6043         return 0;
6044
6045       first_bit = MIN (lr_bitpos, rr_bitpos);
6046       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
6047       rnmode = get_best_mode (end_bit - first_bit, first_bit,
6048                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
6049                               volatilep);
6050       if (rnmode == VOIDmode)
6051         return 0;
6052
6053       rnbitsize = GET_MODE_BITSIZE (rnmode);
6054       rnbitpos = first_bit & ~ (rnbitsize - 1);
6055       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
6056       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
6057
6058       if (BYTES_BIG_ENDIAN)
6059         {
6060           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
6061           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
6062         }
6063
6064       lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
6065                                                             rntype, lr_mask),
6066                              size_int (xlr_bitpos), 0);
6067       rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
6068                                                             rntype, rr_mask),
6069                              size_int (xrr_bitpos), 0);
6070
6071       /* Make a mask that corresponds to both fields being compared.
6072          Do this for both items being compared.  If the operands are the
6073          same size and the bits being compared are in the same position
6074          then we can do this by masking both and comparing the masked
6075          results.  */
6076       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
6077       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
6078       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
6079         {
6080           lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
6081                                     ll_unsignedp || rl_unsignedp);
6082           if (! all_ones_mask_p (ll_mask, lnbitsize))
6083             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
6084
6085           rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
6086                                     lr_unsignedp || rr_unsignedp);
6087           if (! all_ones_mask_p (lr_mask, rnbitsize))
6088             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
6089
6090           result = build2 (wanted_code, truth_type, lhs, rhs);
6091           goto fold_truthop_exit;
6092         }
6093
6094       /* There is still another way we can do something:  If both pairs of
6095          fields being compared are adjacent, we may be able to make a wider
6096          field containing them both.
6097
6098          Note that we still must mask the lhs/rhs expressions.  Furthermore,
6099          the mask must be shifted to account for the shift done by
6100          make_bit_field_ref.  */
6101       if ((ll_bitsize + ll_bitpos == rl_bitpos
6102            && lr_bitsize + lr_bitpos == rr_bitpos)
6103           || (ll_bitpos == rl_bitpos + rl_bitsize
6104               && lr_bitpos == rr_bitpos + rr_bitsize))
6105         {
6106           tree type;
6107
6108           lhs = make_bit_field_ref (loc, ll_inner, lntype,
6109                                     ll_bitsize + rl_bitsize,
6110                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
6111           rhs = make_bit_field_ref (loc, lr_inner, rntype,
6112                                     lr_bitsize + rr_bitsize,
6113                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
6114
6115           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
6116                                  size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
6117           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
6118                                  size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
6119
6120           /* Convert to the smaller type before masking out unwanted bits.  */
6121           type = lntype;
6122           if (lntype != rntype)
6123             {
6124               if (lnbitsize > rnbitsize)
6125                 {
6126                   lhs = fold_convert_loc (loc, rntype, lhs);
6127                   ll_mask = fold_convert_loc (loc, rntype, ll_mask);
6128                   type = rntype;
6129                 }
6130               else if (lnbitsize < rnbitsize)
6131                 {
6132                   rhs = fold_convert_loc (loc, lntype, rhs);
6133                   lr_mask = fold_convert_loc (loc, lntype, lr_mask);
6134                   type = lntype;
6135                 }
6136             }
6137
6138           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
6139             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
6140
6141           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
6142             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
6143
6144           result = build2 (wanted_code, truth_type, lhs, rhs);
6145           goto fold_truthop_exit;
6146         }
6147
6148       return 0;
6149     }
6150
6151   /* Handle the case of comparisons with constants.  If there is something in
6152      common between the masks, those bits of the constants must be the same.
6153      If not, the condition is always false.  Test for this to avoid generating
6154      incorrect code below.  */
6155   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
6156   if (! integer_zerop (result)
6157       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
6158                            const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
6159     {
6160       if (wanted_code == NE_EXPR)
6161         {
6162           warning (0, "%<or%> of unmatched not-equal tests is always 1");
6163           return constant_boolean_node (true, truth_type);
6164         }
6165       else
6166         {
6167           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
6168           return constant_boolean_node (false, truth_type);
6169         }
6170     }
6171
6172   /* Construct the expression we will return.  First get the component
6173      reference we will make.  Unless the mask is all ones the width of
6174      that field, perform the mask operation.  Then compare with the
6175      merged constant.  */
6176   result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
6177                                ll_unsignedp || rl_unsignedp);
6178
6179   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
6180   if (! all_ones_mask_p (ll_mask, lnbitsize))
6181     {
6182       result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
6183       SET_EXPR_LOCATION (result, loc);
6184     }
6185
6186   result = build2 (wanted_code, truth_type, result,
6187                    const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
6188
6189  fold_truthop_exit:
6190   SET_EXPR_LOCATION (result, loc);
6191   return result;
6192 }
6193 \f
6194 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
6195    constant.  */
6196
6197 static tree
6198 optimize_minmax_comparison (location_t loc, enum tree_code code, tree type,
6199                             tree op0, tree op1)
6200 {
6201   tree arg0 = op0;
6202   enum tree_code op_code;
6203   tree comp_const;
6204   tree minmax_const;
6205   int consts_equal, consts_lt;
6206   tree inner;
6207
6208   STRIP_SIGN_NOPS (arg0);
6209
6210   op_code = TREE_CODE (arg0);
6211   minmax_const = TREE_OPERAND (arg0, 1);
6212   comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1);
6213   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
6214   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
6215   inner = TREE_OPERAND (arg0, 0);
6216
6217   /* If something does not permit us to optimize, return the original tree.  */
6218   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
6219       || TREE_CODE (comp_const) != INTEGER_CST
6220       || TREE_OVERFLOW (comp_const)
6221       || TREE_CODE (minmax_const) != INTEGER_CST
6222       || TREE_OVERFLOW (minmax_const))
6223     return NULL_TREE;
6224
6225   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
6226      and GT_EXPR, doing the rest with recursive calls using logical
6227      simplifications.  */
6228   switch (code)
6229     {
6230     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
6231       {
6232         tree tem
6233           = optimize_minmax_comparison (loc,
6234                                         invert_tree_comparison (code, false),
6235                                         type, op0, op1);
6236         if (tem)
6237           return invert_truthvalue_loc (loc, tem);
6238         return NULL_TREE;
6239       }
6240
6241     case GE_EXPR:
6242       return
6243         fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
6244                      optimize_minmax_comparison
6245                      (loc, EQ_EXPR, type, arg0, comp_const),
6246                      optimize_minmax_comparison
6247                      (loc, GT_EXPR, type, arg0, comp_const));
6248
6249     case EQ_EXPR:
6250       if (op_code == MAX_EXPR && consts_equal)
6251         /* MAX (X, 0) == 0  ->  X <= 0  */
6252         return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const);
6253
6254       else if (op_code == MAX_EXPR && consts_lt)
6255         /* MAX (X, 0) == 5  ->  X == 5   */
6256         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
6257
6258       else if (op_code == MAX_EXPR)
6259         /* MAX (X, 0) == -1  ->  false  */
6260         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6261
6262       else if (consts_equal)
6263         /* MIN (X, 0) == 0  ->  X >= 0  */
6264         return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const);
6265
6266       else if (consts_lt)
6267         /* MIN (X, 0) == 5  ->  false  */
6268         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6269
6270       else
6271         /* MIN (X, 0) == -1  ->  X == -1  */
6272         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
6273
6274     case GT_EXPR:
6275       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
6276         /* MAX (X, 0) > 0  ->  X > 0
6277            MAX (X, 0) > 5  ->  X > 5  */
6278         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
6279
6280       else if (op_code == MAX_EXPR)
6281         /* MAX (X, 0) > -1  ->  true  */
6282         return omit_one_operand_loc (loc, type, integer_one_node, inner);
6283
6284       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
6285         /* MIN (X, 0) > 0  ->  false
6286            MIN (X, 0) > 5  ->  false  */
6287         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
6288
6289       else
6290         /* MIN (X, 0) > -1  ->  X > -1  */
6291         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
6292
6293     default:
6294       return NULL_TREE;
6295     }
6296 }
6297 \f
6298 /* T is an integer expression that is being multiplied, divided, or taken a
6299    modulus (CODE says which and what kind of divide or modulus) by a
6300    constant C.  See if we can eliminate that operation by folding it with
6301    other operations already in T.  WIDE_TYPE, if non-null, is a type that
6302    should be used for the computation if wider than our type.
6303
6304    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
6305    (X * 2) + (Y * 4).  We must, however, be assured that either the original
6306    expression would not overflow or that overflow is undefined for the type
6307    in the language in question.
6308
6309    If we return a non-null expression, it is an equivalent form of the
6310    original computation, but need not be in the original type.
6311
6312    We set *STRICT_OVERFLOW_P to true if the return values depends on
6313    signed overflow being undefined.  Otherwise we do not change
6314    *STRICT_OVERFLOW_P.  */
6315
6316 static tree
6317 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
6318                 bool *strict_overflow_p)
6319 {
6320   /* To avoid exponential search depth, refuse to allow recursion past
6321      three levels.  Beyond that (1) it's highly unlikely that we'll find
6322      something interesting and (2) we've probably processed it before
6323      when we built the inner expression.  */
6324
6325   static int depth;
6326   tree ret;
6327
6328   if (depth > 3)
6329     return NULL;
6330
6331   depth++;
6332   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
6333   depth--;
6334
6335   return ret;
6336 }
6337
6338 static tree
6339 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
6340                   bool *strict_overflow_p)
6341 {
6342   tree type = TREE_TYPE (t);
6343   enum tree_code tcode = TREE_CODE (t);
6344   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
6345                                    > GET_MODE_SIZE (TYPE_MODE (type)))
6346                 ? wide_type : type);
6347   tree t1, t2;
6348   int same_p = tcode == code;
6349   tree op0 = NULL_TREE, op1 = NULL_TREE;
6350   bool sub_strict_overflow_p;
6351
6352   /* Don't deal with constants of zero here; they confuse the code below.  */
6353   if (integer_zerop (c))
6354     return NULL_TREE;
6355
6356   if (TREE_CODE_CLASS (tcode) == tcc_unary)
6357     op0 = TREE_OPERAND (t, 0);
6358
6359   if (TREE_CODE_CLASS (tcode) == tcc_binary)
6360     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
6361
6362   /* Note that we need not handle conditional operations here since fold
6363      already handles those cases.  So just do arithmetic here.  */
6364   switch (tcode)
6365     {
6366     case INTEGER_CST:
6367       /* For a constant, we can always simplify if we are a multiply
6368          or (for divide and modulus) if it is a multiple of our constant.  */
6369       if (code == MULT_EXPR
6370           || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
6371         return const_binop (code, fold_convert (ctype, t),
6372                             fold_convert (ctype, c), 0);
6373       break;
6374
6375     CASE_CONVERT: case NON_LVALUE_EXPR:
6376       /* If op0 is an expression ...  */
6377       if ((COMPARISON_CLASS_P (op0)
6378            || UNARY_CLASS_P (op0)
6379            || BINARY_CLASS_P (op0)
6380            || VL_EXP_CLASS_P (op0)
6381            || EXPRESSION_CLASS_P (op0))
6382           /* ... and has wrapping overflow, and its type is smaller
6383              than ctype, then we cannot pass through as widening.  */
6384           && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0))
6385                && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
6386                      && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
6387                && (TYPE_PRECISION (ctype)
6388                    > TYPE_PRECISION (TREE_TYPE (op0))))
6389               /* ... or this is a truncation (t is narrower than op0),
6390                  then we cannot pass through this narrowing.  */
6391               || (TYPE_PRECISION (type)
6392                   < TYPE_PRECISION (TREE_TYPE (op0)))
6393               /* ... or signedness changes for division or modulus,
6394                  then we cannot pass through this conversion.  */
6395               || (code != MULT_EXPR
6396                   && (TYPE_UNSIGNED (ctype)
6397                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
6398               /* ... or has undefined overflow while the converted to
6399                  type has not, we cannot do the operation in the inner type
6400                  as that would introduce undefined overflow.  */
6401               || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
6402                   && !TYPE_OVERFLOW_UNDEFINED (type))))
6403         break;
6404
6405       /* Pass the constant down and see if we can make a simplification.  If
6406          we can, replace this expression with the inner simplification for
6407          possible later conversion to our or some other type.  */
6408       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
6409           && TREE_CODE (t2) == INTEGER_CST
6410           && !TREE_OVERFLOW (t2)
6411           && (0 != (t1 = extract_muldiv (op0, t2, code,
6412                                          code == MULT_EXPR
6413                                          ? ctype : NULL_TREE,
6414                                          strict_overflow_p))))
6415         return t1;
6416       break;
6417
6418     case ABS_EXPR:
6419       /* If widening the type changes it from signed to unsigned, then we
6420          must avoid building ABS_EXPR itself as unsigned.  */
6421       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
6422         {
6423           tree cstype = (*signed_type_for) (ctype);
6424           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
6425               != 0)
6426             {
6427               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
6428               return fold_convert (ctype, t1);
6429             }
6430           break;
6431         }
6432       /* If the constant is negative, we cannot simplify this.  */
6433       if (tree_int_cst_sgn (c) == -1)
6434         break;
6435       /* FALLTHROUGH */
6436     case NEGATE_EXPR:
6437       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
6438           != 0)
6439         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
6440       break;
6441
6442     case MIN_EXPR:  case MAX_EXPR:
6443       /* If widening the type changes the signedness, then we can't perform
6444          this optimization as that changes the result.  */
6445       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6446         break;
6447
6448       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
6449       sub_strict_overflow_p = false;
6450       if ((t1 = extract_muldiv (op0, c, code, wide_type,
6451                                 &sub_strict_overflow_p)) != 0
6452           && (t2 = extract_muldiv (op1, c, code, wide_type,
6453                                    &sub_strict_overflow_p)) != 0)
6454         {
6455           if (tree_int_cst_sgn (c) < 0)
6456             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
6457           if (sub_strict_overflow_p)
6458             *strict_overflow_p = true;
6459           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6460                               fold_convert (ctype, t2));
6461         }
6462       break;
6463
6464     case LSHIFT_EXPR:  case RSHIFT_EXPR:
6465       /* If the second operand is constant, this is a multiplication
6466          or floor division, by a power of two, so we can treat it that
6467          way unless the multiplier or divisor overflows.  Signed
6468          left-shift overflow is implementation-defined rather than
6469          undefined in C90, so do not convert signed left shift into
6470          multiplication.  */
6471       if (TREE_CODE (op1) == INTEGER_CST
6472           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
6473           /* const_binop may not detect overflow correctly,
6474              so check for it explicitly here.  */
6475           && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
6476           && TREE_INT_CST_HIGH (op1) == 0
6477           && 0 != (t1 = fold_convert (ctype,
6478                                       const_binop (LSHIFT_EXPR,
6479                                                    size_one_node,
6480                                                    op1, 0)))
6481           && !TREE_OVERFLOW (t1))
6482         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
6483                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
6484                                        ctype,
6485                                        fold_convert (ctype, op0),
6486                                        t1),
6487                                c, code, wide_type, strict_overflow_p);
6488       break;
6489
6490     case PLUS_EXPR:  case MINUS_EXPR:
6491       /* See if we can eliminate the operation on both sides.  If we can, we
6492          can return a new PLUS or MINUS.  If we can't, the only remaining
6493          cases where we can do anything are if the second operand is a
6494          constant.  */
6495       sub_strict_overflow_p = false;
6496       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
6497       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
6498       if (t1 != 0 && t2 != 0
6499           && (code == MULT_EXPR
6500               /* If not multiplication, we can only do this if both operands
6501                  are divisible by c.  */
6502               || (multiple_of_p (ctype, op0, c)
6503                   && multiple_of_p (ctype, op1, c))))
6504         {
6505           if (sub_strict_overflow_p)
6506             *strict_overflow_p = true;
6507           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6508                               fold_convert (ctype, t2));
6509         }
6510
6511       /* If this was a subtraction, negate OP1 and set it to be an addition.
6512          This simplifies the logic below.  */
6513       if (tcode == MINUS_EXPR)
6514         {
6515           tcode = PLUS_EXPR, op1 = negate_expr (op1);
6516           /* If OP1 was not easily negatable, the constant may be OP0.  */
6517           if (TREE_CODE (op0) == INTEGER_CST)
6518             {
6519               tree tem = op0;
6520               op0 = op1;
6521               op1 = tem;
6522               tem = t1;
6523               t1 = t2;
6524               t2 = tem;
6525             }
6526         }
6527
6528       if (TREE_CODE (op1) != INTEGER_CST)
6529         break;
6530
6531       /* If either OP1 or C are negative, this optimization is not safe for
6532          some of the division and remainder types while for others we need
6533          to change the code.  */
6534       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
6535         {
6536           if (code == CEIL_DIV_EXPR)
6537             code = FLOOR_DIV_EXPR;
6538           else if (code == FLOOR_DIV_EXPR)
6539             code = CEIL_DIV_EXPR;
6540           else if (code != MULT_EXPR
6541                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
6542             break;
6543         }
6544
6545       /* If it's a multiply or a division/modulus operation of a multiple
6546          of our constant, do the operation and verify it doesn't overflow.  */
6547       if (code == MULT_EXPR
6548           || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6549         {
6550           op1 = const_binop (code, fold_convert (ctype, op1),
6551                              fold_convert (ctype, c), 0);
6552           /* We allow the constant to overflow with wrapping semantics.  */
6553           if (op1 == 0
6554               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
6555             break;
6556         }
6557       else
6558         break;
6559
6560       /* If we have an unsigned type is not a sizetype, we cannot widen
6561          the operation since it will change the result if the original
6562          computation overflowed.  */
6563       if (TYPE_UNSIGNED (ctype)
6564           && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
6565           && ctype != type)
6566         break;
6567
6568       /* If we were able to eliminate our operation from the first side,
6569          apply our operation to the second side and reform the PLUS.  */
6570       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
6571         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
6572
6573       /* The last case is if we are a multiply.  In that case, we can
6574          apply the distributive law to commute the multiply and addition
6575          if the multiplication of the constants doesn't overflow.  */
6576       if (code == MULT_EXPR)
6577         return fold_build2 (tcode, ctype,
6578                             fold_build2 (code, ctype,
6579                                          fold_convert (ctype, op0),
6580                                          fold_convert (ctype, c)),
6581                             op1);
6582
6583       break;
6584
6585     case MULT_EXPR:
6586       /* We have a special case here if we are doing something like
6587          (C * 8) % 4 since we know that's zero.  */
6588       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
6589            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
6590           /* If the multiplication can overflow we cannot optimize this.
6591              ???  Until we can properly mark individual operations as
6592              not overflowing we need to treat sizetype special here as
6593              stor-layout relies on this opimization to make
6594              DECL_FIELD_BIT_OFFSET always a constant.  */
6595           && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
6596               || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
6597                   && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
6598           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
6599           && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6600         {
6601           *strict_overflow_p = true;
6602           return omit_one_operand (type, integer_zero_node, op0);
6603         }
6604
6605       /* ... fall through ...  */
6606
6607     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
6608     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
6609       /* If we can extract our operation from the LHS, do so and return a
6610          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
6611          do something only if the second operand is a constant.  */
6612       if (same_p
6613           && (t1 = extract_muldiv (op0, c, code, wide_type,
6614                                    strict_overflow_p)) != 0)
6615         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6616                             fold_convert (ctype, op1));
6617       else if (tcode == MULT_EXPR && code == MULT_EXPR
6618                && (t1 = extract_muldiv (op1, c, code, wide_type,
6619                                         strict_overflow_p)) != 0)
6620         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6621                             fold_convert (ctype, t1));
6622       else if (TREE_CODE (op1) != INTEGER_CST)
6623         return 0;
6624
6625       /* If these are the same operation types, we can associate them
6626          assuming no overflow.  */
6627       if (tcode == code
6628           && 0 != (t1 = int_const_binop (MULT_EXPR,
6629                                          fold_convert (ctype, op1),
6630                                          fold_convert (ctype, c), 1))
6631           && 0 != (t1 = force_fit_type_double (ctype, TREE_INT_CST_LOW (t1),
6632                                                TREE_INT_CST_HIGH (t1),
6633                                                (TYPE_UNSIGNED (ctype)
6634                                                 && tcode != MULT_EXPR) ? -1 : 1,
6635                                                TREE_OVERFLOW (t1)))
6636           && !TREE_OVERFLOW (t1))
6637         return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
6638
6639       /* If these operations "cancel" each other, we have the main
6640          optimizations of this pass, which occur when either constant is a
6641          multiple of the other, in which case we replace this with either an
6642          operation or CODE or TCODE.
6643
6644          If we have an unsigned type that is not a sizetype, we cannot do
6645          this since it will change the result if the original computation
6646          overflowed.  */
6647       if ((TYPE_OVERFLOW_UNDEFINED (ctype)
6648            || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
6649           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
6650               || (tcode == MULT_EXPR
6651                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
6652                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
6653                   && code != MULT_EXPR)))
6654         {
6655           if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
6656             {
6657               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6658                 *strict_overflow_p = true;
6659               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6660                                   fold_convert (ctype,
6661                                                 const_binop (TRUNC_DIV_EXPR,
6662                                                              op1, c, 0)));
6663             }
6664           else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
6665             {
6666               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6667                 *strict_overflow_p = true;
6668               return fold_build2 (code, ctype, fold_convert (ctype, op0),
6669                                   fold_convert (ctype,
6670                                                 const_binop (TRUNC_DIV_EXPR,
6671                                                              c, op1, 0)));
6672             }
6673         }
6674       break;
6675
6676     default:
6677       break;
6678     }
6679
6680   return 0;
6681 }
6682 \f
6683 /* Return a node which has the indicated constant VALUE (either 0 or
6684    1), and is of the indicated TYPE.  */
6685
6686 tree
6687 constant_boolean_node (int value, tree type)
6688 {
6689   if (type == integer_type_node)
6690     return value ? integer_one_node : integer_zero_node;
6691   else if (type == boolean_type_node)
6692     return value ? boolean_true_node : boolean_false_node;
6693   else
6694     return build_int_cst (type, value);
6695 }
6696
6697
6698 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6699    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6700    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6701    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6702    COND is the first argument to CODE; otherwise (as in the example
6703    given here), it is the second argument.  TYPE is the type of the
6704    original expression.  Return NULL_TREE if no simplification is
6705    possible.  */
6706
6707 static tree
6708 fold_binary_op_with_conditional_arg (location_t loc,
6709                                      enum tree_code code,
6710                                      tree type, tree op0, tree op1,
6711                                      tree cond, tree arg, int cond_first_p)
6712 {
6713   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6714   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6715   tree test, true_value, false_value;
6716   tree lhs = NULL_TREE;
6717   tree rhs = NULL_TREE;
6718
6719   /* This transformation is only worthwhile if we don't have to wrap
6720      arg in a SAVE_EXPR, and the operation can be simplified on at least
6721      one of the branches once its pushed inside the COND_EXPR.  */
6722   if (!TREE_CONSTANT (arg))
6723     return NULL_TREE;
6724
6725   if (TREE_CODE (cond) == COND_EXPR)
6726     {
6727       test = TREE_OPERAND (cond, 0);
6728       true_value = TREE_OPERAND (cond, 1);
6729       false_value = TREE_OPERAND (cond, 2);
6730       /* If this operand throws an expression, then it does not make
6731          sense to try to perform a logical or arithmetic operation
6732          involving it.  */
6733       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6734         lhs = true_value;
6735       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6736         rhs = false_value;
6737     }
6738   else
6739     {
6740       tree testtype = TREE_TYPE (cond);
6741       test = cond;
6742       true_value = constant_boolean_node (true, testtype);
6743       false_value = constant_boolean_node (false, testtype);
6744     }
6745
6746   arg = fold_convert_loc (loc, arg_type, arg);
6747   if (lhs == 0)
6748     {
6749       true_value = fold_convert_loc (loc, cond_type, true_value);
6750       if (cond_first_p)
6751         lhs = fold_build2_loc (loc, code, type, true_value, arg);
6752       else
6753         lhs = fold_build2_loc (loc, code, type, arg, true_value);
6754     }
6755   if (rhs == 0)
6756     {
6757       false_value = fold_convert_loc (loc, cond_type, false_value);
6758       if (cond_first_p)
6759         rhs = fold_build2_loc (loc, code, type, false_value, arg);
6760       else
6761         rhs = fold_build2_loc (loc, code, type, arg, false_value);
6762     }
6763
6764   test = fold_build3_loc (loc, COND_EXPR, type, test, lhs, rhs);
6765   return fold_convert_loc (loc, type, test);
6766 }
6767
6768 \f
6769 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6770
6771    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6772    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6773    ADDEND is the same as X.
6774
6775    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6776    and finite.  The problematic cases are when X is zero, and its mode
6777    has signed zeros.  In the case of rounding towards -infinity,
6778    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6779    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6780
6781 bool
6782 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6783 {
6784   if (!real_zerop (addend))
6785     return false;
6786
6787   /* Don't allow the fold with -fsignaling-nans.  */
6788   if (HONOR_SNANS (TYPE_MODE (type)))
6789     return false;
6790
6791   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6792   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6793     return true;
6794
6795   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6796   if (TREE_CODE (addend) == REAL_CST
6797       && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6798     negate = !negate;
6799
6800   /* The mode has signed zeros, and we have to honor their sign.
6801      In this situation, there is only one case we can return true for.
6802      X - 0 is the same as X unless rounding towards -infinity is
6803      supported.  */
6804   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6805 }
6806
6807 /* Subroutine of fold() that checks comparisons of built-in math
6808    functions against real constants.
6809
6810    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6811    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6812    is the type of the result and ARG0 and ARG1 are the operands of the
6813    comparison.  ARG1 must be a TREE_REAL_CST.
6814
6815    The function returns the constant folded tree if a simplification
6816    can be made, and NULL_TREE otherwise.  */
6817
6818 static tree
6819 fold_mathfn_compare (location_t loc,
6820                      enum built_in_function fcode, enum tree_code code,
6821                      tree type, tree arg0, tree arg1)
6822 {
6823   REAL_VALUE_TYPE c;
6824
6825   if (BUILTIN_SQRT_P (fcode))
6826     {
6827       tree arg = CALL_EXPR_ARG (arg0, 0);
6828       enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6829
6830       c = TREE_REAL_CST (arg1);
6831       if (REAL_VALUE_NEGATIVE (c))
6832         {
6833           /* sqrt(x) < y is always false, if y is negative.  */
6834           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6835             return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6836
6837           /* sqrt(x) > y is always true, if y is negative and we
6838              don't care about NaNs, i.e. negative values of x.  */
6839           if (code == NE_EXPR || !HONOR_NANS (mode))
6840             return omit_one_operand_loc (loc, type, integer_one_node, arg);
6841
6842           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6843           return fold_build2_loc (loc, GE_EXPR, type, arg,
6844                               build_real (TREE_TYPE (arg), dconst0));
6845         }
6846       else if (code == GT_EXPR || code == GE_EXPR)
6847         {
6848           REAL_VALUE_TYPE c2;
6849
6850           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6851           real_convert (&c2, mode, &c2);
6852
6853           if (REAL_VALUE_ISINF (c2))
6854             {
6855               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6856               if (HONOR_INFINITIES (mode))
6857                 return fold_build2_loc (loc, EQ_EXPR, type, arg,
6858                                     build_real (TREE_TYPE (arg), c2));
6859
6860               /* sqrt(x) > y is always false, when y is very large
6861                  and we don't care about infinities.  */
6862               return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6863             }
6864
6865           /* sqrt(x) > c is the same as x > c*c.  */
6866           return fold_build2_loc (loc, code, type, arg,
6867                               build_real (TREE_TYPE (arg), c2));
6868         }
6869       else if (code == LT_EXPR || code == LE_EXPR)
6870         {
6871           REAL_VALUE_TYPE c2;
6872
6873           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6874           real_convert (&c2, mode, &c2);
6875
6876           if (REAL_VALUE_ISINF (c2))
6877             {
6878               /* sqrt(x) < y is always true, when y is a very large
6879                  value and we don't care about NaNs or Infinities.  */
6880               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6881                 return omit_one_operand_loc (loc, type, integer_one_node, arg);
6882
6883               /* sqrt(x) < y is x != +Inf when y is very large and we
6884                  don't care about NaNs.  */
6885               if (! HONOR_NANS (mode))
6886                 return fold_build2_loc (loc, NE_EXPR, type, arg,
6887                                     build_real (TREE_TYPE (arg), c2));
6888
6889               /* sqrt(x) < y is x >= 0 when y is very large and we
6890                  don't care about Infinities.  */
6891               if (! HONOR_INFINITIES (mode))
6892                 return fold_build2_loc (loc, GE_EXPR, type, arg,
6893                                     build_real (TREE_TYPE (arg), dconst0));
6894
6895               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6896               if (lang_hooks.decls.global_bindings_p () != 0
6897                   || CONTAINS_PLACEHOLDER_P (arg))
6898                 return NULL_TREE;
6899
6900               arg = save_expr (arg);
6901               return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6902                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6903                                                build_real (TREE_TYPE (arg),
6904                                                            dconst0)),
6905                                   fold_build2_loc (loc, NE_EXPR, type, arg,
6906                                                build_real (TREE_TYPE (arg),
6907                                                            c2)));
6908             }
6909
6910           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6911           if (! HONOR_NANS (mode))
6912             return fold_build2_loc (loc, code, type, arg,
6913                                 build_real (TREE_TYPE (arg), c2));
6914
6915           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6916           if (lang_hooks.decls.global_bindings_p () == 0
6917               && ! CONTAINS_PLACEHOLDER_P (arg))
6918             {
6919               arg = save_expr (arg);
6920               return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6921                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6922                                                build_real (TREE_TYPE (arg),
6923                                                            dconst0)),
6924                                   fold_build2_loc (loc, code, type, arg,
6925                                                build_real (TREE_TYPE (arg),
6926                                                            c2)));
6927             }
6928         }
6929     }
6930
6931   return NULL_TREE;
6932 }
6933
6934 /* Subroutine of fold() that optimizes comparisons against Infinities,
6935    either +Inf or -Inf.
6936
6937    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6938    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6939    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6940
6941    The function returns the constant folded tree if a simplification
6942    can be made, and NULL_TREE otherwise.  */
6943
6944 static tree
6945 fold_inf_compare (location_t loc, enum tree_code code, tree type,
6946                   tree arg0, tree arg1)
6947 {
6948   enum machine_mode mode;
6949   REAL_VALUE_TYPE max;
6950   tree temp;
6951   bool neg;
6952
6953   mode = TYPE_MODE (TREE_TYPE (arg0));
6954
6955   /* For negative infinity swap the sense of the comparison.  */
6956   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6957   if (neg)
6958     code = swap_tree_comparison (code);
6959
6960   switch (code)
6961     {
6962     case GT_EXPR:
6963       /* x > +Inf is always false, if with ignore sNANs.  */
6964       if (HONOR_SNANS (mode))
6965         return NULL_TREE;
6966       return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6967
6968     case LE_EXPR:
6969       /* x <= +Inf is always true, if we don't case about NaNs.  */
6970       if (! HONOR_NANS (mode))
6971         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6972
6973       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6974       if (lang_hooks.decls.global_bindings_p () == 0
6975           && ! CONTAINS_PLACEHOLDER_P (arg0))
6976         {
6977           arg0 = save_expr (arg0);
6978           return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0);
6979         }
6980       break;
6981
6982     case EQ_EXPR:
6983     case GE_EXPR:
6984       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6985       real_maxval (&max, neg, mode);
6986       return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6987                           arg0, build_real (TREE_TYPE (arg0), max));
6988
6989     case LT_EXPR:
6990       /* x < +Inf is always equal to x <= DBL_MAX.  */
6991       real_maxval (&max, neg, mode);
6992       return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6993                           arg0, build_real (TREE_TYPE (arg0), max));
6994
6995     case NE_EXPR:
6996       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6997       real_maxval (&max, neg, mode);
6998       if (! HONOR_NANS (mode))
6999         return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
7000                             arg0, build_real (TREE_TYPE (arg0), max));
7001
7002       temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
7003                           arg0, build_real (TREE_TYPE (arg0), max));
7004       return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp);
7005
7006     default:
7007       break;
7008     }
7009
7010   return NULL_TREE;
7011 }
7012
7013 /* Subroutine of fold() that optimizes comparisons of a division by
7014    a nonzero integer constant against an integer constant, i.e.
7015    X/C1 op C2.
7016
7017    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
7018    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
7019    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
7020
7021    The function returns the constant folded tree if a simplification
7022    can be made, and NULL_TREE otherwise.  */
7023
7024 static tree
7025 fold_div_compare (location_t loc,
7026                   enum tree_code code, tree type, tree arg0, tree arg1)
7027 {
7028   tree prod, tmp, hi, lo;
7029   tree arg00 = TREE_OPERAND (arg0, 0);
7030   tree arg01 = TREE_OPERAND (arg0, 1);
7031   unsigned HOST_WIDE_INT lpart;
7032   HOST_WIDE_INT hpart;
7033   bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
7034   bool neg_overflow;
7035   int overflow;
7036
7037   /* We have to do this the hard way to detect unsigned overflow.
7038      prod = int_const_binop (MULT_EXPR, arg01, arg1, 0);  */
7039   overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
7040                                    TREE_INT_CST_HIGH (arg01),
7041                                    TREE_INT_CST_LOW (arg1),
7042                                    TREE_INT_CST_HIGH (arg1),
7043                                    &lpart, &hpart, unsigned_p);
7044   prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
7045                                 -1, overflow);
7046   neg_overflow = false;
7047
7048   if (unsigned_p)
7049     {
7050       tmp = int_const_binop (MINUS_EXPR, arg01,
7051                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7052       lo = prod;
7053
7054       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0).  */
7055       overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
7056                                        TREE_INT_CST_HIGH (prod),
7057                                        TREE_INT_CST_LOW (tmp),
7058                                        TREE_INT_CST_HIGH (tmp),
7059                                        &lpart, &hpart, unsigned_p);
7060       hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
7061                                   -1, overflow | TREE_OVERFLOW (prod));
7062     }
7063   else if (tree_int_cst_sgn (arg01) >= 0)
7064     {
7065       tmp = int_const_binop (MINUS_EXPR, arg01,
7066                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7067       switch (tree_int_cst_sgn (arg1))
7068         {
7069         case -1:
7070           neg_overflow = true;
7071           lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
7072           hi = prod;
7073           break;
7074
7075         case  0:
7076           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
7077           hi = tmp;
7078           break;
7079
7080         case  1:
7081           hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
7082           lo = prod;
7083           break;
7084
7085         default:
7086           gcc_unreachable ();
7087         }
7088     }
7089   else
7090     {
7091       /* A negative divisor reverses the relational operators.  */
7092       code = swap_tree_comparison (code);
7093
7094       tmp = int_const_binop (PLUS_EXPR, arg01,
7095                              build_int_cst (TREE_TYPE (arg01), 1), 0);
7096       switch (tree_int_cst_sgn (arg1))
7097         {
7098         case -1:
7099           hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
7100           lo = prod;
7101           break;
7102
7103         case  0:
7104           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
7105           lo = tmp;
7106           break;
7107
7108         case  1:
7109           neg_overflow = true;
7110           lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
7111           hi = prod;
7112           break;
7113
7114         default:
7115           gcc_unreachable ();
7116         }
7117     }
7118
7119   switch (code)
7120     {
7121     case EQ_EXPR:
7122       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
7123         return omit_one_operand_loc (loc, type, integer_zero_node, arg00);
7124       if (TREE_OVERFLOW (hi))
7125         return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
7126       if (TREE_OVERFLOW (lo))
7127         return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
7128       return build_range_check (loc, type, arg00, 1, lo, hi);
7129
7130     case NE_EXPR:
7131       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
7132         return omit_one_operand_loc (loc, type, integer_one_node, arg00);
7133       if (TREE_OVERFLOW (hi))
7134         return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
7135       if (TREE_OVERFLOW (lo))
7136         return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
7137       return build_range_check (loc, type, arg00, 0, lo, hi);
7138
7139     case LT_EXPR:
7140       if (TREE_OVERFLOW (lo))
7141         {
7142           tmp = neg_overflow ? integer_zero_node : integer_one_node;
7143           return omit_one_operand_loc (loc, type, tmp, arg00);
7144         }
7145       return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
7146
7147     case LE_EXPR:
7148       if (TREE_OVERFLOW (hi))
7149         {
7150           tmp = neg_overflow ? integer_zero_node : integer_one_node;
7151           return omit_one_operand_loc (loc, type, tmp, arg00);
7152         }
7153       return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
7154
7155     case GT_EXPR:
7156       if (TREE_OVERFLOW (hi))
7157         {
7158           tmp = neg_overflow ? integer_one_node : integer_zero_node;
7159           return omit_one_operand_loc (loc, type, tmp, arg00);
7160         }
7161       return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
7162
7163     case GE_EXPR:
7164       if (TREE_OVERFLOW (lo))
7165         {
7166           tmp = neg_overflow ? integer_one_node : integer_zero_node;
7167           return omit_one_operand_loc (loc, type, tmp, arg00);
7168         }
7169       return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
7170
7171     default:
7172       break;
7173     }
7174
7175   return NULL_TREE;
7176 }
7177
7178
7179 /* If CODE with arguments ARG0 and ARG1 represents a single bit
7180    equality/inequality test, then return a simplified form of the test
7181    using a sign testing.  Otherwise return NULL.  TYPE is the desired
7182    result type.  */
7183
7184 static tree
7185 fold_single_bit_test_into_sign_test (location_t loc,
7186                                      enum tree_code code, tree arg0, tree arg1,
7187                                      tree result_type)
7188 {
7189   /* If this is testing a single bit, we can optimize the test.  */
7190   if ((code == NE_EXPR || code == EQ_EXPR)
7191       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
7192       && integer_pow2p (TREE_OPERAND (arg0, 1)))
7193     {
7194       /* If we have (A & C) != 0 where C is the sign bit of A, convert
7195          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
7196       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
7197
7198       if (arg00 != NULL_TREE
7199           /* This is only a win if casting to a signed type is cheap,
7200              i.e. when arg00's type is not a partial mode.  */
7201           && TYPE_PRECISION (TREE_TYPE (arg00))
7202              == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
7203         {
7204           tree stype = signed_type_for (TREE_TYPE (arg00));
7205           return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
7206                               result_type,
7207                               fold_convert_loc (loc, stype, arg00),
7208                               build_int_cst (stype, 0));
7209         }
7210     }
7211
7212   return NULL_TREE;
7213 }
7214
7215 /* If CODE with arguments ARG0 and ARG1 represents a single bit
7216    equality/inequality test, then return a simplified form of
7217    the test using shifts and logical operations.  Otherwise return
7218    NULL.  TYPE is the desired result type.  */
7219
7220 tree
7221 fold_single_bit_test (location_t loc, enum tree_code code,
7222                       tree arg0, tree arg1, tree result_type)
7223 {
7224   /* If this is testing a single bit, we can optimize the test.  */
7225   if ((code == NE_EXPR || code == EQ_EXPR)
7226       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
7227       && integer_pow2p (TREE_OPERAND (arg0, 1)))
7228     {
7229       tree inner = TREE_OPERAND (arg0, 0);
7230       tree type = TREE_TYPE (arg0);
7231       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
7232       enum machine_mode operand_mode = TYPE_MODE (type);
7233       int ops_unsigned;
7234       tree signed_type, unsigned_type, intermediate_type;
7235       tree tem, one;
7236
7237       /* First, see if we can fold the single bit test into a sign-bit
7238          test.  */
7239       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1,
7240                                                  result_type);
7241       if (tem)
7242         return tem;
7243
7244       /* Otherwise we have (A & C) != 0 where C is a single bit,
7245          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
7246          Similarly for (A & C) == 0.  */
7247
7248       /* If INNER is a right shift of a constant and it plus BITNUM does
7249          not overflow, adjust BITNUM and INNER.  */
7250       if (TREE_CODE (inner) == RSHIFT_EXPR
7251           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
7252           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
7253           && bitnum < TYPE_PRECISION (type)
7254           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
7255                                    bitnum - TYPE_PRECISION (type)))
7256         {
7257           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
7258           inner = TREE_OPERAND (inner, 0);
7259         }
7260
7261       /* If we are going to be able to omit the AND below, we must do our
7262          operations as unsigned.  If we must use the AND, we have a choice.
7263          Normally unsigned is faster, but for some machines signed is.  */
7264 #ifdef LOAD_EXTEND_OP
7265       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
7266                       && !flag_syntax_only) ? 0 : 1;
7267 #else
7268       ops_unsigned = 1;
7269 #endif
7270
7271       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
7272       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
7273       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
7274       inner = fold_convert_loc (loc, intermediate_type, inner);
7275
7276       if (bitnum != 0)
7277         inner = build2 (RSHIFT_EXPR, intermediate_type,
7278                         inner, size_int (bitnum));
7279
7280       one = build_int_cst (intermediate_type, 1);
7281
7282       if (code == EQ_EXPR)
7283         inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one);
7284
7285       /* Put the AND last so it can combine with more things.  */
7286       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
7287
7288       /* Make sure to return the proper type.  */
7289       inner = fold_convert_loc (loc, result_type, inner);
7290
7291       return inner;
7292     }
7293   return NULL_TREE;
7294 }
7295
7296 /* Check whether we are allowed to reorder operands arg0 and arg1,
7297    such that the evaluation of arg1 occurs before arg0.  */
7298
7299 static bool
7300 reorder_operands_p (const_tree arg0, const_tree arg1)
7301 {
7302   if (! flag_evaluation_order)
7303       return true;
7304   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
7305     return true;
7306   return ! TREE_SIDE_EFFECTS (arg0)
7307          && ! TREE_SIDE_EFFECTS (arg1);
7308 }
7309
7310 /* Test whether it is preferable two swap two operands, ARG0 and
7311    ARG1, for example because ARG0 is an integer constant and ARG1
7312    isn't.  If REORDER is true, only recommend swapping if we can
7313    evaluate the operands in reverse order.  */
7314
7315 bool
7316 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
7317 {
7318   STRIP_SIGN_NOPS (arg0);
7319   STRIP_SIGN_NOPS (arg1);
7320
7321   if (TREE_CODE (arg1) == INTEGER_CST)
7322     return 0;
7323   if (TREE_CODE (arg0) == INTEGER_CST)
7324     return 1;
7325
7326   if (TREE_CODE (arg1) == REAL_CST)
7327     return 0;
7328   if (TREE_CODE (arg0) == REAL_CST)
7329     return 1;
7330
7331   if (TREE_CODE (arg1) == FIXED_CST)
7332     return 0;
7333   if (TREE_CODE (arg0) == FIXED_CST)
7334     return 1;
7335
7336   if (TREE_CODE (arg1) == COMPLEX_CST)
7337     return 0;
7338   if (TREE_CODE (arg0) == COMPLEX_CST)
7339     return 1;
7340
7341   if (TREE_CONSTANT (arg1))
7342     return 0;
7343   if (TREE_CONSTANT (arg0))
7344     return 1;
7345
7346   if (optimize_function_for_size_p (cfun))
7347     return 0;
7348
7349   if (reorder && flag_evaluation_order
7350       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
7351     return 0;
7352
7353   /* It is preferable to swap two SSA_NAME to ensure a canonical form
7354      for commutative and comparison operators.  Ensuring a canonical
7355      form allows the optimizers to find additional redundancies without
7356      having to explicitly check for both orderings.  */
7357   if (TREE_CODE (arg0) == SSA_NAME
7358       && TREE_CODE (arg1) == SSA_NAME
7359       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
7360     return 1;
7361
7362   /* Put SSA_NAMEs last.  */
7363   if (TREE_CODE (arg1) == SSA_NAME)
7364     return 0;
7365   if (TREE_CODE (arg0) == SSA_NAME)
7366     return 1;
7367
7368   /* Put variables last.  */
7369   if (DECL_P (arg1))
7370     return 0;
7371   if (DECL_P (arg0))
7372     return 1;
7373
7374   return 0;
7375 }
7376
7377 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
7378    ARG0 is extended to a wider type.  */
7379
7380 static tree
7381 fold_widened_comparison (location_t loc, enum tree_code code,
7382                          tree type, tree arg0, tree arg1)
7383 {
7384   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
7385   tree arg1_unw;
7386   tree shorter_type, outer_type;
7387   tree min, max;
7388   bool above, below;
7389
7390   if (arg0_unw == arg0)
7391     return NULL_TREE;
7392   shorter_type = TREE_TYPE (arg0_unw);
7393
7394 #ifdef HAVE_canonicalize_funcptr_for_compare
7395   /* Disable this optimization if we're casting a function pointer
7396      type on targets that require function pointer canonicalization.  */
7397   if (HAVE_canonicalize_funcptr_for_compare
7398       && TREE_CODE (shorter_type) == POINTER_TYPE
7399       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
7400     return NULL_TREE;
7401 #endif
7402
7403   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
7404     return NULL_TREE;
7405
7406   arg1_unw = get_unwidened (arg1, NULL_TREE);
7407
7408   /* If possible, express the comparison in the shorter mode.  */
7409   if ((code == EQ_EXPR || code == NE_EXPR
7410        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
7411       && (TREE_TYPE (arg1_unw) == shorter_type
7412           || ((TYPE_PRECISION (shorter_type)
7413                >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
7414               && (TYPE_UNSIGNED (shorter_type)
7415                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
7416           || (TREE_CODE (arg1_unw) == INTEGER_CST
7417               && (TREE_CODE (shorter_type) == INTEGER_TYPE
7418                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
7419               && int_fits_type_p (arg1_unw, shorter_type))))
7420     return fold_build2_loc (loc, code, type, arg0_unw,
7421                         fold_convert_loc (loc, shorter_type, arg1_unw));
7422
7423   if (TREE_CODE (arg1_unw) != INTEGER_CST
7424       || TREE_CODE (shorter_type) != INTEGER_TYPE
7425       || !int_fits_type_p (arg1_unw, shorter_type))
7426     return NULL_TREE;
7427
7428   /* If we are comparing with the integer that does not fit into the range
7429      of the shorter type, the result is known.  */
7430   outer_type = TREE_TYPE (arg1_unw);
7431   min = lower_bound_in_type (outer_type, shorter_type);
7432   max = upper_bound_in_type (outer_type, shorter_type);
7433
7434   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7435                                                    max, arg1_unw));
7436   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7437                                                    arg1_unw, min));
7438
7439   switch (code)
7440     {
7441     case EQ_EXPR:
7442       if (above || below)
7443         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7444       break;
7445
7446     case NE_EXPR:
7447       if (above || below)
7448         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7449       break;
7450
7451     case LT_EXPR:
7452     case LE_EXPR:
7453       if (above)
7454         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7455       else if (below)
7456         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7457
7458     case GT_EXPR:
7459     case GE_EXPR:
7460       if (above)
7461         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7462       else if (below)
7463         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7464
7465     default:
7466       break;
7467     }
7468
7469   return NULL_TREE;
7470 }
7471
7472 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
7473    ARG0 just the signedness is changed.  */
7474
7475 static tree
7476 fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type,
7477                               tree arg0, tree arg1)
7478 {
7479   tree arg0_inner;
7480   tree inner_type, outer_type;
7481
7482   if (!CONVERT_EXPR_P (arg0))
7483     return NULL_TREE;
7484
7485   outer_type = TREE_TYPE (arg0);
7486   arg0_inner = TREE_OPERAND (arg0, 0);
7487   inner_type = TREE_TYPE (arg0_inner);
7488
7489 #ifdef HAVE_canonicalize_funcptr_for_compare
7490   /* Disable this optimization if we're casting a function pointer
7491      type on targets that require function pointer canonicalization.  */
7492   if (HAVE_canonicalize_funcptr_for_compare
7493       && TREE_CODE (inner_type) == POINTER_TYPE
7494       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
7495     return NULL_TREE;
7496 #endif
7497
7498   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
7499     return NULL_TREE;
7500
7501   if (TREE_CODE (arg1) != INTEGER_CST
7502       && !(CONVERT_EXPR_P (arg1)
7503            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
7504     return NULL_TREE;
7505
7506   if ((TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
7507        || POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
7508       && code != NE_EXPR
7509       && code != EQ_EXPR)
7510     return NULL_TREE;
7511
7512   if (TREE_CODE (arg1) == INTEGER_CST)
7513     arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
7514                                   TREE_INT_CST_HIGH (arg1), 0,
7515                                   TREE_OVERFLOW (arg1));
7516   else
7517     arg1 = fold_convert_loc (loc, inner_type, arg1);
7518
7519   return fold_build2_loc (loc, code, type, arg0_inner, arg1);
7520 }
7521
7522 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
7523    step of the array.  Reconstructs s and delta in the case of s *
7524    delta being an integer constant (and thus already folded).  ADDR is
7525    the address. MULT is the multiplicative expression.  If the
7526    function succeeds, the new address expression is returned.
7527    Otherwise NULL_TREE is returned.  LOC is the location of the
7528    resulting expression.  */
7529
7530 static tree
7531 try_move_mult_to_index (location_t loc, tree addr, tree op1)
7532 {
7533   tree s, delta, step;
7534   tree ref = TREE_OPERAND (addr, 0), pref;
7535   tree ret, pos;
7536   tree itype;
7537   bool mdim = false;
7538
7539   /*  Strip the nops that might be added when converting op1 to sizetype. */
7540   STRIP_NOPS (op1);
7541
7542   /* Canonicalize op1 into a possibly non-constant delta
7543      and an INTEGER_CST s.  */
7544   if (TREE_CODE (op1) == MULT_EXPR)
7545     {
7546       tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
7547
7548       STRIP_NOPS (arg0);
7549       STRIP_NOPS (arg1);
7550
7551       if (TREE_CODE (arg0) == INTEGER_CST)
7552         {
7553           s = arg0;
7554           delta = arg1;
7555         }
7556       else if (TREE_CODE (arg1) == INTEGER_CST)
7557         {
7558           s = arg1;
7559           delta = arg0;
7560         }
7561       else
7562         return NULL_TREE;
7563     }
7564   else if (TREE_CODE (op1) == INTEGER_CST)
7565     {
7566       delta = op1;
7567       s = NULL_TREE;
7568     }
7569   else
7570     {
7571       /* Simulate we are delta * 1.  */
7572       delta = op1;
7573       s = integer_one_node;
7574     }
7575
7576   for (;; ref = TREE_OPERAND (ref, 0))
7577     {
7578       if (TREE_CODE (ref) == ARRAY_REF)
7579         {
7580           tree domain;
7581
7582           /* Remember if this was a multi-dimensional array.  */
7583           if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
7584             mdim = true;
7585
7586           domain = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
7587           if (! domain)
7588             continue;
7589           itype = TREE_TYPE (domain);
7590
7591           step = array_ref_element_size (ref);
7592           if (TREE_CODE (step) != INTEGER_CST)
7593             continue;
7594
7595           if (s)
7596             {
7597               if (! tree_int_cst_equal (step, s))
7598                 continue;
7599             }
7600           else
7601             {
7602               /* Try if delta is a multiple of step.  */
7603               tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
7604               if (! tmp)
7605                 continue;
7606               delta = tmp;
7607             }
7608
7609           /* Only fold here if we can verify we do not overflow one
7610              dimension of a multi-dimensional array.  */
7611           if (mdim)
7612             {
7613               tree tmp;
7614
7615               if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
7616                   || !TYPE_MAX_VALUE (domain)
7617                   || TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST)
7618                 continue;
7619
7620               tmp = fold_binary_loc (loc, PLUS_EXPR, itype,
7621                                      fold_convert_loc (loc, itype,
7622                                                        TREE_OPERAND (ref, 1)),
7623                                      fold_convert_loc (loc, itype, delta));
7624               if (!tmp
7625                   || TREE_CODE (tmp) != INTEGER_CST
7626                   || tree_int_cst_lt (TYPE_MAX_VALUE (domain), tmp))
7627                 continue;
7628             }
7629
7630           break;
7631         }
7632       else
7633         mdim = false;
7634
7635       if (!handled_component_p (ref))
7636         return NULL_TREE;
7637     }
7638
7639   /* We found the suitable array reference.  So copy everything up to it,
7640      and replace the index.  */
7641
7642   pref = TREE_OPERAND (addr, 0);
7643   ret = copy_node (pref);
7644   SET_EXPR_LOCATION (ret, loc);
7645   pos = ret;
7646
7647   while (pref != ref)
7648     {
7649       pref = TREE_OPERAND (pref, 0);
7650       TREE_OPERAND (pos, 0) = copy_node (pref);
7651       pos = TREE_OPERAND (pos, 0);
7652     }
7653
7654   TREE_OPERAND (pos, 1) = fold_build2_loc (loc, PLUS_EXPR, itype,
7655                                        fold_convert_loc (loc, itype,
7656                                                          TREE_OPERAND (pos, 1)),
7657                                        fold_convert_loc (loc, itype, delta));
7658
7659   return fold_build1_loc (loc, ADDR_EXPR, TREE_TYPE (addr), ret);
7660 }
7661
7662
7663 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7664    means A >= Y && A != MAX, but in this case we know that
7665    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7666
7667 static tree
7668 fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound)
7669 {
7670   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7671
7672   if (TREE_CODE (bound) == LT_EXPR)
7673     a = TREE_OPERAND (bound, 0);
7674   else if (TREE_CODE (bound) == GT_EXPR)
7675     a = TREE_OPERAND (bound, 1);
7676   else
7677     return NULL_TREE;
7678
7679   typea = TREE_TYPE (a);
7680   if (!INTEGRAL_TYPE_P (typea)
7681       && !POINTER_TYPE_P (typea))
7682     return NULL_TREE;
7683
7684   if (TREE_CODE (ineq) == LT_EXPR)
7685     {
7686       a1 = TREE_OPERAND (ineq, 1);
7687       y = TREE_OPERAND (ineq, 0);
7688     }
7689   else if (TREE_CODE (ineq) == GT_EXPR)
7690     {
7691       a1 = TREE_OPERAND (ineq, 0);
7692       y = TREE_OPERAND (ineq, 1);
7693     }
7694   else
7695     return NULL_TREE;
7696
7697   if (TREE_TYPE (a1) != typea)
7698     return NULL_TREE;
7699
7700   if (POINTER_TYPE_P (typea))
7701     {
7702       /* Convert the pointer types into integer before taking the difference.  */
7703       tree ta = fold_convert_loc (loc, ssizetype, a);
7704       tree ta1 = fold_convert_loc (loc, ssizetype, a1);
7705       diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta);
7706     }
7707   else
7708     diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a);
7709
7710   if (!diff || !integer_onep (diff))
7711    return NULL_TREE;
7712
7713   return fold_build2_loc (loc, GE_EXPR, type, a, y);
7714 }
7715
7716 /* Fold a sum or difference of at least one multiplication.
7717    Returns the folded tree or NULL if no simplification could be made.  */
7718
7719 static tree
7720 fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
7721                           tree arg0, tree arg1)
7722 {
7723   tree arg00, arg01, arg10, arg11;
7724   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7725
7726   /* (A * C) +- (B * C) -> (A+-B) * C.
7727      (A * C) +- A -> A * (C+-1).
7728      We are most concerned about the case where C is a constant,
7729      but other combinations show up during loop reduction.  Since
7730      it is not difficult, try all four possibilities.  */
7731
7732   if (TREE_CODE (arg0) == MULT_EXPR)
7733     {
7734       arg00 = TREE_OPERAND (arg0, 0);
7735       arg01 = TREE_OPERAND (arg0, 1);
7736     }
7737   else if (TREE_CODE (arg0) == INTEGER_CST)
7738     {
7739       arg00 = build_one_cst (type);
7740       arg01 = arg0;
7741     }
7742   else
7743     {
7744       /* We cannot generate constant 1 for fract.  */
7745       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7746         return NULL_TREE;
7747       arg00 = arg0;
7748       arg01 = build_one_cst (type);
7749     }
7750   if (TREE_CODE (arg1) == MULT_EXPR)
7751     {
7752       arg10 = TREE_OPERAND (arg1, 0);
7753       arg11 = TREE_OPERAND (arg1, 1);
7754     }
7755   else if (TREE_CODE (arg1) == INTEGER_CST)
7756     {
7757       arg10 = build_one_cst (type);
7758       /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7759          the purpose of this canonicalization.  */
7760       if (TREE_INT_CST_HIGH (arg1) == -1
7761           && negate_expr_p (arg1)
7762           && code == PLUS_EXPR)
7763         {
7764           arg11 = negate_expr (arg1);
7765           code = MINUS_EXPR;
7766         }
7767       else
7768         arg11 = arg1;
7769     }
7770   else
7771     {
7772       /* We cannot generate constant 1 for fract.  */
7773       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7774         return NULL_TREE;
7775       arg10 = arg1;
7776       arg11 = build_one_cst (type);
7777     }
7778   same = NULL_TREE;
7779
7780   if (operand_equal_p (arg01, arg11, 0))
7781     same = arg01, alt0 = arg00, alt1 = arg10;
7782   else if (operand_equal_p (arg00, arg10, 0))
7783     same = arg00, alt0 = arg01, alt1 = arg11;
7784   else if (operand_equal_p (arg00, arg11, 0))
7785     same = arg00, alt0 = arg01, alt1 = arg10;
7786   else if (operand_equal_p (arg01, arg10, 0))
7787     same = arg01, alt0 = arg00, alt1 = arg11;
7788
7789   /* No identical multiplicands; see if we can find a common
7790      power-of-two factor in non-power-of-two multiplies.  This
7791      can help in multi-dimensional array access.  */
7792   else if (host_integerp (arg01, 0)
7793            && host_integerp (arg11, 0))
7794     {
7795       HOST_WIDE_INT int01, int11, tmp;
7796       bool swap = false;
7797       tree maybe_same;
7798       int01 = TREE_INT_CST_LOW (arg01);
7799       int11 = TREE_INT_CST_LOW (arg11);
7800
7801       /* Move min of absolute values to int11.  */
7802       if ((int01 >= 0 ? int01 : -int01)
7803           < (int11 >= 0 ? int11 : -int11))
7804         {
7805           tmp = int01, int01 = int11, int11 = tmp;
7806           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7807           maybe_same = arg01;
7808           swap = true;
7809         }
7810       else
7811         maybe_same = arg11;
7812
7813       if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0
7814           /* The remainder should not be a constant, otherwise we
7815              end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7816              increased the number of multiplications necessary.  */
7817           && TREE_CODE (arg10) != INTEGER_CST)
7818         {
7819           alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00,
7820                               build_int_cst (TREE_TYPE (arg00),
7821                                              int01 / int11));
7822           alt1 = arg10;
7823           same = maybe_same;
7824           if (swap)
7825             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7826         }
7827     }
7828
7829   if (same)
7830     return fold_build2_loc (loc, MULT_EXPR, type,
7831                         fold_build2_loc (loc, code, type,
7832                                      fold_convert_loc (loc, type, alt0),
7833                                      fold_convert_loc (loc, type, alt1)),
7834                         fold_convert_loc (loc, type, same));
7835
7836   return NULL_TREE;
7837 }
7838
7839 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7840    specified by EXPR into the buffer PTR of length LEN bytes.
7841    Return the number of bytes placed in the buffer, or zero
7842    upon failure.  */
7843
7844 static int
7845 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7846 {
7847   tree type = TREE_TYPE (expr);
7848   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7849   int byte, offset, word, words;
7850   unsigned char value;
7851
7852   if (total_bytes > len)
7853     return 0;
7854   words = total_bytes / UNITS_PER_WORD;
7855
7856   for (byte = 0; byte < total_bytes; byte++)
7857     {
7858       int bitpos = byte * BITS_PER_UNIT;
7859       if (bitpos < HOST_BITS_PER_WIDE_INT)
7860         value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7861       else
7862         value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7863                                  >> (bitpos - HOST_BITS_PER_WIDE_INT));
7864
7865       if (total_bytes > UNITS_PER_WORD)
7866         {
7867           word = byte / UNITS_PER_WORD;
7868           if (WORDS_BIG_ENDIAN)
7869             word = (words - 1) - word;
7870           offset = word * UNITS_PER_WORD;
7871           if (BYTES_BIG_ENDIAN)
7872             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7873           else
7874             offset += byte % UNITS_PER_WORD;
7875         }
7876       else
7877         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7878       ptr[offset] = value;
7879     }
7880   return total_bytes;
7881 }
7882
7883
7884 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7885    specified by EXPR into the buffer PTR of length LEN bytes.
7886    Return the number of bytes placed in the buffer, or zero
7887    upon failure.  */
7888
7889 static int
7890 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7891 {
7892   tree type = TREE_TYPE (expr);
7893   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7894   int byte, offset, word, words, bitpos;
7895   unsigned char value;
7896
7897   /* There are always 32 bits in each long, no matter the size of
7898      the hosts long.  We handle floating point representations with
7899      up to 192 bits.  */
7900   long tmp[6];
7901
7902   if (total_bytes > len)
7903     return 0;
7904   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7905
7906   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7907
7908   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7909        bitpos += BITS_PER_UNIT)
7910     {
7911       byte = (bitpos / BITS_PER_UNIT) & 3;
7912       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7913
7914       if (UNITS_PER_WORD < 4)
7915         {
7916           word = byte / UNITS_PER_WORD;
7917           if (WORDS_BIG_ENDIAN)
7918             word = (words - 1) - word;
7919           offset = word * UNITS_PER_WORD;
7920           if (BYTES_BIG_ENDIAN)
7921             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7922           else
7923             offset += byte % UNITS_PER_WORD;
7924         }
7925       else
7926         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7927       ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7928     }
7929   return total_bytes;
7930 }
7931
7932 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7933    specified by EXPR into the buffer PTR of length LEN bytes.
7934    Return the number of bytes placed in the buffer, or zero
7935    upon failure.  */
7936
7937 static int
7938 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7939 {
7940   int rsize, isize;
7941   tree part;
7942
7943   part = TREE_REALPART (expr);
7944   rsize = native_encode_expr (part, ptr, len);
7945   if (rsize == 0)
7946     return 0;
7947   part = TREE_IMAGPART (expr);
7948   isize = native_encode_expr (part, ptr+rsize, len-rsize);
7949   if (isize != rsize)
7950     return 0;
7951   return rsize + isize;
7952 }
7953
7954
7955 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7956    specified by EXPR into the buffer PTR of length LEN bytes.
7957    Return the number of bytes placed in the buffer, or zero
7958    upon failure.  */
7959
7960 static int
7961 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7962 {
7963   int i, size, offset, count;
7964   tree itype, elem, elements;
7965
7966   offset = 0;
7967   elements = TREE_VECTOR_CST_ELTS (expr);
7968   count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7969   itype = TREE_TYPE (TREE_TYPE (expr));
7970   size = GET_MODE_SIZE (TYPE_MODE (itype));
7971   for (i = 0; i < count; i++)
7972     {
7973       if (elements)
7974         {
7975           elem = TREE_VALUE (elements);
7976           elements = TREE_CHAIN (elements);
7977         }
7978       else
7979         elem = NULL_TREE;
7980
7981       if (elem)
7982         {
7983           if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7984             return 0;
7985         }
7986       else
7987         {
7988           if (offset + size > len)
7989             return 0;
7990           memset (ptr+offset, 0, size);
7991         }
7992       offset += size;
7993     }
7994   return offset;
7995 }
7996
7997
7998 /* Subroutine of native_encode_expr.  Encode the STRING_CST
7999    specified by EXPR into the buffer PTR of length LEN bytes.
8000    Return the number of bytes placed in the buffer, or zero
8001    upon failure.  */
8002
8003 static int
8004 native_encode_string (const_tree expr, unsigned char *ptr, int len)
8005 {
8006   tree type = TREE_TYPE (expr);
8007   HOST_WIDE_INT total_bytes;
8008
8009   if (TREE_CODE (type) != ARRAY_TYPE
8010       || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
8011       || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
8012       || !host_integerp (TYPE_SIZE_UNIT (type), 0))
8013     return 0;
8014   total_bytes = tree_low_cst (TYPE_SIZE_UNIT (type), 0);
8015   if (total_bytes > len)
8016     return 0;
8017   if (TREE_STRING_LENGTH (expr) < total_bytes)
8018     {
8019       memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr));
8020       memset (ptr + TREE_STRING_LENGTH (expr), 0,
8021               total_bytes - TREE_STRING_LENGTH (expr));
8022     }
8023   else
8024     memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes);
8025   return total_bytes;
8026 }
8027
8028
8029 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
8030    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
8031    buffer PTR of length LEN bytes.  Return the number of bytes
8032    placed in the buffer, or zero upon failure.  */
8033
8034 int
8035 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
8036 {
8037   switch (TREE_CODE (expr))
8038     {
8039     case INTEGER_CST:
8040       return native_encode_int (expr, ptr, len);
8041
8042     case REAL_CST:
8043       return native_encode_real (expr, ptr, len);
8044
8045     case COMPLEX_CST:
8046       return native_encode_complex (expr, ptr, len);
8047
8048     case VECTOR_CST:
8049       return native_encode_vector (expr, ptr, len);
8050
8051     case STRING_CST:
8052       return native_encode_string (expr, ptr, len);
8053
8054     default:
8055       return 0;
8056     }
8057 }
8058
8059
8060 /* Subroutine of native_interpret_expr.  Interpret the contents of
8061    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
8062    If the buffer cannot be interpreted, return NULL_TREE.  */
8063
8064 static tree
8065 native_interpret_int (tree type, const unsigned char *ptr, int len)
8066 {
8067   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
8068   int byte, offset, word, words;
8069   unsigned char value;
8070   unsigned int HOST_WIDE_INT lo = 0;
8071   HOST_WIDE_INT hi = 0;
8072
8073   if (total_bytes > len)
8074     return NULL_TREE;
8075   if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
8076     return NULL_TREE;
8077   words = total_bytes / UNITS_PER_WORD;
8078
8079   for (byte = 0; byte < total_bytes; byte++)
8080     {
8081       int bitpos = byte * BITS_PER_UNIT;
8082       if (total_bytes > UNITS_PER_WORD)
8083         {
8084           word = byte / UNITS_PER_WORD;
8085           if (WORDS_BIG_ENDIAN)
8086             word = (words - 1) - word;
8087           offset = word * UNITS_PER_WORD;
8088           if (BYTES_BIG_ENDIAN)
8089             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
8090           else
8091             offset += byte % UNITS_PER_WORD;
8092         }
8093       else
8094         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
8095       value = ptr[offset];
8096
8097       if (bitpos < HOST_BITS_PER_WIDE_INT)
8098         lo |= (unsigned HOST_WIDE_INT) value << bitpos;
8099       else
8100         hi |= (unsigned HOST_WIDE_INT) value
8101               << (bitpos - HOST_BITS_PER_WIDE_INT);
8102     }
8103
8104   return build_int_cst_wide_type (type, lo, hi);
8105 }
8106
8107
8108 /* Subroutine of native_interpret_expr.  Interpret the contents of
8109    the buffer PTR of length LEN as a REAL_CST of type TYPE.
8110    If the buffer cannot be interpreted, return NULL_TREE.  */
8111
8112 static tree
8113 native_interpret_real (tree type, const unsigned char *ptr, int len)
8114 {
8115   enum machine_mode mode = TYPE_MODE (type);
8116   int total_bytes = GET_MODE_SIZE (mode);
8117   int byte, offset, word, words, bitpos;
8118   unsigned char value;
8119   /* There are always 32 bits in each long, no matter the size of
8120      the hosts long.  We handle floating point representations with
8121      up to 192 bits.  */
8122   REAL_VALUE_TYPE r;
8123   long tmp[6];
8124
8125   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
8126   if (total_bytes > len || total_bytes > 24)
8127     return NULL_TREE;
8128   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
8129
8130   memset (tmp, 0, sizeof (tmp));
8131   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
8132        bitpos += BITS_PER_UNIT)
8133     {
8134       byte = (bitpos / BITS_PER_UNIT) & 3;
8135       if (UNITS_PER_WORD < 4)
8136         {
8137           word = byte / UNITS_PER_WORD;
8138           if (WORDS_BIG_ENDIAN)
8139             word = (words - 1) - word;
8140           offset = word * UNITS_PER_WORD;
8141           if (BYTES_BIG_ENDIAN)
8142             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
8143           else
8144             offset += byte % UNITS_PER_WORD;
8145         }
8146       else
8147         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
8148       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
8149
8150       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
8151     }
8152
8153   real_from_target (&r, tmp, mode);
8154   return build_real (type, r);
8155 }
8156
8157
8158 /* Subroutine of native_interpret_expr.  Interpret the contents of
8159    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
8160    If the buffer cannot be interpreted, return NULL_TREE.  */
8161
8162 static tree
8163 native_interpret_complex (tree type, const unsigned char *ptr, int len)
8164 {
8165   tree etype, rpart, ipart;
8166   int size;
8167
8168   etype = TREE_TYPE (type);
8169   size = GET_MODE_SIZE (TYPE_MODE (etype));
8170   if (size * 2 > len)
8171     return NULL_TREE;
8172   rpart = native_interpret_expr (etype, ptr, size);
8173   if (!rpart)
8174     return NULL_TREE;
8175   ipart = native_interpret_expr (etype, ptr+size, size);
8176   if (!ipart)
8177     return NULL_TREE;
8178   return build_complex (type, rpart, ipart);
8179 }
8180
8181
8182 /* Subroutine of native_interpret_expr.  Interpret the contents of
8183    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
8184    If the buffer cannot be interpreted, return NULL_TREE.  */
8185
8186 static tree
8187 native_interpret_vector (tree type, const unsigned char *ptr, int len)
8188 {
8189   tree etype, elem, elements;
8190   int i, size, count;
8191
8192   etype = TREE_TYPE (type);
8193   size = GET_MODE_SIZE (TYPE_MODE (etype));
8194   count = TYPE_VECTOR_SUBPARTS (type);
8195   if (size * count > len)
8196     return NULL_TREE;
8197
8198   elements = NULL_TREE;
8199   for (i = count - 1; i >= 0; i--)
8200     {
8201       elem = native_interpret_expr (etype, ptr+(i*size), size);
8202       if (!elem)
8203         return NULL_TREE;
8204       elements = tree_cons (NULL_TREE, elem, elements);
8205     }
8206   return build_vector (type, elements);
8207 }
8208
8209
8210 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
8211    the buffer PTR of length LEN as a constant of type TYPE.  For
8212    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
8213    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
8214    return NULL_TREE.  */
8215
8216 tree
8217 native_interpret_expr (tree type, const unsigned char *ptr, int len)
8218 {
8219   switch (TREE_CODE (type))
8220     {
8221     case INTEGER_TYPE:
8222     case ENUMERAL_TYPE:
8223     case BOOLEAN_TYPE:
8224       return native_interpret_int (type, ptr, len);
8225
8226     case REAL_TYPE:
8227       return native_interpret_real (type, ptr, len);
8228
8229     case COMPLEX_TYPE:
8230       return native_interpret_complex (type, ptr, len);
8231
8232     case VECTOR_TYPE:
8233       return native_interpret_vector (type, ptr, len);
8234
8235     default:
8236       return NULL_TREE;
8237     }
8238 }
8239
8240
8241 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
8242    TYPE at compile-time.  If we're unable to perform the conversion
8243    return NULL_TREE.  */
8244
8245 static tree
8246 fold_view_convert_expr (tree type, tree expr)
8247 {
8248   /* We support up to 512-bit values (for V8DFmode).  */
8249   unsigned char buffer[64];
8250   int len;
8251
8252   /* Check that the host and target are sane.  */
8253   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
8254     return NULL_TREE;
8255
8256   len = native_encode_expr (expr, buffer, sizeof (buffer));
8257   if (len == 0)
8258     return NULL_TREE;
8259
8260   return native_interpret_expr (type, buffer, len);
8261 }
8262
8263 /* Build an expression for the address of T.  Folds away INDIRECT_REF
8264    to avoid confusing the gimplify process.  */
8265
8266 tree
8267 build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype)
8268 {
8269   /* The size of the object is not relevant when talking about its address.  */
8270   if (TREE_CODE (t) == WITH_SIZE_EXPR)
8271     t = TREE_OPERAND (t, 0);
8272
8273   /* Note: doesn't apply to ALIGN_INDIRECT_REF */
8274   if (TREE_CODE (t) == INDIRECT_REF
8275       || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
8276     {
8277       t = TREE_OPERAND (t, 0);
8278
8279       if (TREE_TYPE (t) != ptrtype)
8280         {
8281           t = build1 (NOP_EXPR, ptrtype, t);
8282           SET_EXPR_LOCATION (t, loc);
8283         }
8284     }
8285   else if (TREE_CODE (t) == VIEW_CONVERT_EXPR)
8286     {
8287       t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0));
8288
8289       if (TREE_TYPE (t) != ptrtype)
8290         t = fold_convert_loc (loc, ptrtype, t);
8291     }
8292   else
8293     {
8294       t = build1 (ADDR_EXPR, ptrtype, t);
8295       SET_EXPR_LOCATION (t, loc);
8296     }
8297
8298   return t;
8299 }
8300
8301 /* Build an expression for the address of T.  */
8302
8303 tree
8304 build_fold_addr_expr_loc (location_t loc, tree t)
8305 {
8306   tree ptrtype = build_pointer_type (TREE_TYPE (t));
8307
8308   return build_fold_addr_expr_with_type_loc (loc, t, ptrtype);
8309 }
8310
8311 /* Fold a unary expression of code CODE and type TYPE with operand
8312    OP0.  Return the folded expression if folding is successful.
8313    Otherwise, return NULL_TREE.  */
8314
8315 tree
8316 fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
8317 {
8318   tree tem;
8319   tree arg0;
8320   enum tree_code_class kind = TREE_CODE_CLASS (code);
8321
8322   gcc_assert (IS_EXPR_CODE_CLASS (kind)
8323               && TREE_CODE_LENGTH (code) == 1);
8324
8325   arg0 = op0;
8326   if (arg0)
8327     {
8328       if (CONVERT_EXPR_CODE_P (code)
8329           || code == FLOAT_EXPR || code == ABS_EXPR)
8330         {
8331           /* Don't use STRIP_NOPS, because signedness of argument type
8332              matters.  */
8333           STRIP_SIGN_NOPS (arg0);
8334         }
8335       else
8336         {
8337           /* Strip any conversions that don't change the mode.  This
8338              is safe for every expression, except for a comparison
8339              expression because its signedness is derived from its
8340              operands.
8341
8342              Note that this is done as an internal manipulation within
8343              the constant folder, in order to find the simplest
8344              representation of the arguments so that their form can be
8345              studied.  In any cases, the appropriate type conversions
8346              should be put back in the tree that will get out of the
8347              constant folder.  */
8348           STRIP_NOPS (arg0);
8349         }
8350     }
8351
8352   if (TREE_CODE_CLASS (code) == tcc_unary)
8353     {
8354       if (TREE_CODE (arg0) == COMPOUND_EXPR)
8355         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
8356                        fold_build1_loc (loc, code, type,
8357                                     fold_convert_loc (loc, TREE_TYPE (op0),
8358                                                       TREE_OPERAND (arg0, 1))));
8359       else if (TREE_CODE (arg0) == COND_EXPR)
8360         {
8361           tree arg01 = TREE_OPERAND (arg0, 1);
8362           tree arg02 = TREE_OPERAND (arg0, 2);
8363           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
8364             arg01 = fold_build1_loc (loc, code, type,
8365                                  fold_convert_loc (loc,
8366                                                    TREE_TYPE (op0), arg01));
8367           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
8368             arg02 = fold_build1_loc (loc, code, type,
8369                                  fold_convert_loc (loc,
8370                                                    TREE_TYPE (op0), arg02));
8371           tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0),
8372                              arg01, arg02);
8373
8374           /* If this was a conversion, and all we did was to move into
8375              inside the COND_EXPR, bring it back out.  But leave it if
8376              it is a conversion from integer to integer and the
8377              result precision is no wider than a word since such a
8378              conversion is cheap and may be optimized away by combine,
8379              while it couldn't if it were outside the COND_EXPR.  Then return
8380              so we don't get into an infinite recursion loop taking the
8381              conversion out and then back in.  */
8382
8383           if ((CONVERT_EXPR_CODE_P (code)
8384                || code == NON_LVALUE_EXPR)
8385               && TREE_CODE (tem) == COND_EXPR
8386               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
8387               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
8388               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
8389               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
8390               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
8391                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
8392               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8393                      && (INTEGRAL_TYPE_P
8394                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
8395                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
8396                   || flag_syntax_only))
8397             {
8398               tem = build1 (code, type,
8399                             build3 (COND_EXPR,
8400                                     TREE_TYPE (TREE_OPERAND
8401                                                (TREE_OPERAND (tem, 1), 0)),
8402                                     TREE_OPERAND (tem, 0),
8403                                     TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
8404                                     TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
8405               SET_EXPR_LOCATION (tem, loc);
8406             }
8407           return tem;
8408         }
8409       else if (COMPARISON_CLASS_P (arg0))
8410         {
8411           if (TREE_CODE (type) == BOOLEAN_TYPE)
8412             {
8413               arg0 = copy_node (arg0);
8414               TREE_TYPE (arg0) = type;
8415               return arg0;
8416             }
8417           else if (TREE_CODE (type) != INTEGER_TYPE)
8418             return fold_build3_loc (loc, COND_EXPR, type, arg0,
8419                                 fold_build1_loc (loc, code, type,
8420                                              integer_one_node),
8421                                 fold_build1_loc (loc, code, type,
8422                                              integer_zero_node));
8423         }
8424    }
8425
8426   switch (code)
8427     {
8428     case PAREN_EXPR:
8429       /* Re-association barriers around constants and other re-association
8430          barriers can be removed.  */
8431       if (CONSTANT_CLASS_P (op0)
8432           || TREE_CODE (op0) == PAREN_EXPR)
8433         return fold_convert_loc (loc, type, op0);
8434       return NULL_TREE;
8435
8436     CASE_CONVERT:
8437     case FLOAT_EXPR:
8438     case FIX_TRUNC_EXPR:
8439       if (TREE_TYPE (op0) == type)
8440         return op0;
8441
8442       /* If we have (type) (a CMP b) and type is an integral type, return
8443          new expression involving the new type.  */
8444       if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
8445         return fold_build2_loc (loc, TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
8446                             TREE_OPERAND (op0, 1));
8447
8448       /* Handle cases of two conversions in a row.  */
8449       if (CONVERT_EXPR_P (op0))
8450         {
8451           tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
8452           tree inter_type = TREE_TYPE (op0);
8453           int inside_int = INTEGRAL_TYPE_P (inside_type);
8454           int inside_ptr = POINTER_TYPE_P (inside_type);
8455           int inside_float = FLOAT_TYPE_P (inside_type);
8456           int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
8457           unsigned int inside_prec = TYPE_PRECISION (inside_type);
8458           int inside_unsignedp = TYPE_UNSIGNED (inside_type);
8459           int inter_int = INTEGRAL_TYPE_P (inter_type);
8460           int inter_ptr = POINTER_TYPE_P (inter_type);
8461           int inter_float = FLOAT_TYPE_P (inter_type);
8462           int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
8463           unsigned int inter_prec = TYPE_PRECISION (inter_type);
8464           int inter_unsignedp = TYPE_UNSIGNED (inter_type);
8465           int final_int = INTEGRAL_TYPE_P (type);
8466           int final_ptr = POINTER_TYPE_P (type);
8467           int final_float = FLOAT_TYPE_P (type);
8468           int final_vec = TREE_CODE (type) == VECTOR_TYPE;
8469           unsigned int final_prec = TYPE_PRECISION (type);
8470           int final_unsignedp = TYPE_UNSIGNED (type);
8471
8472           /* In addition to the cases of two conversions in a row
8473              handled below, if we are converting something to its own
8474              type via an object of identical or wider precision, neither
8475              conversion is needed.  */
8476           if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
8477               && (((inter_int || inter_ptr) && final_int)
8478                   || (inter_float && final_float))
8479               && inter_prec >= final_prec)
8480             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8481
8482           /* Likewise, if the intermediate and initial types are either both
8483              float or both integer, we don't need the middle conversion if the
8484              former is wider than the latter and doesn't change the signedness
8485              (for integers).  Avoid this if the final type is a pointer since
8486              then we sometimes need the middle conversion.  Likewise if the
8487              final type has a precision not equal to the size of its mode.  */
8488           if (((inter_int && inside_int)
8489                || (inter_float && inside_float)
8490                || (inter_vec && inside_vec))
8491               && inter_prec >= inside_prec
8492               && (inter_float || inter_vec
8493                   || inter_unsignedp == inside_unsignedp)
8494               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8495                     && TYPE_MODE (type) == TYPE_MODE (inter_type))
8496               && ! final_ptr
8497               && (! final_vec || inter_prec == inside_prec))
8498             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8499
8500           /* If we have a sign-extension of a zero-extended value, we can
8501              replace that by a single zero-extension.  */
8502           if (inside_int && inter_int && final_int
8503               && inside_prec < inter_prec && inter_prec < final_prec
8504               && inside_unsignedp && !inter_unsignedp)
8505             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8506
8507           /* Two conversions in a row are not needed unless:
8508              - some conversion is floating-point (overstrict for now), or
8509              - some conversion is a vector (overstrict for now), or
8510              - the intermediate type is narrower than both initial and
8511                final, or
8512              - the intermediate type and innermost type differ in signedness,
8513                and the outermost type is wider than the intermediate, or
8514              - the initial type is a pointer type and the precisions of the
8515                intermediate and final types differ, or
8516              - the final type is a pointer type and the precisions of the
8517                initial and intermediate types differ.  */
8518           if (! inside_float && ! inter_float && ! final_float
8519               && ! inside_vec && ! inter_vec && ! final_vec
8520               && (inter_prec >= inside_prec || inter_prec >= final_prec)
8521               && ! (inside_int && inter_int
8522                     && inter_unsignedp != inside_unsignedp
8523                     && inter_prec < final_prec)
8524               && ((inter_unsignedp && inter_prec > inside_prec)
8525                   == (final_unsignedp && final_prec > inter_prec))
8526               && ! (inside_ptr && inter_prec != final_prec)
8527               && ! (final_ptr && inside_prec != inter_prec)
8528               && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
8529                     && TYPE_MODE (type) == TYPE_MODE (inter_type)))
8530             return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
8531         }
8532
8533       /* Handle (T *)&A.B.C for A being of type T and B and C
8534          living at offset zero.  This occurs frequently in
8535          C++ upcasting and then accessing the base.  */
8536       if (TREE_CODE (op0) == ADDR_EXPR
8537           && POINTER_TYPE_P (type)
8538           && handled_component_p (TREE_OPERAND (op0, 0)))
8539         {
8540           HOST_WIDE_INT bitsize, bitpos;
8541           tree offset;
8542           enum machine_mode mode;
8543           int unsignedp, volatilep;
8544           tree base = TREE_OPERAND (op0, 0);
8545           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
8546                                       &mode, &unsignedp, &volatilep, false);
8547           /* If the reference was to a (constant) zero offset, we can use
8548              the address of the base if it has the same base type
8549              as the result type.  */
8550           if (! offset && bitpos == 0
8551               && TYPE_MAIN_VARIANT (TREE_TYPE (type))
8552                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
8553             return fold_convert_loc (loc, type,
8554                                      build_fold_addr_expr_loc (loc, base));
8555         }
8556
8557       if (TREE_CODE (op0) == MODIFY_EXPR
8558           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
8559           /* Detect assigning a bitfield.  */
8560           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
8561                && DECL_BIT_FIELD
8562                (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
8563         {
8564           /* Don't leave an assignment inside a conversion
8565              unless assigning a bitfield.  */
8566           tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1));
8567           /* First do the assignment, then return converted constant.  */
8568           tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
8569           TREE_NO_WARNING (tem) = 1;
8570           TREE_USED (tem) = 1;
8571           SET_EXPR_LOCATION (tem, loc);
8572           return tem;
8573         }
8574
8575       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
8576          constants (if x has signed type, the sign bit cannot be set
8577          in c).  This folds extension into the BIT_AND_EXPR.
8578          ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
8579          very likely don't have maximal range for their precision and this
8580          transformation effectively doesn't preserve non-maximal ranges.  */
8581       if (TREE_CODE (type) == INTEGER_TYPE
8582           && TREE_CODE (op0) == BIT_AND_EXPR
8583           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
8584         {
8585           tree and_expr = op0;
8586           tree and0 = TREE_OPERAND (and_expr, 0);
8587           tree and1 = TREE_OPERAND (and_expr, 1);
8588           int change = 0;
8589
8590           if (TYPE_UNSIGNED (TREE_TYPE (and_expr))
8591               || (TYPE_PRECISION (type)
8592                   <= TYPE_PRECISION (TREE_TYPE (and_expr))))
8593             change = 1;
8594           else if (TYPE_PRECISION (TREE_TYPE (and1))
8595                    <= HOST_BITS_PER_WIDE_INT
8596                    && host_integerp (and1, 1))
8597             {
8598               unsigned HOST_WIDE_INT cst;
8599
8600               cst = tree_low_cst (and1, 1);
8601               cst &= (HOST_WIDE_INT) -1
8602                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
8603               change = (cst == 0);
8604 #ifdef LOAD_EXTEND_OP
8605               if (change
8606                   && !flag_syntax_only
8607                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
8608                       == ZERO_EXTEND))
8609                 {
8610                   tree uns = unsigned_type_for (TREE_TYPE (and0));
8611                   and0 = fold_convert_loc (loc, uns, and0);
8612                   and1 = fold_convert_loc (loc, uns, and1);
8613                 }
8614 #endif
8615             }
8616           if (change)
8617             {
8618               tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
8619                                            TREE_INT_CST_HIGH (and1), 0,
8620                                            TREE_OVERFLOW (and1));
8621               return fold_build2_loc (loc, BIT_AND_EXPR, type,
8622                                   fold_convert_loc (loc, type, and0), tem);
8623             }
8624         }
8625
8626       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8627          when one of the new casts will fold away. Conservatively we assume
8628          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8629       if (POINTER_TYPE_P (type)
8630           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8631           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8632               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8633               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8634         {
8635           tree arg00 = TREE_OPERAND (arg0, 0);
8636           tree arg01 = TREE_OPERAND (arg0, 1);
8637
8638           return fold_build2_loc (loc,
8639                               TREE_CODE (arg0), type,
8640                               fold_convert_loc (loc, type, arg00),
8641                               fold_convert_loc (loc, sizetype, arg01));
8642         }
8643
8644       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8645          of the same precision, and X is an integer type not narrower than
8646          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
8647       if (INTEGRAL_TYPE_P (type)
8648           && TREE_CODE (op0) == BIT_NOT_EXPR
8649           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8650           && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8651           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8652         {
8653           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8654           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8655               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8656             return fold_build1_loc (loc, BIT_NOT_EXPR, type,
8657                                 fold_convert_loc (loc, type, tem));
8658         }
8659
8660       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8661          type of X and Y (integer types only).  */
8662       if (INTEGRAL_TYPE_P (type)
8663           && TREE_CODE (op0) == MULT_EXPR
8664           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8665           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8666         {
8667           /* Be careful not to introduce new overflows.  */
8668           tree mult_type;
8669           if (TYPE_OVERFLOW_WRAPS (type))
8670             mult_type = type;
8671           else
8672             mult_type = unsigned_type_for (type);
8673
8674           if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8675             {
8676               tem = fold_build2_loc (loc, MULT_EXPR, mult_type,
8677                                  fold_convert_loc (loc, mult_type,
8678                                                    TREE_OPERAND (op0, 0)),
8679                                  fold_convert_loc (loc, mult_type,
8680                                                    TREE_OPERAND (op0, 1)));
8681               return fold_convert_loc (loc, type, tem);
8682             }
8683         }
8684
8685       tem = fold_convert_const (code, type, op0);
8686       return tem ? tem : NULL_TREE;
8687
8688     case ADDR_SPACE_CONVERT_EXPR:
8689       if (integer_zerop (arg0))
8690         return fold_convert_const (code, type, arg0);
8691       return NULL_TREE;
8692
8693     case FIXED_CONVERT_EXPR:
8694       tem = fold_convert_const (code, type, arg0);
8695       return tem ? tem : NULL_TREE;
8696
8697     case VIEW_CONVERT_EXPR:
8698       if (TREE_TYPE (op0) == type)
8699         return op0;
8700       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
8701         return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8702                             type, TREE_OPERAND (op0, 0));
8703
8704       /* For integral conversions with the same precision or pointer
8705          conversions use a NOP_EXPR instead.  */
8706       if ((INTEGRAL_TYPE_P (type)
8707            || POINTER_TYPE_P (type))
8708           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8709               || POINTER_TYPE_P (TREE_TYPE (op0)))
8710           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8711         return fold_convert_loc (loc, type, op0);
8712
8713       /* Strip inner integral conversions that do not change the precision.  */
8714       if (CONVERT_EXPR_P (op0)
8715           && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8716               || POINTER_TYPE_P (TREE_TYPE (op0)))
8717           && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
8718               || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
8719           && (TYPE_PRECISION (TREE_TYPE (op0))
8720               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
8721         return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8722                             type, TREE_OPERAND (op0, 0));
8723
8724       return fold_view_convert_expr (type, op0);
8725
8726     case NEGATE_EXPR:
8727       tem = fold_negate_expr (loc, arg0);
8728       if (tem)
8729         return fold_convert_loc (loc, type, tem);
8730       return NULL_TREE;
8731
8732     case ABS_EXPR:
8733       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8734         return fold_abs_const (arg0, type);
8735       else if (TREE_CODE (arg0) == NEGATE_EXPR)
8736         return fold_build1_loc (loc, ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8737       /* Convert fabs((double)float) into (double)fabsf(float).  */
8738       else if (TREE_CODE (arg0) == NOP_EXPR
8739                && TREE_CODE (type) == REAL_TYPE)
8740         {
8741           tree targ0 = strip_float_extensions (arg0);
8742           if (targ0 != arg0)
8743             return fold_convert_loc (loc, type,
8744                                      fold_build1_loc (loc, ABS_EXPR,
8745                                                   TREE_TYPE (targ0),
8746                                                   targ0));
8747         }
8748       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8749       else if (TREE_CODE (arg0) == ABS_EXPR)
8750         return arg0;
8751       else if (tree_expr_nonnegative_p (arg0))
8752         return arg0;
8753
8754       /* Strip sign ops from argument.  */
8755       if (TREE_CODE (type) == REAL_TYPE)
8756         {
8757           tem = fold_strip_sign_ops (arg0);
8758           if (tem)
8759             return fold_build1_loc (loc, ABS_EXPR, type,
8760                                 fold_convert_loc (loc, type, tem));
8761         }
8762       return NULL_TREE;
8763
8764     case CONJ_EXPR:
8765       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8766         return fold_convert_loc (loc, type, arg0);
8767       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8768         {
8769           tree itype = TREE_TYPE (type);
8770           tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0));
8771           tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1));
8772           return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart,
8773                               negate_expr (ipart));
8774         }
8775       if (TREE_CODE (arg0) == COMPLEX_CST)
8776         {
8777           tree itype = TREE_TYPE (type);
8778           tree rpart = fold_convert_loc (loc, itype, TREE_REALPART (arg0));
8779           tree ipart = fold_convert_loc (loc, itype, TREE_IMAGPART (arg0));
8780           return build_complex (type, rpart, negate_expr (ipart));
8781         }
8782       if (TREE_CODE (arg0) == CONJ_EXPR)
8783         return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8784       return NULL_TREE;
8785
8786     case BIT_NOT_EXPR:
8787       if (TREE_CODE (arg0) == INTEGER_CST)
8788         return fold_not_const (arg0, type);
8789       else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8790         return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8791       /* Convert ~ (-A) to A - 1.  */
8792       else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8793         return fold_build2_loc (loc, MINUS_EXPR, type,
8794                             fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)),
8795                             build_int_cst (type, 1));
8796       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8797       else if (INTEGRAL_TYPE_P (type)
8798                && ((TREE_CODE (arg0) == MINUS_EXPR
8799                     && integer_onep (TREE_OPERAND (arg0, 1)))
8800                    || (TREE_CODE (arg0) == PLUS_EXPR
8801                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8802         return fold_build1_loc (loc, NEGATE_EXPR, type,
8803                             fold_convert_loc (loc, type,
8804                                               TREE_OPERAND (arg0, 0)));
8805       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8806       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8807                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8808                                      fold_convert_loc (loc, type,
8809                                                        TREE_OPERAND (arg0, 0)))))
8810         return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem,
8811                             fold_convert_loc (loc, type,
8812                                               TREE_OPERAND (arg0, 1)));
8813       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8814                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8815                                      fold_convert_loc (loc, type,
8816                                                        TREE_OPERAND (arg0, 1)))))
8817         return fold_build2_loc (loc, BIT_XOR_EXPR, type,
8818                             fold_convert_loc (loc, type,
8819                                               TREE_OPERAND (arg0, 0)), tem);
8820       /* Perform BIT_NOT_EXPR on each element individually.  */
8821       else if (TREE_CODE (arg0) == VECTOR_CST)
8822         {
8823           tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8824           int count = TYPE_VECTOR_SUBPARTS (type), i;
8825
8826           for (i = 0; i < count; i++)
8827             {
8828               if (elements)
8829                 {
8830                   elem = TREE_VALUE (elements);
8831                   elem = fold_unary_loc (loc, BIT_NOT_EXPR, TREE_TYPE (type), elem);
8832                   if (elem == NULL_TREE)
8833                     break;
8834                   elements = TREE_CHAIN (elements);
8835                 }
8836               else
8837                 elem = build_int_cst (TREE_TYPE (type), -1);
8838               list = tree_cons (NULL_TREE, elem, list);
8839             }
8840           if (i == count)
8841             return build_vector (type, nreverse (list));
8842         }
8843
8844       return NULL_TREE;
8845
8846     case TRUTH_NOT_EXPR:
8847       /* The argument to invert_truthvalue must have Boolean type.  */
8848       if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8849           arg0 = fold_convert_loc (loc, boolean_type_node, arg0);
8850
8851       /* Note that the operand of this must be an int
8852          and its values must be 0 or 1.
8853          ("true" is a fixed value perhaps depending on the language,
8854          but we don't handle values other than 1 correctly yet.)  */
8855       tem = fold_truth_not_expr (loc, arg0);
8856       if (!tem)
8857         return NULL_TREE;
8858       return fold_convert_loc (loc, type, tem);
8859
8860     case REALPART_EXPR:
8861       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8862         return fold_convert_loc (loc, type, arg0);
8863       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8864         return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0),
8865                                  TREE_OPERAND (arg0, 1));
8866       if (TREE_CODE (arg0) == COMPLEX_CST)
8867         return fold_convert_loc (loc, type, TREE_REALPART (arg0));
8868       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8869         {
8870           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8871           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8872                              fold_build1_loc (loc, REALPART_EXPR, itype,
8873                                           TREE_OPERAND (arg0, 0)),
8874                              fold_build1_loc (loc, REALPART_EXPR, itype,
8875                                           TREE_OPERAND (arg0, 1)));
8876           return fold_convert_loc (loc, type, tem);
8877         }
8878       if (TREE_CODE (arg0) == CONJ_EXPR)
8879         {
8880           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8881           tem = fold_build1_loc (loc, REALPART_EXPR, itype,
8882                              TREE_OPERAND (arg0, 0));
8883           return fold_convert_loc (loc, type, tem);
8884         }
8885       if (TREE_CODE (arg0) == CALL_EXPR)
8886         {
8887           tree fn = get_callee_fndecl (arg0);
8888           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8889             switch (DECL_FUNCTION_CODE (fn))
8890               {
8891               CASE_FLT_FN (BUILT_IN_CEXPI):
8892                 fn = mathfn_built_in (type, BUILT_IN_COS);
8893                 if (fn)
8894                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8895                 break;
8896
8897               default:
8898                 break;
8899               }
8900         }
8901       return NULL_TREE;
8902
8903     case IMAGPART_EXPR:
8904       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8905         return fold_convert_loc (loc, type, integer_zero_node);
8906       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8907         return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 1),
8908                                  TREE_OPERAND (arg0, 0));
8909       if (TREE_CODE (arg0) == COMPLEX_CST)
8910         return fold_convert_loc (loc, type, TREE_IMAGPART (arg0));
8911       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8912         {
8913           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8914           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8915                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8916                                           TREE_OPERAND (arg0, 0)),
8917                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8918                                           TREE_OPERAND (arg0, 1)));
8919           return fold_convert_loc (loc, type, tem);
8920         }
8921       if (TREE_CODE (arg0) == CONJ_EXPR)
8922         {
8923           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8924           tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8925           return fold_convert_loc (loc, type, negate_expr (tem));
8926         }
8927       if (TREE_CODE (arg0) == CALL_EXPR)
8928         {
8929           tree fn = get_callee_fndecl (arg0);
8930           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8931             switch (DECL_FUNCTION_CODE (fn))
8932               {
8933               CASE_FLT_FN (BUILT_IN_CEXPI):
8934                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8935                 if (fn)
8936                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8937                 break;
8938
8939               default:
8940                 break;
8941               }
8942         }
8943       return NULL_TREE;
8944
8945     default:
8946       return NULL_TREE;
8947     } /* switch (code) */
8948 }
8949
8950
8951 /* If the operation was a conversion do _not_ mark a resulting constant
8952    with TREE_OVERFLOW if the original constant was not.  These conversions
8953    have implementation defined behavior and retaining the TREE_OVERFLOW
8954    flag here would confuse later passes such as VRP.  */
8955 tree
8956 fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code,
8957                                 tree type, tree op0)
8958 {
8959   tree res = fold_unary_loc (loc, code, type, op0);
8960   if (res
8961       && TREE_CODE (res) == INTEGER_CST
8962       && TREE_CODE (op0) == INTEGER_CST
8963       && CONVERT_EXPR_CODE_P (code))
8964     TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8965
8966   return res;
8967 }
8968
8969 /* Fold a binary expression of code CODE and type TYPE with operands
8970    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8971    Return the folded expression if folding is successful.  Otherwise,
8972    return NULL_TREE.  */
8973
8974 static tree
8975 fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
8976 {
8977   enum tree_code compl_code;
8978
8979   if (code == MIN_EXPR)
8980     compl_code = MAX_EXPR;
8981   else if (code == MAX_EXPR)
8982     compl_code = MIN_EXPR;
8983   else
8984     gcc_unreachable ();
8985
8986   /* MIN (MAX (a, b), b) == b.  */
8987   if (TREE_CODE (op0) == compl_code
8988       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8989     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
8990
8991   /* MIN (MAX (b, a), b) == b.  */
8992   if (TREE_CODE (op0) == compl_code
8993       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8994       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8995     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
8996
8997   /* MIN (a, MAX (a, b)) == a.  */
8998   if (TREE_CODE (op1) == compl_code
8999       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
9000       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
9001     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
9002
9003   /* MIN (a, MAX (b, a)) == a.  */
9004   if (TREE_CODE (op1) == compl_code
9005       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
9006       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
9007     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
9008
9009   return NULL_TREE;
9010 }
9011
9012 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
9013    by changing CODE to reduce the magnitude of constants involved in
9014    ARG0 of the comparison.
9015    Returns a canonicalized comparison tree if a simplification was
9016    possible, otherwise returns NULL_TREE.
9017    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
9018    valid if signed overflow is undefined.  */
9019
9020 static tree
9021 maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
9022                                  tree arg0, tree arg1,
9023                                  bool *strict_overflow_p)
9024 {
9025   enum tree_code code0 = TREE_CODE (arg0);
9026   tree t, cst0 = NULL_TREE;
9027   int sgn0;
9028   bool swap = false;
9029
9030   /* Match A +- CST code arg1 and CST code arg1.  We can change the
9031      first form only if overflow is undefined.  */
9032   if (!((TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9033          /* In principle pointers also have undefined overflow behavior,
9034             but that causes problems elsewhere.  */
9035          && !POINTER_TYPE_P (TREE_TYPE (arg0))
9036          && (code0 == MINUS_EXPR
9037              || code0 == PLUS_EXPR)
9038          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9039         || code0 == INTEGER_CST))
9040     return NULL_TREE;
9041
9042   /* Identify the constant in arg0 and its sign.  */
9043   if (code0 == INTEGER_CST)
9044     cst0 = arg0;
9045   else
9046     cst0 = TREE_OPERAND (arg0, 1);
9047   sgn0 = tree_int_cst_sgn (cst0);
9048
9049   /* Overflowed constants and zero will cause problems.  */
9050   if (integer_zerop (cst0)
9051       || TREE_OVERFLOW (cst0))
9052     return NULL_TREE;
9053
9054   /* See if we can reduce the magnitude of the constant in
9055      arg0 by changing the comparison code.  */
9056   if (code0 == INTEGER_CST)
9057     {
9058       /* CST <= arg1  ->  CST-1 < arg1.  */
9059       if (code == LE_EXPR && sgn0 == 1)
9060         code = LT_EXPR;
9061       /* -CST < arg1  ->  -CST-1 <= arg1.  */
9062       else if (code == LT_EXPR && sgn0 == -1)
9063         code = LE_EXPR;
9064       /* CST > arg1  ->  CST-1 >= arg1.  */
9065       else if (code == GT_EXPR && sgn0 == 1)
9066         code = GE_EXPR;
9067       /* -CST >= arg1  ->  -CST-1 > arg1.  */
9068       else if (code == GE_EXPR && sgn0 == -1)
9069         code = GT_EXPR;
9070       else
9071         return NULL_TREE;
9072       /* arg1 code' CST' might be more canonical.  */
9073       swap = true;
9074     }
9075   else
9076     {
9077       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
9078       if (code == LT_EXPR
9079           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
9080         code = LE_EXPR;
9081       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
9082       else if (code == GT_EXPR
9083                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
9084         code = GE_EXPR;
9085       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
9086       else if (code == LE_EXPR
9087                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
9088         code = LT_EXPR;
9089       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
9090       else if (code == GE_EXPR
9091                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
9092         code = GT_EXPR;
9093       else
9094         return NULL_TREE;
9095       *strict_overflow_p = true;
9096     }
9097
9098   /* Now build the constant reduced in magnitude.  But not if that
9099      would produce one outside of its types range.  */
9100   if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
9101       && ((sgn0 == 1
9102            && TYPE_MIN_VALUE (TREE_TYPE (cst0))
9103            && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
9104           || (sgn0 == -1
9105               && TYPE_MAX_VALUE (TREE_TYPE (cst0))
9106               && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
9107     /* We cannot swap the comparison here as that would cause us to
9108        endlessly recurse.  */
9109     return NULL_TREE;
9110
9111   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
9112                        cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
9113   if (code0 != INTEGER_CST)
9114     t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
9115
9116   /* If swapping might yield to a more canonical form, do so.  */
9117   if (swap)
9118     return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t);
9119   else
9120     return fold_build2_loc (loc, code, type, t, arg1);
9121 }
9122
9123 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
9124    overflow further.  Try to decrease the magnitude of constants involved
9125    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
9126    and put sole constants at the second argument position.
9127    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
9128
9129 static tree
9130 maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type,
9131                                tree arg0, tree arg1)
9132 {
9133   tree t;
9134   bool strict_overflow_p;
9135   const char * const warnmsg = G_("assuming signed overflow does not occur "
9136                                   "when reducing constant in comparison");
9137
9138   /* Try canonicalization by simplifying arg0.  */
9139   strict_overflow_p = false;
9140   t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
9141                                        &strict_overflow_p);
9142   if (t)
9143     {
9144       if (strict_overflow_p)
9145         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
9146       return t;
9147     }
9148
9149   /* Try canonicalization by simplifying arg1 using the swapped
9150      comparison.  */
9151   code = swap_tree_comparison (code);
9152   strict_overflow_p = false;
9153   t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
9154                                        &strict_overflow_p);
9155   if (t && strict_overflow_p)
9156     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
9157   return t;
9158 }
9159
9160 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
9161    space.  This is used to avoid issuing overflow warnings for
9162    expressions like &p->x which can not wrap.  */
9163
9164 static bool
9165 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
9166 {
9167   unsigned HOST_WIDE_INT offset_low, total_low;
9168   HOST_WIDE_INT size, offset_high, total_high;
9169
9170   if (!POINTER_TYPE_P (TREE_TYPE (base)))
9171     return true;
9172
9173   if (bitpos < 0)
9174     return true;
9175
9176   if (offset == NULL_TREE)
9177     {
9178       offset_low = 0;
9179       offset_high = 0;
9180     }
9181   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
9182     return true;
9183   else
9184     {
9185       offset_low = TREE_INT_CST_LOW (offset);
9186       offset_high = TREE_INT_CST_HIGH (offset);
9187     }
9188
9189   if (add_double_with_sign (offset_low, offset_high,
9190                             bitpos / BITS_PER_UNIT, 0,
9191                             &total_low, &total_high,
9192                             true))
9193     return true;
9194
9195   if (total_high != 0)
9196     return true;
9197
9198   size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
9199   if (size <= 0)
9200     return true;
9201
9202   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
9203      array.  */
9204   if (TREE_CODE (base) == ADDR_EXPR)
9205     {
9206       HOST_WIDE_INT base_size;
9207
9208       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
9209       if (base_size > 0 && size < base_size)
9210         size = base_size;
9211     }
9212
9213   return total_low > (unsigned HOST_WIDE_INT) size;
9214 }
9215
9216 /* Subroutine of fold_binary.  This routine performs all of the
9217    transformations that are common to the equality/inequality
9218    operators (EQ_EXPR and NE_EXPR) and the ordering operators
9219    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
9220    fold_binary should call fold_binary.  Fold a comparison with
9221    tree code CODE and type TYPE with operands OP0 and OP1.  Return
9222    the folded comparison or NULL_TREE.  */
9223
9224 static tree
9225 fold_comparison (location_t loc, enum tree_code code, tree type,
9226                  tree op0, tree op1)
9227 {
9228   tree arg0, arg1, tem;
9229
9230   arg0 = op0;
9231   arg1 = op1;
9232
9233   STRIP_SIGN_NOPS (arg0);
9234   STRIP_SIGN_NOPS (arg1);
9235
9236   tem = fold_relational_const (code, type, arg0, arg1);
9237   if (tem != NULL_TREE)
9238     return tem;
9239
9240   /* If one arg is a real or integer constant, put it last.  */
9241   if (tree_swap_operands_p (arg0, arg1, true))
9242     return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
9243
9244   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1.  */
9245   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9246       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9247           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9248           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
9249       && (TREE_CODE (arg1) == INTEGER_CST
9250           && !TREE_OVERFLOW (arg1)))
9251     {
9252       tree const1 = TREE_OPERAND (arg0, 1);
9253       tree const2 = arg1;
9254       tree variable = TREE_OPERAND (arg0, 0);
9255       tree lhs;
9256       int lhs_add;
9257       lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
9258
9259       lhs = fold_build2_loc (loc, lhs_add ? PLUS_EXPR : MINUS_EXPR,
9260                          TREE_TYPE (arg1), const2, const1);
9261
9262       /* If the constant operation overflowed this can be
9263          simplified as a comparison against INT_MAX/INT_MIN.  */
9264       if (TREE_CODE (lhs) == INTEGER_CST
9265           && TREE_OVERFLOW (lhs))
9266         {
9267           int const1_sgn = tree_int_cst_sgn (const1);
9268           enum tree_code code2 = code;
9269
9270           /* Get the sign of the constant on the lhs if the
9271              operation were VARIABLE + CONST1.  */
9272           if (TREE_CODE (arg0) == MINUS_EXPR)
9273             const1_sgn = -const1_sgn;
9274
9275           /* The sign of the constant determines if we overflowed
9276              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
9277              Canonicalize to the INT_MIN overflow by swapping the comparison
9278              if necessary.  */
9279           if (const1_sgn == -1)
9280             code2 = swap_tree_comparison (code);
9281
9282           /* We now can look at the canonicalized case
9283                VARIABLE + 1  CODE2  INT_MIN
9284              and decide on the result.  */
9285           if (code2 == LT_EXPR
9286               || code2 == LE_EXPR
9287               || code2 == EQ_EXPR)
9288             return omit_one_operand_loc (loc, type, boolean_false_node, variable);
9289           else if (code2 == NE_EXPR
9290                    || code2 == GE_EXPR
9291                    || code2 == GT_EXPR)
9292             return omit_one_operand_loc (loc, type, boolean_true_node, variable);
9293         }
9294
9295       if (TREE_CODE (lhs) == TREE_CODE (arg1)
9296           && (TREE_CODE (lhs) != INTEGER_CST
9297               || !TREE_OVERFLOW (lhs)))
9298         {
9299           fold_overflow_warning (("assuming signed overflow does not occur "
9300                                   "when changing X +- C1 cmp C2 to "
9301                                   "X cmp C1 +- C2"),
9302                                  WARN_STRICT_OVERFLOW_COMPARISON);
9303           return fold_build2_loc (loc, code, type, variable, lhs);
9304         }
9305     }
9306
9307   /* For comparisons of pointers we can decompose it to a compile time
9308      comparison of the base objects and the offsets into the object.
9309      This requires at least one operand being an ADDR_EXPR or a
9310      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
9311   if (POINTER_TYPE_P (TREE_TYPE (arg0))
9312       && (TREE_CODE (arg0) == ADDR_EXPR
9313           || TREE_CODE (arg1) == ADDR_EXPR
9314           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
9315           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
9316     {
9317       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
9318       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
9319       enum machine_mode mode;
9320       int volatilep, unsignedp;
9321       bool indirect_base0 = false, indirect_base1 = false;
9322
9323       /* Get base and offset for the access.  Strip ADDR_EXPR for
9324          get_inner_reference, but put it back by stripping INDIRECT_REF
9325          off the base object if possible.  indirect_baseN will be true
9326          if baseN is not an address but refers to the object itself.  */
9327       base0 = arg0;
9328       if (TREE_CODE (arg0) == ADDR_EXPR)
9329         {
9330           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
9331                                        &bitsize, &bitpos0, &offset0, &mode,
9332                                        &unsignedp, &volatilep, false);
9333           if (TREE_CODE (base0) == INDIRECT_REF)
9334             base0 = TREE_OPERAND (base0, 0);
9335           else
9336             indirect_base0 = true;
9337         }
9338       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9339         {
9340           base0 = TREE_OPERAND (arg0, 0);
9341           offset0 = TREE_OPERAND (arg0, 1);
9342         }
9343
9344       base1 = arg1;
9345       if (TREE_CODE (arg1) == ADDR_EXPR)
9346         {
9347           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
9348                                        &bitsize, &bitpos1, &offset1, &mode,
9349                                        &unsignedp, &volatilep, false);
9350           if (TREE_CODE (base1) == INDIRECT_REF)
9351             base1 = TREE_OPERAND (base1, 0);
9352           else
9353             indirect_base1 = true;
9354         }
9355       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9356         {
9357           base1 = TREE_OPERAND (arg1, 0);
9358           offset1 = TREE_OPERAND (arg1, 1);
9359         }
9360
9361       /* If we have equivalent bases we might be able to simplify.  */
9362       if (indirect_base0 == indirect_base1
9363           && operand_equal_p (base0, base1, 0))
9364         {
9365           /* We can fold this expression to a constant if the non-constant
9366              offset parts are equal.  */
9367           if ((offset0 == offset1
9368                || (offset0 && offset1
9369                    && operand_equal_p (offset0, offset1, 0)))
9370               && (code == EQ_EXPR
9371                   || code == NE_EXPR
9372                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
9373
9374             {
9375               if (code != EQ_EXPR
9376                   && code != NE_EXPR
9377                   && bitpos0 != bitpos1
9378                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9379                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9380                 fold_overflow_warning (("assuming pointer wraparound does not "
9381                                         "occur when comparing P +- C1 with "
9382                                         "P +- C2"),
9383                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
9384
9385               switch (code)
9386                 {
9387                 case EQ_EXPR:
9388                   return constant_boolean_node (bitpos0 == bitpos1, type);
9389                 case NE_EXPR:
9390                   return constant_boolean_node (bitpos0 != bitpos1, type);
9391                 case LT_EXPR:
9392                   return constant_boolean_node (bitpos0 < bitpos1, type);
9393                 case LE_EXPR:
9394                   return constant_boolean_node (bitpos0 <= bitpos1, type);
9395                 case GE_EXPR:
9396                   return constant_boolean_node (bitpos0 >= bitpos1, type);
9397                 case GT_EXPR:
9398                   return constant_boolean_node (bitpos0 > bitpos1, type);
9399                 default:;
9400                 }
9401             }
9402           /* We can simplify the comparison to a comparison of the variable
9403              offset parts if the constant offset parts are equal.
9404              Be careful to use signed size type here because otherwise we
9405              mess with array offsets in the wrong way.  This is possible
9406              because pointer arithmetic is restricted to retain within an
9407              object and overflow on pointer differences is undefined as of
9408              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
9409           else if (bitpos0 == bitpos1
9410                    && ((code == EQ_EXPR || code == NE_EXPR)
9411                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
9412             {
9413               tree signed_size_type_node;
9414               signed_size_type_node = signed_type_for (size_type_node);
9415
9416               /* By converting to signed size type we cover middle-end pointer
9417                  arithmetic which operates on unsigned pointer types of size
9418                  type size and ARRAY_REF offsets which are properly sign or
9419                  zero extended from their type in case it is narrower than
9420                  size type.  */
9421               if (offset0 == NULL_TREE)
9422                 offset0 = build_int_cst (signed_size_type_node, 0);
9423               else
9424                 offset0 = fold_convert_loc (loc, signed_size_type_node,
9425                                             offset0);
9426               if (offset1 == NULL_TREE)
9427                 offset1 = build_int_cst (signed_size_type_node, 0);
9428               else
9429                 offset1 = fold_convert_loc (loc, signed_size_type_node,
9430                                             offset1);
9431
9432               if (code != EQ_EXPR
9433                   && code != NE_EXPR
9434                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9435                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9436                 fold_overflow_warning (("assuming pointer wraparound does not "
9437                                         "occur when comparing P +- C1 with "
9438                                         "P +- C2"),
9439                                        WARN_STRICT_OVERFLOW_COMPARISON);
9440
9441               return fold_build2_loc (loc, code, type, offset0, offset1);
9442             }
9443         }
9444       /* For non-equal bases we can simplify if they are addresses
9445          of local binding decls or constants.  */
9446       else if (indirect_base0 && indirect_base1
9447                /* We know that !operand_equal_p (base0, base1, 0)
9448                   because the if condition was false.  But make
9449                   sure two decls are not the same.  */
9450                && base0 != base1
9451                && TREE_CODE (arg0) == ADDR_EXPR
9452                && TREE_CODE (arg1) == ADDR_EXPR
9453                && (((TREE_CODE (base0) == VAR_DECL
9454                      || TREE_CODE (base0) == PARM_DECL)
9455                     && (targetm.binds_local_p (base0)
9456                         || CONSTANT_CLASS_P (base1)))
9457                    || CONSTANT_CLASS_P (base0))
9458                && (((TREE_CODE (base1) == VAR_DECL
9459                      || TREE_CODE (base1) == PARM_DECL)
9460                     && (targetm.binds_local_p (base1)
9461                         || CONSTANT_CLASS_P (base0)))
9462                    || CONSTANT_CLASS_P (base1)))
9463         {
9464           if (code == EQ_EXPR)
9465             return omit_two_operands_loc (loc, type, boolean_false_node,
9466                                       arg0, arg1);
9467           else if (code == NE_EXPR)
9468             return omit_two_operands_loc (loc, type, boolean_true_node,
9469                                       arg0, arg1);
9470         }
9471       /* For equal offsets we can simplify to a comparison of the
9472          base addresses.  */
9473       else if (bitpos0 == bitpos1
9474                && (indirect_base0
9475                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9476                && (indirect_base1
9477                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9478                && ((offset0 == offset1)
9479                    || (offset0 && offset1
9480                        && operand_equal_p (offset0, offset1, 0))))
9481         {
9482           if (indirect_base0)
9483             base0 = build_fold_addr_expr_loc (loc, base0);
9484           if (indirect_base1)
9485             base1 = build_fold_addr_expr_loc (loc, base1);
9486           return fold_build2_loc (loc, code, type, base0, base1);
9487         }
9488     }
9489
9490   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9491      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
9492      the resulting offset is smaller in absolute value than the
9493      original one.  */
9494   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9495       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9496       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9497           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9498       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9499       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9500           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9501     {
9502       tree const1 = TREE_OPERAND (arg0, 1);
9503       tree const2 = TREE_OPERAND (arg1, 1);
9504       tree variable1 = TREE_OPERAND (arg0, 0);
9505       tree variable2 = TREE_OPERAND (arg1, 0);
9506       tree cst;
9507       const char * const warnmsg = G_("assuming signed overflow does not "
9508                                       "occur when combining constants around "
9509                                       "a comparison");
9510
9511       /* Put the constant on the side where it doesn't overflow and is
9512          of lower absolute value than before.  */
9513       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9514                              ? MINUS_EXPR : PLUS_EXPR,
9515                              const2, const1, 0);
9516       if (!TREE_OVERFLOW (cst)
9517           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
9518         {
9519           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9520           return fold_build2_loc (loc, code, type,
9521                               variable1,
9522                               fold_build2_loc (loc,
9523                                            TREE_CODE (arg1), TREE_TYPE (arg1),
9524                                            variable2, cst));
9525         }
9526
9527       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9528                              ? MINUS_EXPR : PLUS_EXPR,
9529                              const1, const2, 0);
9530       if (!TREE_OVERFLOW (cst)
9531           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
9532         {
9533           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9534           return fold_build2_loc (loc, code, type,
9535                               fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0),
9536                                            variable1, cst),
9537                               variable2);
9538         }
9539     }
9540
9541   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9542      signed arithmetic case.  That form is created by the compiler
9543      often enough for folding it to be of value.  One example is in
9544      computing loop trip counts after Operator Strength Reduction.  */
9545   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9546       && TREE_CODE (arg0) == MULT_EXPR
9547       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9548           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9549       && integer_zerop (arg1))
9550     {
9551       tree const1 = TREE_OPERAND (arg0, 1);
9552       tree const2 = arg1;                       /* zero */
9553       tree variable1 = TREE_OPERAND (arg0, 0);
9554       enum tree_code cmp_code = code;
9555
9556       gcc_assert (!integer_zerop (const1));
9557
9558       fold_overflow_warning (("assuming signed overflow does not occur when "
9559                               "eliminating multiplication in comparison "
9560                               "with zero"),
9561                              WARN_STRICT_OVERFLOW_COMPARISON);
9562
9563       /* If const1 is negative we swap the sense of the comparison.  */
9564       if (tree_int_cst_sgn (const1) < 0)
9565         cmp_code = swap_tree_comparison (cmp_code);
9566
9567       return fold_build2_loc (loc, cmp_code, type, variable1, const2);
9568     }
9569
9570   tem = maybe_canonicalize_comparison (loc, code, type, op0, op1);
9571   if (tem)
9572     return tem;
9573
9574   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9575     {
9576       tree targ0 = strip_float_extensions (arg0);
9577       tree targ1 = strip_float_extensions (arg1);
9578       tree newtype = TREE_TYPE (targ0);
9579
9580       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9581         newtype = TREE_TYPE (targ1);
9582
9583       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9584       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9585         return fold_build2_loc (loc, code, type,
9586                             fold_convert_loc (loc, newtype, targ0),
9587                             fold_convert_loc (loc, newtype, targ1));
9588
9589       /* (-a) CMP (-b) -> b CMP a  */
9590       if (TREE_CODE (arg0) == NEGATE_EXPR
9591           && TREE_CODE (arg1) == NEGATE_EXPR)
9592         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0),
9593                             TREE_OPERAND (arg0, 0));
9594
9595       if (TREE_CODE (arg1) == REAL_CST)
9596         {
9597           REAL_VALUE_TYPE cst;
9598           cst = TREE_REAL_CST (arg1);
9599
9600           /* (-a) CMP CST -> a swap(CMP) (-CST)  */
9601           if (TREE_CODE (arg0) == NEGATE_EXPR)
9602             return fold_build2_loc (loc, swap_tree_comparison (code), type,
9603                                 TREE_OPERAND (arg0, 0),
9604                                 build_real (TREE_TYPE (arg1),
9605                                             REAL_VALUE_NEGATE (cst)));
9606
9607           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9608           /* a CMP (-0) -> a CMP 0  */
9609           if (REAL_VALUE_MINUS_ZERO (cst))
9610             return fold_build2_loc (loc, code, type, arg0,
9611                                 build_real (TREE_TYPE (arg1), dconst0));
9612
9613           /* x != NaN is always true, other ops are always false.  */
9614           if (REAL_VALUE_ISNAN (cst)
9615               && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
9616             {
9617               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9618               return omit_one_operand_loc (loc, type, tem, arg0);
9619             }
9620
9621           /* Fold comparisons against infinity.  */
9622           if (REAL_VALUE_ISINF (cst)
9623               && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9624             {
9625               tem = fold_inf_compare (loc, code, type, arg0, arg1);
9626               if (tem != NULL_TREE)
9627                 return tem;
9628             }
9629         }
9630
9631       /* If this is a comparison of a real constant with a PLUS_EXPR
9632          or a MINUS_EXPR of a real constant, we can convert it into a
9633          comparison with a revised real constant as long as no overflow
9634          occurs when unsafe_math_optimizations are enabled.  */
9635       if (flag_unsafe_math_optimizations
9636           && TREE_CODE (arg1) == REAL_CST
9637           && (TREE_CODE (arg0) == PLUS_EXPR
9638               || TREE_CODE (arg0) == MINUS_EXPR)
9639           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9640           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9641                                       ? MINUS_EXPR : PLUS_EXPR,
9642                                       arg1, TREE_OPERAND (arg0, 1), 0))
9643           && !TREE_OVERFLOW (tem))
9644         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
9645
9646       /* Likewise, we can simplify a comparison of a real constant with
9647          a MINUS_EXPR whose first operand is also a real constant, i.e.
9648          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on
9649          floating-point types only if -fassociative-math is set.  */
9650       if (flag_associative_math
9651           && TREE_CODE (arg1) == REAL_CST
9652           && TREE_CODE (arg0) == MINUS_EXPR
9653           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9654           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9655                                       arg1, 0))
9656           && !TREE_OVERFLOW (tem))
9657         return fold_build2_loc (loc, swap_tree_comparison (code), type,
9658                             TREE_OPERAND (arg0, 1), tem);
9659
9660       /* Fold comparisons against built-in math functions.  */
9661       if (TREE_CODE (arg1) == REAL_CST
9662           && flag_unsafe_math_optimizations
9663           && ! flag_errno_math)
9664         {
9665           enum built_in_function fcode = builtin_mathfn_code (arg0);
9666
9667           if (fcode != END_BUILTINS)
9668             {
9669               tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1);
9670               if (tem != NULL_TREE)
9671                 return tem;
9672             }
9673         }
9674     }
9675
9676   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9677       && CONVERT_EXPR_P (arg0))
9678     {
9679       /* If we are widening one operand of an integer comparison,
9680          see if the other operand is similarly being widened.  Perhaps we
9681          can do the comparison in the narrower type.  */
9682       tem = fold_widened_comparison (loc, code, type, arg0, arg1);
9683       if (tem)
9684         return tem;
9685
9686       /* Or if we are changing signedness.  */
9687       tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1);
9688       if (tem)
9689         return tem;
9690     }
9691
9692   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9693      constant, we can simplify it.  */
9694   if (TREE_CODE (arg1) == INTEGER_CST
9695       && (TREE_CODE (arg0) == MIN_EXPR
9696           || TREE_CODE (arg0) == MAX_EXPR)
9697       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9698     {
9699       tem = optimize_minmax_comparison (loc, code, type, op0, op1);
9700       if (tem)
9701         return tem;
9702     }
9703
9704   /* Simplify comparison of something with itself.  (For IEEE
9705      floating-point, we can only do some of these simplifications.)  */
9706   if (operand_equal_p (arg0, arg1, 0))
9707     {
9708       switch (code)
9709         {
9710         case EQ_EXPR:
9711           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9712               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9713             return constant_boolean_node (1, type);
9714           break;
9715
9716         case GE_EXPR:
9717         case LE_EXPR:
9718           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9719               || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9720             return constant_boolean_node (1, type);
9721           return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1);
9722
9723         case NE_EXPR:
9724           /* For NE, we can only do this simplification if integer
9725              or we don't honor IEEE floating point NaNs.  */
9726           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9727               && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9728             break;
9729           /* ... fall through ...  */
9730         case GT_EXPR:
9731         case LT_EXPR:
9732           return constant_boolean_node (0, type);
9733         default:
9734           gcc_unreachable ();
9735         }
9736     }
9737
9738   /* If we are comparing an expression that just has comparisons
9739      of two integer values, arithmetic expressions of those comparisons,
9740      and constants, we can simplify it.  There are only three cases
9741      to check: the two values can either be equal, the first can be
9742      greater, or the second can be greater.  Fold the expression for
9743      those three values.  Since each value must be 0 or 1, we have
9744      eight possibilities, each of which corresponds to the constant 0
9745      or 1 or one of the six possible comparisons.
9746
9747      This handles common cases like (a > b) == 0 but also handles
9748      expressions like  ((x > y) - (y > x)) > 0, which supposedly
9749      occur in macroized code.  */
9750
9751   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9752     {
9753       tree cval1 = 0, cval2 = 0;
9754       int save_p = 0;
9755
9756       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9757           /* Don't handle degenerate cases here; they should already
9758              have been handled anyway.  */
9759           && cval1 != 0 && cval2 != 0
9760           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9761           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9762           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9763           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9764           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9765           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9766                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9767         {
9768           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9769           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9770
9771           /* We can't just pass T to eval_subst in case cval1 or cval2
9772              was the same as ARG1.  */
9773
9774           tree high_result
9775                 = fold_build2_loc (loc, code, type,
9776                                eval_subst (loc, arg0, cval1, maxval,
9777                                            cval2, minval),
9778                                arg1);
9779           tree equal_result
9780                 = fold_build2_loc (loc, code, type,
9781                                eval_subst (loc, arg0, cval1, maxval,
9782                                            cval2, maxval),
9783                                arg1);
9784           tree low_result
9785                 = fold_build2_loc (loc, code, type,
9786                                eval_subst (loc, arg0, cval1, minval,
9787                                            cval2, maxval),
9788                                arg1);
9789
9790           /* All three of these results should be 0 or 1.  Confirm they are.
9791              Then use those values to select the proper code to use.  */
9792
9793           if (TREE_CODE (high_result) == INTEGER_CST
9794               && TREE_CODE (equal_result) == INTEGER_CST
9795               && TREE_CODE (low_result) == INTEGER_CST)
9796             {
9797               /* Make a 3-bit mask with the high-order bit being the
9798                  value for `>', the next for '=', and the low for '<'.  */
9799               switch ((integer_onep (high_result) * 4)
9800                       + (integer_onep (equal_result) * 2)
9801                       + integer_onep (low_result))
9802                 {
9803                 case 0:
9804                   /* Always false.  */
9805                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
9806                 case 1:
9807                   code = LT_EXPR;
9808                   break;
9809                 case 2:
9810                   code = EQ_EXPR;
9811                   break;
9812                 case 3:
9813                   code = LE_EXPR;
9814                   break;
9815                 case 4:
9816                   code = GT_EXPR;
9817                   break;
9818                 case 5:
9819                   code = NE_EXPR;
9820                   break;
9821                 case 6:
9822                   code = GE_EXPR;
9823                   break;
9824                 case 7:
9825                   /* Always true.  */
9826                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
9827                 }
9828
9829               if (save_p)
9830                 {
9831                   tem = save_expr (build2 (code, type, cval1, cval2));
9832                   SET_EXPR_LOCATION (tem, loc);
9833                   return tem;
9834                 }
9835               return fold_build2_loc (loc, code, type, cval1, cval2);
9836             }
9837         }
9838     }
9839
9840   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9841      into a single range test.  */
9842   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9843        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9844       && TREE_CODE (arg1) == INTEGER_CST
9845       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9846       && !integer_zerop (TREE_OPERAND (arg0, 1))
9847       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9848       && !TREE_OVERFLOW (arg1))
9849     {
9850       tem = fold_div_compare (loc, code, type, arg0, arg1);
9851       if (tem != NULL_TREE)
9852         return tem;
9853     }
9854
9855   /* Fold ~X op ~Y as Y op X.  */
9856   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9857       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9858     {
9859       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9860       return fold_build2_loc (loc, code, type,
9861                           fold_convert_loc (loc, cmp_type,
9862                                             TREE_OPERAND (arg1, 0)),
9863                           TREE_OPERAND (arg0, 0));
9864     }
9865
9866   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9867   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9868       && TREE_CODE (arg1) == INTEGER_CST)
9869     {
9870       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9871       return fold_build2_loc (loc, swap_tree_comparison (code), type,
9872                           TREE_OPERAND (arg0, 0),
9873                           fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type,
9874                                        fold_convert_loc (loc, cmp_type, arg1)));
9875     }
9876
9877   return NULL_TREE;
9878 }
9879
9880
9881 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9882    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9883    argument EXPR represents the expression "z" of type TYPE.  */
9884
9885 static tree
9886 fold_mult_zconjz (location_t loc, tree type, tree expr)
9887 {
9888   tree itype = TREE_TYPE (type);
9889   tree rpart, ipart, tem;
9890
9891   if (TREE_CODE (expr) == COMPLEX_EXPR)
9892     {
9893       rpart = TREE_OPERAND (expr, 0);
9894       ipart = TREE_OPERAND (expr, 1);
9895     }
9896   else if (TREE_CODE (expr) == COMPLEX_CST)
9897     {
9898       rpart = TREE_REALPART (expr);
9899       ipart = TREE_IMAGPART (expr);
9900     }
9901   else
9902     {
9903       expr = save_expr (expr);
9904       rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr);
9905       ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr);
9906     }
9907
9908   rpart = save_expr (rpart);
9909   ipart = save_expr (ipart);
9910   tem = fold_build2_loc (loc, PLUS_EXPR, itype,
9911                      fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart),
9912                      fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart));
9913   return fold_build2_loc (loc, COMPLEX_EXPR, type, tem,
9914                       fold_convert_loc (loc, itype, integer_zero_node));
9915 }
9916
9917
9918 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9919    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9920    guarantees that P and N have the same least significant log2(M) bits.
9921    N is not otherwise constrained.  In particular, N is not normalized to
9922    0 <= N < M as is common.  In general, the precise value of P is unknown.
9923    M is chosen as large as possible such that constant N can be determined.
9924
9925    Returns M and sets *RESIDUE to N.
9926
9927    If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9928    account.  This is not always possible due to PR 35705.
9929  */
9930
9931 static unsigned HOST_WIDE_INT
9932 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9933                                  bool allow_func_align)
9934 {
9935   enum tree_code code;
9936
9937   *residue = 0;
9938
9939   code = TREE_CODE (expr);
9940   if (code == ADDR_EXPR)
9941     {
9942       expr = TREE_OPERAND (expr, 0);
9943       if (handled_component_p (expr))
9944         {
9945           HOST_WIDE_INT bitsize, bitpos;
9946           tree offset;
9947           enum machine_mode mode;
9948           int unsignedp, volatilep;
9949
9950           expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9951                                       &mode, &unsignedp, &volatilep, false);
9952           *residue = bitpos / BITS_PER_UNIT;
9953           if (offset)
9954             {
9955               if (TREE_CODE (offset) == INTEGER_CST)
9956                 *residue += TREE_INT_CST_LOW (offset);
9957               else
9958                 /* We don't handle more complicated offset expressions.  */
9959                 return 1;
9960             }
9961         }
9962
9963       if (DECL_P (expr)
9964           && (allow_func_align || TREE_CODE (expr) != FUNCTION_DECL))
9965         return DECL_ALIGN_UNIT (expr);
9966     }
9967   else if (code == POINTER_PLUS_EXPR)
9968     {
9969       tree op0, op1;
9970       unsigned HOST_WIDE_INT modulus;
9971       enum tree_code inner_code;
9972
9973       op0 = TREE_OPERAND (expr, 0);
9974       STRIP_NOPS (op0);
9975       modulus = get_pointer_modulus_and_residue (op0, residue,
9976                                                  allow_func_align);
9977
9978       op1 = TREE_OPERAND (expr, 1);
9979       STRIP_NOPS (op1);
9980       inner_code = TREE_CODE (op1);
9981       if (inner_code == INTEGER_CST)
9982         {
9983           *residue += TREE_INT_CST_LOW (op1);
9984           return modulus;
9985         }
9986       else if (inner_code == MULT_EXPR)
9987         {
9988           op1 = TREE_OPERAND (op1, 1);
9989           if (TREE_CODE (op1) == INTEGER_CST)
9990             {
9991               unsigned HOST_WIDE_INT align;
9992
9993               /* Compute the greatest power-of-2 divisor of op1.  */
9994               align = TREE_INT_CST_LOW (op1);
9995               align &= -align;
9996
9997               /* If align is non-zero and less than *modulus, replace
9998                  *modulus with align., If align is 0, then either op1 is 0
9999                  or the greatest power-of-2 divisor of op1 doesn't fit in an
10000                  unsigned HOST_WIDE_INT.  In either case, no additional
10001                  constraint is imposed.  */
10002               if (align)
10003                 modulus = MIN (modulus, align);
10004
10005               return modulus;
10006             }
10007         }
10008     }
10009
10010     /* If we get here, we were unable to determine anything useful about the
10011        expression.  */
10012     return 1;
10013 }
10014
10015
10016 /* Fold a binary expression of code CODE and type TYPE with operands
10017    OP0 and OP1.  LOC is the location of the resulting expression.
10018    Return the folded expression if folding is successful.  Otherwise,
10019    return NULL_TREE.  */
10020
10021 tree
10022 fold_binary_loc (location_t loc,
10023              enum tree_code code, tree type, tree op0, tree op1)
10024 {
10025   enum tree_code_class kind = TREE_CODE_CLASS (code);
10026   tree arg0, arg1, tem;
10027   tree t1 = NULL_TREE;
10028   bool strict_overflow_p;
10029
10030   gcc_assert (IS_EXPR_CODE_CLASS (kind)
10031               && TREE_CODE_LENGTH (code) == 2
10032               && op0 != NULL_TREE
10033               && op1 != NULL_TREE);
10034
10035   arg0 = op0;
10036   arg1 = op1;
10037
10038   /* Strip any conversions that don't change the mode.  This is
10039      safe for every expression, except for a comparison expression
10040      because its signedness is derived from its operands.  So, in
10041      the latter case, only strip conversions that don't change the
10042      signedness.  MIN_EXPR/MAX_EXPR also need signedness of arguments
10043      preserved.
10044
10045      Note that this is done as an internal manipulation within the
10046      constant folder, in order to find the simplest representation
10047      of the arguments so that their form can be studied.  In any
10048      cases, the appropriate type conversions should be put back in
10049      the tree that will get out of the constant folder.  */
10050
10051   if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
10052     {
10053       STRIP_SIGN_NOPS (arg0);
10054       STRIP_SIGN_NOPS (arg1);
10055     }
10056   else
10057     {
10058       STRIP_NOPS (arg0);
10059       STRIP_NOPS (arg1);
10060     }
10061
10062   /* Note that TREE_CONSTANT isn't enough: static var addresses are
10063      constant but we can't do arithmetic on them.  */
10064   if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
10065       || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
10066       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
10067       || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
10068       || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
10069       || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
10070     {
10071       if (kind == tcc_binary)
10072         {
10073           /* Make sure type and arg0 have the same saturating flag.  */
10074           gcc_assert (TYPE_SATURATING (type)
10075                       == TYPE_SATURATING (TREE_TYPE (arg0)));
10076           tem = const_binop (code, arg0, arg1, 0);
10077         }
10078       else if (kind == tcc_comparison)
10079         tem = fold_relational_const (code, type, arg0, arg1);
10080       else
10081         tem = NULL_TREE;
10082
10083       if (tem != NULL_TREE)
10084         {
10085           if (TREE_TYPE (tem) != type)
10086             tem = fold_convert_loc (loc, type, tem);
10087           return tem;
10088         }
10089     }
10090
10091   /* If this is a commutative operation, and ARG0 is a constant, move it
10092      to ARG1 to reduce the number of tests below.  */
10093   if (commutative_tree_code (code)
10094       && tree_swap_operands_p (arg0, arg1, true))
10095     return fold_build2_loc (loc, code, type, op1, op0);
10096
10097   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
10098
10099      First check for cases where an arithmetic operation is applied to a
10100      compound, conditional, or comparison operation.  Push the arithmetic
10101      operation inside the compound or conditional to see if any folding
10102      can then be done.  Convert comparison to conditional for this purpose.
10103      The also optimizes non-constant cases that used to be done in
10104      expand_expr.
10105
10106      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
10107      one of the operands is a comparison and the other is a comparison, a
10108      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
10109      code below would make the expression more complex.  Change it to a
10110      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
10111      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
10112
10113   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
10114        || code == EQ_EXPR || code == NE_EXPR)
10115       && ((truth_value_p (TREE_CODE (arg0))
10116            && (truth_value_p (TREE_CODE (arg1))
10117                || (TREE_CODE (arg1) == BIT_AND_EXPR
10118                    && integer_onep (TREE_OPERAND (arg1, 1)))))
10119           || (truth_value_p (TREE_CODE (arg1))
10120               && (truth_value_p (TREE_CODE (arg0))
10121                   || (TREE_CODE (arg0) == BIT_AND_EXPR
10122                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
10123     {
10124       tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR
10125                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
10126                          : TRUTH_XOR_EXPR,
10127                          boolean_type_node,
10128                          fold_convert_loc (loc, boolean_type_node, arg0),
10129                          fold_convert_loc (loc, boolean_type_node, arg1));
10130
10131       if (code == EQ_EXPR)
10132         tem = invert_truthvalue_loc (loc, tem);
10133
10134       return fold_convert_loc (loc, type, tem);
10135     }
10136
10137   if (TREE_CODE_CLASS (code) == tcc_binary
10138       || TREE_CODE_CLASS (code) == tcc_comparison)
10139     {
10140       if (TREE_CODE (arg0) == COMPOUND_EXPR)
10141         {
10142           tem = fold_build2_loc (loc, code, type,
10143                              fold_convert_loc (loc, TREE_TYPE (op0),
10144                                                TREE_OPERAND (arg0, 1)), op1);
10145           tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), tem);
10146           goto fold_binary_exit;
10147         }
10148       if (TREE_CODE (arg1) == COMPOUND_EXPR
10149           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10150         {
10151           tem = fold_build2_loc (loc, code, type, op0,
10152                              fold_convert_loc (loc, TREE_TYPE (op1),
10153                                                TREE_OPERAND (arg1, 1)));
10154           tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0), tem);
10155           goto fold_binary_exit;
10156         }
10157
10158       if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
10159         {
10160           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10161                                                      arg0, arg1,
10162                                                      /*cond_first_p=*/1);
10163           if (tem != NULL_TREE)
10164             return tem;
10165         }
10166
10167       if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
10168         {
10169           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10170                                                      arg1, arg0,
10171                                                      /*cond_first_p=*/0);
10172           if (tem != NULL_TREE)
10173             return tem;
10174         }
10175     }
10176
10177   switch (code)
10178     {
10179     case POINTER_PLUS_EXPR:
10180       /* 0 +p index -> (type)index */
10181       if (integer_zerop (arg0))
10182         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
10183
10184       /* PTR +p 0 -> PTR */
10185       if (integer_zerop (arg1))
10186         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10187
10188       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
10189       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10190            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10191         return fold_convert_loc (loc, type,
10192                                  fold_build2_loc (loc, PLUS_EXPR, sizetype,
10193                                               fold_convert_loc (loc, sizetype,
10194                                                                 arg1),
10195                                               fold_convert_loc (loc, sizetype,
10196                                                                 arg0)));
10197
10198       /* index +p PTR -> PTR +p index */
10199       if (POINTER_TYPE_P (TREE_TYPE (arg1))
10200           && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10201         return fold_build2_loc (loc, POINTER_PLUS_EXPR, type,
10202                             fold_convert_loc (loc, type, arg1),
10203                             fold_convert_loc (loc, sizetype, arg0));
10204
10205       /* (PTR +p B) +p A -> PTR +p (B + A) */
10206       if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10207         {
10208           tree inner;
10209           tree arg01 = fold_convert_loc (loc, sizetype, TREE_OPERAND (arg0, 1));
10210           tree arg00 = TREE_OPERAND (arg0, 0);
10211           inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
10212                                arg01, fold_convert_loc (loc, sizetype, arg1));
10213           return fold_convert_loc (loc, type,
10214                                    fold_build2_loc (loc, POINTER_PLUS_EXPR,
10215                                                 TREE_TYPE (arg00),
10216                                                 arg00, inner));
10217         }
10218
10219       /* PTR_CST +p CST -> CST1 */
10220       if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
10221         return fold_build2_loc (loc, PLUS_EXPR, type, arg0,
10222                             fold_convert_loc (loc, type, arg1));
10223
10224      /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
10225         of the array.  Loop optimizer sometimes produce this type of
10226         expressions.  */
10227       if (TREE_CODE (arg0) == ADDR_EXPR)
10228         {
10229           tem = try_move_mult_to_index (loc, arg0,
10230                                         fold_convert_loc (loc, sizetype, arg1));
10231           if (tem)
10232             return fold_convert_loc (loc, type, tem);
10233         }
10234
10235       return NULL_TREE;
10236
10237     case PLUS_EXPR:
10238       /* A + (-B) -> A - B */
10239       if (TREE_CODE (arg1) == NEGATE_EXPR)
10240         return fold_build2_loc (loc, MINUS_EXPR, type,
10241                             fold_convert_loc (loc, type, arg0),
10242                             fold_convert_loc (loc, type,
10243                                               TREE_OPERAND (arg1, 0)));
10244       /* (-A) + B -> B - A */
10245       if (TREE_CODE (arg0) == NEGATE_EXPR
10246           && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
10247         return fold_build2_loc (loc, MINUS_EXPR, type,
10248                             fold_convert_loc (loc, type, arg1),
10249                             fold_convert_loc (loc, type,
10250                                               TREE_OPERAND (arg0, 0)));
10251
10252       if (INTEGRAL_TYPE_P (type))
10253         {
10254           /* Convert ~A + 1 to -A.  */
10255           if (TREE_CODE (arg0) == BIT_NOT_EXPR
10256               && integer_onep (arg1))
10257             return fold_build1_loc (loc, NEGATE_EXPR, type,
10258                                 fold_convert_loc (loc, type,
10259                                                   TREE_OPERAND (arg0, 0)));
10260
10261           /* ~X + X is -1.  */
10262           if (TREE_CODE (arg0) == BIT_NOT_EXPR
10263               && !TYPE_OVERFLOW_TRAPS (type))
10264             {
10265               tree tem = TREE_OPERAND (arg0, 0);
10266
10267               STRIP_NOPS (tem);
10268               if (operand_equal_p (tem, arg1, 0))
10269                 {
10270                   t1 = build_int_cst_type (type, -1);
10271                   return omit_one_operand_loc (loc, type, t1, arg1);
10272                 }
10273             }
10274
10275           /* X + ~X is -1.  */
10276           if (TREE_CODE (arg1) == BIT_NOT_EXPR
10277               && !TYPE_OVERFLOW_TRAPS (type))
10278             {
10279               tree tem = TREE_OPERAND (arg1, 0);
10280
10281               STRIP_NOPS (tem);
10282               if (operand_equal_p (arg0, tem, 0))
10283                 {
10284                   t1 = build_int_cst_type (type, -1);
10285                   return omit_one_operand_loc (loc, type, t1, arg0);
10286                 }
10287             }
10288
10289           /* X + (X / CST) * -CST is X % CST.  */
10290           if (TREE_CODE (arg1) == MULT_EXPR
10291               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10292               && operand_equal_p (arg0,
10293                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
10294             {
10295               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
10296               tree cst1 = TREE_OPERAND (arg1, 1);
10297               tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1),
10298                                       cst1, cst0);
10299               if (sum && integer_zerop (sum))
10300                 return fold_convert_loc (loc, type,
10301                                          fold_build2_loc (loc, TRUNC_MOD_EXPR,
10302                                                       TREE_TYPE (arg0), arg0,
10303                                                       cst0));
10304             }
10305         }
10306
10307       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
10308          same or one.  Make sure type is not saturating.
10309          fold_plusminus_mult_expr will re-associate.  */
10310       if ((TREE_CODE (arg0) == MULT_EXPR
10311            || TREE_CODE (arg1) == MULT_EXPR)
10312           && !TYPE_SATURATING (type)
10313           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10314         {
10315           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10316           if (tem)
10317             return tem;
10318         }
10319
10320       if (! FLOAT_TYPE_P (type))
10321         {
10322           if (integer_zerop (arg1))
10323             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10324
10325           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
10326              with a constant, and the two constants have no bits in common,
10327              we should treat this as a BIT_IOR_EXPR since this may produce more
10328              simplifications.  */
10329           if (TREE_CODE (arg0) == BIT_AND_EXPR
10330               && TREE_CODE (arg1) == BIT_AND_EXPR
10331               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10332               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10333               && integer_zerop (const_binop (BIT_AND_EXPR,
10334                                              TREE_OPERAND (arg0, 1),
10335                                              TREE_OPERAND (arg1, 1), 0)))
10336             {
10337               code = BIT_IOR_EXPR;
10338               goto bit_ior;
10339             }
10340
10341           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
10342              (plus (plus (mult) (mult)) (foo)) so that we can
10343              take advantage of the factoring cases below.  */
10344           if (((TREE_CODE (arg0) == PLUS_EXPR
10345                 || TREE_CODE (arg0) == MINUS_EXPR)
10346                && TREE_CODE (arg1) == MULT_EXPR)
10347               || ((TREE_CODE (arg1) == PLUS_EXPR
10348                    || TREE_CODE (arg1) == MINUS_EXPR)
10349                   && TREE_CODE (arg0) == MULT_EXPR))
10350             {
10351               tree parg0, parg1, parg, marg;
10352               enum tree_code pcode;
10353
10354               if (TREE_CODE (arg1) == MULT_EXPR)
10355                 parg = arg0, marg = arg1;
10356               else
10357                 parg = arg1, marg = arg0;
10358               pcode = TREE_CODE (parg);
10359               parg0 = TREE_OPERAND (parg, 0);
10360               parg1 = TREE_OPERAND (parg, 1);
10361               STRIP_NOPS (parg0);
10362               STRIP_NOPS (parg1);
10363
10364               if (TREE_CODE (parg0) == MULT_EXPR
10365                   && TREE_CODE (parg1) != MULT_EXPR)
10366                 return fold_build2_loc (loc, pcode, type,
10367                                     fold_build2_loc (loc, PLUS_EXPR, type,
10368                                                  fold_convert_loc (loc, type,
10369                                                                    parg0),
10370                                                  fold_convert_loc (loc, type,
10371                                                                    marg)),
10372                                     fold_convert_loc (loc, type, parg1));
10373               if (TREE_CODE (parg0) != MULT_EXPR
10374                   && TREE_CODE (parg1) == MULT_EXPR)
10375                 return
10376                   fold_build2_loc (loc, PLUS_EXPR, type,
10377                                fold_convert_loc (loc, type, parg0),
10378                                fold_build2_loc (loc, pcode, type,
10379                                             fold_convert_loc (loc, type, marg),
10380                                             fold_convert_loc (loc, type,
10381                                                               parg1)));
10382             }
10383         }
10384       else
10385         {
10386           /* See if ARG1 is zero and X + ARG1 reduces to X.  */
10387           if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
10388             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10389
10390           /* Likewise if the operands are reversed.  */
10391           if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10392             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
10393
10394           /* Convert X + -C into X - C.  */
10395           if (TREE_CODE (arg1) == REAL_CST
10396               && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
10397             {
10398               tem = fold_negate_const (arg1, type);
10399               if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
10400                 return fold_build2_loc (loc, MINUS_EXPR, type,
10401                                     fold_convert_loc (loc, type, arg0),
10402                                     fold_convert_loc (loc, type, tem));
10403             }
10404
10405           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10406              to __complex__ ( x, y ).  This is not the same for SNaNs or
10407              if signed zeros are involved.  */
10408           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10409               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10410               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10411             {
10412               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10413               tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10414               tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10415               bool arg0rz = false, arg0iz = false;
10416               if ((arg0r && (arg0rz = real_zerop (arg0r)))
10417                   || (arg0i && (arg0iz = real_zerop (arg0i))))
10418                 {
10419                   tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10420                   tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10421                   if (arg0rz && arg1i && real_zerop (arg1i))
10422                     {
10423                       tree rp = arg1r ? arg1r
10424                                   : build1 (REALPART_EXPR, rtype, arg1);
10425                       tree ip = arg0i ? arg0i
10426                                   : build1 (IMAGPART_EXPR, rtype, arg0);
10427                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10428                     }
10429                   else if (arg0iz && arg1r && real_zerop (arg1r))
10430                     {
10431                       tree rp = arg0r ? arg0r
10432                                   : build1 (REALPART_EXPR, rtype, arg0);
10433                       tree ip = arg1i ? arg1i
10434                                   : build1 (IMAGPART_EXPR, rtype, arg1);
10435                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10436                     }
10437                 }
10438             }
10439
10440           if (flag_unsafe_math_optimizations
10441               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10442               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10443               && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10444             return tem;
10445
10446           /* Convert x+x into x*2.0.  */
10447           if (operand_equal_p (arg0, arg1, 0)
10448               && SCALAR_FLOAT_TYPE_P (type))
10449             return fold_build2_loc (loc, MULT_EXPR, type, arg0,
10450                                 build_real (type, dconst2));
10451
10452           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.
10453              We associate floats only if the user has specified
10454              -fassociative-math.  */
10455           if (flag_associative_math
10456               && TREE_CODE (arg1) == PLUS_EXPR
10457               && TREE_CODE (arg0) != MULT_EXPR)
10458             {
10459               tree tree10 = TREE_OPERAND (arg1, 0);
10460               tree tree11 = TREE_OPERAND (arg1, 1);
10461               if (TREE_CODE (tree11) == MULT_EXPR
10462                   && TREE_CODE (tree10) == MULT_EXPR)
10463                 {
10464                   tree tree0;
10465                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10);
10466                   return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11);
10467                 }
10468             }
10469           /* Convert (b*c + d*e) + a into b*c + (d*e +a).
10470              We associate floats only if the user has specified
10471              -fassociative-math.  */
10472           if (flag_associative_math
10473               && TREE_CODE (arg0) == PLUS_EXPR
10474               && TREE_CODE (arg1) != MULT_EXPR)
10475             {
10476               tree tree00 = TREE_OPERAND (arg0, 0);
10477               tree tree01 = TREE_OPERAND (arg0, 1);
10478               if (TREE_CODE (tree01) == MULT_EXPR
10479                   && TREE_CODE (tree00) == MULT_EXPR)
10480                 {
10481                   tree tree0;
10482                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1);
10483                   return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0);
10484                 }
10485             }
10486         }
10487
10488      bit_rotate:
10489       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10490          is a rotate of A by C1 bits.  */
10491       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10492          is a rotate of A by B bits.  */
10493       {
10494         enum tree_code code0, code1;
10495         tree rtype;
10496         code0 = TREE_CODE (arg0);
10497         code1 = TREE_CODE (arg1);
10498         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10499              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10500             && operand_equal_p (TREE_OPERAND (arg0, 0),
10501                                 TREE_OPERAND (arg1, 0), 0)
10502             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10503                 TYPE_UNSIGNED (rtype))
10504             /* Only create rotates in complete modes.  Other cases are not
10505                expanded properly.  */
10506             && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
10507           {
10508             tree tree01, tree11;
10509             enum tree_code code01, code11;
10510
10511             tree01 = TREE_OPERAND (arg0, 1);
10512             tree11 = TREE_OPERAND (arg1, 1);
10513             STRIP_NOPS (tree01);
10514             STRIP_NOPS (tree11);
10515             code01 = TREE_CODE (tree01);
10516             code11 = TREE_CODE (tree11);
10517             if (code01 == INTEGER_CST
10518                 && code11 == INTEGER_CST
10519                 && TREE_INT_CST_HIGH (tree01) == 0
10520                 && TREE_INT_CST_HIGH (tree11) == 0
10521                 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
10522                     == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10523               {
10524                 tem = build2 (LROTATE_EXPR,
10525                               TREE_TYPE (TREE_OPERAND (arg0, 0)),
10526                               TREE_OPERAND (arg0, 0),
10527                               code0 == LSHIFT_EXPR
10528                               ? tree01 : tree11);
10529                 SET_EXPR_LOCATION (tem, loc);
10530                 return fold_convert_loc (loc, type, tem);
10531               }
10532             else if (code11 == MINUS_EXPR)
10533               {
10534                 tree tree110, tree111;
10535                 tree110 = TREE_OPERAND (tree11, 0);
10536                 tree111 = TREE_OPERAND (tree11, 1);
10537                 STRIP_NOPS (tree110);
10538                 STRIP_NOPS (tree111);
10539                 if (TREE_CODE (tree110) == INTEGER_CST
10540                     && 0 == compare_tree_int (tree110,
10541                                               TYPE_PRECISION
10542                                               (TREE_TYPE (TREE_OPERAND
10543                                                           (arg0, 0))))
10544                     && operand_equal_p (tree01, tree111, 0))
10545                   return
10546                     fold_convert_loc (loc, type,
10547                                       build2 ((code0 == LSHIFT_EXPR
10548                                                ? LROTATE_EXPR
10549                                                : RROTATE_EXPR),
10550                                               TREE_TYPE (TREE_OPERAND (arg0, 0)),
10551                                               TREE_OPERAND (arg0, 0), tree01));
10552               }
10553             else if (code01 == MINUS_EXPR)
10554               {
10555                 tree tree010, tree011;
10556                 tree010 = TREE_OPERAND (tree01, 0);
10557                 tree011 = TREE_OPERAND (tree01, 1);
10558                 STRIP_NOPS (tree010);
10559                 STRIP_NOPS (tree011);
10560                 if (TREE_CODE (tree010) == INTEGER_CST
10561                     && 0 == compare_tree_int (tree010,
10562                                               TYPE_PRECISION
10563                                               (TREE_TYPE (TREE_OPERAND
10564                                                           (arg0, 0))))
10565                     && operand_equal_p (tree11, tree011, 0))
10566                     return fold_convert_loc
10567                       (loc, type,
10568                        build2 ((code0 != LSHIFT_EXPR
10569                                 ? LROTATE_EXPR
10570                                 : RROTATE_EXPR),
10571                                TREE_TYPE (TREE_OPERAND (arg0, 0)),
10572                                TREE_OPERAND (arg0, 0), tree11));
10573               }
10574           }
10575       }
10576
10577     associate:
10578       /* In most languages, can't associate operations on floats through
10579          parentheses.  Rather than remember where the parentheses were, we
10580          don't associate floats at all, unless the user has specified
10581          -fassociative-math.
10582          And, we need to make sure type is not saturating.  */
10583
10584       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10585           && !TYPE_SATURATING (type))
10586         {
10587           tree var0, con0, lit0, minus_lit0;
10588           tree var1, con1, lit1, minus_lit1;
10589           bool ok = true;
10590
10591           /* Split both trees into variables, constants, and literals.  Then
10592              associate each group together, the constants with literals,
10593              then the result with variables.  This increases the chances of
10594              literals being recombined later and of generating relocatable
10595              expressions for the sum of a constant and literal.  */
10596           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
10597           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
10598                              code == MINUS_EXPR);
10599
10600           /* With undefined overflow we can only associate constants
10601              with one variable.  */
10602           if (((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10603                || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10604               && var0 && var1)
10605             {
10606               tree tmp0 = var0;
10607               tree tmp1 = var1;
10608
10609               if (TREE_CODE (tmp0) == NEGATE_EXPR)
10610                 tmp0 = TREE_OPERAND (tmp0, 0);
10611               if (TREE_CODE (tmp1) == NEGATE_EXPR)
10612                 tmp1 = TREE_OPERAND (tmp1, 0);
10613               /* The only case we can still associate with two variables
10614                  is if they are the same, modulo negation.  */
10615               if (!operand_equal_p (tmp0, tmp1, 0))
10616                 ok = false;
10617             }
10618
10619           /* Only do something if we found more than two objects.  Otherwise,
10620              nothing has changed and we risk infinite recursion.  */
10621           if (ok
10622               && (2 < ((var0 != 0) + (var1 != 0)
10623                        + (con0 != 0) + (con1 != 0)
10624                        + (lit0 != 0) + (lit1 != 0)
10625                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
10626             {
10627               /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
10628               if (code == MINUS_EXPR)
10629                 code = PLUS_EXPR;
10630
10631               var0 = associate_trees (loc, var0, var1, code, type);
10632               con0 = associate_trees (loc, con0, con1, code, type);
10633               lit0 = associate_trees (loc, lit0, lit1, code, type);
10634               minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1, code, type);
10635
10636               /* Preserve the MINUS_EXPR if the negative part of the literal is
10637                  greater than the positive part.  Otherwise, the multiplicative
10638                  folding code (i.e extract_muldiv) may be fooled in case
10639                  unsigned constants are subtracted, like in the following
10640                  example: ((X*2 + 4) - 8U)/2.  */
10641               if (minus_lit0 && lit0)
10642                 {
10643                   if (TREE_CODE (lit0) == INTEGER_CST
10644                       && TREE_CODE (minus_lit0) == INTEGER_CST
10645                       && tree_int_cst_lt (lit0, minus_lit0))
10646                     {
10647                       minus_lit0 = associate_trees (loc, minus_lit0, lit0,
10648                                                     MINUS_EXPR, type);
10649                       lit0 = 0;
10650                     }
10651                   else
10652                     {
10653                       lit0 = associate_trees (loc, lit0, minus_lit0,
10654                                               MINUS_EXPR, type);
10655                       minus_lit0 = 0;
10656                     }
10657                 }
10658               if (minus_lit0)
10659                 {
10660                   if (con0 == 0)
10661                     return
10662                       fold_convert_loc (loc, type,
10663                                         associate_trees (loc, var0, minus_lit0,
10664                                                          MINUS_EXPR, type));
10665                   else
10666                     {
10667                       con0 = associate_trees (loc, con0, minus_lit0,
10668                                               MINUS_EXPR, type);
10669                       return
10670                         fold_convert_loc (loc, type,
10671                                           associate_trees (loc, var0, con0,
10672                                                            PLUS_EXPR, type));
10673                     }
10674                 }
10675
10676               con0 = associate_trees (loc, con0, lit0, code, type);
10677               return
10678                 fold_convert_loc (loc, type, associate_trees (loc, var0, con0,
10679                                                               code, type));
10680             }
10681         }
10682
10683       return NULL_TREE;
10684
10685     case MINUS_EXPR:
10686       /* Pointer simplifications for subtraction, simple reassociations. */
10687       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10688         {
10689           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10690           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10691               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10692             {
10693               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10694               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10695               tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
10696               tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
10697               return fold_build2_loc (loc, PLUS_EXPR, type,
10698                                   fold_build2_loc (loc, MINUS_EXPR, type,
10699                                                arg00, arg10),
10700                                   fold_build2_loc (loc, MINUS_EXPR, type,
10701                                                arg01, arg11));
10702             }
10703           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10704           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10705             {
10706               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10707               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10708               tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00,
10709                                       fold_convert_loc (loc, type, arg1));
10710               if (tmp)
10711                 return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01);
10712             }
10713         }
10714       /* A - (-B) -> A + B */
10715       if (TREE_CODE (arg1) == NEGATE_EXPR)
10716         return fold_build2_loc (loc, PLUS_EXPR, type, op0,
10717                             fold_convert_loc (loc, type,
10718                                               TREE_OPERAND (arg1, 0)));
10719       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
10720       if (TREE_CODE (arg0) == NEGATE_EXPR
10721           && (FLOAT_TYPE_P (type)
10722               || INTEGRAL_TYPE_P (type))
10723           && negate_expr_p (arg1)
10724           && reorder_operands_p (arg0, arg1))
10725         return fold_build2_loc (loc, MINUS_EXPR, type,
10726                             fold_convert_loc (loc, type,
10727                                               negate_expr (arg1)),
10728                             fold_convert_loc (loc, type,
10729                                               TREE_OPERAND (arg0, 0)));
10730       /* Convert -A - 1 to ~A.  */
10731       if (INTEGRAL_TYPE_P (type)
10732           && TREE_CODE (arg0) == NEGATE_EXPR
10733           && integer_onep (arg1)
10734           && !TYPE_OVERFLOW_TRAPS (type))
10735         return fold_build1_loc (loc, BIT_NOT_EXPR, type,
10736                             fold_convert_loc (loc, type,
10737                                               TREE_OPERAND (arg0, 0)));
10738
10739       /* Convert -1 - A to ~A.  */
10740       if (INTEGRAL_TYPE_P (type)
10741           && integer_all_onesp (arg0))
10742         return fold_build1_loc (loc, BIT_NOT_EXPR, type, op1);
10743
10744
10745       /* X - (X / CST) * CST is X % CST.  */
10746       if (INTEGRAL_TYPE_P (type)
10747           && TREE_CODE (arg1) == MULT_EXPR
10748           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10749           && operand_equal_p (arg0,
10750                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10751           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10752                               TREE_OPERAND (arg1, 1), 0))
10753         return
10754           fold_convert_loc (loc, type,
10755                             fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10756                                          arg0, TREE_OPERAND (arg1, 1)));
10757
10758       if (! FLOAT_TYPE_P (type))
10759         {
10760           if (integer_zerop (arg0))
10761             return negate_expr (fold_convert_loc (loc, type, arg1));
10762           if (integer_zerop (arg1))
10763             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10764
10765           /* Fold A - (A & B) into ~B & A.  */
10766           if (!TREE_SIDE_EFFECTS (arg0)
10767               && TREE_CODE (arg1) == BIT_AND_EXPR)
10768             {
10769               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10770                 {
10771                   tree arg10 = fold_convert_loc (loc, type,
10772                                                  TREE_OPERAND (arg1, 0));
10773                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10774                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10775                                                    type, arg10),
10776                                       fold_convert_loc (loc, type, arg0));
10777                 }
10778               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10779                 {
10780                   tree arg11 = fold_convert_loc (loc,
10781                                                  type, TREE_OPERAND (arg1, 1));
10782                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10783                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10784                                                    type, arg11),
10785                                       fold_convert_loc (loc, type, arg0));
10786                 }
10787             }
10788
10789           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10790              any power of 2 minus 1.  */
10791           if (TREE_CODE (arg0) == BIT_AND_EXPR
10792               && TREE_CODE (arg1) == BIT_AND_EXPR
10793               && operand_equal_p (TREE_OPERAND (arg0, 0),
10794                                   TREE_OPERAND (arg1, 0), 0))
10795             {
10796               tree mask0 = TREE_OPERAND (arg0, 1);
10797               tree mask1 = TREE_OPERAND (arg1, 1);
10798               tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0);
10799
10800               if (operand_equal_p (tem, mask1, 0))
10801                 {
10802                   tem = fold_build2_loc (loc, BIT_XOR_EXPR, type,
10803                                      TREE_OPERAND (arg0, 0), mask1);
10804                   return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1);
10805                 }
10806             }
10807         }
10808
10809       /* See if ARG1 is zero and X - ARG1 reduces to X.  */
10810       else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
10811         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10812
10813       /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0).  So check whether
10814          ARG0 is zero and X + ARG0 reduces to X, since that would mean
10815          (-ARG1 + ARG0) reduces to -ARG1.  */
10816       else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10817         return negate_expr (fold_convert_loc (loc, type, arg1));
10818
10819       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10820          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10821          signed zeros are involved.  */
10822       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10823           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10824           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10825         {
10826           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10827           tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10828           tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10829           bool arg0rz = false, arg0iz = false;
10830           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10831               || (arg0i && (arg0iz = real_zerop (arg0i))))
10832             {
10833               tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10834               tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10835               if (arg0rz && arg1i && real_zerop (arg1i))
10836                 {
10837                   tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10838                                          arg1r ? arg1r
10839                                          : build1 (REALPART_EXPR, rtype, arg1));
10840                   tree ip = arg0i ? arg0i
10841                     : build1 (IMAGPART_EXPR, rtype, arg0);
10842                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10843                 }
10844               else if (arg0iz && arg1r && real_zerop (arg1r))
10845                 {
10846                   tree rp = arg0r ? arg0r
10847                     : build1 (REALPART_EXPR, rtype, arg0);
10848                   tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10849                                          arg1i ? arg1i
10850                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10851                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10852                 }
10853             }
10854         }
10855
10856       /* Fold &x - &x.  This can happen from &x.foo - &x.
10857          This is unsafe for certain floats even in non-IEEE formats.
10858          In IEEE, it is unsafe because it does wrong for NaNs.
10859          Also note that operand_equal_p is always false if an operand
10860          is volatile.  */
10861
10862       if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10863           && operand_equal_p (arg0, arg1, 0))
10864         return fold_convert_loc (loc, type, integer_zero_node);
10865
10866       /* A - B -> A + (-B) if B is easily negatable.  */
10867       if (negate_expr_p (arg1)
10868           && ((FLOAT_TYPE_P (type)
10869                /* Avoid this transformation if B is a positive REAL_CST.  */
10870                && (TREE_CODE (arg1) != REAL_CST
10871                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10872               || INTEGRAL_TYPE_P (type)))
10873         return fold_build2_loc (loc, PLUS_EXPR, type,
10874                             fold_convert_loc (loc, type, arg0),
10875                             fold_convert_loc (loc, type,
10876                                               negate_expr (arg1)));
10877
10878       /* Try folding difference of addresses.  */
10879       {
10880         HOST_WIDE_INT diff;
10881
10882         if ((TREE_CODE (arg0) == ADDR_EXPR
10883              || TREE_CODE (arg1) == ADDR_EXPR)
10884             && ptr_difference_const (arg0, arg1, &diff))
10885           return build_int_cst_type (type, diff);
10886       }
10887
10888       /* Fold &a[i] - &a[j] to i-j.  */
10889       if (TREE_CODE (arg0) == ADDR_EXPR
10890           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10891           && TREE_CODE (arg1) == ADDR_EXPR
10892           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10893         {
10894           tree aref0 = TREE_OPERAND (arg0, 0);
10895           tree aref1 = TREE_OPERAND (arg1, 0);
10896           if (operand_equal_p (TREE_OPERAND (aref0, 0),
10897                                TREE_OPERAND (aref1, 0), 0))
10898             {
10899               tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
10900               tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
10901               tree esz = array_ref_element_size (aref0);
10902               tree diff = build2 (MINUS_EXPR, type, op0, op1);
10903               return fold_build2_loc (loc, MULT_EXPR, type, diff,
10904                                   fold_convert_loc (loc, type, esz));
10905
10906             }
10907         }
10908
10909       if (FLOAT_TYPE_P (type)
10910           && flag_unsafe_math_optimizations
10911           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10912           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10913           && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10914         return tem;
10915
10916       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
10917          same or one.  Make sure type is not saturating.
10918          fold_plusminus_mult_expr will re-associate.  */
10919       if ((TREE_CODE (arg0) == MULT_EXPR
10920            || TREE_CODE (arg1) == MULT_EXPR)
10921           && !TYPE_SATURATING (type)
10922           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10923         {
10924           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10925           if (tem)
10926             return tem;
10927         }
10928
10929       goto associate;
10930
10931     case MULT_EXPR:
10932       /* (-A) * (-B) -> A * B  */
10933       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10934         return fold_build2_loc (loc, MULT_EXPR, type,
10935                             fold_convert_loc (loc, type,
10936                                               TREE_OPERAND (arg0, 0)),
10937                             fold_convert_loc (loc, type,
10938                                               negate_expr (arg1)));
10939       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10940         return fold_build2_loc (loc, MULT_EXPR, type,
10941                             fold_convert_loc (loc, type,
10942                                               negate_expr (arg0)),
10943                             fold_convert_loc (loc, type,
10944                                               TREE_OPERAND (arg1, 0)));
10945
10946       if (! FLOAT_TYPE_P (type))
10947         {
10948           if (integer_zerop (arg1))
10949             return omit_one_operand_loc (loc, type, arg1, arg0);
10950           if (integer_onep (arg1))
10951             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10952           /* Transform x * -1 into -x.  Make sure to do the negation
10953              on the original operand with conversions not stripped
10954              because we can only strip non-sign-changing conversions.  */
10955           if (integer_all_onesp (arg1))
10956             return fold_convert_loc (loc, type, negate_expr (op0));
10957           /* Transform x * -C into -x * C if x is easily negatable.  */
10958           if (TREE_CODE (arg1) == INTEGER_CST
10959               && tree_int_cst_sgn (arg1) == -1
10960               && negate_expr_p (arg0)
10961               && (tem = negate_expr (arg1)) != arg1
10962               && !TREE_OVERFLOW (tem))
10963             return fold_build2_loc (loc, MULT_EXPR, type,
10964                                 fold_convert_loc (loc, type,
10965                                                   negate_expr (arg0)),
10966                                 tem);
10967
10968           /* (a * (1 << b)) is (a << b)  */
10969           if (TREE_CODE (arg1) == LSHIFT_EXPR
10970               && integer_onep (TREE_OPERAND (arg1, 0)))
10971             return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
10972                                 TREE_OPERAND (arg1, 1));
10973           if (TREE_CODE (arg0) == LSHIFT_EXPR
10974               && integer_onep (TREE_OPERAND (arg0, 0)))
10975             return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
10976                                 TREE_OPERAND (arg0, 1));
10977
10978           /* (A + A) * C -> A * 2 * C  */
10979           if (TREE_CODE (arg0) == PLUS_EXPR
10980               && TREE_CODE (arg1) == INTEGER_CST
10981               && operand_equal_p (TREE_OPERAND (arg0, 0),
10982                                   TREE_OPERAND (arg0, 1), 0))
10983             return fold_build2_loc (loc, MULT_EXPR, type,
10984                                 omit_one_operand_loc (loc, type,
10985                                                   TREE_OPERAND (arg0, 0),
10986                                                   TREE_OPERAND (arg0, 1)),
10987                                 fold_build2_loc (loc, MULT_EXPR, type,
10988                                              build_int_cst (type, 2) , arg1));
10989
10990           strict_overflow_p = false;
10991           if (TREE_CODE (arg1) == INTEGER_CST
10992               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10993                                              &strict_overflow_p)))
10994             {
10995               if (strict_overflow_p)
10996                 fold_overflow_warning (("assuming signed overflow does not "
10997                                         "occur when simplifying "
10998                                         "multiplication"),
10999                                        WARN_STRICT_OVERFLOW_MISC);
11000               return fold_convert_loc (loc, type, tem);
11001             }
11002
11003           /* Optimize z * conj(z) for integer complex numbers.  */
11004           if (TREE_CODE (arg0) == CONJ_EXPR
11005               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11006             return fold_mult_zconjz (loc, type, arg1);
11007           if (TREE_CODE (arg1) == CONJ_EXPR
11008               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11009             return fold_mult_zconjz (loc, type, arg0);
11010         }
11011       else
11012         {
11013           /* Maybe fold x * 0 to 0.  The expressions aren't the same
11014              when x is NaN, since x * 0 is also NaN.  Nor are they the
11015              same in modes with signed zeros, since multiplying a
11016              negative value by 0 gives -0, not +0.  */
11017           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11018               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11019               && real_zerop (arg1))
11020             return omit_one_operand_loc (loc, type, arg1, arg0);
11021           /* In IEEE floating point, x*1 is not equivalent to x for snans.
11022              Likewise for complex arithmetic with signed zeros.  */
11023           if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11024               && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11025                   || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
11026               && real_onep (arg1))
11027             return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11028
11029           /* Transform x * -1.0 into -x.  */
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_minus_onep (arg1))
11034             return fold_convert_loc (loc, type, negate_expr (arg0));
11035
11036           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
11037              the result for floating point types due to rounding so it is applied
11038              only if -fassociative-math was specify.  */
11039           if (flag_associative_math
11040               && TREE_CODE (arg0) == RDIV_EXPR
11041               && TREE_CODE (arg1) == REAL_CST
11042               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
11043             {
11044               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
11045                                       arg1, 0);
11046               if (tem)
11047                 return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11048                                     TREE_OPERAND (arg0, 1));
11049             }
11050
11051           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
11052           if (operand_equal_p (arg0, arg1, 0))
11053             {
11054               tree tem = fold_strip_sign_ops (arg0);
11055               if (tem != NULL_TREE)
11056                 {
11057                   tem = fold_convert_loc (loc, type, tem);
11058                   return fold_build2_loc (loc, MULT_EXPR, type, tem, tem);
11059                 }
11060             }
11061
11062           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
11063              This is not the same for NaNs or if signed zeros are
11064              involved.  */
11065           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11066               && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
11067               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11068               && TREE_CODE (arg1) == COMPLEX_CST
11069               && real_zerop (TREE_REALPART (arg1)))
11070             {
11071               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
11072               if (real_onep (TREE_IMAGPART (arg1)))
11073                 return
11074                   fold_build2_loc (loc, COMPLEX_EXPR, type,
11075                                negate_expr (fold_build1_loc (loc, IMAGPART_EXPR,
11076                                                              rtype, arg0)),
11077                                fold_build1_loc (loc, REALPART_EXPR, rtype, arg0));
11078               else if (real_minus_onep (TREE_IMAGPART (arg1)))
11079                 return
11080                   fold_build2_loc (loc, COMPLEX_EXPR, type,
11081                                fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0),
11082                                negate_expr (fold_build1_loc (loc, REALPART_EXPR,
11083                                                              rtype, arg0)));
11084             }
11085
11086           /* Optimize z * conj(z) for floating point complex numbers.
11087              Guarded by flag_unsafe_math_optimizations as non-finite
11088              imaginary components don't produce scalar results.  */
11089           if (flag_unsafe_math_optimizations
11090               && TREE_CODE (arg0) == CONJ_EXPR
11091               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11092             return fold_mult_zconjz (loc, type, arg1);
11093           if (flag_unsafe_math_optimizations
11094               && TREE_CODE (arg1) == CONJ_EXPR
11095               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11096             return fold_mult_zconjz (loc, type, arg0);
11097
11098           if (flag_unsafe_math_optimizations)
11099             {
11100               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11101               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11102
11103               /* Optimizations of root(...)*root(...).  */
11104               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
11105                 {
11106                   tree rootfn, arg;
11107                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11108                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11109
11110                   /* Optimize sqrt(x)*sqrt(x) as x.  */
11111                   if (BUILTIN_SQRT_P (fcode0)
11112                       && operand_equal_p (arg00, arg10, 0)
11113                       && ! HONOR_SNANS (TYPE_MODE (type)))
11114                     return arg00;
11115
11116                   /* Optimize root(x)*root(y) as root(x*y).  */
11117                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11118                   arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10);
11119                   return build_call_expr_loc (loc, rootfn, 1, arg);
11120                 }
11121
11122               /* Optimize expN(x)*expN(y) as expN(x+y).  */
11123               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
11124                 {
11125                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11126                   tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
11127                                           CALL_EXPR_ARG (arg0, 0),
11128                                           CALL_EXPR_ARG (arg1, 0));
11129                   return build_call_expr_loc (loc, expfn, 1, arg);
11130                 }
11131
11132               /* Optimizations of pow(...)*pow(...).  */
11133               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
11134                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
11135                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
11136                 {
11137                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11138                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
11139                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11140                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
11141
11142                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
11143                   if (operand_equal_p (arg01, arg11, 0))
11144                     {
11145                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11146                       tree arg = fold_build2_loc (loc, MULT_EXPR, type,
11147                                               arg00, arg10);
11148                       return build_call_expr_loc (loc, powfn, 2, arg, arg01);
11149                     }
11150
11151                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
11152                   if (operand_equal_p (arg00, arg10, 0))
11153                     {
11154                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11155                       tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
11156                                               arg01, arg11);
11157                       return build_call_expr_loc (loc, powfn, 2, arg00, arg);
11158                     }
11159                 }
11160
11161               /* Optimize tan(x)*cos(x) as sin(x).  */
11162               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
11163                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
11164                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
11165                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
11166                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
11167                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
11168                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11169                                       CALL_EXPR_ARG (arg1, 0), 0))
11170                 {
11171                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
11172
11173                   if (sinfn != NULL_TREE)
11174                     return build_call_expr_loc (loc, sinfn, 1,
11175                                             CALL_EXPR_ARG (arg0, 0));
11176                 }
11177
11178               /* Optimize x*pow(x,c) as pow(x,c+1).  */
11179               if (fcode1 == BUILT_IN_POW
11180                   || fcode1 == BUILT_IN_POWF
11181                   || fcode1 == BUILT_IN_POWL)
11182                 {
11183                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
11184                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
11185                   if (TREE_CODE (arg11) == REAL_CST
11186                       && !TREE_OVERFLOW (arg11)
11187                       && operand_equal_p (arg0, arg10, 0))
11188                     {
11189                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11190                       REAL_VALUE_TYPE c;
11191                       tree arg;
11192
11193                       c = TREE_REAL_CST (arg11);
11194                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
11195                       arg = build_real (type, c);
11196                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11197                     }
11198                 }
11199
11200               /* Optimize pow(x,c)*x as pow(x,c+1).  */
11201               if (fcode0 == BUILT_IN_POW
11202                   || fcode0 == BUILT_IN_POWF
11203                   || fcode0 == BUILT_IN_POWL)
11204                 {
11205                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
11206                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
11207                   if (TREE_CODE (arg01) == REAL_CST
11208                       && !TREE_OVERFLOW (arg01)
11209                       && operand_equal_p (arg1, arg00, 0))
11210                     {
11211                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11212                       REAL_VALUE_TYPE c;
11213                       tree arg;
11214
11215                       c = TREE_REAL_CST (arg01);
11216                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
11217                       arg = build_real (type, c);
11218                       return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11219                     }
11220                 }
11221
11222               /* Optimize x*x as pow(x,2.0), which is expanded as x*x.  */
11223               if (optimize_function_for_speed_p (cfun)
11224                   && operand_equal_p (arg0, arg1, 0))
11225                 {
11226                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
11227
11228                   if (powfn)
11229                     {
11230                       tree arg = build_real (type, dconst2);
11231                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11232                     }
11233                 }
11234             }
11235         }
11236       goto associate;
11237
11238     case BIT_IOR_EXPR:
11239     bit_ior:
11240       if (integer_all_onesp (arg1))
11241         return omit_one_operand_loc (loc, type, arg1, arg0);
11242       if (integer_zerop (arg1))
11243         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11244       if (operand_equal_p (arg0, arg1, 0))
11245         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11246
11247       /* ~X | X is -1.  */
11248       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11249           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11250         {
11251           t1 = fold_convert_loc (loc, type, integer_zero_node);
11252           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11253           return omit_one_operand_loc (loc, type, t1, arg1);
11254         }
11255
11256       /* X | ~X is -1.  */
11257       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11258           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11259         {
11260           t1 = fold_convert_loc (loc, type, integer_zero_node);
11261           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11262           return omit_one_operand_loc (loc, type, t1, arg0);
11263         }
11264
11265       /* Canonicalize (X & C1) | C2.  */
11266       if (TREE_CODE (arg0) == BIT_AND_EXPR
11267           && TREE_CODE (arg1) == INTEGER_CST
11268           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11269         {
11270           unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
11271           int width = TYPE_PRECISION (type), w;
11272           hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
11273           lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11274           hi2 = TREE_INT_CST_HIGH (arg1);
11275           lo2 = TREE_INT_CST_LOW (arg1);
11276
11277           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
11278           if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
11279             return omit_one_operand_loc (loc, type, arg1,
11280                                      TREE_OPERAND (arg0, 0));
11281
11282           if (width > HOST_BITS_PER_WIDE_INT)
11283             {
11284               mhi = (unsigned HOST_WIDE_INT) -1
11285                     >> (2 * HOST_BITS_PER_WIDE_INT - width);
11286               mlo = -1;
11287             }
11288           else
11289             {
11290               mhi = 0;
11291               mlo = (unsigned HOST_WIDE_INT) -1
11292                     >> (HOST_BITS_PER_WIDE_INT - width);
11293             }
11294
11295           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
11296           if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
11297             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11298                                 TREE_OPERAND (arg0, 0), arg1);
11299
11300           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
11301              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
11302              mode which allows further optimizations.  */
11303           hi1 &= mhi;
11304           lo1 &= mlo;
11305           hi2 &= mhi;
11306           lo2 &= mlo;
11307           hi3 = hi1 & ~hi2;
11308           lo3 = lo1 & ~lo2;
11309           for (w = BITS_PER_UNIT;
11310                w <= width && w <= HOST_BITS_PER_WIDE_INT;
11311                w <<= 1)
11312             {
11313               unsigned HOST_WIDE_INT mask
11314                 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
11315               if (((lo1 | lo2) & mask) == mask
11316                   && (lo1 & ~mask) == 0 && hi1 == 0)
11317                 {
11318                   hi3 = 0;
11319                   lo3 = mask;
11320                   break;
11321                 }
11322             }
11323           if (hi3 != hi1 || lo3 != lo1)
11324             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11325                                 fold_build2_loc (loc, BIT_AND_EXPR, type,
11326                                              TREE_OPERAND (arg0, 0),
11327                                              build_int_cst_wide (type,
11328                                                                  lo3, hi3)),
11329                                 arg1);
11330         }
11331
11332       /* (X & Y) | Y is (X, Y).  */
11333       if (TREE_CODE (arg0) == BIT_AND_EXPR
11334           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11335         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11336       /* (X & Y) | X is (Y, X).  */
11337       if (TREE_CODE (arg0) == BIT_AND_EXPR
11338           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11339           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11340         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11341       /* X | (X & Y) is (Y, X).  */
11342       if (TREE_CODE (arg1) == BIT_AND_EXPR
11343           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11344           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11345         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11346       /* X | (Y & X) is (Y, X).  */
11347       if (TREE_CODE (arg1) == BIT_AND_EXPR
11348           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11349           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11350         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11351
11352       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11353       if (t1 != NULL_TREE)
11354         return t1;
11355
11356       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
11357
11358          This results in more efficient code for machines without a NAND
11359          instruction.  Combine will canonicalize to the first form
11360          which will allow use of NAND instructions provided by the
11361          backend if they exist.  */
11362       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11363           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11364         {
11365           return
11366             fold_build1_loc (loc, BIT_NOT_EXPR, type,
11367                          build2 (BIT_AND_EXPR, type,
11368                                  fold_convert_loc (loc, type,
11369                                                    TREE_OPERAND (arg0, 0)),
11370                                  fold_convert_loc (loc, type,
11371                                                    TREE_OPERAND (arg1, 0))));
11372         }
11373
11374       /* See if this can be simplified into a rotate first.  If that
11375          is unsuccessful continue in the association code.  */
11376       goto bit_rotate;
11377
11378     case BIT_XOR_EXPR:
11379       if (integer_zerop (arg1))
11380         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11381       if (integer_all_onesp (arg1))
11382         return fold_build1_loc (loc, BIT_NOT_EXPR, type, op0);
11383       if (operand_equal_p (arg0, arg1, 0))
11384         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11385
11386       /* ~X ^ X is -1.  */
11387       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11388           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11389         {
11390           t1 = fold_convert_loc (loc, type, integer_zero_node);
11391           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11392           return omit_one_operand_loc (loc, type, t1, arg1);
11393         }
11394
11395       /* X ^ ~X is -1.  */
11396       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11397           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11398         {
11399           t1 = fold_convert_loc (loc, type, integer_zero_node);
11400           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11401           return omit_one_operand_loc (loc, type, t1, arg0);
11402         }
11403
11404       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
11405          with a constant, and the two constants have no bits in common,
11406          we should treat this as a BIT_IOR_EXPR since this may produce more
11407          simplifications.  */
11408       if (TREE_CODE (arg0) == BIT_AND_EXPR
11409           && TREE_CODE (arg1) == BIT_AND_EXPR
11410           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11411           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
11412           && integer_zerop (const_binop (BIT_AND_EXPR,
11413                                          TREE_OPERAND (arg0, 1),
11414                                          TREE_OPERAND (arg1, 1), 0)))
11415         {
11416           code = BIT_IOR_EXPR;
11417           goto bit_ior;
11418         }
11419
11420       /* (X | Y) ^ X -> Y & ~ X*/
11421       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11422           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11423         {
11424           tree t2 = TREE_OPERAND (arg0, 1);
11425           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11426                             arg1);
11427           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11428                             fold_convert_loc (loc, type, t2),
11429                             fold_convert_loc (loc, type, t1));
11430           return t1;
11431         }
11432
11433       /* (Y | X) ^ X -> Y & ~ X*/
11434       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11435           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11436         {
11437           tree t2 = TREE_OPERAND (arg0, 0);
11438           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11439                             arg1);
11440           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11441                             fold_convert_loc (loc, type, t2),
11442                             fold_convert_loc (loc, type, t1));
11443           return t1;
11444         }
11445
11446       /* X ^ (X | Y) -> Y & ~ X*/
11447       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11448           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11449         {
11450           tree t2 = TREE_OPERAND (arg1, 1);
11451           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11452                             arg0);
11453           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11454                             fold_convert_loc (loc, type, t2),
11455                             fold_convert_loc (loc, type, t1));
11456           return t1;
11457         }
11458
11459       /* X ^ (Y | X) -> Y & ~ X*/
11460       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11461           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11462         {
11463           tree t2 = TREE_OPERAND (arg1, 0);
11464           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11465                             arg0);
11466           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11467                             fold_convert_loc (loc, type, t2),
11468                             fold_convert_loc (loc, type, t1));
11469           return t1;
11470         }
11471
11472       /* Convert ~X ^ ~Y to X ^ Y.  */
11473       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11474           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11475         return fold_build2_loc (loc, code, type,
11476                             fold_convert_loc (loc, type,
11477                                               TREE_OPERAND (arg0, 0)),
11478                             fold_convert_loc (loc, type,
11479                                               TREE_OPERAND (arg1, 0)));
11480
11481       /* Convert ~X ^ C to X ^ ~C.  */
11482       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11483           && TREE_CODE (arg1) == INTEGER_CST)
11484         return fold_build2_loc (loc, code, type,
11485                             fold_convert_loc (loc, type,
11486                                               TREE_OPERAND (arg0, 0)),
11487                             fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1));
11488
11489       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
11490       if (TREE_CODE (arg0) == BIT_AND_EXPR
11491           && integer_onep (TREE_OPERAND (arg0, 1))
11492           && integer_onep (arg1))
11493         return fold_build2_loc (loc, EQ_EXPR, type, arg0,
11494                             build_int_cst (TREE_TYPE (arg0), 0));
11495
11496       /* Fold (X & Y) ^ Y as ~X & Y.  */
11497       if (TREE_CODE (arg0) == BIT_AND_EXPR
11498           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11499         {
11500           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11501           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11502                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11503                               fold_convert_loc (loc, type, arg1));
11504         }
11505       /* Fold (X & Y) ^ X as ~Y & X.  */
11506       if (TREE_CODE (arg0) == BIT_AND_EXPR
11507           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11508           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11509         {
11510           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11511           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11512                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11513                               fold_convert_loc (loc, type, arg1));
11514         }
11515       /* Fold X ^ (X & Y) as X & ~Y.  */
11516       if (TREE_CODE (arg1) == BIT_AND_EXPR
11517           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11518         {
11519           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11520           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11521                               fold_convert_loc (loc, type, arg0),
11522                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11523         }
11524       /* Fold X ^ (Y & X) as ~Y & X.  */
11525       if (TREE_CODE (arg1) == BIT_AND_EXPR
11526           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11527           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11528         {
11529           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11530           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11531                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11532                               fold_convert_loc (loc, type, arg0));
11533         }
11534
11535       /* See if this can be simplified into a rotate first.  If that
11536          is unsuccessful continue in the association code.  */
11537       goto bit_rotate;
11538
11539     case BIT_AND_EXPR:
11540       if (integer_all_onesp (arg1))
11541         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11542       if (integer_zerop (arg1))
11543         return omit_one_operand_loc (loc, type, arg1, arg0);
11544       if (operand_equal_p (arg0, arg1, 0))
11545         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11546
11547       /* ~X & X is always zero.  */
11548       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11549           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11550         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
11551
11552       /* X & ~X is always zero.  */
11553       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11554           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11555         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11556
11557       /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2).  */
11558       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11559           && TREE_CODE (arg1) == INTEGER_CST
11560           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11561         {
11562           tree tmp1 = fold_convert_loc (loc, type, arg1);
11563           tree tmp2 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11564           tree tmp3 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11565           tmp2 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp2, tmp1);
11566           tmp3 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp3, tmp1);
11567           return
11568             fold_convert_loc (loc, type,
11569                               fold_build2_loc (loc, BIT_IOR_EXPR,
11570                                            type, tmp2, tmp3));
11571         }
11572
11573       /* (X | Y) & Y is (X, Y).  */
11574       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11575           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11576         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11577       /* (X | Y) & X is (Y, X).  */
11578       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11579           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11580           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11581         return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11582       /* X & (X | Y) is (Y, X).  */
11583       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11584           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11585           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11586         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11587       /* X & (Y | X) is (Y, X).  */
11588       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11589           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11590           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11591         return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11592
11593       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
11594       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11595           && integer_onep (TREE_OPERAND (arg0, 1))
11596           && integer_onep (arg1))
11597         {
11598           tem = TREE_OPERAND (arg0, 0);
11599           return fold_build2_loc (loc, EQ_EXPR, type,
11600                               fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11601                                            build_int_cst (TREE_TYPE (tem), 1)),
11602                               build_int_cst (TREE_TYPE (tem), 0));
11603         }
11604       /* Fold ~X & 1 as (X & 1) == 0.  */
11605       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11606           && integer_onep (arg1))
11607         {
11608           tem = TREE_OPERAND (arg0, 0);
11609           return fold_build2_loc (loc, EQ_EXPR, type,
11610                               fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11611                                            build_int_cst (TREE_TYPE (tem), 1)),
11612                               build_int_cst (TREE_TYPE (tem), 0));
11613         }
11614
11615       /* Fold (X ^ Y) & Y as ~X & Y.  */
11616       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11617           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11618         {
11619           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11620           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11621                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11622                               fold_convert_loc (loc, type, arg1));
11623         }
11624       /* Fold (X ^ Y) & X as ~Y & X.  */
11625       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11626           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11627           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11628         {
11629           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11630           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11631                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11632                               fold_convert_loc (loc, type, arg1));
11633         }
11634       /* Fold X & (X ^ Y) as X & ~Y.  */
11635       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11636           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11637         {
11638           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11639           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11640                               fold_convert_loc (loc, type, arg0),
11641                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11642         }
11643       /* Fold X & (Y ^ X) as ~Y & X.  */
11644       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11645           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11646           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11647         {
11648           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11649           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11650                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11651                               fold_convert_loc (loc, type, arg0));
11652         }
11653
11654       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11655       if (t1 != NULL_TREE)
11656         return t1;
11657       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
11658       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11659           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11660         {
11661           unsigned int prec
11662             = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11663
11664           if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
11665               && (~TREE_INT_CST_LOW (arg1)
11666                   & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
11667             return
11668               fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11669         }
11670
11671       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11672
11673          This results in more efficient code for machines without a NOR
11674          instruction.  Combine will canonicalize to the first form
11675          which will allow use of NOR instructions provided by the
11676          backend if they exist.  */
11677       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11678           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11679         {
11680           return fold_build1_loc (loc, BIT_NOT_EXPR, type,
11681                               build2 (BIT_IOR_EXPR, type,
11682                                       fold_convert_loc (loc, type,
11683                                                         TREE_OPERAND (arg0, 0)),
11684                                       fold_convert_loc (loc, type,
11685                                                         TREE_OPERAND (arg1, 0))));
11686         }
11687
11688       /* If arg0 is derived from the address of an object or function, we may
11689          be able to fold this expression using the object or function's
11690          alignment.  */
11691       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
11692         {
11693           unsigned HOST_WIDE_INT modulus, residue;
11694           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
11695
11696           modulus = get_pointer_modulus_and_residue (arg0, &residue,
11697                                                      integer_onep (arg1));
11698
11699           /* This works because modulus is a power of 2.  If this weren't the
11700              case, we'd have to replace it by its greatest power-of-2
11701              divisor: modulus & -modulus.  */
11702           if (low < modulus)
11703             return build_int_cst (type, residue & low);
11704         }
11705
11706       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11707               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11708          if the new mask might be further optimized.  */
11709       if ((TREE_CODE (arg0) == LSHIFT_EXPR
11710            || TREE_CODE (arg0) == RSHIFT_EXPR)
11711           && host_integerp (TREE_OPERAND (arg0, 1), 1)
11712           && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
11713           && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
11714              < TYPE_PRECISION (TREE_TYPE (arg0))
11715           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11716           && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
11717         {
11718           unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
11719           unsigned HOST_WIDE_INT mask
11720             = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
11721           unsigned HOST_WIDE_INT newmask, zerobits = 0;
11722           tree shift_type = TREE_TYPE (arg0);
11723
11724           if (TREE_CODE (arg0) == LSHIFT_EXPR)
11725             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11726           else if (TREE_CODE (arg0) == RSHIFT_EXPR
11727                    && TYPE_PRECISION (TREE_TYPE (arg0))
11728                       == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
11729             {
11730               unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
11731               tree arg00 = TREE_OPERAND (arg0, 0);
11732               /* See if more bits can be proven as zero because of
11733                  zero extension.  */
11734               if (TREE_CODE (arg00) == NOP_EXPR
11735                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11736                 {
11737                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11738                   if (TYPE_PRECISION (inner_type)
11739                       == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
11740                       && TYPE_PRECISION (inner_type) < prec)
11741                     {
11742                       prec = TYPE_PRECISION (inner_type);
11743                       /* See if we can shorten the right shift.  */
11744                       if (shiftc < prec)
11745                         shift_type = inner_type;
11746                     }
11747                 }
11748               zerobits = ~(unsigned HOST_WIDE_INT) 0;
11749               zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11750               zerobits <<= prec - shiftc;
11751               /* For arithmetic shift if sign bit could be set, zerobits
11752                  can contain actually sign bits, so no transformation is
11753                  possible, unless MASK masks them all away.  In that
11754                  case the shift needs to be converted into logical shift.  */
11755               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11756                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11757                 {
11758                   if ((mask & zerobits) == 0)
11759                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
11760                   else
11761                     zerobits = 0;
11762                 }
11763             }
11764
11765           /* ((X << 16) & 0xff00) is (X, 0).  */
11766           if ((mask & zerobits) == mask)
11767             return omit_one_operand_loc (loc, type,
11768                                      build_int_cst (type, 0), arg0);
11769
11770           newmask = mask | zerobits;
11771           if (newmask != mask && (newmask & (newmask + 1)) == 0)
11772             {
11773               unsigned int prec;
11774
11775               /* Only do the transformation if NEWMASK is some integer
11776                  mode's mask.  */
11777               for (prec = BITS_PER_UNIT;
11778                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11779                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11780                   break;
11781               if (prec < HOST_BITS_PER_WIDE_INT
11782                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
11783                 {
11784                   tree newmaskt;
11785
11786                   if (shift_type != TREE_TYPE (arg0))
11787                     {
11788                       tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type,
11789                                          fold_convert_loc (loc, shift_type,
11790                                                            TREE_OPERAND (arg0, 0)),
11791                                          TREE_OPERAND (arg0, 1));
11792                       tem = fold_convert_loc (loc, type, tem);
11793                     }
11794                   else
11795                     tem = op0;
11796                   newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask);
11797                   if (!tree_int_cst_equal (newmaskt, arg1))
11798                     return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt);
11799                 }
11800             }
11801         }
11802
11803       goto associate;
11804
11805     case RDIV_EXPR:
11806       /* Don't touch a floating-point divide by zero unless the mode
11807          of the constant can represent infinity.  */
11808       if (TREE_CODE (arg1) == REAL_CST
11809           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11810           && real_zerop (arg1))
11811         return NULL_TREE;
11812
11813       /* Optimize A / A to 1.0 if we don't care about
11814          NaNs or Infinities.  Skip the transformation
11815          for non-real operands.  */
11816       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
11817           && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11818           && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
11819           && operand_equal_p (arg0, arg1, 0))
11820         {
11821           tree r = build_real (TREE_TYPE (arg0), dconst1);
11822
11823           return omit_two_operands_loc (loc, type, r, arg0, arg1);
11824         }
11825
11826       /* The complex version of the above A / A optimization.  */
11827       if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11828           && operand_equal_p (arg0, arg1, 0))
11829         {
11830           tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
11831           if (! HONOR_NANS (TYPE_MODE (elem_type))
11832               && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
11833             {
11834               tree r = build_real (elem_type, dconst1);
11835               /* omit_two_operands will call fold_convert for us.  */
11836               return omit_two_operands_loc (loc, type, r, arg0, arg1);
11837             }
11838         }
11839
11840       /* (-A) / (-B) -> A / B  */
11841       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11842         return fold_build2_loc (loc, RDIV_EXPR, type,
11843                             TREE_OPERAND (arg0, 0),
11844                             negate_expr (arg1));
11845       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11846         return fold_build2_loc (loc, RDIV_EXPR, type,
11847                             negate_expr (arg0),
11848                             TREE_OPERAND (arg1, 0));
11849
11850       /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
11851       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11852           && real_onep (arg1))
11853         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11854
11855       /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
11856       if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11857           && real_minus_onep (arg1))
11858         return non_lvalue_loc (loc, fold_convert_loc (loc, type,
11859                                                   negate_expr (arg0)));
11860
11861       /* If ARG1 is a constant, we can convert this to a multiply by the
11862          reciprocal.  This does not have the same rounding properties,
11863          so only do this if -freciprocal-math.  We can actually
11864          always safely do it if ARG1 is a power of two, but it's hard to
11865          tell if it is or not in a portable manner.  */
11866       if (TREE_CODE (arg1) == REAL_CST)
11867         {
11868           if (flag_reciprocal_math
11869               && 0 != (tem = const_binop (code, build_real (type, dconst1),
11870                                           arg1, 0)))
11871             return fold_build2_loc (loc, MULT_EXPR, type, arg0, tem);
11872           /* Find the reciprocal if optimizing and the result is exact.  */
11873           if (optimize)
11874             {
11875               REAL_VALUE_TYPE r;
11876               r = TREE_REAL_CST (arg1);
11877               if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11878                 {
11879                   tem = build_real (type, r);
11880                   return fold_build2_loc (loc, MULT_EXPR, type,
11881                                       fold_convert_loc (loc, type, arg0), tem);
11882                 }
11883             }
11884         }
11885       /* Convert A/B/C to A/(B*C).  */
11886       if (flag_reciprocal_math
11887           && TREE_CODE (arg0) == RDIV_EXPR)
11888         return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11889                             fold_build2_loc (loc, MULT_EXPR, type,
11890                                          TREE_OPERAND (arg0, 1), arg1));
11891
11892       /* Convert A/(B/C) to (A/B)*C.  */
11893       if (flag_reciprocal_math
11894           && TREE_CODE (arg1) == RDIV_EXPR)
11895         return fold_build2_loc (loc, MULT_EXPR, type,
11896                             fold_build2_loc (loc, RDIV_EXPR, type, arg0,
11897                                          TREE_OPERAND (arg1, 0)),
11898                             TREE_OPERAND (arg1, 1));
11899
11900       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11901       if (flag_reciprocal_math
11902           && TREE_CODE (arg1) == MULT_EXPR
11903           && TREE_CODE (arg0) == REAL_CST
11904           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11905         {
11906           tree tem = const_binop (RDIV_EXPR, arg0,
11907                                   TREE_OPERAND (arg1, 1), 0);
11908           if (tem)
11909             return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11910                                 TREE_OPERAND (arg1, 0));
11911         }
11912
11913       if (flag_unsafe_math_optimizations)
11914         {
11915           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11916           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11917
11918           /* Optimize sin(x)/cos(x) as tan(x).  */
11919           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11920                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11921                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11922               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11923                                   CALL_EXPR_ARG (arg1, 0), 0))
11924             {
11925               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11926
11927               if (tanfn != NULL_TREE)
11928                 return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11929             }
11930
11931           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11932           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11933                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11934                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11935               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11936                                   CALL_EXPR_ARG (arg1, 0), 0))
11937             {
11938               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11939
11940               if (tanfn != NULL_TREE)
11941                 {
11942                   tree tmp = build_call_expr_loc (loc, tanfn, 1,
11943                                               CALL_EXPR_ARG (arg0, 0));
11944                   return fold_build2_loc (loc, RDIV_EXPR, type,
11945                                       build_real (type, dconst1), tmp);
11946                 }
11947             }
11948
11949           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11950              NaNs or Infinities.  */
11951           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11952                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11953                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11954             {
11955               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11956               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11957
11958               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11959                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11960                   && operand_equal_p (arg00, arg01, 0))
11961                 {
11962                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11963
11964                   if (cosfn != NULL_TREE)
11965                     return build_call_expr_loc (loc, cosfn, 1, arg00);
11966                 }
11967             }
11968
11969           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11970              NaNs or Infinities.  */
11971           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11972                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11973                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11974             {
11975               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11976               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11977
11978               if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11979                   && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11980                   && operand_equal_p (arg00, arg01, 0))
11981                 {
11982                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11983
11984                   if (cosfn != NULL_TREE)
11985                     {
11986                       tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00);
11987                       return fold_build2_loc (loc, RDIV_EXPR, type,
11988                                           build_real (type, dconst1),
11989                                           tmp);
11990                     }
11991                 }
11992             }
11993
11994           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11995           if (fcode0 == BUILT_IN_POW
11996               || fcode0 == BUILT_IN_POWF
11997               || fcode0 == BUILT_IN_POWL)
11998             {
11999               tree arg00 = CALL_EXPR_ARG (arg0, 0);
12000               tree arg01 = CALL_EXPR_ARG (arg0, 1);
12001               if (TREE_CODE (arg01) == REAL_CST
12002                   && !TREE_OVERFLOW (arg01)
12003                   && operand_equal_p (arg1, arg00, 0))
12004                 {
12005                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
12006                   REAL_VALUE_TYPE c;
12007                   tree arg;
12008
12009                   c = TREE_REAL_CST (arg01);
12010                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
12011                   arg = build_real (type, c);
12012                   return build_call_expr_loc (loc, powfn, 2, arg1, arg);
12013                 }
12014             }
12015
12016           /* Optimize a/root(b/c) into a*root(c/b).  */
12017           if (BUILTIN_ROOT_P (fcode1))
12018             {
12019               tree rootarg = CALL_EXPR_ARG (arg1, 0);
12020
12021               if (TREE_CODE (rootarg) == RDIV_EXPR)
12022                 {
12023                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12024                   tree b = TREE_OPERAND (rootarg, 0);
12025                   tree c = TREE_OPERAND (rootarg, 1);
12026
12027                   tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b);
12028
12029                   tmp = build_call_expr_loc (loc, rootfn, 1, tmp);
12030                   return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp);
12031                 }
12032             }
12033
12034           /* Optimize x/expN(y) into x*expN(-y).  */
12035           if (BUILTIN_EXPONENT_P (fcode1))
12036             {
12037               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12038               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
12039               arg1 = build_call_expr_loc (loc,
12040                                       expfn, 1,
12041                                       fold_convert_loc (loc, type, arg));
12042               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
12043             }
12044
12045           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
12046           if (fcode1 == BUILT_IN_POW
12047               || fcode1 == BUILT_IN_POWF
12048               || fcode1 == BUILT_IN_POWL)
12049             {
12050               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
12051               tree arg10 = CALL_EXPR_ARG (arg1, 0);
12052               tree arg11 = CALL_EXPR_ARG (arg1, 1);
12053               tree neg11 = fold_convert_loc (loc, type,
12054                                              negate_expr (arg11));
12055               arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11);
12056               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
12057             }
12058         }
12059       return NULL_TREE;
12060
12061     case TRUNC_DIV_EXPR:
12062     case FLOOR_DIV_EXPR:
12063       /* Simplify A / (B << N) where A and B are positive and B is
12064          a power of 2, to A >> (N + log2(B)).  */
12065       strict_overflow_p = false;
12066       if (TREE_CODE (arg1) == LSHIFT_EXPR
12067           && (TYPE_UNSIGNED (type)
12068               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12069         {
12070           tree sval = TREE_OPERAND (arg1, 0);
12071           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
12072             {
12073               tree sh_cnt = TREE_OPERAND (arg1, 1);
12074               unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
12075
12076               if (strict_overflow_p)
12077                 fold_overflow_warning (("assuming signed overflow does not "
12078                                         "occur when simplifying A / (B << N)"),
12079                                        WARN_STRICT_OVERFLOW_MISC);
12080
12081               sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
12082                                     sh_cnt, build_int_cst (NULL_TREE, pow2));
12083               return fold_build2_loc (loc, RSHIFT_EXPR, type,
12084                                   fold_convert_loc (loc, type, arg0), sh_cnt);
12085             }
12086         }
12087
12088       /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
12089          TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
12090       if (INTEGRAL_TYPE_P (type)
12091           && TYPE_UNSIGNED (type)
12092           && code == FLOOR_DIV_EXPR)
12093         return fold_build2_loc (loc, TRUNC_DIV_EXPR, type, op0, op1);
12094
12095       /* Fall thru */
12096
12097     case ROUND_DIV_EXPR:
12098     case CEIL_DIV_EXPR:
12099     case EXACT_DIV_EXPR:
12100       if (integer_onep (arg1))
12101         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12102       if (integer_zerop (arg1))
12103         return NULL_TREE;
12104       /* X / -1 is -X.  */
12105       if (!TYPE_UNSIGNED (type)
12106           && TREE_CODE (arg1) == INTEGER_CST
12107           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12108           && TREE_INT_CST_HIGH (arg1) == -1)
12109         return fold_convert_loc (loc, type, negate_expr (arg0));
12110
12111       /* Convert -A / -B to A / B when the type is signed and overflow is
12112          undefined.  */
12113       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12114           && TREE_CODE (arg0) == NEGATE_EXPR
12115           && negate_expr_p (arg1))
12116         {
12117           if (INTEGRAL_TYPE_P (type))
12118             fold_overflow_warning (("assuming signed overflow does not occur "
12119                                     "when distributing negation across "
12120                                     "division"),
12121                                    WARN_STRICT_OVERFLOW_MISC);
12122           return fold_build2_loc (loc, code, type,
12123                               fold_convert_loc (loc, type,
12124                                                 TREE_OPERAND (arg0, 0)),
12125                               fold_convert_loc (loc, type,
12126                                                 negate_expr (arg1)));
12127         }
12128       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12129           && TREE_CODE (arg1) == NEGATE_EXPR
12130           && negate_expr_p (arg0))
12131         {
12132           if (INTEGRAL_TYPE_P (type))
12133             fold_overflow_warning (("assuming signed overflow does not occur "
12134                                     "when distributing negation across "
12135                                     "division"),
12136                                    WARN_STRICT_OVERFLOW_MISC);
12137           return fold_build2_loc (loc, code, type,
12138                               fold_convert_loc (loc, type,
12139                                                 negate_expr (arg0)),
12140                               fold_convert_loc (loc, type,
12141                                                 TREE_OPERAND (arg1, 0)));
12142         }
12143
12144       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
12145          operation, EXACT_DIV_EXPR.
12146
12147          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
12148          At one time others generated faster code, it's not clear if they do
12149          after the last round to changes to the DIV code in expmed.c.  */
12150       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
12151           && multiple_of_p (type, arg0, arg1))
12152         return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
12153
12154       strict_overflow_p = false;
12155       if (TREE_CODE (arg1) == INTEGER_CST
12156           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12157                                          &strict_overflow_p)))
12158         {
12159           if (strict_overflow_p)
12160             fold_overflow_warning (("assuming signed overflow does not occur "
12161                                     "when simplifying division"),
12162                                    WARN_STRICT_OVERFLOW_MISC);
12163           return fold_convert_loc (loc, type, tem);
12164         }
12165
12166       return NULL_TREE;
12167
12168     case CEIL_MOD_EXPR:
12169     case FLOOR_MOD_EXPR:
12170     case ROUND_MOD_EXPR:
12171     case TRUNC_MOD_EXPR:
12172       /* X % 1 is always zero, but be sure to preserve any side
12173          effects in X.  */
12174       if (integer_onep (arg1))
12175         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12176
12177       /* X % 0, return X % 0 unchanged so that we can get the
12178          proper warnings and errors.  */
12179       if (integer_zerop (arg1))
12180         return NULL_TREE;
12181
12182       /* 0 % X is always zero, but be sure to preserve any side
12183          effects in X.  Place this after checking for X == 0.  */
12184       if (integer_zerop (arg0))
12185         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12186
12187       /* X % -1 is zero.  */
12188       if (!TYPE_UNSIGNED (type)
12189           && TREE_CODE (arg1) == INTEGER_CST
12190           && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12191           && TREE_INT_CST_HIGH (arg1) == -1)
12192         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12193
12194       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
12195          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
12196       strict_overflow_p = false;
12197       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
12198           && (TYPE_UNSIGNED (type)
12199               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12200         {
12201           tree c = arg1;
12202           /* Also optimize A % (C << N)  where C is a power of 2,
12203              to A & ((C << N) - 1).  */
12204           if (TREE_CODE (arg1) == LSHIFT_EXPR)
12205             c = TREE_OPERAND (arg1, 0);
12206
12207           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
12208             {
12209               tree mask = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1,
12210                                        build_int_cst (TREE_TYPE (arg1), 1));
12211               if (strict_overflow_p)
12212                 fold_overflow_warning (("assuming signed overflow does not "
12213                                         "occur when simplifying "
12214                                         "X % (power of two)"),
12215                                        WARN_STRICT_OVERFLOW_MISC);
12216               return fold_build2_loc (loc, BIT_AND_EXPR, type,
12217                                   fold_convert_loc (loc, type, arg0),
12218                                   fold_convert_loc (loc, type, mask));
12219             }
12220         }
12221
12222       /* X % -C is the same as X % C.  */
12223       if (code == TRUNC_MOD_EXPR
12224           && !TYPE_UNSIGNED (type)
12225           && TREE_CODE (arg1) == INTEGER_CST
12226           && !TREE_OVERFLOW (arg1)
12227           && TREE_INT_CST_HIGH (arg1) < 0
12228           && !TYPE_OVERFLOW_TRAPS (type)
12229           /* Avoid this transformation if C is INT_MIN, i.e. C == -C.  */
12230           && !sign_bit_p (arg1, arg1))
12231         return fold_build2_loc (loc, code, type,
12232                             fold_convert_loc (loc, type, arg0),
12233                             fold_convert_loc (loc, type,
12234                                               negate_expr (arg1)));
12235
12236       /* X % -Y is the same as X % Y.  */
12237       if (code == TRUNC_MOD_EXPR
12238           && !TYPE_UNSIGNED (type)
12239           && TREE_CODE (arg1) == NEGATE_EXPR
12240           && !TYPE_OVERFLOW_TRAPS (type))
12241         return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0),
12242                             fold_convert_loc (loc, type,
12243                                               TREE_OPERAND (arg1, 0)));
12244
12245       if (TREE_CODE (arg1) == INTEGER_CST
12246           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12247                                          &strict_overflow_p)))
12248         {
12249           if (strict_overflow_p)
12250             fold_overflow_warning (("assuming signed overflow does not occur "
12251                                     "when simplifying modulus"),
12252                                    WARN_STRICT_OVERFLOW_MISC);
12253           return fold_convert_loc (loc, type, tem);
12254         }
12255
12256       return NULL_TREE;
12257
12258     case LROTATE_EXPR:
12259     case RROTATE_EXPR:
12260       if (integer_all_onesp (arg0))
12261         return omit_one_operand_loc (loc, type, arg0, arg1);
12262       goto shift;
12263
12264     case RSHIFT_EXPR:
12265       /* Optimize -1 >> x for arithmetic right shifts.  */
12266       if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type)
12267           && tree_expr_nonnegative_p (arg1))
12268         return omit_one_operand_loc (loc, type, arg0, arg1);
12269       /* ... fall through ...  */
12270
12271     case LSHIFT_EXPR:
12272     shift:
12273       if (integer_zerop (arg1))
12274         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12275       if (integer_zerop (arg0))
12276         return omit_one_operand_loc (loc, type, arg0, arg1);
12277
12278       /* Since negative shift count is not well-defined,
12279          don't try to compute it in the compiler.  */
12280       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
12281         return NULL_TREE;
12282
12283       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
12284       if (TREE_CODE (op0) == code && host_integerp (arg1, false)
12285           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12286           && host_integerp (TREE_OPERAND (arg0, 1), false)
12287           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12288         {
12289           HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
12290                                + TREE_INT_CST_LOW (arg1));
12291
12292           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
12293              being well defined.  */
12294           if (low >= TYPE_PRECISION (type))
12295             {
12296               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
12297                 low = low % TYPE_PRECISION (type);
12298               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
12299                 return omit_one_operand_loc (loc, type, build_int_cst (type, 0),
12300                                          TREE_OPERAND (arg0, 0));
12301               else
12302                 low = TYPE_PRECISION (type) - 1;
12303             }
12304
12305           return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12306                               build_int_cst (type, low));
12307         }
12308
12309       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
12310          into x & ((unsigned)-1 >> c) for unsigned types.  */
12311       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
12312            || (TYPE_UNSIGNED (type)
12313                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
12314           && host_integerp (arg1, false)
12315           && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12316           && host_integerp (TREE_OPERAND (arg0, 1), false)
12317           && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12318         {
12319           HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
12320           HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
12321           tree lshift;
12322           tree arg00;
12323
12324           if (low0 == low1)
12325             {
12326               arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12327
12328               lshift = build_int_cst (type, -1);
12329               lshift = int_const_binop (code, lshift, arg1, 0);
12330
12331               return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift);
12332             }
12333         }
12334
12335       /* Rewrite an LROTATE_EXPR by a constant into an
12336          RROTATE_EXPR by a new constant.  */
12337       if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
12338         {
12339           tree tem = build_int_cst (TREE_TYPE (arg1),
12340                                     TYPE_PRECISION (type));
12341           tem = const_binop (MINUS_EXPR, tem, arg1, 0);
12342           return fold_build2_loc (loc, RROTATE_EXPR, type, op0, tem);
12343         }
12344
12345       /* If we have a rotate of a bit operation with the rotate count and
12346          the second operand of the bit operation both constant,
12347          permute the two operations.  */
12348       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12349           && (TREE_CODE (arg0) == BIT_AND_EXPR
12350               || TREE_CODE (arg0) == BIT_IOR_EXPR
12351               || TREE_CODE (arg0) == BIT_XOR_EXPR)
12352           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12353         return fold_build2_loc (loc, TREE_CODE (arg0), type,
12354                             fold_build2_loc (loc, code, type,
12355                                          TREE_OPERAND (arg0, 0), arg1),
12356                             fold_build2_loc (loc, code, type,
12357                                          TREE_OPERAND (arg0, 1), arg1));
12358
12359       /* Two consecutive rotates adding up to the precision of the
12360          type can be ignored.  */
12361       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12362           && TREE_CODE (arg0) == RROTATE_EXPR
12363           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12364           && TREE_INT_CST_HIGH (arg1) == 0
12365           && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
12366           && ((TREE_INT_CST_LOW (arg1)
12367                + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
12368               == (unsigned int) TYPE_PRECISION (type)))
12369         return TREE_OPERAND (arg0, 0);
12370
12371       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
12372               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
12373          if the latter can be further optimized.  */
12374       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
12375           && TREE_CODE (arg0) == BIT_AND_EXPR
12376           && TREE_CODE (arg1) == INTEGER_CST
12377           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12378         {
12379           tree mask = fold_build2_loc (loc, code, type,
12380                                    fold_convert_loc (loc, type,
12381                                                      TREE_OPERAND (arg0, 1)),
12382                                    arg1);
12383           tree shift = fold_build2_loc (loc, code, type,
12384                                     fold_convert_loc (loc, type,
12385                                                       TREE_OPERAND (arg0, 0)),
12386                                     arg1);
12387           tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
12388           if (tem)
12389             return tem;
12390         }
12391
12392       return NULL_TREE;
12393
12394     case MIN_EXPR:
12395       if (operand_equal_p (arg0, arg1, 0))
12396         return omit_one_operand_loc (loc, type, arg0, arg1);
12397       if (INTEGRAL_TYPE_P (type)
12398           && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
12399         return omit_one_operand_loc (loc, type, arg1, arg0);
12400       tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
12401       if (tem)
12402         return tem;
12403       goto associate;
12404
12405     case MAX_EXPR:
12406       if (operand_equal_p (arg0, arg1, 0))
12407         return omit_one_operand_loc (loc, type, arg0, arg1);
12408       if (INTEGRAL_TYPE_P (type)
12409           && TYPE_MAX_VALUE (type)
12410           && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
12411         return omit_one_operand_loc (loc, type, arg1, arg0);
12412       tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
12413       if (tem)
12414         return tem;
12415       goto associate;
12416
12417     case TRUTH_ANDIF_EXPR:
12418       /* Note that the operands of this must be ints
12419          and their values must be 0 or 1.
12420          ("true" is a fixed value perhaps depending on the language.)  */
12421       /* If first arg is constant zero, return it.  */
12422       if (integer_zerop (arg0))
12423         return fold_convert_loc (loc, type, arg0);
12424     case TRUTH_AND_EXPR:
12425       /* If either arg is constant true, drop it.  */
12426       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12427         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12428       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
12429           /* Preserve sequence points.  */
12430           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12431         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12432       /* If second arg is constant zero, result is zero, but first arg
12433          must be evaluated.  */
12434       if (integer_zerop (arg1))
12435         return omit_one_operand_loc (loc, type, arg1, arg0);
12436       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
12437          case will be handled here.  */
12438       if (integer_zerop (arg0))
12439         return omit_one_operand_loc (loc, type, arg0, arg1);
12440
12441       /* !X && X is always false.  */
12442       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12443           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12444         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12445       /* X && !X is always false.  */
12446       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12447           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12448         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12449
12450       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
12451          means A >= Y && A != MAX, but in this case we know that
12452          A < X <= MAX.  */
12453
12454       if (!TREE_SIDE_EFFECTS (arg0)
12455           && !TREE_SIDE_EFFECTS (arg1))
12456         {
12457           tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1);
12458           if (tem && !operand_equal_p (tem, arg0, 0))
12459             return fold_build2_loc (loc, code, type, tem, arg1);
12460
12461           tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0);
12462           if (tem && !operand_equal_p (tem, arg1, 0))
12463             return fold_build2_loc (loc, code, type, arg0, tem);
12464         }
12465
12466     truth_andor:
12467       /* We only do these simplifications if we are optimizing.  */
12468       if (!optimize)
12469         return NULL_TREE;
12470
12471       /* Check for things like (A || B) && (A || C).  We can convert this
12472          to A || (B && C).  Note that either operator can be any of the four
12473          truth and/or operations and the transformation will still be
12474          valid.   Also note that we only care about order for the
12475          ANDIF and ORIF operators.  If B contains side effects, this
12476          might change the truth-value of A.  */
12477       if (TREE_CODE (arg0) == TREE_CODE (arg1)
12478           && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
12479               || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
12480               || TREE_CODE (arg0) == TRUTH_AND_EXPR
12481               || TREE_CODE (arg0) == TRUTH_OR_EXPR)
12482           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
12483         {
12484           tree a00 = TREE_OPERAND (arg0, 0);
12485           tree a01 = TREE_OPERAND (arg0, 1);
12486           tree a10 = TREE_OPERAND (arg1, 0);
12487           tree a11 = TREE_OPERAND (arg1, 1);
12488           int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
12489                               || TREE_CODE (arg0) == TRUTH_AND_EXPR)
12490                              && (code == TRUTH_AND_EXPR
12491                                  || code == TRUTH_OR_EXPR));
12492
12493           if (operand_equal_p (a00, a10, 0))
12494             return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
12495                                 fold_build2_loc (loc, code, type, a01, a11));
12496           else if (commutative && operand_equal_p (a00, a11, 0))
12497             return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
12498                                 fold_build2_loc (loc, code, type, a01, a10));
12499           else if (commutative && operand_equal_p (a01, a10, 0))
12500             return fold_build2_loc (loc, TREE_CODE (arg0), type, a01,
12501                                 fold_build2_loc (loc, code, type, a00, a11));
12502
12503           /* This case if tricky because we must either have commutative
12504              operators or else A10 must not have side-effects.  */
12505
12506           else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
12507                    && operand_equal_p (a01, a11, 0))
12508             return fold_build2_loc (loc, TREE_CODE (arg0), type,
12509                                 fold_build2_loc (loc, code, type, a00, a10),
12510                                 a01);
12511         }
12512
12513       /* See if we can build a range comparison.  */
12514       if (0 != (tem = fold_range_test (loc, code, type, op0, op1)))
12515         return tem;
12516
12517       /* Check for the possibility of merging component references.  If our
12518          lhs is another similar operation, try to merge its rhs with our
12519          rhs.  Then try to merge our lhs and rhs.  */
12520       if (TREE_CODE (arg0) == code
12521           && 0 != (tem = fold_truthop (loc, code, type,
12522                                        TREE_OPERAND (arg0, 1), arg1)))
12523         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12524
12525       if ((tem = fold_truthop (loc, code, type, arg0, arg1)) != 0)
12526         return tem;
12527
12528       return NULL_TREE;
12529
12530     case TRUTH_ORIF_EXPR:
12531       /* Note that the operands of this must be ints
12532          and their values must be 0 or true.
12533          ("true" is a fixed value perhaps depending on the language.)  */
12534       /* If first arg is constant true, return it.  */
12535       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12536         return fold_convert_loc (loc, type, arg0);
12537     case TRUTH_OR_EXPR:
12538       /* If either arg is constant zero, drop it.  */
12539       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12540         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12541       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12542           /* Preserve sequence points.  */
12543           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12544         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12545       /* If second arg is constant true, result is true, but we must
12546          evaluate first arg.  */
12547       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12548         return omit_one_operand_loc (loc, type, arg1, arg0);
12549       /* Likewise for first arg, but note this only occurs here for
12550          TRUTH_OR_EXPR.  */
12551       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12552         return omit_one_operand_loc (loc, type, arg0, arg1);
12553
12554       /* !X || X is always true.  */
12555       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12556           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12557         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12558       /* X || !X is always true.  */
12559       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12560           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12561         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12562
12563       goto truth_andor;
12564
12565     case TRUTH_XOR_EXPR:
12566       /* If the second arg is constant zero, drop it.  */
12567       if (integer_zerop (arg1))
12568         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12569       /* If the second arg is constant true, this is a logical inversion.  */
12570       if (integer_onep (arg1))
12571         {
12572           /* Only call invert_truthvalue if operand is a truth value.  */
12573           if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
12574             tem = fold_build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
12575           else
12576             tem = invert_truthvalue_loc (loc, arg0);
12577           return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
12578         }
12579       /* Identical arguments cancel to zero.  */
12580       if (operand_equal_p (arg0, arg1, 0))
12581         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12582
12583       /* !X ^ X is always true.  */
12584       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12585           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12586         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12587
12588       /* X ^ !X is always true.  */
12589       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12590           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12591         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12592
12593       return NULL_TREE;
12594
12595     case EQ_EXPR:
12596     case NE_EXPR:
12597       tem = fold_comparison (loc, code, type, op0, op1);
12598       if (tem != NULL_TREE)
12599         return tem;
12600
12601       /* bool_var != 0 becomes bool_var. */
12602       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12603           && code == NE_EXPR)
12604         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12605
12606       /* bool_var == 1 becomes bool_var. */
12607       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12608           && code == EQ_EXPR)
12609         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12610
12611       /* bool_var != 1 becomes !bool_var. */
12612       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12613           && code == NE_EXPR)
12614         return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
12615                             fold_convert_loc (loc, type, arg0));
12616
12617       /* bool_var == 0 becomes !bool_var. */
12618       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12619           && code == EQ_EXPR)
12620         return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
12621                             fold_convert_loc (loc, type, arg0));
12622
12623       /* !exp != 0 becomes !exp */
12624       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1)
12625           && code == NE_EXPR)
12626         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12627
12628       /* If this is an equality comparison of the address of two non-weak,
12629          unaliased symbols neither of which are extern (since we do not
12630          have access to attributes for externs), then we know the result.  */
12631       if (TREE_CODE (arg0) == ADDR_EXPR
12632           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
12633           && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
12634           && ! lookup_attribute ("alias",
12635                                  DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
12636           && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
12637           && TREE_CODE (arg1) == ADDR_EXPR
12638           && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
12639           && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
12640           && ! lookup_attribute ("alias",
12641                                  DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
12642           && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
12643         {
12644           /* We know that we're looking at the address of two
12645              non-weak, unaliased, static _DECL nodes.
12646
12647              It is both wasteful and incorrect to call operand_equal_p
12648              to compare the two ADDR_EXPR nodes.  It is wasteful in that
12649              all we need to do is test pointer equality for the arguments
12650              to the two ADDR_EXPR nodes.  It is incorrect to use
12651              operand_equal_p as that function is NOT equivalent to a
12652              C equality test.  It can in fact return false for two
12653              objects which would test as equal using the C equality
12654              operator.  */
12655           bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12656           return constant_boolean_node (equal
12657                                         ? code == EQ_EXPR : code != EQ_EXPR,
12658                                         type);
12659         }
12660
12661       /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
12662          a MINUS_EXPR of a constant, we can convert it into a comparison with
12663          a revised constant as long as no overflow occurs.  */
12664       if (TREE_CODE (arg1) == INTEGER_CST
12665           && (TREE_CODE (arg0) == PLUS_EXPR
12666               || TREE_CODE (arg0) == MINUS_EXPR)
12667           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12668           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
12669                                       ? MINUS_EXPR : PLUS_EXPR,
12670                                       fold_convert_loc (loc, TREE_TYPE (arg0),
12671                                                         arg1),
12672                                       TREE_OPERAND (arg0, 1), 0))
12673           && !TREE_OVERFLOW (tem))
12674         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12675
12676       /* Similarly for a NEGATE_EXPR.  */
12677       if (TREE_CODE (arg0) == NEGATE_EXPR
12678           && TREE_CODE (arg1) == INTEGER_CST
12679           && 0 != (tem = negate_expr (arg1))
12680           && TREE_CODE (tem) == INTEGER_CST
12681           && !TREE_OVERFLOW (tem))
12682         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12683
12684       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
12685       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12686           && TREE_CODE (arg1) == INTEGER_CST
12687           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12688         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12689                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0),
12690                                          fold_convert_loc (loc,
12691                                                            TREE_TYPE (arg0),
12692                                                            arg1),
12693                                          TREE_OPERAND (arg0, 1)));
12694
12695       /* Transform comparisons of the form X +- Y CMP X to Y CMP 0.  */
12696       if ((TREE_CODE (arg0) == PLUS_EXPR
12697            || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12698            || TREE_CODE (arg0) == MINUS_EXPR)
12699           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12700           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12701               || POINTER_TYPE_P (TREE_TYPE (arg0))))
12702         {
12703           tree val = TREE_OPERAND (arg0, 1);
12704           return omit_two_operands_loc (loc, type,
12705                                     fold_build2_loc (loc, code, type,
12706                                                  val,
12707                                                  build_int_cst (TREE_TYPE (val),
12708                                                                 0)),
12709                                     TREE_OPERAND (arg0, 0), arg1);
12710         }
12711
12712       /* Transform comparisons of the form C - X CMP X if C % 2 == 1.  */
12713       if (TREE_CODE (arg0) == MINUS_EXPR
12714           && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12715           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)
12716           && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1)
12717         {
12718           return omit_two_operands_loc (loc, type,
12719                                     code == NE_EXPR
12720                                     ? boolean_true_node : boolean_false_node,
12721                                     TREE_OPERAND (arg0, 1), arg1);
12722         }
12723
12724       /* If we have X - Y == 0, we can convert that to X == Y and similarly
12725          for !=.  Don't do this for ordered comparisons due to overflow.  */
12726       if (TREE_CODE (arg0) == MINUS_EXPR
12727           && integer_zerop (arg1))
12728         return fold_build2_loc (loc, code, type,
12729                             TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
12730
12731       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
12732       if (TREE_CODE (arg0) == ABS_EXPR
12733           && (integer_zerop (arg1) || real_zerop (arg1)))
12734         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1);
12735
12736       /* If this is an EQ or NE comparison with zero and ARG0 is
12737          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
12738          two operations, but the latter can be done in one less insn
12739          on machines that have only two-operand insns or on which a
12740          constant cannot be the first operand.  */
12741       if (TREE_CODE (arg0) == BIT_AND_EXPR
12742           && integer_zerop (arg1))
12743         {
12744           tree arg00 = TREE_OPERAND (arg0, 0);
12745           tree arg01 = TREE_OPERAND (arg0, 1);
12746           if (TREE_CODE (arg00) == LSHIFT_EXPR
12747               && integer_onep (TREE_OPERAND (arg00, 0)))
12748             {
12749               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00),
12750                                       arg01, TREE_OPERAND (arg00, 1));
12751               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12752                                  build_int_cst (TREE_TYPE (arg0), 1));
12753               return fold_build2_loc (loc, code, type,
12754                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12755                                   arg1);
12756             }
12757           else if (TREE_CODE (arg01) == LSHIFT_EXPR
12758                    && integer_onep (TREE_OPERAND (arg01, 0)))
12759             {
12760               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01),
12761                                       arg00, TREE_OPERAND (arg01, 1));
12762               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12763                                  build_int_cst (TREE_TYPE (arg0), 1));
12764               return fold_build2_loc (loc, code, type,
12765                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12766                                   arg1);
12767             }
12768         }
12769
12770       /* If this is an NE or EQ comparison of zero against the result of a
12771          signed MOD operation whose second operand is a power of 2, make
12772          the MOD operation unsigned since it is simpler and equivalent.  */
12773       if (integer_zerop (arg1)
12774           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12775           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12776               || TREE_CODE (arg0) == CEIL_MOD_EXPR
12777               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12778               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12779           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12780         {
12781           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12782           tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype,
12783                                      fold_convert_loc (loc, newtype,
12784                                                        TREE_OPERAND (arg0, 0)),
12785                                      fold_convert_loc (loc, newtype,
12786                                                        TREE_OPERAND (arg0, 1)));
12787
12788           return fold_build2_loc (loc, code, type, newmod,
12789                               fold_convert_loc (loc, newtype, arg1));
12790         }
12791
12792       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12793          C1 is a valid shift constant, and C2 is a power of two, i.e.
12794          a single bit.  */
12795       if (TREE_CODE (arg0) == BIT_AND_EXPR
12796           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12797           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12798              == INTEGER_CST
12799           && integer_pow2p (TREE_OPERAND (arg0, 1))
12800           && integer_zerop (arg1))
12801         {
12802           tree itype = TREE_TYPE (arg0);
12803           unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
12804           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12805
12806           /* Check for a valid shift count.  */
12807           if (TREE_INT_CST_HIGH (arg001) == 0
12808               && TREE_INT_CST_LOW (arg001) < prec)
12809             {
12810               tree arg01 = TREE_OPERAND (arg0, 1);
12811               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12812               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12813               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12814                  can be rewritten as (X & (C2 << C1)) != 0.  */
12815               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12816                 {
12817                   tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001);
12818                   tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem);
12819                   return fold_build2_loc (loc, code, type, tem, arg1);
12820                 }
12821               /* Otherwise, for signed (arithmetic) shifts,
12822                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12823                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
12824               else if (!TYPE_UNSIGNED (itype))
12825                 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12826                                     arg000, build_int_cst (itype, 0));
12827               /* Otherwise, of unsigned (logical) shifts,
12828                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12829                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
12830               else
12831                 return omit_one_operand_loc (loc, type,
12832                                          code == EQ_EXPR ? integer_one_node
12833                                                          : integer_zero_node,
12834                                          arg000);
12835             }
12836         }
12837
12838       /* If this is an NE comparison of zero with an AND of one, remove the
12839          comparison since the AND will give the correct value.  */
12840       if (code == NE_EXPR
12841           && integer_zerop (arg1)
12842           && TREE_CODE (arg0) == BIT_AND_EXPR
12843           && integer_onep (TREE_OPERAND (arg0, 1)))
12844         return fold_convert_loc (loc, type, arg0);
12845
12846       /* If we have (A & C) == C where C is a power of 2, convert this into
12847          (A & C) != 0.  Similarly for NE_EXPR.  */
12848       if (TREE_CODE (arg0) == BIT_AND_EXPR
12849           && integer_pow2p (TREE_OPERAND (arg0, 1))
12850           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12851         return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12852                             arg0, fold_convert_loc (loc, TREE_TYPE (arg0),
12853                                                     integer_zero_node));
12854
12855       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12856          bit, then fold the expression into A < 0 or A >= 0.  */
12857       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type);
12858       if (tem)
12859         return tem;
12860
12861       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12862          Similarly for NE_EXPR.  */
12863       if (TREE_CODE (arg0) == BIT_AND_EXPR
12864           && TREE_CODE (arg1) == INTEGER_CST
12865           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12866         {
12867           tree notc = fold_build1_loc (loc, BIT_NOT_EXPR,
12868                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
12869                                    TREE_OPERAND (arg0, 1));
12870           tree dandnotc = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12871                                        arg1, notc);
12872           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12873           if (integer_nonzerop (dandnotc))
12874             return omit_one_operand_loc (loc, type, rslt, arg0);
12875         }
12876
12877       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12878          Similarly for NE_EXPR.  */
12879       if (TREE_CODE (arg0) == BIT_IOR_EXPR
12880           && TREE_CODE (arg1) == INTEGER_CST
12881           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12882         {
12883           tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12884           tree candnotd = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12885                                        TREE_OPERAND (arg0, 1), notd);
12886           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12887           if (integer_nonzerop (candnotd))
12888             return omit_one_operand_loc (loc, type, rslt, arg0);
12889         }
12890
12891       /* If this is a comparison of a field, we may be able to simplify it.  */
12892       if ((TREE_CODE (arg0) == COMPONENT_REF
12893            || TREE_CODE (arg0) == BIT_FIELD_REF)
12894           /* Handle the constant case even without -O
12895              to make sure the warnings are given.  */
12896           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12897         {
12898           t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1);
12899           if (t1)
12900             return t1;
12901         }
12902
12903       /* Optimize comparisons of strlen vs zero to a compare of the
12904          first character of the string vs zero.  To wit,
12905                 strlen(ptr) == 0   =>  *ptr == 0
12906                 strlen(ptr) != 0   =>  *ptr != 0
12907          Other cases should reduce to one of these two (or a constant)
12908          due to the return value of strlen being unsigned.  */
12909       if (TREE_CODE (arg0) == CALL_EXPR
12910           && integer_zerop (arg1))
12911         {
12912           tree fndecl = get_callee_fndecl (arg0);
12913
12914           if (fndecl
12915               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12916               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12917               && call_expr_nargs (arg0) == 1
12918               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12919             {
12920               tree iref = build_fold_indirect_ref_loc (loc,
12921                                                    CALL_EXPR_ARG (arg0, 0));
12922               return fold_build2_loc (loc, code, type, iref,
12923                                   build_int_cst (TREE_TYPE (iref), 0));
12924             }
12925         }
12926
12927       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12928          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12929       if (TREE_CODE (arg0) == RSHIFT_EXPR
12930           && integer_zerop (arg1)
12931           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12932         {
12933           tree arg00 = TREE_OPERAND (arg0, 0);
12934           tree arg01 = TREE_OPERAND (arg0, 1);
12935           tree itype = TREE_TYPE (arg00);
12936           if (TREE_INT_CST_HIGH (arg01) == 0
12937               && TREE_INT_CST_LOW (arg01)
12938                  == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12939             {
12940               if (TYPE_UNSIGNED (itype))
12941                 {
12942                   itype = signed_type_for (itype);
12943                   arg00 = fold_convert_loc (loc, itype, arg00);
12944                 }
12945               return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12946                                   type, arg00, build_int_cst (itype, 0));
12947             }
12948         }
12949
12950       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12951       if (integer_zerop (arg1)
12952           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12953         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12954                             TREE_OPERAND (arg0, 1));
12955
12956       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12957       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12958           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12959         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12960                             build_int_cst (TREE_TYPE (arg1), 0));
12961       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12962       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12963           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12964           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12965         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
12966                             build_int_cst (TREE_TYPE (arg1), 0));
12967
12968       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12969       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12970           && TREE_CODE (arg1) == INTEGER_CST
12971           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12972         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12973                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1),
12974                                          TREE_OPERAND (arg0, 1), arg1));
12975
12976       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12977          (X & C) == 0 when C is a single bit.  */
12978       if (TREE_CODE (arg0) == BIT_AND_EXPR
12979           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12980           && integer_zerop (arg1)
12981           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12982         {
12983           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12984                              TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12985                              TREE_OPERAND (arg0, 1));
12986           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12987                               type, tem, arg1);
12988         }
12989
12990       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12991          constant C is a power of two, i.e. a single bit.  */
12992       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12993           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12994           && integer_zerop (arg1)
12995           && integer_pow2p (TREE_OPERAND (arg0, 1))
12996           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12997                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12998         {
12999           tree arg00 = TREE_OPERAND (arg0, 0);
13000           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
13001                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
13002         }
13003
13004       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
13005          when is C is a power of two, i.e. a single bit.  */
13006       if (TREE_CODE (arg0) == BIT_AND_EXPR
13007           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
13008           && integer_zerop (arg1)
13009           && integer_pow2p (TREE_OPERAND (arg0, 1))
13010           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13011                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
13012         {
13013           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
13014           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000),
13015                              arg000, TREE_OPERAND (arg0, 1));
13016           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
13017                               tem, build_int_cst (TREE_TYPE (tem), 0));
13018         }
13019
13020       if (integer_zerop (arg1)
13021           && tree_expr_nonzero_p (arg0))
13022         {
13023           tree res = constant_boolean_node (code==NE_EXPR, type);
13024           return omit_one_operand_loc (loc, type, res, arg0);
13025         }
13026
13027       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
13028       if (TREE_CODE (arg0) == NEGATE_EXPR
13029           && TREE_CODE (arg1) == NEGATE_EXPR)
13030         return fold_build2_loc (loc, code, type,
13031                             TREE_OPERAND (arg0, 0),
13032                             TREE_OPERAND (arg1, 0));
13033
13034       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
13035       if (TREE_CODE (arg0) == BIT_AND_EXPR
13036           && TREE_CODE (arg1) == BIT_AND_EXPR)
13037         {
13038           tree arg00 = TREE_OPERAND (arg0, 0);
13039           tree arg01 = TREE_OPERAND (arg0, 1);
13040           tree arg10 = TREE_OPERAND (arg1, 0);
13041           tree arg11 = TREE_OPERAND (arg1, 1);
13042           tree itype = TREE_TYPE (arg0);
13043
13044           if (operand_equal_p (arg01, arg11, 0))
13045             return fold_build2_loc (loc, code, type,
13046                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13047                                              fold_build2_loc (loc,
13048                                                           BIT_XOR_EXPR, itype,
13049                                                           arg00, arg10),
13050                                              arg01),
13051                                 build_int_cst (itype, 0));
13052
13053           if (operand_equal_p (arg01, arg10, 0))
13054             return fold_build2_loc (loc, code, type,
13055                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13056                                              fold_build2_loc (loc,
13057                                                           BIT_XOR_EXPR, itype,
13058                                                           arg00, arg11),
13059                                              arg01),
13060                                 build_int_cst (itype, 0));
13061
13062           if (operand_equal_p (arg00, arg11, 0))
13063             return fold_build2_loc (loc, code, type,
13064                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13065                                              fold_build2_loc (loc,
13066                                                           BIT_XOR_EXPR, itype,
13067                                                           arg01, arg10),
13068                                              arg00),
13069                                 build_int_cst (itype, 0));
13070
13071           if (operand_equal_p (arg00, arg10, 0))
13072             return fold_build2_loc (loc, code, type,
13073                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
13074                                              fold_build2_loc (loc,
13075                                                           BIT_XOR_EXPR, itype,
13076                                                           arg01, arg11),
13077                                              arg00),
13078                                 build_int_cst (itype, 0));
13079         }
13080
13081       if (TREE_CODE (arg0) == BIT_XOR_EXPR
13082           && TREE_CODE (arg1) == BIT_XOR_EXPR)
13083         {
13084           tree arg00 = TREE_OPERAND (arg0, 0);
13085           tree arg01 = TREE_OPERAND (arg0, 1);
13086           tree arg10 = TREE_OPERAND (arg1, 0);
13087           tree arg11 = TREE_OPERAND (arg1, 1);
13088           tree itype = TREE_TYPE (arg0);
13089
13090           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
13091              operand_equal_p guarantees no side-effects so we don't need
13092              to use omit_one_operand on Z.  */
13093           if (operand_equal_p (arg01, arg11, 0))
13094             return fold_build2_loc (loc, code, type, arg00, arg10);
13095           if (operand_equal_p (arg01, arg10, 0))
13096             return fold_build2_loc (loc, code, type, arg00, arg11);
13097           if (operand_equal_p (arg00, arg11, 0))
13098             return fold_build2_loc (loc, code, type, arg01, arg10);
13099           if (operand_equal_p (arg00, arg10, 0))
13100             return fold_build2_loc (loc, code, type, arg01, arg11);
13101
13102           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
13103           if (TREE_CODE (arg01) == INTEGER_CST
13104               && TREE_CODE (arg11) == INTEGER_CST)
13105             return fold_build2_loc (loc, code, type,
13106                                 fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00,
13107                                              fold_build2_loc (loc,
13108                                                           BIT_XOR_EXPR, itype,
13109                                                           arg01, arg11)),
13110                                 arg10);
13111         }
13112
13113       /* Attempt to simplify equality/inequality comparisons of complex
13114          values.  Only lower the comparison if the result is known or
13115          can be simplified to a single scalar comparison.  */
13116       if ((TREE_CODE (arg0) == COMPLEX_EXPR
13117            || TREE_CODE (arg0) == COMPLEX_CST)
13118           && (TREE_CODE (arg1) == COMPLEX_EXPR
13119               || TREE_CODE (arg1) == COMPLEX_CST))
13120         {
13121           tree real0, imag0, real1, imag1;
13122           tree rcond, icond;
13123
13124           if (TREE_CODE (arg0) == COMPLEX_EXPR)
13125             {
13126               real0 = TREE_OPERAND (arg0, 0);
13127               imag0 = TREE_OPERAND (arg0, 1);
13128             }
13129           else
13130             {
13131               real0 = TREE_REALPART (arg0);
13132               imag0 = TREE_IMAGPART (arg0);
13133             }
13134
13135           if (TREE_CODE (arg1) == COMPLEX_EXPR)
13136             {
13137               real1 = TREE_OPERAND (arg1, 0);
13138               imag1 = TREE_OPERAND (arg1, 1);
13139             }
13140           else
13141             {
13142               real1 = TREE_REALPART (arg1);
13143               imag1 = TREE_IMAGPART (arg1);
13144             }
13145
13146           rcond = fold_binary_loc (loc, code, type, real0, real1);
13147           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
13148             {
13149               if (integer_zerop (rcond))
13150                 {
13151                   if (code == EQ_EXPR)
13152                     return omit_two_operands_loc (loc, type, boolean_false_node,
13153                                               imag0, imag1);
13154                   return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1);
13155                 }
13156               else
13157                 {
13158                   if (code == NE_EXPR)
13159                     return omit_two_operands_loc (loc, type, boolean_true_node,
13160                                               imag0, imag1);
13161                   return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1);
13162                 }
13163             }
13164
13165           icond = fold_binary_loc (loc, code, type, imag0, imag1);
13166           if (icond && TREE_CODE (icond) == INTEGER_CST)
13167             {
13168               if (integer_zerop (icond))
13169                 {
13170                   if (code == EQ_EXPR)
13171                     return omit_two_operands_loc (loc, type, boolean_false_node,
13172                                               real0, real1);
13173                   return fold_build2_loc (loc, NE_EXPR, type, real0, real1);
13174                 }
13175               else
13176                 {
13177                   if (code == NE_EXPR)
13178                     return omit_two_operands_loc (loc, type, boolean_true_node,
13179                                               real0, real1);
13180                   return fold_build2_loc (loc, EQ_EXPR, type, real0, real1);
13181                 }
13182             }
13183         }
13184
13185       return NULL_TREE;
13186
13187     case LT_EXPR:
13188     case GT_EXPR:
13189     case LE_EXPR:
13190     case GE_EXPR:
13191       tem = fold_comparison (loc, code, type, op0, op1);
13192       if (tem != NULL_TREE)
13193         return tem;
13194
13195       /* Transform comparisons of the form X +- C CMP X.  */
13196       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
13197           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
13198           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
13199                && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
13200               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
13201                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
13202         {
13203           tree arg01 = TREE_OPERAND (arg0, 1);
13204           enum tree_code code0 = TREE_CODE (arg0);
13205           int is_positive;
13206
13207           if (TREE_CODE (arg01) == REAL_CST)
13208             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
13209           else
13210             is_positive = tree_int_cst_sgn (arg01);
13211
13212           /* (X - c) > X becomes false.  */
13213           if (code == GT_EXPR
13214               && ((code0 == MINUS_EXPR && is_positive >= 0)
13215                   || (code0 == PLUS_EXPR && is_positive <= 0)))
13216             {
13217               if (TREE_CODE (arg01) == INTEGER_CST
13218                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13219                 fold_overflow_warning (("assuming signed overflow does not "
13220                                         "occur when assuming that (X - c) > X "
13221                                         "is always false"),
13222                                        WARN_STRICT_OVERFLOW_ALL);
13223               return constant_boolean_node (0, type);
13224             }
13225
13226           /* Likewise (X + c) < X becomes false.  */
13227           if (code == LT_EXPR
13228               && ((code0 == PLUS_EXPR && is_positive >= 0)
13229                   || (code0 == MINUS_EXPR && is_positive <= 0)))
13230             {
13231               if (TREE_CODE (arg01) == INTEGER_CST
13232                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13233                 fold_overflow_warning (("assuming signed overflow does not "
13234                                         "occur when assuming that "
13235                                         "(X + c) < X is always false"),
13236                                        WARN_STRICT_OVERFLOW_ALL);
13237               return constant_boolean_node (0, type);
13238             }
13239
13240           /* Convert (X - c) <= X to true.  */
13241           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13242               && code == LE_EXPR
13243               && ((code0 == MINUS_EXPR && is_positive >= 0)
13244                   || (code0 == PLUS_EXPR && is_positive <= 0)))
13245             {
13246               if (TREE_CODE (arg01) == INTEGER_CST
13247                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13248                 fold_overflow_warning (("assuming signed overflow does not "
13249                                         "occur when assuming that "
13250                                         "(X - c) <= X is always true"),
13251                                        WARN_STRICT_OVERFLOW_ALL);
13252               return constant_boolean_node (1, type);
13253             }
13254
13255           /* Convert (X + c) >= X to true.  */
13256           if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13257               && code == GE_EXPR
13258               && ((code0 == PLUS_EXPR && is_positive >= 0)
13259                   || (code0 == MINUS_EXPR && is_positive <= 0)))
13260             {
13261               if (TREE_CODE (arg01) == INTEGER_CST
13262                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13263                 fold_overflow_warning (("assuming signed overflow does not "
13264                                         "occur when assuming that "
13265                                         "(X + c) >= X is always true"),
13266                                        WARN_STRICT_OVERFLOW_ALL);
13267               return constant_boolean_node (1, type);
13268             }
13269
13270           if (TREE_CODE (arg01) == INTEGER_CST)
13271             {
13272               /* Convert X + c > X and X - c < X to true for integers.  */
13273               if (code == GT_EXPR
13274                   && ((code0 == PLUS_EXPR && is_positive > 0)
13275                       || (code0 == MINUS_EXPR && is_positive < 0)))
13276                 {
13277                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13278                     fold_overflow_warning (("assuming signed overflow does "
13279                                             "not occur when assuming that "
13280                                             "(X + c) > X is always true"),
13281                                            WARN_STRICT_OVERFLOW_ALL);
13282                   return constant_boolean_node (1, type);
13283                 }
13284
13285               if (code == LT_EXPR
13286                   && ((code0 == MINUS_EXPR && is_positive > 0)
13287                       || (code0 == PLUS_EXPR && is_positive < 0)))
13288                 {
13289                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13290                     fold_overflow_warning (("assuming signed overflow does "
13291                                             "not occur when assuming that "
13292                                             "(X - c) < X is always true"),
13293                                            WARN_STRICT_OVERFLOW_ALL);
13294                   return constant_boolean_node (1, type);
13295                 }
13296
13297               /* Convert X + c <= X and X - c >= X to false for integers.  */
13298               if (code == LE_EXPR
13299                   && ((code0 == PLUS_EXPR && is_positive > 0)
13300                       || (code0 == MINUS_EXPR && is_positive < 0)))
13301                 {
13302                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13303                     fold_overflow_warning (("assuming signed overflow does "
13304                                             "not occur when assuming that "
13305                                             "(X + c) <= X is always false"),
13306                                            WARN_STRICT_OVERFLOW_ALL);
13307                   return constant_boolean_node (0, type);
13308                 }
13309
13310               if (code == GE_EXPR
13311                   && ((code0 == MINUS_EXPR && is_positive > 0)
13312                       || (code0 == PLUS_EXPR && is_positive < 0)))
13313                 {
13314                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13315                     fold_overflow_warning (("assuming signed overflow does "
13316                                             "not occur when assuming that "
13317                                             "(X - c) >= X is always false"),
13318                                            WARN_STRICT_OVERFLOW_ALL);
13319                   return constant_boolean_node (0, type);
13320                 }
13321             }
13322         }
13323
13324       /* Comparisons with the highest or lowest possible integer of
13325          the specified precision will have known values.  */
13326       {
13327         tree arg1_type = TREE_TYPE (arg1);
13328         unsigned int width = TYPE_PRECISION (arg1_type);
13329
13330         if (TREE_CODE (arg1) == INTEGER_CST
13331             && width <= 2 * HOST_BITS_PER_WIDE_INT
13332             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
13333           {
13334             HOST_WIDE_INT signed_max_hi;
13335             unsigned HOST_WIDE_INT signed_max_lo;
13336             unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
13337
13338             if (width <= HOST_BITS_PER_WIDE_INT)
13339               {
13340                 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13341                                 - 1;
13342                 signed_max_hi = 0;
13343                 max_hi = 0;
13344
13345                 if (TYPE_UNSIGNED (arg1_type))
13346                   {
13347                     max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13348                     min_lo = 0;
13349                     min_hi = 0;
13350                   }
13351                 else
13352                   {
13353                     max_lo = signed_max_lo;
13354                     min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13355                     min_hi = -1;
13356                   }
13357               }
13358             else
13359               {
13360                 width -= HOST_BITS_PER_WIDE_INT;
13361                 signed_max_lo = -1;
13362                 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13363                                 - 1;
13364                 max_lo = -1;
13365                 min_lo = 0;
13366
13367                 if (TYPE_UNSIGNED (arg1_type))
13368                   {
13369                     max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13370                     min_hi = 0;
13371                   }
13372                 else
13373                   {
13374                     max_hi = signed_max_hi;
13375                     min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13376                   }
13377               }
13378
13379             if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
13380                 && TREE_INT_CST_LOW (arg1) == max_lo)
13381               switch (code)
13382                 {
13383                 case GT_EXPR:
13384                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13385
13386                 case GE_EXPR:
13387                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13388
13389                 case LE_EXPR:
13390                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13391
13392                 case LT_EXPR:
13393                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13394
13395                 /* The GE_EXPR and LT_EXPR cases above are not normally
13396                    reached because of previous transformations.  */
13397
13398                 default:
13399                   break;
13400                 }
13401             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13402                      == max_hi
13403                      && TREE_INT_CST_LOW (arg1) == max_lo - 1)
13404               switch (code)
13405                 {
13406                 case GT_EXPR:
13407                   arg1 = const_binop (PLUS_EXPR, arg1,
13408                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
13409                   return fold_build2_loc (loc, EQ_EXPR, type,
13410                                       fold_convert_loc (loc,
13411                                                         TREE_TYPE (arg1), arg0),
13412                                       arg1);
13413                 case LE_EXPR:
13414                   arg1 = const_binop (PLUS_EXPR, arg1,
13415                                       build_int_cst (TREE_TYPE (arg1), 1), 0);
13416                   return fold_build2_loc (loc, NE_EXPR, type,
13417                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13418                                                         arg0),
13419                                       arg1);
13420                 default:
13421                   break;
13422                 }
13423             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13424                      == min_hi
13425                      && TREE_INT_CST_LOW (arg1) == min_lo)
13426               switch (code)
13427                 {
13428                 case LT_EXPR:
13429                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13430
13431                 case LE_EXPR:
13432                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13433
13434                 case GE_EXPR:
13435                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13436
13437                 case GT_EXPR:
13438                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13439
13440                 default:
13441                   break;
13442                 }
13443             else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13444                      == min_hi
13445                      && TREE_INT_CST_LOW (arg1) == min_lo + 1)
13446               switch (code)
13447                 {
13448                 case GE_EXPR:
13449                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
13450                   return fold_build2_loc (loc, NE_EXPR, type,
13451                                       fold_convert_loc (loc,
13452                                                         TREE_TYPE (arg1), arg0),
13453                                       arg1);
13454                 case LT_EXPR:
13455                   arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
13456                   return fold_build2_loc (loc, EQ_EXPR, type,
13457                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13458                                                         arg0),
13459                                       arg1);
13460                 default:
13461                   break;
13462                 }
13463
13464             else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
13465                      && TREE_INT_CST_LOW (arg1) == signed_max_lo
13466                      && TYPE_UNSIGNED (arg1_type)
13467                      /* We will flip the signedness of the comparison operator
13468                         associated with the mode of arg1, so the sign bit is
13469                         specified by this mode.  Check that arg1 is the signed
13470                         max associated with this sign bit.  */
13471                      && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
13472                      /* signed_type does not work on pointer types.  */
13473                      && INTEGRAL_TYPE_P (arg1_type))
13474               {
13475                 /* The following case also applies to X < signed_max+1
13476                    and X >= signed_max+1 because previous transformations.  */
13477                 if (code == LE_EXPR || code == GT_EXPR)
13478                   {
13479                     tree st;
13480                     st = signed_type_for (TREE_TYPE (arg1));
13481                     return fold_build2_loc (loc,
13482                                         code == LE_EXPR ? GE_EXPR : LT_EXPR,
13483                                         type, fold_convert_loc (loc, st, arg0),
13484                                         build_int_cst (st, 0));
13485                   }
13486               }
13487           }
13488       }
13489
13490       /* If we are comparing an ABS_EXPR with a constant, we can
13491          convert all the cases into explicit comparisons, but they may
13492          well not be faster than doing the ABS and one comparison.
13493          But ABS (X) <= C is a range comparison, which becomes a subtraction
13494          and a comparison, and is probably faster.  */
13495       if (code == LE_EXPR
13496           && TREE_CODE (arg1) == INTEGER_CST
13497           && TREE_CODE (arg0) == ABS_EXPR
13498           && ! TREE_SIDE_EFFECTS (arg0)
13499           && (0 != (tem = negate_expr (arg1)))
13500           && TREE_CODE (tem) == INTEGER_CST
13501           && !TREE_OVERFLOW (tem))
13502         return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13503                             build2 (GE_EXPR, type,
13504                                     TREE_OPERAND (arg0, 0), tem),
13505                             build2 (LE_EXPR, type,
13506                                     TREE_OPERAND (arg0, 0), arg1));
13507
13508       /* Convert ABS_EXPR<x> >= 0 to true.  */
13509       strict_overflow_p = false;
13510       if (code == GE_EXPR
13511           && (integer_zerop (arg1)
13512               || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
13513                   && real_zerop (arg1)))
13514           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13515         {
13516           if (strict_overflow_p)
13517             fold_overflow_warning (("assuming signed overflow does not occur "
13518                                     "when simplifying comparison of "
13519                                     "absolute value and zero"),
13520                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13521           return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13522         }
13523
13524       /* Convert ABS_EXPR<x> < 0 to false.  */
13525       strict_overflow_p = false;
13526       if (code == LT_EXPR
13527           && (integer_zerop (arg1) || real_zerop (arg1))
13528           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13529         {
13530           if (strict_overflow_p)
13531             fold_overflow_warning (("assuming signed overflow does not occur "
13532                                     "when simplifying comparison of "
13533                                     "absolute value and zero"),
13534                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13535           return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13536         }
13537
13538       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13539          and similarly for >= into !=.  */
13540       if ((code == LT_EXPR || code == GE_EXPR)
13541           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13542           && TREE_CODE (arg1) == LSHIFT_EXPR
13543           && integer_onep (TREE_OPERAND (arg1, 0)))
13544         {
13545           tem = build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13546                         build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13547                                 TREE_OPERAND (arg1, 1)),
13548                         build_int_cst (TREE_TYPE (arg0), 0));
13549           goto fold_binary_exit;
13550         }
13551
13552       if ((code == LT_EXPR || code == GE_EXPR)
13553           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13554           && CONVERT_EXPR_P (arg1)
13555           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13556           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13557         {
13558           tem = build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13559                         fold_convert_loc (loc, TREE_TYPE (arg0),
13560                                           build2 (RSHIFT_EXPR,
13561                                                   TREE_TYPE (arg0), arg0,
13562                                                   TREE_OPERAND (TREE_OPERAND (arg1, 0),
13563                                                                 1))),
13564                         build_int_cst (TREE_TYPE (arg0), 0));
13565           goto fold_binary_exit;
13566         }
13567
13568       return NULL_TREE;
13569
13570     case UNORDERED_EXPR:
13571     case ORDERED_EXPR:
13572     case UNLT_EXPR:
13573     case UNLE_EXPR:
13574     case UNGT_EXPR:
13575     case UNGE_EXPR:
13576     case UNEQ_EXPR:
13577     case LTGT_EXPR:
13578       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13579         {
13580           t1 = fold_relational_const (code, type, arg0, arg1);
13581           if (t1 != NULL_TREE)
13582             return t1;
13583         }
13584
13585       /* If the first operand is NaN, the result is constant.  */
13586       if (TREE_CODE (arg0) == REAL_CST
13587           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13588           && (code != LTGT_EXPR || ! flag_trapping_math))
13589         {
13590           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13591                ? integer_zero_node
13592                : integer_one_node;
13593           return omit_one_operand_loc (loc, type, t1, arg1);
13594         }
13595
13596       /* If the second operand is NaN, the result is constant.  */
13597       if (TREE_CODE (arg1) == REAL_CST
13598           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13599           && (code != LTGT_EXPR || ! flag_trapping_math))
13600         {
13601           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13602                ? integer_zero_node
13603                : integer_one_node;
13604           return omit_one_operand_loc (loc, type, t1, arg0);
13605         }
13606
13607       /* Simplify unordered comparison of something with itself.  */
13608       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13609           && operand_equal_p (arg0, arg1, 0))
13610         return constant_boolean_node (1, type);
13611
13612       if (code == LTGT_EXPR
13613           && !flag_trapping_math
13614           && operand_equal_p (arg0, arg1, 0))
13615         return constant_boolean_node (0, type);
13616
13617       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
13618       {
13619         tree targ0 = strip_float_extensions (arg0);
13620         tree targ1 = strip_float_extensions (arg1);
13621         tree newtype = TREE_TYPE (targ0);
13622
13623         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13624           newtype = TREE_TYPE (targ1);
13625
13626         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13627           return fold_build2_loc (loc, code, type,
13628                               fold_convert_loc (loc, newtype, targ0),
13629                               fold_convert_loc (loc, newtype, targ1));
13630       }
13631
13632       return NULL_TREE;
13633
13634     case COMPOUND_EXPR:
13635       /* When pedantic, a compound expression can be neither an lvalue
13636          nor an integer constant expression.  */
13637       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13638         return NULL_TREE;
13639       /* Don't let (0, 0) be null pointer constant.  */
13640       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13641                                  : fold_convert_loc (loc, type, arg1);
13642       return pedantic_non_lvalue_loc (loc, tem);
13643
13644     case COMPLEX_EXPR:
13645       if ((TREE_CODE (arg0) == REAL_CST
13646            && TREE_CODE (arg1) == REAL_CST)
13647           || (TREE_CODE (arg0) == INTEGER_CST
13648               && TREE_CODE (arg1) == INTEGER_CST))
13649         return build_complex (type, arg0, arg1);
13650       return NULL_TREE;
13651
13652     case ASSERT_EXPR:
13653       /* An ASSERT_EXPR should never be passed to fold_binary.  */
13654       gcc_unreachable ();
13655
13656     default:
13657       return NULL_TREE;
13658     } /* switch (code) */
13659  fold_binary_exit:
13660   protected_set_expr_location (tem, loc);
13661   return tem;
13662 }
13663
13664 /* Callback for walk_tree, looking for LABEL_EXPR.  Return *TP if it is
13665    a LABEL_EXPR; otherwise return NULL_TREE.  Do not check the subtrees
13666    of GOTO_EXPR.  */
13667
13668 static tree
13669 contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13670 {
13671   switch (TREE_CODE (*tp))
13672     {
13673     case LABEL_EXPR:
13674       return *tp;
13675
13676     case GOTO_EXPR:
13677       *walk_subtrees = 0;
13678
13679       /* ... fall through ...  */
13680
13681     default:
13682       return NULL_TREE;
13683     }
13684 }
13685
13686 /* Return whether the sub-tree ST contains a label which is accessible from
13687    outside the sub-tree.  */
13688
13689 static bool
13690 contains_label_p (tree st)
13691 {
13692   return
13693    (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE);
13694 }
13695
13696 /* Fold a ternary expression of code CODE and type TYPE with operands
13697    OP0, OP1, and OP2.  Return the folded expression if folding is
13698    successful.  Otherwise, return NULL_TREE.  */
13699
13700 tree
13701 fold_ternary_loc (location_t loc, enum tree_code code, tree type,
13702               tree op0, tree op1, tree op2)
13703 {
13704   tree tem;
13705   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
13706   enum tree_code_class kind = TREE_CODE_CLASS (code);
13707
13708   gcc_assert (IS_EXPR_CODE_CLASS (kind)
13709               && TREE_CODE_LENGTH (code) == 3);
13710
13711   /* Strip any conversions that don't change the mode.  This is safe
13712      for every expression, except for a comparison expression because
13713      its signedness is derived from its operands.  So, in the latter
13714      case, only strip conversions that don't change the signedness.
13715
13716      Note that this is done as an internal manipulation within the
13717      constant folder, in order to find the simplest representation of
13718      the arguments so that their form can be studied.  In any cases,
13719      the appropriate type conversions should be put back in the tree
13720      that will get out of the constant folder.  */
13721   if (op0)
13722     {
13723       arg0 = op0;
13724       STRIP_NOPS (arg0);
13725     }
13726
13727   if (op1)
13728     {
13729       arg1 = op1;
13730       STRIP_NOPS (arg1);
13731     }
13732
13733   switch (code)
13734     {
13735     case COMPONENT_REF:
13736       if (TREE_CODE (arg0) == CONSTRUCTOR
13737           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13738         {
13739           unsigned HOST_WIDE_INT idx;
13740           tree field, value;
13741           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13742             if (field == arg1)
13743               return value;
13744         }
13745       return NULL_TREE;
13746
13747     case COND_EXPR:
13748       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13749          so all simple results must be passed through pedantic_non_lvalue.  */
13750       if (TREE_CODE (arg0) == INTEGER_CST)
13751         {
13752           tree unused_op = integer_zerop (arg0) ? op1 : op2;
13753           tem = integer_zerop (arg0) ? op2 : op1;
13754           /* Only optimize constant conditions when the selected branch
13755              has the same type as the COND_EXPR.  This avoids optimizing
13756              away "c ? x : throw", where the throw has a void type.
13757              Avoid throwing away that operand which contains label.  */
13758           if ((!TREE_SIDE_EFFECTS (unused_op)
13759                || !contains_label_p (unused_op))
13760               && (! VOID_TYPE_P (TREE_TYPE (tem))
13761                   || VOID_TYPE_P (type)))
13762             return pedantic_non_lvalue_loc (loc, tem);
13763           return NULL_TREE;
13764         }
13765       if (operand_equal_p (arg1, op2, 0))
13766         return pedantic_omit_one_operand_loc (loc, type, arg1, arg0);
13767
13768       /* If we have A op B ? A : C, we may be able to convert this to a
13769          simpler expression, depending on the operation and the values
13770          of B and C.  Signed zeros prevent all of these transformations,
13771          for reasons given above each one.
13772
13773          Also try swapping the arguments and inverting the conditional.  */
13774       if (COMPARISON_CLASS_P (arg0)
13775           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13776                                              arg1, TREE_OPERAND (arg0, 1))
13777           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
13778         {
13779           tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2);
13780           if (tem)
13781             return tem;
13782         }
13783
13784       if (COMPARISON_CLASS_P (arg0)
13785           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13786                                              op2,
13787                                              TREE_OPERAND (arg0, 1))
13788           && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
13789         {
13790           tem = fold_truth_not_expr (loc, arg0);
13791           if (tem && COMPARISON_CLASS_P (tem))
13792             {
13793               tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
13794               if (tem)
13795                 return tem;
13796             }
13797         }
13798
13799       /* If the second operand is simpler than the third, swap them
13800          since that produces better jump optimization results.  */
13801       if (truth_value_p (TREE_CODE (arg0))
13802           && tree_swap_operands_p (op1, op2, false))
13803         {
13804           /* See if this can be inverted.  If it can't, possibly because
13805              it was a floating-point inequality comparison, don't do
13806              anything.  */
13807           tem = fold_truth_not_expr (loc, arg0);
13808           if (tem)
13809             return fold_build3_loc (loc, code, type, tem, op2, op1);
13810         }
13811
13812       /* Convert A ? 1 : 0 to simply A.  */
13813       if (integer_onep (op1)
13814           && integer_zerop (op2)
13815           /* If we try to convert OP0 to our type, the
13816              call to fold will try to move the conversion inside
13817              a COND, which will recurse.  In that case, the COND_EXPR
13818              is probably the best choice, so leave it alone.  */
13819           && type == TREE_TYPE (arg0))
13820         return pedantic_non_lvalue_loc (loc, arg0);
13821
13822       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
13823          over COND_EXPR in cases such as floating point comparisons.  */
13824       if (integer_zerop (op1)
13825           && integer_onep (op2)
13826           && truth_value_p (TREE_CODE (arg0)))
13827         return pedantic_non_lvalue_loc (loc,
13828                                     fold_convert_loc (loc, type,
13829                                               invert_truthvalue_loc (loc,
13830                                                                      arg0)));
13831
13832       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
13833       if (TREE_CODE (arg0) == LT_EXPR
13834           && integer_zerop (TREE_OPERAND (arg0, 1))
13835           && integer_zerop (op2)
13836           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13837         {
13838           /* sign_bit_p only checks ARG1 bits within A's precision.
13839              If <sign bit of A> has wider type than A, bits outside
13840              of A's precision in <sign bit of A> need to be checked.
13841              If they are all 0, this optimization needs to be done
13842              in unsigned A's type, if they are all 1 in signed A's type,
13843              otherwise this can't be done.  */
13844           if (TYPE_PRECISION (TREE_TYPE (tem))
13845               < TYPE_PRECISION (TREE_TYPE (arg1))
13846               && TYPE_PRECISION (TREE_TYPE (tem))
13847                  < TYPE_PRECISION (type))
13848             {
13849               unsigned HOST_WIDE_INT mask_lo;
13850               HOST_WIDE_INT mask_hi;
13851               int inner_width, outer_width;
13852               tree tem_type;
13853
13854               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13855               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13856               if (outer_width > TYPE_PRECISION (type))
13857                 outer_width = TYPE_PRECISION (type);
13858
13859               if (outer_width > HOST_BITS_PER_WIDE_INT)
13860                 {
13861                   mask_hi = ((unsigned HOST_WIDE_INT) -1
13862                              >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
13863                   mask_lo = -1;
13864                 }
13865               else
13866                 {
13867                   mask_hi = 0;
13868                   mask_lo = ((unsigned HOST_WIDE_INT) -1
13869                              >> (HOST_BITS_PER_WIDE_INT - outer_width));
13870                 }
13871               if (inner_width > HOST_BITS_PER_WIDE_INT)
13872                 {
13873                   mask_hi &= ~((unsigned HOST_WIDE_INT) -1
13874                                >> (HOST_BITS_PER_WIDE_INT - inner_width));
13875                   mask_lo = 0;
13876                 }
13877               else
13878                 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
13879                              >> (HOST_BITS_PER_WIDE_INT - inner_width));
13880
13881               if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
13882                   && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
13883                 {
13884                   tem_type = signed_type_for (TREE_TYPE (tem));
13885                   tem = fold_convert_loc (loc, tem_type, tem);
13886                 }
13887               else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
13888                        && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
13889                 {
13890                   tem_type = unsigned_type_for (TREE_TYPE (tem));
13891                   tem = fold_convert_loc (loc, tem_type, tem);
13892                 }
13893               else
13894                 tem = NULL;
13895             }
13896
13897           if (tem)
13898             return
13899               fold_convert_loc (loc, type,
13900                                 fold_build2_loc (loc, BIT_AND_EXPR,
13901                                              TREE_TYPE (tem), tem,
13902                                              fold_convert_loc (loc,
13903                                                                TREE_TYPE (tem),
13904                                                                arg1)));
13905         }
13906
13907       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13908          already handled above.  */
13909       if (TREE_CODE (arg0) == BIT_AND_EXPR
13910           && integer_onep (TREE_OPERAND (arg0, 1))
13911           && integer_zerop (op2)
13912           && integer_pow2p (arg1))
13913         {
13914           tree tem = TREE_OPERAND (arg0, 0);
13915           STRIP_NOPS (tem);
13916           if (TREE_CODE (tem) == RSHIFT_EXPR
13917               && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13918               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13919                  TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13920             return fold_build2_loc (loc, BIT_AND_EXPR, type,
13921                                 TREE_OPERAND (tem, 0), arg1);
13922         }
13923
13924       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13925          is probably obsolete because the first operand should be a
13926          truth value (that's why we have the two cases above), but let's
13927          leave it in until we can confirm this for all front-ends.  */
13928       if (integer_zerop (op2)
13929           && TREE_CODE (arg0) == NE_EXPR
13930           && integer_zerop (TREE_OPERAND (arg0, 1))
13931           && integer_pow2p (arg1)
13932           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13933           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13934                               arg1, OEP_ONLY_CONST))
13935         return pedantic_non_lvalue_loc (loc,
13936                                     fold_convert_loc (loc, type,
13937                                                       TREE_OPERAND (arg0, 0)));
13938
13939       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13940       if (integer_zerop (op2)
13941           && truth_value_p (TREE_CODE (arg0))
13942           && truth_value_p (TREE_CODE (arg1)))
13943         return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13944                             fold_convert_loc (loc, type, arg0),
13945                             arg1);
13946
13947       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13948       if (integer_onep (op2)
13949           && truth_value_p (TREE_CODE (arg0))
13950           && truth_value_p (TREE_CODE (arg1)))
13951         {
13952           /* Only perform transformation if ARG0 is easily inverted.  */
13953           tem = fold_truth_not_expr (loc, arg0);
13954           if (tem)
13955             return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
13956                                 fold_convert_loc (loc, type, tem),
13957                                 arg1);
13958         }
13959
13960       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13961       if (integer_zerop (arg1)
13962           && truth_value_p (TREE_CODE (arg0))
13963           && truth_value_p (TREE_CODE (op2)))
13964         {
13965           /* Only perform transformation if ARG0 is easily inverted.  */
13966           tem = fold_truth_not_expr (loc, arg0);
13967           if (tem)
13968             return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13969                                 fold_convert_loc (loc, type, tem),
13970                                 op2);
13971         }
13972
13973       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13974       if (integer_onep (arg1)
13975           && truth_value_p (TREE_CODE (arg0))
13976           && truth_value_p (TREE_CODE (op2)))
13977         return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
13978                             fold_convert_loc (loc, type, arg0),
13979                             op2);
13980
13981       return NULL_TREE;
13982
13983     case CALL_EXPR:
13984       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13985          of fold_ternary on them.  */
13986       gcc_unreachable ();
13987
13988     case BIT_FIELD_REF:
13989       if ((TREE_CODE (arg0) == VECTOR_CST
13990            || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
13991           && type == TREE_TYPE (TREE_TYPE (arg0)))
13992         {
13993           unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
13994           unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
13995
13996           if (width != 0
13997               && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
13998               && (idx % width) == 0
13999               && (idx = idx / width)
14000                  < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
14001             {
14002               tree elements = NULL_TREE;
14003
14004               if (TREE_CODE (arg0) == VECTOR_CST)
14005                 elements = TREE_VECTOR_CST_ELTS (arg0);
14006               else
14007                 {
14008                   unsigned HOST_WIDE_INT idx;
14009                   tree value;
14010
14011                   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
14012                     elements = tree_cons (NULL_TREE, value, elements);
14013                 }
14014               while (idx-- > 0 && elements)
14015                 elements = TREE_CHAIN (elements);
14016               if (elements)
14017                 return TREE_VALUE (elements);
14018               else
14019                 return fold_convert_loc (loc, type, integer_zero_node);
14020             }
14021         }
14022
14023       /* A bit-field-ref that referenced the full argument can be stripped.  */
14024       if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
14025           && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_low_cst (arg1, 1)
14026           && integer_zerop (op2))
14027         return fold_convert_loc (loc, type, arg0);
14028
14029       return NULL_TREE;
14030
14031     default:
14032       return NULL_TREE;
14033     } /* switch (code) */
14034 }
14035
14036 /* Perform constant folding and related simplification of EXPR.
14037    The related simplifications include x*1 => x, x*0 => 0, etc.,
14038    and application of the associative law.
14039    NOP_EXPR conversions may be removed freely (as long as we
14040    are careful not to change the type of the overall expression).
14041    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
14042    but we can constant-fold them if they have constant operands.  */
14043
14044 #ifdef ENABLE_FOLD_CHECKING
14045 # define fold(x) fold_1 (x)
14046 static tree fold_1 (tree);
14047 static
14048 #endif
14049 tree
14050 fold (tree expr)
14051 {
14052   const tree t = expr;
14053   enum tree_code code = TREE_CODE (t);
14054   enum tree_code_class kind = TREE_CODE_CLASS (code);
14055   tree tem;
14056   location_t loc = EXPR_LOCATION (expr);
14057
14058   /* Return right away if a constant.  */
14059   if (kind == tcc_constant)
14060     return t;
14061
14062   /* CALL_EXPR-like objects with variable numbers of operands are
14063      treated specially.  */
14064   if (kind == tcc_vl_exp)
14065     {
14066       if (code == CALL_EXPR)
14067         {
14068           tem = fold_call_expr (loc, expr, false);
14069           return tem ? tem : expr;
14070         }
14071       return expr;
14072     }
14073
14074   if (IS_EXPR_CODE_CLASS (kind))
14075     {
14076       tree type = TREE_TYPE (t);
14077       tree op0, op1, op2;
14078
14079       switch (TREE_CODE_LENGTH (code))
14080         {
14081         case 1:
14082           op0 = TREE_OPERAND (t, 0);
14083           tem = fold_unary_loc (loc, code, type, op0);
14084           return tem ? tem : expr;
14085         case 2:
14086           op0 = TREE_OPERAND (t, 0);
14087           op1 = TREE_OPERAND (t, 1);
14088           tem = fold_binary_loc (loc, code, type, op0, op1);
14089           return tem ? tem : expr;
14090         case 3:
14091           op0 = TREE_OPERAND (t, 0);
14092           op1 = TREE_OPERAND (t, 1);
14093           op2 = TREE_OPERAND (t, 2);
14094           tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14095           return tem ? tem : expr;
14096         default:
14097           break;
14098         }
14099     }
14100
14101   switch (code)
14102     {
14103     case ARRAY_REF:
14104       {
14105         tree op0 = TREE_OPERAND (t, 0);
14106         tree op1 = TREE_OPERAND (t, 1);
14107
14108         if (TREE_CODE (op1) == INTEGER_CST
14109             && TREE_CODE (op0) == CONSTRUCTOR
14110             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
14111           {
14112             VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
14113             unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
14114             unsigned HOST_WIDE_INT begin = 0;
14115
14116             /* Find a matching index by means of a binary search.  */
14117             while (begin != end)
14118               {
14119                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
14120                 tree index = VEC_index (constructor_elt, elts, middle)->index;
14121
14122                 if (TREE_CODE (index) == INTEGER_CST
14123                     && tree_int_cst_lt (index, op1))
14124                   begin = middle + 1;
14125                 else if (TREE_CODE (index) == INTEGER_CST
14126                          && tree_int_cst_lt (op1, index))
14127                   end = middle;
14128                 else if (TREE_CODE (index) == RANGE_EXPR
14129                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
14130                   begin = middle + 1;
14131                 else if (TREE_CODE (index) == RANGE_EXPR
14132                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
14133                   end = middle;
14134                 else
14135                   return VEC_index (constructor_elt, elts, middle)->value;
14136               }
14137           }
14138
14139         return t;
14140       }
14141
14142     case CONST_DECL:
14143       return fold (DECL_INITIAL (t));
14144
14145     default:
14146       return t;
14147     } /* switch (code) */
14148 }
14149
14150 #ifdef ENABLE_FOLD_CHECKING
14151 #undef fold
14152
14153 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
14154 static void fold_check_failed (const_tree, const_tree);
14155 void print_fold_checksum (const_tree);
14156
14157 /* When --enable-checking=fold, compute a digest of expr before
14158    and after actual fold call to see if fold did not accidentally
14159    change original expr.  */
14160
14161 tree
14162 fold (tree expr)
14163 {
14164   tree ret;
14165   struct md5_ctx ctx;
14166   unsigned char checksum_before[16], checksum_after[16];
14167   htab_t ht;
14168
14169   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14170   md5_init_ctx (&ctx);
14171   fold_checksum_tree (expr, &ctx, ht);
14172   md5_finish_ctx (&ctx, checksum_before);
14173   htab_empty (ht);
14174
14175   ret = fold_1 (expr);
14176
14177   md5_init_ctx (&ctx);
14178   fold_checksum_tree (expr, &ctx, ht);
14179   md5_finish_ctx (&ctx, checksum_after);
14180   htab_delete (ht);
14181
14182   if (memcmp (checksum_before, checksum_after, 16))
14183     fold_check_failed (expr, ret);
14184
14185   return ret;
14186 }
14187
14188 void
14189 print_fold_checksum (const_tree expr)
14190 {
14191   struct md5_ctx ctx;
14192   unsigned char checksum[16], cnt;
14193   htab_t ht;
14194
14195   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14196   md5_init_ctx (&ctx);
14197   fold_checksum_tree (expr, &ctx, ht);
14198   md5_finish_ctx (&ctx, checksum);
14199   htab_delete (ht);
14200   for (cnt = 0; cnt < 16; ++cnt)
14201     fprintf (stderr, "%02x", checksum[cnt]);
14202   putc ('\n', stderr);
14203 }
14204
14205 static void
14206 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
14207 {
14208   internal_error ("fold check: original tree changed by fold");
14209 }
14210
14211 static void
14212 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
14213 {
14214   const void **slot;
14215   enum tree_code code;
14216   union tree_node buf;
14217   int i, len;
14218
14219 recursive_label:
14220
14221   gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
14222                <= sizeof (struct tree_function_decl))
14223               && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
14224   if (expr == NULL)
14225     return;
14226   slot = (const void **) htab_find_slot (ht, expr, INSERT);
14227   if (*slot != NULL)
14228     return;
14229   *slot = expr;
14230   code = TREE_CODE (expr);
14231   if (TREE_CODE_CLASS (code) == tcc_declaration
14232       && DECL_ASSEMBLER_NAME_SET_P (expr))
14233     {
14234       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
14235       memcpy ((char *) &buf, expr, tree_size (expr));
14236       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
14237       expr = (tree) &buf;
14238     }
14239   else if (TREE_CODE_CLASS (code) == tcc_type
14240            && (TYPE_POINTER_TO (expr)
14241                || TYPE_REFERENCE_TO (expr)
14242                || TYPE_CACHED_VALUES_P (expr)
14243                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
14244                || TYPE_NEXT_VARIANT (expr)))
14245     {
14246       /* Allow these fields to be modified.  */
14247       tree tmp;
14248       memcpy ((char *) &buf, expr, tree_size (expr));
14249       expr = tmp = (tree) &buf;
14250       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
14251       TYPE_POINTER_TO (tmp) = NULL;
14252       TYPE_REFERENCE_TO (tmp) = NULL;
14253       TYPE_NEXT_VARIANT (tmp) = NULL;
14254       if (TYPE_CACHED_VALUES_P (tmp))
14255         {
14256           TYPE_CACHED_VALUES_P (tmp) = 0;
14257           TYPE_CACHED_VALUES (tmp) = NULL;
14258         }
14259     }
14260   md5_process_bytes (expr, tree_size (expr), ctx);
14261   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
14262   if (TREE_CODE_CLASS (code) != tcc_type
14263       && TREE_CODE_CLASS (code) != tcc_declaration
14264       && code != TREE_LIST
14265       && code != SSA_NAME)
14266     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
14267   switch (TREE_CODE_CLASS (code))
14268     {
14269     case tcc_constant:
14270       switch (code)
14271         {
14272         case STRING_CST:
14273           md5_process_bytes (TREE_STRING_POINTER (expr),
14274                              TREE_STRING_LENGTH (expr), ctx);
14275           break;
14276         case COMPLEX_CST:
14277           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
14278           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
14279           break;
14280         case VECTOR_CST:
14281           fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
14282           break;
14283         default:
14284           break;
14285         }
14286       break;
14287     case tcc_exceptional:
14288       switch (code)
14289         {
14290         case TREE_LIST:
14291           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
14292           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
14293           expr = TREE_CHAIN (expr);
14294           goto recursive_label;
14295           break;
14296         case TREE_VEC:
14297           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
14298             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
14299           break;
14300         default:
14301           break;
14302         }
14303       break;
14304     case tcc_expression:
14305     case tcc_reference:
14306     case tcc_comparison:
14307     case tcc_unary:
14308     case tcc_binary:
14309     case tcc_statement:
14310     case tcc_vl_exp:
14311       len = TREE_OPERAND_LENGTH (expr);
14312       for (i = 0; i < len; ++i)
14313         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
14314       break;
14315     case tcc_declaration:
14316       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
14317       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
14318       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
14319         {
14320           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
14321           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
14322           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
14323           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
14324           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
14325         }
14326       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
14327         fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
14328
14329       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
14330         {
14331           fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
14332           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
14333           fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
14334         }
14335       break;
14336     case tcc_type:
14337       if (TREE_CODE (expr) == ENUMERAL_TYPE)
14338         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
14339       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
14340       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
14341       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
14342       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
14343       if (INTEGRAL_TYPE_P (expr)
14344           || SCALAR_FLOAT_TYPE_P (expr))
14345         {
14346           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
14347           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
14348         }
14349       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
14350       if (TREE_CODE (expr) == RECORD_TYPE
14351           || TREE_CODE (expr) == UNION_TYPE
14352           || TREE_CODE (expr) == QUAL_UNION_TYPE)
14353         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
14354       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
14355       break;
14356     default:
14357       break;
14358     }
14359 }
14360
14361 /* Helper function for outputting the checksum of a tree T.  When
14362    debugging with gdb, you can "define mynext" to be "next" followed
14363    by "call debug_fold_checksum (op0)", then just trace down till the
14364    outputs differ.  */
14365
14366 void
14367 debug_fold_checksum (const_tree t)
14368 {
14369   int i;
14370   unsigned char checksum[16];
14371   struct md5_ctx ctx;
14372   htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14373
14374   md5_init_ctx (&ctx);
14375   fold_checksum_tree (t, &ctx, ht);
14376   md5_finish_ctx (&ctx, checksum);
14377   htab_empty (ht);
14378
14379   for (i = 0; i < 16; i++)
14380     fprintf (stderr, "%d ", checksum[i]);
14381
14382   fprintf (stderr, "\n");
14383 }
14384
14385 #endif
14386
14387 /* Fold a unary tree expression with code CODE of type TYPE with an
14388    operand OP0.  LOC is the location of the resulting expression.
14389    Return a folded expression if successful.  Otherwise, return a tree
14390    expression with code CODE of type TYPE with an operand OP0.  */
14391
14392 tree
14393 fold_build1_stat_loc (location_t loc,
14394                       enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
14395 {
14396   tree tem;
14397 #ifdef ENABLE_FOLD_CHECKING
14398   unsigned char checksum_before[16], checksum_after[16];
14399   struct md5_ctx ctx;
14400   htab_t ht;
14401
14402   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14403   md5_init_ctx (&ctx);
14404   fold_checksum_tree (op0, &ctx, ht);
14405   md5_finish_ctx (&ctx, checksum_before);
14406   htab_empty (ht);
14407 #endif
14408
14409   tem = fold_unary_loc (loc, code, type, op0);
14410   if (!tem)
14411     {
14412       tem = build1_stat (code, type, op0 PASS_MEM_STAT);
14413       SET_EXPR_LOCATION (tem, loc);
14414     }
14415
14416 #ifdef ENABLE_FOLD_CHECKING
14417   md5_init_ctx (&ctx);
14418   fold_checksum_tree (op0, &ctx, ht);
14419   md5_finish_ctx (&ctx, checksum_after);
14420   htab_delete (ht);
14421
14422   if (memcmp (checksum_before, checksum_after, 16))
14423     fold_check_failed (op0, tem);
14424 #endif
14425   return tem;
14426 }
14427
14428 /* Fold a binary tree expression with code CODE of type TYPE with
14429    operands OP0 and OP1.  LOC is the location of the resulting
14430    expression.  Return a folded expression if successful.  Otherwise,
14431    return a tree expression with code CODE of type TYPE with operands
14432    OP0 and OP1.  */
14433
14434 tree
14435 fold_build2_stat_loc (location_t loc,
14436                       enum tree_code code, tree type, tree op0, tree op1
14437                       MEM_STAT_DECL)
14438 {
14439   tree tem;
14440 #ifdef ENABLE_FOLD_CHECKING
14441   unsigned char checksum_before_op0[16],
14442                 checksum_before_op1[16],
14443                 checksum_after_op0[16],
14444                 checksum_after_op1[16];
14445   struct md5_ctx ctx;
14446   htab_t ht;
14447
14448   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14449   md5_init_ctx (&ctx);
14450   fold_checksum_tree (op0, &ctx, ht);
14451   md5_finish_ctx (&ctx, checksum_before_op0);
14452   htab_empty (ht);
14453
14454   md5_init_ctx (&ctx);
14455   fold_checksum_tree (op1, &ctx, ht);
14456   md5_finish_ctx (&ctx, checksum_before_op1);
14457   htab_empty (ht);
14458 #endif
14459
14460   tem = fold_binary_loc (loc, code, type, op0, op1);
14461   if (!tem)
14462     {
14463       tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
14464       SET_EXPR_LOCATION (tem, loc);
14465     }
14466
14467 #ifdef ENABLE_FOLD_CHECKING
14468   md5_init_ctx (&ctx);
14469   fold_checksum_tree (op0, &ctx, ht);
14470   md5_finish_ctx (&ctx, checksum_after_op0);
14471   htab_empty (ht);
14472
14473   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14474     fold_check_failed (op0, tem);
14475
14476   md5_init_ctx (&ctx);
14477   fold_checksum_tree (op1, &ctx, ht);
14478   md5_finish_ctx (&ctx, checksum_after_op1);
14479   htab_delete (ht);
14480
14481   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14482     fold_check_failed (op1, tem);
14483 #endif
14484   return tem;
14485 }
14486
14487 /* Fold a ternary tree expression with code CODE of type TYPE with
14488    operands OP0, OP1, and OP2.  Return a folded expression if
14489    successful.  Otherwise, return a tree expression with code CODE of
14490    type TYPE with operands OP0, OP1, and OP2.  */
14491
14492 tree
14493 fold_build3_stat_loc (location_t loc, enum tree_code code, tree type,
14494                       tree op0, tree op1, tree op2 MEM_STAT_DECL)
14495 {
14496   tree tem;
14497 #ifdef ENABLE_FOLD_CHECKING
14498   unsigned char checksum_before_op0[16],
14499                 checksum_before_op1[16],
14500                 checksum_before_op2[16],
14501                 checksum_after_op0[16],
14502                 checksum_after_op1[16],
14503                 checksum_after_op2[16];
14504   struct md5_ctx ctx;
14505   htab_t ht;
14506
14507   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14508   md5_init_ctx (&ctx);
14509   fold_checksum_tree (op0, &ctx, ht);
14510   md5_finish_ctx (&ctx, checksum_before_op0);
14511   htab_empty (ht);
14512
14513   md5_init_ctx (&ctx);
14514   fold_checksum_tree (op1, &ctx, ht);
14515   md5_finish_ctx (&ctx, checksum_before_op1);
14516   htab_empty (ht);
14517
14518   md5_init_ctx (&ctx);
14519   fold_checksum_tree (op2, &ctx, ht);
14520   md5_finish_ctx (&ctx, checksum_before_op2);
14521   htab_empty (ht);
14522 #endif
14523
14524   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14525   tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14526   if (!tem)
14527     {
14528       tem =  build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
14529       SET_EXPR_LOCATION (tem, loc);
14530     }
14531
14532 #ifdef ENABLE_FOLD_CHECKING
14533   md5_init_ctx (&ctx);
14534   fold_checksum_tree (op0, &ctx, ht);
14535   md5_finish_ctx (&ctx, checksum_after_op0);
14536   htab_empty (ht);
14537
14538   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14539     fold_check_failed (op0, tem);
14540
14541   md5_init_ctx (&ctx);
14542   fold_checksum_tree (op1, &ctx, ht);
14543   md5_finish_ctx (&ctx, checksum_after_op1);
14544   htab_empty (ht);
14545
14546   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14547     fold_check_failed (op1, tem);
14548
14549   md5_init_ctx (&ctx);
14550   fold_checksum_tree (op2, &ctx, ht);
14551   md5_finish_ctx (&ctx, checksum_after_op2);
14552   htab_delete (ht);
14553
14554   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14555     fold_check_failed (op2, tem);
14556 #endif
14557   return tem;
14558 }
14559
14560 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14561    arguments in ARGARRAY, and a null static chain.
14562    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
14563    of type TYPE from the given operands as constructed by build_call_array.  */
14564
14565 tree
14566 fold_build_call_array_loc (location_t loc, tree type, tree fn,
14567                            int nargs, tree *argarray)
14568 {
14569   tree tem;
14570 #ifdef ENABLE_FOLD_CHECKING
14571   unsigned char checksum_before_fn[16],
14572                 checksum_before_arglist[16],
14573                 checksum_after_fn[16],
14574                 checksum_after_arglist[16];
14575   struct md5_ctx ctx;
14576   htab_t ht;
14577   int i;
14578
14579   ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14580   md5_init_ctx (&ctx);
14581   fold_checksum_tree (fn, &ctx, ht);
14582   md5_finish_ctx (&ctx, checksum_before_fn);
14583   htab_empty (ht);
14584
14585   md5_init_ctx (&ctx);
14586   for (i = 0; i < nargs; i++)
14587     fold_checksum_tree (argarray[i], &ctx, ht);
14588   md5_finish_ctx (&ctx, checksum_before_arglist);
14589   htab_empty (ht);
14590 #endif
14591
14592   tem = fold_builtin_call_array (loc, type, fn, nargs, argarray);
14593
14594 #ifdef ENABLE_FOLD_CHECKING
14595   md5_init_ctx (&ctx);
14596   fold_checksum_tree (fn, &ctx, ht);
14597   md5_finish_ctx (&ctx, checksum_after_fn);
14598   htab_empty (ht);
14599
14600   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14601     fold_check_failed (fn, tem);
14602
14603   md5_init_ctx (&ctx);
14604   for (i = 0; i < nargs; i++)
14605     fold_checksum_tree (argarray[i], &ctx, ht);
14606   md5_finish_ctx (&ctx, checksum_after_arglist);
14607   htab_delete (ht);
14608
14609   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14610     fold_check_failed (NULL_TREE, tem);
14611 #endif
14612   return tem;
14613 }
14614
14615 /* Perform constant folding and related simplification of initializer
14616    expression EXPR.  These behave identically to "fold_buildN" but ignore
14617    potential run-time traps and exceptions that fold must preserve.  */
14618
14619 #define START_FOLD_INIT \
14620   int saved_signaling_nans = flag_signaling_nans;\
14621   int saved_trapping_math = flag_trapping_math;\
14622   int saved_rounding_math = flag_rounding_math;\
14623   int saved_trapv = flag_trapv;\
14624   int saved_folding_initializer = folding_initializer;\
14625   flag_signaling_nans = 0;\
14626   flag_trapping_math = 0;\
14627   flag_rounding_math = 0;\
14628   flag_trapv = 0;\
14629   folding_initializer = 1;
14630
14631 #define END_FOLD_INIT \
14632   flag_signaling_nans = saved_signaling_nans;\
14633   flag_trapping_math = saved_trapping_math;\
14634   flag_rounding_math = saved_rounding_math;\
14635   flag_trapv = saved_trapv;\
14636   folding_initializer = saved_folding_initializer;
14637
14638 tree
14639 fold_build1_initializer_loc (location_t loc, enum tree_code code,
14640                              tree type, tree op)
14641 {
14642   tree result;
14643   START_FOLD_INIT;
14644
14645   result = fold_build1_loc (loc, code, type, op);
14646
14647   END_FOLD_INIT;
14648   return result;
14649 }
14650
14651 tree
14652 fold_build2_initializer_loc (location_t loc, enum tree_code code,
14653                              tree type, tree op0, tree op1)
14654 {
14655   tree result;
14656   START_FOLD_INIT;
14657
14658   result = fold_build2_loc (loc, code, type, op0, op1);
14659
14660   END_FOLD_INIT;
14661   return result;
14662 }
14663
14664 tree
14665 fold_build3_initializer_loc (location_t loc, enum tree_code code,
14666                              tree type, tree op0, tree op1, tree op2)
14667 {
14668   tree result;
14669   START_FOLD_INIT;
14670
14671   result = fold_build3_loc (loc, code, type, op0, op1, op2);
14672
14673   END_FOLD_INIT;
14674   return result;
14675 }
14676
14677 tree
14678 fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn,
14679                                        int nargs, tree *argarray)
14680 {
14681   tree result;
14682   START_FOLD_INIT;
14683
14684   result = fold_build_call_array_loc (loc, type, fn, nargs, argarray);
14685
14686   END_FOLD_INIT;
14687   return result;
14688 }
14689
14690 #undef START_FOLD_INIT
14691 #undef END_FOLD_INIT
14692
14693 /* Determine if first argument is a multiple of second argument.  Return 0 if
14694    it is not, or we cannot easily determined it to be.
14695
14696    An example of the sort of thing we care about (at this point; this routine
14697    could surely be made more general, and expanded to do what the *_DIV_EXPR's
14698    fold cases do now) is discovering that
14699
14700      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14701
14702    is a multiple of
14703
14704      SAVE_EXPR (J * 8)
14705
14706    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14707
14708    This code also handles discovering that
14709
14710      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14711
14712    is a multiple of 8 so we don't have to worry about dealing with a
14713    possible remainder.
14714
14715    Note that we *look* inside a SAVE_EXPR only to determine how it was
14716    calculated; it is not safe for fold to do much of anything else with the
14717    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14718    at run time.  For example, the latter example above *cannot* be implemented
14719    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14720    evaluation time of the original SAVE_EXPR is not necessarily the same at
14721    the time the new expression is evaluated.  The only optimization of this
14722    sort that would be valid is changing
14723
14724      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14725
14726    divided by 8 to
14727
14728      SAVE_EXPR (I) * SAVE_EXPR (J)
14729
14730    (where the same SAVE_EXPR (J) is used in the original and the
14731    transformed version).  */
14732
14733 int
14734 multiple_of_p (tree type, const_tree top, const_tree bottom)
14735 {
14736   if (operand_equal_p (top, bottom, 0))
14737     return 1;
14738
14739   if (TREE_CODE (type) != INTEGER_TYPE)
14740     return 0;
14741
14742   switch (TREE_CODE (top))
14743     {
14744     case BIT_AND_EXPR:
14745       /* Bitwise and provides a power of two multiple.  If the mask is
14746          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
14747       if (!integer_pow2p (bottom))
14748         return 0;
14749       /* FALLTHRU */
14750
14751     case MULT_EXPR:
14752       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14753               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14754
14755     case PLUS_EXPR:
14756     case MINUS_EXPR:
14757       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14758               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14759
14760     case LSHIFT_EXPR:
14761       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14762         {
14763           tree op1, t1;
14764
14765           op1 = TREE_OPERAND (top, 1);
14766           /* const_binop may not detect overflow correctly,
14767              so check for it explicitly here.  */
14768           if (TYPE_PRECISION (TREE_TYPE (size_one_node))
14769               > TREE_INT_CST_LOW (op1)
14770               && TREE_INT_CST_HIGH (op1) == 0
14771               && 0 != (t1 = fold_convert (type,
14772                                           const_binop (LSHIFT_EXPR,
14773                                                        size_one_node,
14774                                                        op1, 0)))
14775               && !TREE_OVERFLOW (t1))
14776             return multiple_of_p (type, t1, bottom);
14777         }
14778       return 0;
14779
14780     case NOP_EXPR:
14781       /* Can't handle conversions from non-integral or wider integral type.  */
14782       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14783           || (TYPE_PRECISION (type)
14784               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14785         return 0;
14786
14787       /* .. fall through ...  */
14788
14789     case SAVE_EXPR:
14790       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14791
14792     case INTEGER_CST:
14793       if (TREE_CODE (bottom) != INTEGER_CST
14794           || integer_zerop (bottom)
14795           || (TYPE_UNSIGNED (type)
14796               && (tree_int_cst_sgn (top) < 0
14797                   || tree_int_cst_sgn (bottom) < 0)))
14798         return 0;
14799       return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
14800                                              top, bottom, 0));
14801
14802     default:
14803       return 0;
14804     }
14805 }
14806
14807 /* Return true if CODE or TYPE is known to be non-negative. */
14808
14809 static bool
14810 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14811 {
14812   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14813       && truth_value_p (code))
14814     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14815        have a signed:1 type (where the value is -1 and 0).  */
14816     return true;
14817   return false;
14818 }
14819
14820 /* Return true if (CODE OP0) is known to be non-negative.  If the return
14821    value is based on the assumption that signed overflow is undefined,
14822    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14823    *STRICT_OVERFLOW_P.  */
14824
14825 bool
14826 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14827                                 bool *strict_overflow_p)
14828 {
14829   if (TYPE_UNSIGNED (type))
14830     return true;
14831
14832   switch (code)
14833     {
14834     case ABS_EXPR:
14835       /* We can't return 1 if flag_wrapv is set because
14836          ABS_EXPR<INT_MIN> = INT_MIN.  */
14837       if (!INTEGRAL_TYPE_P (type))
14838         return true;
14839       if (TYPE_OVERFLOW_UNDEFINED (type))
14840         {
14841           *strict_overflow_p = true;
14842           return true;
14843         }
14844       break;
14845
14846     case NON_LVALUE_EXPR:
14847     case FLOAT_EXPR:
14848     case FIX_TRUNC_EXPR:
14849       return tree_expr_nonnegative_warnv_p (op0,
14850                                             strict_overflow_p);
14851
14852     case NOP_EXPR:
14853       {
14854         tree inner_type = TREE_TYPE (op0);
14855         tree outer_type = type;
14856
14857         if (TREE_CODE (outer_type) == REAL_TYPE)
14858           {
14859             if (TREE_CODE (inner_type) == REAL_TYPE)
14860               return tree_expr_nonnegative_warnv_p (op0,
14861                                                     strict_overflow_p);
14862             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14863               {
14864                 if (TYPE_UNSIGNED (inner_type))
14865                   return true;
14866                 return tree_expr_nonnegative_warnv_p (op0,
14867                                                       strict_overflow_p);
14868               }
14869           }
14870         else if (TREE_CODE (outer_type) == INTEGER_TYPE)
14871           {
14872             if (TREE_CODE (inner_type) == REAL_TYPE)
14873               return tree_expr_nonnegative_warnv_p (op0,
14874                                                     strict_overflow_p);
14875             if (TREE_CODE (inner_type) == INTEGER_TYPE)
14876               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14877                       && TYPE_UNSIGNED (inner_type);
14878           }
14879       }
14880       break;
14881
14882     default:
14883       return tree_simple_nonnegative_warnv_p (code, type);
14884     }
14885
14886   /* We don't know sign of `t', so be conservative and return false.  */
14887   return false;
14888 }
14889
14890 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
14891    value is based on the assumption that signed overflow is undefined,
14892    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14893    *STRICT_OVERFLOW_P.  */
14894
14895 bool
14896 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14897                                       tree op1, bool *strict_overflow_p)
14898 {
14899   if (TYPE_UNSIGNED (type))
14900     return true;
14901
14902   switch (code)
14903     {
14904     case POINTER_PLUS_EXPR:
14905     case PLUS_EXPR:
14906       if (FLOAT_TYPE_P (type))
14907         return (tree_expr_nonnegative_warnv_p (op0,
14908                                                strict_overflow_p)
14909                 && tree_expr_nonnegative_warnv_p (op1,
14910                                                   strict_overflow_p));
14911
14912       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14913          both unsigned and at least 2 bits shorter than the result.  */
14914       if (TREE_CODE (type) == INTEGER_TYPE
14915           && TREE_CODE (op0) == NOP_EXPR
14916           && TREE_CODE (op1) == NOP_EXPR)
14917         {
14918           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14919           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14920           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14921               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14922             {
14923               unsigned int prec = MAX (TYPE_PRECISION (inner1),
14924                                        TYPE_PRECISION (inner2)) + 1;
14925               return prec < TYPE_PRECISION (type);
14926             }
14927         }
14928       break;
14929
14930     case MULT_EXPR:
14931       if (FLOAT_TYPE_P (type))
14932         {
14933           /* x * x for floating point x is always non-negative.  */
14934           if (operand_equal_p (op0, op1, 0))
14935             return true;
14936           return (tree_expr_nonnegative_warnv_p (op0,
14937                                                  strict_overflow_p)
14938                   && tree_expr_nonnegative_warnv_p (op1,
14939                                                     strict_overflow_p));
14940         }
14941
14942       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14943          both unsigned and their total bits is shorter than the result.  */
14944       if (TREE_CODE (type) == INTEGER_TYPE
14945           && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
14946           && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
14947         {
14948           tree inner0 = (TREE_CODE (op0) == NOP_EXPR)
14949             ? TREE_TYPE (TREE_OPERAND (op0, 0))
14950             : TREE_TYPE (op0);
14951           tree inner1 = (TREE_CODE (op1) == NOP_EXPR)
14952             ? TREE_TYPE (TREE_OPERAND (op1, 0))
14953             : TREE_TYPE (op1);
14954
14955           bool unsigned0 = TYPE_UNSIGNED (inner0);
14956           bool unsigned1 = TYPE_UNSIGNED (inner1);
14957
14958           if (TREE_CODE (op0) == INTEGER_CST)
14959             unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
14960
14961           if (TREE_CODE (op1) == INTEGER_CST)
14962             unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
14963
14964           if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
14965               && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
14966             {
14967               unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
14968                 ? tree_int_cst_min_precision (op0, /*unsignedp=*/true)
14969                 : TYPE_PRECISION (inner0);
14970
14971               unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
14972                 ? tree_int_cst_min_precision (op1, /*unsignedp=*/true)
14973                 : TYPE_PRECISION (inner1);
14974
14975               return precision0 + precision1 < TYPE_PRECISION (type);
14976             }
14977         }
14978       return false;
14979
14980     case BIT_AND_EXPR:
14981     case MAX_EXPR:
14982       return (tree_expr_nonnegative_warnv_p (op0,
14983                                              strict_overflow_p)
14984               || tree_expr_nonnegative_warnv_p (op1,
14985                                                 strict_overflow_p));
14986
14987     case BIT_IOR_EXPR:
14988     case BIT_XOR_EXPR:
14989     case MIN_EXPR:
14990     case RDIV_EXPR:
14991     case TRUNC_DIV_EXPR:
14992     case CEIL_DIV_EXPR:
14993     case FLOOR_DIV_EXPR:
14994     case ROUND_DIV_EXPR:
14995       return (tree_expr_nonnegative_warnv_p (op0,
14996                                              strict_overflow_p)
14997               && tree_expr_nonnegative_warnv_p (op1,
14998                                                 strict_overflow_p));
14999
15000     case TRUNC_MOD_EXPR:
15001     case CEIL_MOD_EXPR:
15002     case FLOOR_MOD_EXPR:
15003     case ROUND_MOD_EXPR:
15004       return tree_expr_nonnegative_warnv_p (op0,
15005                                             strict_overflow_p);
15006     default:
15007       return tree_simple_nonnegative_warnv_p (code, type);
15008     }
15009
15010   /* We don't know sign of `t', so be conservative and return false.  */
15011   return false;
15012 }
15013
15014 /* Return true if T is known to be non-negative.  If the return
15015    value is based on the assumption that signed overflow is undefined,
15016    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15017    *STRICT_OVERFLOW_P.  */
15018
15019 bool
15020 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15021 {
15022   if (TYPE_UNSIGNED (TREE_TYPE (t)))
15023     return true;
15024
15025   switch (TREE_CODE (t))
15026     {
15027     case INTEGER_CST:
15028       return tree_int_cst_sgn (t) >= 0;
15029
15030     case REAL_CST:
15031       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
15032
15033     case FIXED_CST:
15034       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
15035
15036     case COND_EXPR:
15037       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15038                                              strict_overflow_p)
15039               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
15040                                                 strict_overflow_p));
15041     default:
15042       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15043                                                    TREE_TYPE (t));
15044     }
15045   /* We don't know sign of `t', so be conservative and return false.  */
15046   return false;
15047 }
15048
15049 /* Return true if T is known to be non-negative.  If the return
15050    value is based on the assumption that signed overflow is undefined,
15051    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15052    *STRICT_OVERFLOW_P.  */
15053
15054 bool
15055 tree_call_nonnegative_warnv_p (tree type, tree fndecl,
15056                                tree arg0, tree arg1, bool *strict_overflow_p)
15057 {
15058   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
15059     switch (DECL_FUNCTION_CODE (fndecl))
15060       {
15061         CASE_FLT_FN (BUILT_IN_ACOS):
15062         CASE_FLT_FN (BUILT_IN_ACOSH):
15063         CASE_FLT_FN (BUILT_IN_CABS):
15064         CASE_FLT_FN (BUILT_IN_COSH):
15065         CASE_FLT_FN (BUILT_IN_ERFC):
15066         CASE_FLT_FN (BUILT_IN_EXP):
15067         CASE_FLT_FN (BUILT_IN_EXP10):
15068         CASE_FLT_FN (BUILT_IN_EXP2):
15069         CASE_FLT_FN (BUILT_IN_FABS):
15070         CASE_FLT_FN (BUILT_IN_FDIM):
15071         CASE_FLT_FN (BUILT_IN_HYPOT):
15072         CASE_FLT_FN (BUILT_IN_POW10):
15073         CASE_INT_FN (BUILT_IN_FFS):
15074         CASE_INT_FN (BUILT_IN_PARITY):
15075         CASE_INT_FN (BUILT_IN_POPCOUNT):
15076       case BUILT_IN_BSWAP32:
15077       case BUILT_IN_BSWAP64:
15078         /* Always true.  */
15079         return true;
15080
15081         CASE_FLT_FN (BUILT_IN_SQRT):
15082         /* sqrt(-0.0) is -0.0.  */
15083         if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
15084           return true;
15085         return tree_expr_nonnegative_warnv_p (arg0,
15086                                               strict_overflow_p);
15087
15088         CASE_FLT_FN (BUILT_IN_ASINH):
15089         CASE_FLT_FN (BUILT_IN_ATAN):
15090         CASE_FLT_FN (BUILT_IN_ATANH):
15091         CASE_FLT_FN (BUILT_IN_CBRT):
15092         CASE_FLT_FN (BUILT_IN_CEIL):
15093         CASE_FLT_FN (BUILT_IN_ERF):
15094         CASE_FLT_FN (BUILT_IN_EXPM1):
15095         CASE_FLT_FN (BUILT_IN_FLOOR):
15096         CASE_FLT_FN (BUILT_IN_FMOD):
15097         CASE_FLT_FN (BUILT_IN_FREXP):
15098         CASE_FLT_FN (BUILT_IN_LCEIL):
15099         CASE_FLT_FN (BUILT_IN_LDEXP):
15100         CASE_FLT_FN (BUILT_IN_LFLOOR):
15101         CASE_FLT_FN (BUILT_IN_LLCEIL):
15102         CASE_FLT_FN (BUILT_IN_LLFLOOR):
15103         CASE_FLT_FN (BUILT_IN_LLRINT):
15104         CASE_FLT_FN (BUILT_IN_LLROUND):
15105         CASE_FLT_FN (BUILT_IN_LRINT):
15106         CASE_FLT_FN (BUILT_IN_LROUND):
15107         CASE_FLT_FN (BUILT_IN_MODF):
15108         CASE_FLT_FN (BUILT_IN_NEARBYINT):
15109         CASE_FLT_FN (BUILT_IN_RINT):
15110         CASE_FLT_FN (BUILT_IN_ROUND):
15111         CASE_FLT_FN (BUILT_IN_SCALB):
15112         CASE_FLT_FN (BUILT_IN_SCALBLN):
15113         CASE_FLT_FN (BUILT_IN_SCALBN):
15114         CASE_FLT_FN (BUILT_IN_SIGNBIT):
15115         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
15116         CASE_FLT_FN (BUILT_IN_SINH):
15117         CASE_FLT_FN (BUILT_IN_TANH):
15118         CASE_FLT_FN (BUILT_IN_TRUNC):
15119         /* True if the 1st argument is nonnegative.  */
15120         return tree_expr_nonnegative_warnv_p (arg0,
15121                                               strict_overflow_p);
15122
15123         CASE_FLT_FN (BUILT_IN_FMAX):
15124         /* True if the 1st OR 2nd arguments are nonnegative.  */
15125         return (tree_expr_nonnegative_warnv_p (arg0,
15126                                                strict_overflow_p)
15127                 || (tree_expr_nonnegative_warnv_p (arg1,
15128                                                    strict_overflow_p)));
15129
15130         CASE_FLT_FN (BUILT_IN_FMIN):
15131         /* True if the 1st AND 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_COPYSIGN):
15138         /* True if the 2nd argument is nonnegative.  */
15139         return tree_expr_nonnegative_warnv_p (arg1,
15140                                               strict_overflow_p);
15141
15142         CASE_FLT_FN (BUILT_IN_POWI):
15143         /* True if the 1st argument is nonnegative or the second
15144            argument is an even integer.  */
15145         if (TREE_CODE (arg1) == INTEGER_CST
15146             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
15147           return true;
15148         return tree_expr_nonnegative_warnv_p (arg0,
15149                                               strict_overflow_p);
15150
15151         CASE_FLT_FN (BUILT_IN_POW):
15152         /* True if the 1st argument is nonnegative or the second
15153            argument is an even integer valued real.  */
15154         if (TREE_CODE (arg1) == REAL_CST)
15155           {
15156             REAL_VALUE_TYPE c;
15157             HOST_WIDE_INT n;
15158
15159             c = TREE_REAL_CST (arg1);
15160             n = real_to_integer (&c);
15161             if ((n & 1) == 0)
15162               {
15163                 REAL_VALUE_TYPE cint;
15164                 real_from_integer (&cint, VOIDmode, n,
15165                                    n < 0 ? -1 : 0, 0);
15166                 if (real_identical (&c, &cint))
15167                   return true;
15168               }
15169           }
15170         return tree_expr_nonnegative_warnv_p (arg0,
15171                                               strict_overflow_p);
15172
15173       default:
15174         break;
15175       }
15176   return tree_simple_nonnegative_warnv_p (CALL_EXPR,
15177                                           type);
15178 }
15179
15180 /* Return true if T is known to be non-negative.  If the return
15181    value is based on the assumption that signed overflow is undefined,
15182    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15183    *STRICT_OVERFLOW_P.  */
15184
15185 bool
15186 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15187 {
15188   enum tree_code code = TREE_CODE (t);
15189   if (TYPE_UNSIGNED (TREE_TYPE (t)))
15190     return true;
15191
15192   switch (code)
15193     {
15194     case TARGET_EXPR:
15195       {
15196         tree temp = TARGET_EXPR_SLOT (t);
15197         t = TARGET_EXPR_INITIAL (t);
15198
15199         /* If the initializer is non-void, then it's a normal expression
15200            that will be assigned to the slot.  */
15201         if (!VOID_TYPE_P (t))
15202           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
15203
15204         /* Otherwise, the initializer sets the slot in some way.  One common
15205            way is an assignment statement at the end of the initializer.  */
15206         while (1)
15207           {
15208             if (TREE_CODE (t) == BIND_EXPR)
15209               t = expr_last (BIND_EXPR_BODY (t));
15210             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
15211                      || TREE_CODE (t) == TRY_CATCH_EXPR)
15212               t = expr_last (TREE_OPERAND (t, 0));
15213             else if (TREE_CODE (t) == STATEMENT_LIST)
15214               t = expr_last (t);
15215             else
15216               break;
15217           }
15218         if (TREE_CODE (t) == MODIFY_EXPR
15219             && TREE_OPERAND (t, 0) == temp)
15220           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15221                                                 strict_overflow_p);
15222
15223         return false;
15224       }
15225
15226     case CALL_EXPR:
15227       {
15228         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
15229         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
15230
15231         return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
15232                                               get_callee_fndecl (t),
15233                                               arg0,
15234                                               arg1,
15235                                               strict_overflow_p);
15236       }
15237     case COMPOUND_EXPR:
15238     case MODIFY_EXPR:
15239       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15240                                             strict_overflow_p);
15241     case BIND_EXPR:
15242       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
15243                                             strict_overflow_p);
15244     case SAVE_EXPR:
15245       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
15246                                             strict_overflow_p);
15247
15248     default:
15249       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15250                                                    TREE_TYPE (t));
15251     }
15252
15253   /* We don't know sign of `t', so be conservative and return false.  */
15254   return false;
15255 }
15256
15257 /* Return true if T is known to be non-negative.  If the return
15258    value is based on the assumption that signed overflow is undefined,
15259    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15260    *STRICT_OVERFLOW_P.  */
15261
15262 bool
15263 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15264 {
15265   enum tree_code code;
15266   if (t == error_mark_node)
15267     return false;
15268
15269   code = TREE_CODE (t);
15270   switch (TREE_CODE_CLASS (code))
15271     {
15272     case tcc_binary:
15273     case tcc_comparison:
15274       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15275                                               TREE_TYPE (t),
15276                                               TREE_OPERAND (t, 0),
15277                                               TREE_OPERAND (t, 1),
15278                                               strict_overflow_p);
15279
15280     case tcc_unary:
15281       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15282                                              TREE_TYPE (t),
15283                                              TREE_OPERAND (t, 0),
15284                                              strict_overflow_p);
15285
15286     case tcc_constant:
15287     case tcc_declaration:
15288     case tcc_reference:
15289       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15290
15291     default:
15292       break;
15293     }
15294
15295   switch (code)
15296     {
15297     case TRUTH_AND_EXPR:
15298     case TRUTH_OR_EXPR:
15299     case TRUTH_XOR_EXPR:
15300       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15301                                               TREE_TYPE (t),
15302                                               TREE_OPERAND (t, 0),
15303                                               TREE_OPERAND (t, 1),
15304                                               strict_overflow_p);
15305     case TRUTH_NOT_EXPR:
15306       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15307                                              TREE_TYPE (t),
15308                                              TREE_OPERAND (t, 0),
15309                                              strict_overflow_p);
15310
15311     case COND_EXPR:
15312     case CONSTRUCTOR:
15313     case OBJ_TYPE_REF:
15314     case ASSERT_EXPR:
15315     case ADDR_EXPR:
15316     case WITH_SIZE_EXPR:
15317     case SSA_NAME:
15318       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15319
15320     default:
15321       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
15322     }
15323 }
15324
15325 /* Return true if `t' is known to be non-negative.  Handle warnings
15326    about undefined signed overflow.  */
15327
15328 bool
15329 tree_expr_nonnegative_p (tree t)
15330 {
15331   bool ret, strict_overflow_p;
15332
15333   strict_overflow_p = false;
15334   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
15335   if (strict_overflow_p)
15336     fold_overflow_warning (("assuming signed overflow does not occur when "
15337                             "determining that expression is always "
15338                             "non-negative"),
15339                            WARN_STRICT_OVERFLOW_MISC);
15340   return ret;
15341 }
15342
15343
15344 /* Return true when (CODE OP0) is an address and is known to be nonzero.
15345    For floating point we further ensure that T is not denormal.
15346    Similar logic is present in nonzero_address in rtlanal.h.
15347
15348    If the return value is based on the assumption that signed overflow
15349    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15350    change *STRICT_OVERFLOW_P.  */
15351
15352 bool
15353 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
15354                                  bool *strict_overflow_p)
15355 {
15356   switch (code)
15357     {
15358     case ABS_EXPR:
15359       return tree_expr_nonzero_warnv_p (op0,
15360                                         strict_overflow_p);
15361
15362     case NOP_EXPR:
15363       {
15364         tree inner_type = TREE_TYPE (op0);
15365         tree outer_type = type;
15366
15367         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
15368                 && tree_expr_nonzero_warnv_p (op0,
15369                                               strict_overflow_p));
15370       }
15371       break;
15372
15373     case NON_LVALUE_EXPR:
15374       return tree_expr_nonzero_warnv_p (op0,
15375                                         strict_overflow_p);
15376
15377     default:
15378       break;
15379   }
15380
15381   return false;
15382 }
15383
15384 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
15385    For floating point we further ensure that T is not denormal.
15386    Similar logic is present in nonzero_address in rtlanal.h.
15387
15388    If the return value is based on the assumption that signed overflow
15389    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15390    change *STRICT_OVERFLOW_P.  */
15391
15392 bool
15393 tree_binary_nonzero_warnv_p (enum tree_code code,
15394                              tree type,
15395                              tree op0,
15396                              tree op1, bool *strict_overflow_p)
15397 {
15398   bool sub_strict_overflow_p;
15399   switch (code)
15400     {
15401     case POINTER_PLUS_EXPR:
15402     case PLUS_EXPR:
15403       if (TYPE_OVERFLOW_UNDEFINED (type))
15404         {
15405           /* With the presence of negative values it is hard
15406              to say something.  */
15407           sub_strict_overflow_p = false;
15408           if (!tree_expr_nonnegative_warnv_p (op0,
15409                                               &sub_strict_overflow_p)
15410               || !tree_expr_nonnegative_warnv_p (op1,
15411                                                  &sub_strict_overflow_p))
15412             return false;
15413           /* One of operands must be positive and the other non-negative.  */
15414           /* We don't set *STRICT_OVERFLOW_P here: even if this value
15415              overflows, on a twos-complement machine the sum of two
15416              nonnegative numbers can never be zero.  */
15417           return (tree_expr_nonzero_warnv_p (op0,
15418                                              strict_overflow_p)
15419                   || tree_expr_nonzero_warnv_p (op1,
15420                                                 strict_overflow_p));
15421         }
15422       break;
15423
15424     case MULT_EXPR:
15425       if (TYPE_OVERFLOW_UNDEFINED (type))
15426         {
15427           if (tree_expr_nonzero_warnv_p (op0,
15428                                          strict_overflow_p)
15429               && tree_expr_nonzero_warnv_p (op1,
15430                                             strict_overflow_p))
15431             {
15432               *strict_overflow_p = true;
15433               return true;
15434             }
15435         }
15436       break;
15437
15438     case MIN_EXPR:
15439       sub_strict_overflow_p = false;
15440       if (tree_expr_nonzero_warnv_p (op0,
15441                                      &sub_strict_overflow_p)
15442           && tree_expr_nonzero_warnv_p (op1,
15443                                         &sub_strict_overflow_p))
15444         {
15445           if (sub_strict_overflow_p)
15446             *strict_overflow_p = true;
15447         }
15448       break;
15449
15450     case MAX_EXPR:
15451       sub_strict_overflow_p = false;
15452       if (tree_expr_nonzero_warnv_p (op0,
15453                                      &sub_strict_overflow_p))
15454         {
15455           if (sub_strict_overflow_p)
15456             *strict_overflow_p = true;
15457
15458           /* When both operands are nonzero, then MAX must be too.  */
15459           if (tree_expr_nonzero_warnv_p (op1,
15460                                          strict_overflow_p))
15461             return true;
15462
15463           /* MAX where operand 0 is positive is positive.  */
15464           return tree_expr_nonnegative_warnv_p (op0,
15465                                                strict_overflow_p);
15466         }
15467       /* MAX where operand 1 is positive is positive.  */
15468       else if (tree_expr_nonzero_warnv_p (op1,
15469                                           &sub_strict_overflow_p)
15470                && tree_expr_nonnegative_warnv_p (op1,
15471                                                  &sub_strict_overflow_p))
15472         {
15473           if (sub_strict_overflow_p)
15474             *strict_overflow_p = true;
15475           return true;
15476         }
15477       break;
15478
15479     case BIT_IOR_EXPR:
15480       return (tree_expr_nonzero_warnv_p (op1,
15481                                          strict_overflow_p)
15482               || tree_expr_nonzero_warnv_p (op0,
15483                                             strict_overflow_p));
15484
15485     default:
15486       break;
15487   }
15488
15489   return false;
15490 }
15491
15492 /* Return true when T is an address and is known to be nonzero.
15493    For floating point we further ensure that T is not denormal.
15494    Similar logic is present in nonzero_address in rtlanal.h.
15495
15496    If the return value is based on the assumption that signed overflow
15497    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15498    change *STRICT_OVERFLOW_P.  */
15499
15500 bool
15501 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15502 {
15503   bool sub_strict_overflow_p;
15504   switch (TREE_CODE (t))
15505     {
15506     case INTEGER_CST:
15507       return !integer_zerop (t);
15508
15509     case ADDR_EXPR:
15510       {
15511         tree base = get_base_address (TREE_OPERAND (t, 0));
15512
15513         if (!base)
15514           return false;
15515
15516         /* Weak declarations may link to NULL.  Other things may also be NULL
15517            so protect with -fdelete-null-pointer-checks; but not variables
15518            allocated on the stack.  */
15519         if (DECL_P (base)
15520             && (flag_delete_null_pointer_checks
15521                 || (TREE_CODE (base) == VAR_DECL && !TREE_STATIC (base))))
15522           return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base);
15523
15524         /* Constants are never weak.  */
15525         if (CONSTANT_CLASS_P (base))
15526           return true;
15527
15528         return false;
15529       }
15530
15531     case COND_EXPR:
15532       sub_strict_overflow_p = false;
15533       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15534                                      &sub_strict_overflow_p)
15535           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15536                                         &sub_strict_overflow_p))
15537         {
15538           if (sub_strict_overflow_p)
15539             *strict_overflow_p = true;
15540           return true;
15541         }
15542       break;
15543
15544     default:
15545       break;
15546     }
15547   return false;
15548 }
15549
15550 /* Return true when T is an address and is known to be nonzero.
15551    For floating point we further ensure that T is not denormal.
15552    Similar logic is present in nonzero_address in rtlanal.h.
15553
15554    If the return value is based on the assumption that signed overflow
15555    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15556    change *STRICT_OVERFLOW_P.  */
15557
15558 bool
15559 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15560 {
15561   tree type = TREE_TYPE (t);
15562   enum tree_code code;
15563
15564   /* Doing something useful for floating point would need more work.  */
15565   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
15566     return false;
15567
15568   code = TREE_CODE (t);
15569   switch (TREE_CODE_CLASS (code))
15570     {
15571     case tcc_unary:
15572       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15573                                               strict_overflow_p);
15574     case tcc_binary:
15575     case tcc_comparison:
15576       return tree_binary_nonzero_warnv_p (code, type,
15577                                                TREE_OPERAND (t, 0),
15578                                                TREE_OPERAND (t, 1),
15579                                                strict_overflow_p);
15580     case tcc_constant:
15581     case tcc_declaration:
15582     case tcc_reference:
15583       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15584
15585     default:
15586       break;
15587     }
15588
15589   switch (code)
15590     {
15591     case TRUTH_NOT_EXPR:
15592       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15593                                               strict_overflow_p);
15594
15595     case TRUTH_AND_EXPR:
15596     case TRUTH_OR_EXPR:
15597     case TRUTH_XOR_EXPR:
15598       return tree_binary_nonzero_warnv_p (code, type,
15599                                                TREE_OPERAND (t, 0),
15600                                                TREE_OPERAND (t, 1),
15601                                                strict_overflow_p);
15602
15603     case COND_EXPR:
15604     case CONSTRUCTOR:
15605     case OBJ_TYPE_REF:
15606     case ASSERT_EXPR:
15607     case ADDR_EXPR:
15608     case WITH_SIZE_EXPR:
15609     case SSA_NAME:
15610       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15611
15612     case COMPOUND_EXPR:
15613     case MODIFY_EXPR:
15614     case BIND_EXPR:
15615       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15616                                         strict_overflow_p);
15617
15618     case SAVE_EXPR:
15619       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
15620                                         strict_overflow_p);
15621
15622     case CALL_EXPR:
15623       return alloca_call_p (t);
15624
15625     default:
15626       break;
15627     }
15628   return false;
15629 }
15630
15631 /* Return true when T is an address and is known to be nonzero.
15632    Handle warnings about undefined signed overflow.  */
15633
15634 bool
15635 tree_expr_nonzero_p (tree t)
15636 {
15637   bool ret, strict_overflow_p;
15638
15639   strict_overflow_p = false;
15640   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
15641   if (strict_overflow_p)
15642     fold_overflow_warning (("assuming signed overflow does not occur when "
15643                             "determining that expression is always "
15644                             "non-zero"),
15645                            WARN_STRICT_OVERFLOW_MISC);
15646   return ret;
15647 }
15648
15649 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15650    attempt to fold the expression to a constant without modifying TYPE,
15651    OP0 or OP1.
15652
15653    If the expression could be simplified to a constant, then return
15654    the constant.  If the expression would not be simplified to a
15655    constant, then return NULL_TREE.  */
15656
15657 tree
15658 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15659 {
15660   tree tem = fold_binary (code, type, op0, op1);
15661   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15662 }
15663
15664 /* Given the components of a unary expression CODE, TYPE and OP0,
15665    attempt to fold the expression to a constant without modifying
15666    TYPE or OP0.
15667
15668    If the expression could be simplified to a constant, then return
15669    the constant.  If the expression would not be simplified to a
15670    constant, then return NULL_TREE.  */
15671
15672 tree
15673 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15674 {
15675   tree tem = fold_unary (code, type, op0);
15676   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15677 }
15678
15679 /* If EXP represents referencing an element in a constant string
15680    (either via pointer arithmetic or array indexing), return the
15681    tree representing the value accessed, otherwise return NULL.  */
15682
15683 tree
15684 fold_read_from_constant_string (tree exp)
15685 {
15686   if ((TREE_CODE (exp) == INDIRECT_REF
15687        || TREE_CODE (exp) == ARRAY_REF)
15688       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15689     {
15690       tree exp1 = TREE_OPERAND (exp, 0);
15691       tree index;
15692       tree string;
15693       location_t loc = EXPR_LOCATION (exp);
15694
15695       if (TREE_CODE (exp) == INDIRECT_REF)
15696         string = string_constant (exp1, &index);
15697       else
15698         {
15699           tree low_bound = array_ref_low_bound (exp);
15700           index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1));
15701
15702           /* Optimize the special-case of a zero lower bound.
15703
15704              We convert the low_bound to sizetype to avoid some problems
15705              with constant folding.  (E.g. suppose the lower bound is 1,
15706              and its mode is QI.  Without the conversion,l (ARRAY
15707              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15708              +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
15709           if (! integer_zerop (low_bound))
15710             index = size_diffop_loc (loc, index,
15711                                  fold_convert_loc (loc, sizetype, low_bound));
15712
15713           string = exp1;
15714         }
15715
15716       if (string
15717           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15718           && TREE_CODE (string) == STRING_CST
15719           && TREE_CODE (index) == INTEGER_CST
15720           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15721           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15722               == MODE_INT)
15723           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15724         return build_int_cst_type (TREE_TYPE (exp),
15725                                    (TREE_STRING_POINTER (string)
15726                                     [TREE_INT_CST_LOW (index)]));
15727     }
15728   return NULL;
15729 }
15730
15731 /* Return the tree for neg (ARG0) when ARG0 is known to be either
15732    an integer constant, real, or fixed-point constant.
15733
15734    TYPE is the type of the result.  */
15735
15736 static tree
15737 fold_negate_const (tree arg0, tree type)
15738 {
15739   tree t = NULL_TREE;
15740
15741   switch (TREE_CODE (arg0))
15742     {
15743     case INTEGER_CST:
15744       {
15745         unsigned HOST_WIDE_INT low;
15746         HOST_WIDE_INT high;
15747         int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15748                                    TREE_INT_CST_HIGH (arg0),
15749                                    &low, &high);
15750         t = force_fit_type_double (type, low, high, 1,
15751                                    (overflow | TREE_OVERFLOW (arg0))
15752                                    && !TYPE_UNSIGNED (type));
15753         break;
15754       }
15755
15756     case REAL_CST:
15757       t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15758       break;
15759
15760     case FIXED_CST:
15761       {
15762         FIXED_VALUE_TYPE f;
15763         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15764                                             &(TREE_FIXED_CST (arg0)), NULL,
15765                                             TYPE_SATURATING (type));
15766         t = build_fixed (type, f);
15767         /* Propagate overflow flags.  */
15768         if (overflow_p | TREE_OVERFLOW (arg0))
15769           TREE_OVERFLOW (t) = 1;
15770         break;
15771       }
15772
15773     default:
15774       gcc_unreachable ();
15775     }
15776
15777   return t;
15778 }
15779
15780 /* Return the tree for abs (ARG0) when ARG0 is known to be either
15781    an integer constant or real constant.
15782
15783    TYPE is the type of the result.  */
15784
15785 tree
15786 fold_abs_const (tree arg0, tree type)
15787 {
15788   tree t = NULL_TREE;
15789
15790   switch (TREE_CODE (arg0))
15791     {
15792     case INTEGER_CST:
15793       /* If the value is unsigned, then the absolute value is
15794          the same as the ordinary value.  */
15795       if (TYPE_UNSIGNED (type))
15796         t = arg0;
15797       /* Similarly, if the value is non-negative.  */
15798       else if (INT_CST_LT (integer_minus_one_node, arg0))
15799         t = arg0;
15800       /* If the value is negative, then the absolute value is
15801          its negation.  */
15802       else
15803         {
15804           unsigned HOST_WIDE_INT low;
15805           HOST_WIDE_INT high;
15806           int overflow = neg_double (TREE_INT_CST_LOW (arg0),
15807                                      TREE_INT_CST_HIGH (arg0),
15808                                      &low, &high);
15809           t = force_fit_type_double (type, low, high, -1,
15810                                      overflow | TREE_OVERFLOW (arg0));
15811         }
15812       break;
15813
15814     case REAL_CST:
15815       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15816         t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
15817       else
15818         t =  arg0;
15819       break;
15820
15821     default:
15822       gcc_unreachable ();
15823     }
15824
15825   return t;
15826 }
15827
15828 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
15829    constant.  TYPE is the type of the result.  */
15830
15831 static tree
15832 fold_not_const (tree arg0, tree type)
15833 {
15834   tree t = NULL_TREE;
15835
15836   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15837
15838   t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
15839                              ~TREE_INT_CST_HIGH (arg0), 0,
15840                              TREE_OVERFLOW (arg0));
15841
15842   return t;
15843 }
15844
15845 /* Given CODE, a relational operator, the target type, TYPE and two
15846    constant operands OP0 and OP1, return the result of the
15847    relational operation.  If the result is not a compile time
15848    constant, then return NULL_TREE.  */
15849
15850 static tree
15851 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15852 {
15853   int result, invert;
15854
15855   /* From here on, the only cases we handle are when the result is
15856      known to be a constant.  */
15857
15858   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15859     {
15860       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15861       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15862
15863       /* Handle the cases where either operand is a NaN.  */
15864       if (real_isnan (c0) || real_isnan (c1))
15865         {
15866           switch (code)
15867             {
15868             case EQ_EXPR:
15869             case ORDERED_EXPR:
15870               result = 0;
15871               break;
15872
15873             case NE_EXPR:
15874             case UNORDERED_EXPR:
15875             case UNLT_EXPR:
15876             case UNLE_EXPR:
15877             case UNGT_EXPR:
15878             case UNGE_EXPR:
15879             case UNEQ_EXPR:
15880               result = 1;
15881               break;
15882
15883             case LT_EXPR:
15884             case LE_EXPR:
15885             case GT_EXPR:
15886             case GE_EXPR:
15887             case LTGT_EXPR:
15888               if (flag_trapping_math)
15889                 return NULL_TREE;
15890               result = 0;
15891               break;
15892
15893             default:
15894               gcc_unreachable ();
15895             }
15896
15897           return constant_boolean_node (result, type);
15898         }
15899
15900       return constant_boolean_node (real_compare (code, c0, c1), type);
15901     }
15902
15903   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15904     {
15905       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15906       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15907       return constant_boolean_node (fixed_compare (code, c0, c1), type);
15908     }
15909
15910   /* Handle equality/inequality of complex constants.  */
15911   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15912     {
15913       tree rcond = fold_relational_const (code, type,
15914                                           TREE_REALPART (op0),
15915                                           TREE_REALPART (op1));
15916       tree icond = fold_relational_const (code, type,
15917                                           TREE_IMAGPART (op0),
15918                                           TREE_IMAGPART (op1));
15919       if (code == EQ_EXPR)
15920         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
15921       else if (code == NE_EXPR)
15922         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
15923       else
15924         return NULL_TREE;
15925     }
15926
15927   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
15928
15929      To compute GT, swap the arguments and do LT.
15930      To compute GE, do LT and invert the result.
15931      To compute LE, swap the arguments, do LT and invert the result.
15932      To compute NE, do EQ and invert the result.
15933
15934      Therefore, the code below must handle only EQ and LT.  */
15935
15936   if (code == LE_EXPR || code == GT_EXPR)
15937     {
15938       tree tem = op0;
15939       op0 = op1;
15940       op1 = tem;
15941       code = swap_tree_comparison (code);
15942     }
15943
15944   /* Note that it is safe to invert for real values here because we
15945      have already handled the one case that it matters.  */
15946
15947   invert = 0;
15948   if (code == NE_EXPR || code == GE_EXPR)
15949     {
15950       invert = 1;
15951       code = invert_tree_comparison (code, false);
15952     }
15953
15954   /* Compute a result for LT or EQ if args permit;
15955      Otherwise return T.  */
15956   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15957     {
15958       if (code == EQ_EXPR)
15959         result = tree_int_cst_equal (op0, op1);
15960       else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
15961         result = INT_CST_LT_UNSIGNED (op0, op1);
15962       else
15963         result = INT_CST_LT (op0, op1);
15964     }
15965   else
15966     return NULL_TREE;
15967
15968   if (invert)
15969     result ^= 1;
15970   return constant_boolean_node (result, type);
15971 }
15972
15973 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15974    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15975    itself.  */
15976
15977 tree
15978 fold_build_cleanup_point_expr (tree type, tree expr)
15979 {
15980   /* If the expression does not have side effects then we don't have to wrap
15981      it with a cleanup point expression.  */
15982   if (!TREE_SIDE_EFFECTS (expr))
15983     return expr;
15984
15985   /* If the expression is a return, check to see if the expression inside the
15986      return has no side effects or the right hand side of the modify expression
15987      inside the return. If either don't have side effects set we don't need to
15988      wrap the expression in a cleanup point expression.  Note we don't check the
15989      left hand side of the modify because it should always be a return decl.  */
15990   if (TREE_CODE (expr) == RETURN_EXPR)
15991     {
15992       tree op = TREE_OPERAND (expr, 0);
15993       if (!op || !TREE_SIDE_EFFECTS (op))
15994         return expr;
15995       op = TREE_OPERAND (op, 1);
15996       if (!TREE_SIDE_EFFECTS (op))
15997         return expr;
15998     }
15999
16000   return build1 (CLEANUP_POINT_EXPR, type, expr);
16001 }
16002
16003 /* Given a pointer value OP0 and a type TYPE, return a simplified version
16004    of an indirection through OP0, or NULL_TREE if no simplification is
16005    possible.  */
16006
16007 tree
16008 fold_indirect_ref_1 (location_t loc, tree type, tree op0)
16009 {
16010   tree sub = op0;
16011   tree subtype;
16012
16013   STRIP_NOPS (sub);
16014   subtype = TREE_TYPE (sub);
16015   if (!POINTER_TYPE_P (subtype))
16016     return NULL_TREE;
16017
16018   if (TREE_CODE (sub) == ADDR_EXPR)
16019     {
16020       tree op = TREE_OPERAND (sub, 0);
16021       tree optype = TREE_TYPE (op);
16022       /* *&CONST_DECL -> to the value of the const decl.  */
16023       if (TREE_CODE (op) == CONST_DECL)
16024         return DECL_INITIAL (op);
16025       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
16026       if (type == optype)
16027         {
16028           tree fop = fold_read_from_constant_string (op);
16029           if (fop)
16030             return fop;
16031           else
16032             return op;
16033         }
16034       /* *(foo *)&fooarray => fooarray[0] */
16035       else if (TREE_CODE (optype) == ARRAY_TYPE
16036                && type == TREE_TYPE (optype))
16037         {
16038           tree type_domain = TYPE_DOMAIN (optype);
16039           tree min_val = size_zero_node;
16040           if (type_domain && TYPE_MIN_VALUE (type_domain))
16041             min_val = TYPE_MIN_VALUE (type_domain);
16042           op0 = build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
16043           SET_EXPR_LOCATION (op0, loc);
16044           return op0;
16045         }
16046       /* *(foo *)&complexfoo => __real__ complexfoo */
16047       else if (TREE_CODE (optype) == COMPLEX_TYPE
16048                && type == TREE_TYPE (optype))
16049         return fold_build1_loc (loc, REALPART_EXPR, type, op);
16050       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
16051       else if (TREE_CODE (optype) == VECTOR_TYPE
16052                && type == TREE_TYPE (optype))
16053         {
16054           tree part_width = TYPE_SIZE (type);
16055           tree index = bitsize_int (0);
16056           return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
16057         }
16058     }
16059
16060   /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
16061   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
16062       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
16063     {
16064       tree op00 = TREE_OPERAND (sub, 0);
16065       tree op01 = TREE_OPERAND (sub, 1);
16066       tree op00type;
16067
16068       STRIP_NOPS (op00);
16069       op00type = TREE_TYPE (op00);
16070       if (TREE_CODE (op00) == ADDR_EXPR
16071           && TREE_CODE (TREE_TYPE (op00type)) == VECTOR_TYPE
16072           && type == TREE_TYPE (TREE_TYPE (op00type)))
16073         {
16074           HOST_WIDE_INT offset = tree_low_cst (op01, 0);
16075           tree part_width = TYPE_SIZE (type);
16076           unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
16077           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
16078           tree index = bitsize_int (indexi);
16079
16080           if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (op00type)))
16081             return fold_build3_loc (loc,
16082                                 BIT_FIELD_REF, type, TREE_OPERAND (op00, 0),
16083                                 part_width, index);
16084
16085         }
16086     }
16087
16088
16089   /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
16090   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
16091       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
16092     {
16093       tree op00 = TREE_OPERAND (sub, 0);
16094       tree op01 = TREE_OPERAND (sub, 1);
16095       tree op00type;
16096
16097       STRIP_NOPS (op00);
16098       op00type = TREE_TYPE (op00);
16099       if (TREE_CODE (op00) == ADDR_EXPR
16100           && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
16101           && type == TREE_TYPE (TREE_TYPE (op00type)))
16102         {
16103           tree size = TYPE_SIZE_UNIT (type);
16104           if (tree_int_cst_equal (size, op01))
16105             return fold_build1_loc (loc, IMAGPART_EXPR, type,
16106                                 TREE_OPERAND (op00, 0));
16107         }
16108     }
16109
16110   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
16111   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
16112       && type == TREE_TYPE (TREE_TYPE (subtype)))
16113     {
16114       tree type_domain;
16115       tree min_val = size_zero_node;
16116       sub = build_fold_indirect_ref_loc (loc, sub);
16117       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
16118       if (type_domain && TYPE_MIN_VALUE (type_domain))
16119         min_val = TYPE_MIN_VALUE (type_domain);
16120       op0 = build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
16121       SET_EXPR_LOCATION (op0, loc);
16122       return op0;
16123     }
16124
16125   return NULL_TREE;
16126 }
16127
16128 /* Builds an expression for an indirection through T, simplifying some
16129    cases.  */
16130
16131 tree
16132 build_fold_indirect_ref_loc (location_t loc, tree t)
16133 {
16134   tree type = TREE_TYPE (TREE_TYPE (t));
16135   tree sub = fold_indirect_ref_1 (loc, type, t);
16136
16137   if (sub)
16138     return sub;
16139
16140   t = build1 (INDIRECT_REF, type, t);
16141   SET_EXPR_LOCATION (t, loc);
16142   return t;
16143 }
16144
16145 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
16146
16147 tree
16148 fold_indirect_ref_loc (location_t loc, tree t)
16149 {
16150   tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0));
16151
16152   if (sub)
16153     return sub;
16154   else
16155     return t;
16156 }
16157
16158 /* Strip non-trapping, non-side-effecting tree nodes from an expression
16159    whose result is ignored.  The type of the returned tree need not be
16160    the same as the original expression.  */
16161
16162 tree
16163 fold_ignored_result (tree t)
16164 {
16165   if (!TREE_SIDE_EFFECTS (t))
16166     return integer_zero_node;
16167
16168   for (;;)
16169     switch (TREE_CODE_CLASS (TREE_CODE (t)))
16170       {
16171       case tcc_unary:
16172         t = TREE_OPERAND (t, 0);
16173         break;
16174
16175       case tcc_binary:
16176       case tcc_comparison:
16177         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16178           t = TREE_OPERAND (t, 0);
16179         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
16180           t = TREE_OPERAND (t, 1);
16181         else
16182           return t;
16183         break;
16184
16185       case tcc_expression:
16186         switch (TREE_CODE (t))
16187           {
16188           case COMPOUND_EXPR:
16189             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16190               return t;
16191             t = TREE_OPERAND (t, 0);
16192             break;
16193
16194           case COND_EXPR:
16195             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
16196                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
16197               return t;
16198             t = TREE_OPERAND (t, 0);
16199             break;
16200
16201           default:
16202             return t;
16203           }
16204         break;
16205
16206       default:
16207         return t;
16208       }
16209 }
16210
16211 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
16212    This can only be applied to objects of a sizetype.  */
16213
16214 tree
16215 round_up_loc (location_t loc, tree value, int divisor)
16216 {
16217   tree div = NULL_TREE;
16218
16219   gcc_assert (divisor > 0);
16220   if (divisor == 1)
16221     return value;
16222
16223   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16224      have to do anything.  Only do this when we are not given a const,
16225      because in that case, this check is more expensive than just
16226      doing it.  */
16227   if (TREE_CODE (value) != INTEGER_CST)
16228     {
16229       div = build_int_cst (TREE_TYPE (value), divisor);
16230
16231       if (multiple_of_p (TREE_TYPE (value), value, div))
16232         return value;
16233     }
16234
16235   /* If divisor is a power of two, simplify this to bit manipulation.  */
16236   if (divisor == (divisor & -divisor))
16237     {
16238       if (TREE_CODE (value) == INTEGER_CST)
16239         {
16240           unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
16241           unsigned HOST_WIDE_INT high;
16242           bool overflow_p;
16243
16244           if ((low & (divisor - 1)) == 0)
16245             return value;
16246
16247           overflow_p = TREE_OVERFLOW (value);
16248           high = TREE_INT_CST_HIGH (value);
16249           low &= ~(divisor - 1);
16250           low += divisor;
16251           if (low == 0)
16252             {
16253               high++;
16254               if (high == 0)
16255                 overflow_p = true;
16256             }
16257
16258           return force_fit_type_double (TREE_TYPE (value), low, high,
16259                                         -1, overflow_p);
16260         }
16261       else
16262         {
16263           tree t;
16264
16265           t = build_int_cst (TREE_TYPE (value), divisor - 1);
16266           value = size_binop_loc (loc, PLUS_EXPR, value, t);
16267           t = build_int_cst (TREE_TYPE (value), -divisor);
16268           value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16269         }
16270     }
16271   else
16272     {
16273       if (!div)
16274         div = build_int_cst (TREE_TYPE (value), divisor);
16275       value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div);
16276       value = size_binop_loc (loc, MULT_EXPR, value, div);
16277     }
16278
16279   return value;
16280 }
16281
16282 /* Likewise, but round down.  */
16283
16284 tree
16285 round_down_loc (location_t loc, tree value, int divisor)
16286 {
16287   tree div = NULL_TREE;
16288
16289   gcc_assert (divisor > 0);
16290   if (divisor == 1)
16291     return value;
16292
16293   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16294      have to do anything.  Only do this when we are not given a const,
16295      because in that case, this check is more expensive than just
16296      doing it.  */
16297   if (TREE_CODE (value) != INTEGER_CST)
16298     {
16299       div = build_int_cst (TREE_TYPE (value), divisor);
16300
16301       if (multiple_of_p (TREE_TYPE (value), value, div))
16302         return value;
16303     }
16304
16305   /* If divisor is a power of two, simplify this to bit manipulation.  */
16306   if (divisor == (divisor & -divisor))
16307     {
16308       tree t;
16309
16310       t = build_int_cst (TREE_TYPE (value), -divisor);
16311       value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16312     }
16313   else
16314     {
16315       if (!div)
16316         div = build_int_cst (TREE_TYPE (value), divisor);
16317       value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div);
16318       value = size_binop_loc (loc, MULT_EXPR, value, div);
16319     }
16320
16321   return value;
16322 }
16323
16324 /* Returns the pointer to the base of the object addressed by EXP and
16325    extracts the information about the offset of the access, storing it
16326    to PBITPOS and POFFSET.  */
16327
16328 static tree
16329 split_address_to_core_and_offset (tree exp,
16330                                   HOST_WIDE_INT *pbitpos, tree *poffset)
16331 {
16332   tree core;
16333   enum machine_mode mode;
16334   int unsignedp, volatilep;
16335   HOST_WIDE_INT bitsize;
16336   location_t loc = EXPR_LOCATION (exp);
16337
16338   if (TREE_CODE (exp) == ADDR_EXPR)
16339     {
16340       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
16341                                   poffset, &mode, &unsignedp, &volatilep,
16342                                   false);
16343       core = build_fold_addr_expr_loc (loc, core);
16344     }
16345   else
16346     {
16347       core = exp;
16348       *pbitpos = 0;
16349       *poffset = NULL_TREE;
16350     }
16351
16352   return core;
16353 }
16354
16355 /* Returns true if addresses of E1 and E2 differ by a constant, false
16356    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
16357
16358 bool
16359 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
16360 {
16361   tree core1, core2;
16362   HOST_WIDE_INT bitpos1, bitpos2;
16363   tree toffset1, toffset2, tdiff, type;
16364
16365   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
16366   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
16367
16368   if (bitpos1 % BITS_PER_UNIT != 0
16369       || bitpos2 % BITS_PER_UNIT != 0
16370       || !operand_equal_p (core1, core2, 0))
16371     return false;
16372
16373   if (toffset1 && toffset2)
16374     {
16375       type = TREE_TYPE (toffset1);
16376       if (type != TREE_TYPE (toffset2))
16377         toffset2 = fold_convert (type, toffset2);
16378
16379       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
16380       if (!cst_and_fits_in_hwi (tdiff))
16381         return false;
16382
16383       *diff = int_cst_value (tdiff);
16384     }
16385   else if (toffset1 || toffset2)
16386     {
16387       /* If only one of the offsets is non-constant, the difference cannot
16388          be a constant.  */
16389       return false;
16390     }
16391   else
16392     *diff = 0;
16393
16394   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
16395   return true;
16396 }
16397
16398 /* Simplify the floating point expression EXP when the sign of the
16399    result is not significant.  Return NULL_TREE if no simplification
16400    is possible.  */
16401
16402 tree
16403 fold_strip_sign_ops (tree exp)
16404 {
16405   tree arg0, arg1;
16406   location_t loc = EXPR_LOCATION (exp);
16407
16408   switch (TREE_CODE (exp))
16409     {
16410     case ABS_EXPR:
16411     case NEGATE_EXPR:
16412       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16413       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
16414
16415     case MULT_EXPR:
16416     case RDIV_EXPR:
16417       if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
16418         return NULL_TREE;
16419       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16420       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16421       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
16422         return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp),
16423                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
16424                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
16425       break;
16426
16427     case COMPOUND_EXPR:
16428       arg0 = TREE_OPERAND (exp, 0);
16429       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16430       if (arg1)
16431         return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
16432       break;
16433
16434     case COND_EXPR:
16435       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16436       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
16437       if (arg0 || arg1)
16438         return fold_build3_loc (loc,
16439                             COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
16440                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
16441                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
16442       break;
16443
16444     case CALL_EXPR:
16445       {
16446         const enum built_in_function fcode = builtin_mathfn_code (exp);
16447         switch (fcode)
16448         {
16449         CASE_FLT_FN (BUILT_IN_COPYSIGN):
16450           /* Strip copysign function call, return the 1st argument. */
16451           arg0 = CALL_EXPR_ARG (exp, 0);
16452           arg1 = CALL_EXPR_ARG (exp, 1);
16453           return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1);
16454
16455         default:
16456           /* Strip sign ops from the argument of "odd" math functions.  */
16457           if (negate_mathfn_p (fcode))
16458             {
16459               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
16460               if (arg0)
16461                 return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0);
16462             }
16463           break;
16464         }
16465       }
16466       break;
16467
16468     default:
16469       break;
16470     }
16471   return NULL_TREE;
16472 }