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
4 Free Software Foundation, Inc.
6 This file is part of GCC.
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
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
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/>. */
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. */
30 /* The entry points in this file are fold, size_int_wide, size_binop
31 and force_fit_type_double.
33 fold takes a tree as argument and returns a simplified tree.
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'.
39 size_int takes an integer value, and creates a tree constant
40 with type from `sizetype'.
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
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. */
52 #include "coretypes.h"
57 #include "fixed-value.h"
65 #include "langhooks.h"
68 /* Nonzero if we are folding constants inside an initializer; zero
70 int folding_initializer = 0;
72 /* The following constants represent a bit based encoding of GCC's
73 comparison operators. This encoding simplifies transformations
74 on relational comparison operators, such as AND and OR. */
75 enum comparison_code {
94 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
95 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
96 static bool negate_mathfn_p (enum built_in_function);
97 static bool negate_expr_p (tree);
98 static tree negate_expr (tree);
99 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
100 static tree associate_trees (tree, tree, enum tree_code, tree);
101 static tree const_binop (enum tree_code, tree, tree, int);
102 static enum comparison_code comparison_to_compcode (enum tree_code);
103 static enum tree_code compcode_to_comparison (enum comparison_code);
104 static tree combine_comparisons (enum tree_code, enum tree_code,
105 enum tree_code, tree, tree, tree);
106 static int truth_value_p (enum tree_code);
107 static int operand_equal_for_comparison_p (tree, tree, tree);
108 static int twoval_comparison_p (tree, tree *, tree *, int *);
109 static tree eval_subst (tree, tree, tree, tree, tree);
110 static tree pedantic_omit_one_operand (tree, tree, tree);
111 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
112 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
113 enum machine_mode *, int *, int *,
115 static tree sign_bit_p (tree, const_tree);
116 static int simple_operand_p (const_tree);
117 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
118 static tree range_predecessor (tree);
119 static tree range_successor (tree);
120 static tree make_range (tree, int *, tree *, tree *, bool *);
121 static tree build_range_check (tree, tree, int, tree, tree);
122 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
124 static tree fold_range_test (enum tree_code, tree, tree, tree);
125 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
126 static tree unextend (tree, int, int, tree);
127 static tree fold_truthop (enum tree_code, tree, tree, tree);
128 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
129 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
130 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
131 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
134 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
136 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
137 static tree fold_div_compare (enum tree_code, tree, tree, tree);
138 static bool reorder_operands_p (const_tree, const_tree);
139 static tree fold_negate_const (tree, tree);
140 static tree fold_not_const (tree, tree);
141 static tree fold_relational_const (enum tree_code, tree, tree, tree);
144 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
145 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
146 and SUM1. Then this yields nonzero if overflow occurred during the
149 Overflow occurs if A and B have the same sign, but A and SUM differ in
150 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
152 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
154 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
155 We do that by representing the two-word integer in 4 words, with only
156 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
157 number. The value of the word is LOWPART + HIGHPART * BASE. */
160 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
161 #define HIGHPART(x) \
162 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
163 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
165 /* Unpack a two-word integer into 4 words.
166 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
167 WORDS points to the array of HOST_WIDE_INTs. */
170 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
172 words[0] = LOWPART (low);
173 words[1] = HIGHPART (low);
174 words[2] = LOWPART (hi);
175 words[3] = HIGHPART (hi);
178 /* Pack an array of 4 words into a two-word integer.
179 WORDS points to the array of words.
180 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
183 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
186 *low = words[0] + words[1] * BASE;
187 *hi = words[2] + words[3] * BASE;
190 /* Force the double-word integer L1, H1 to be within the range of the
191 integer type TYPE. Stores the properly truncated and sign-extended
192 double-word integer in *LV, *HV. Returns true if the operation
193 overflows, that is, argument and result are different. */
196 fit_double_type (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
197 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, const_tree type)
199 unsigned HOST_WIDE_INT low0 = l1;
200 HOST_WIDE_INT high0 = h1;
202 int sign_extended_type;
204 if (POINTER_TYPE_P (type)
205 || TREE_CODE (type) == OFFSET_TYPE)
208 prec = TYPE_PRECISION (type);
210 /* Size types *are* sign extended. */
211 sign_extended_type = (!TYPE_UNSIGNED (type)
212 || (TREE_CODE (type) == INTEGER_TYPE
213 && TYPE_IS_SIZETYPE (type)));
215 /* First clear all bits that are beyond the type's precision. */
216 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
218 else if (prec > HOST_BITS_PER_WIDE_INT)
219 h1 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
223 if (prec < HOST_BITS_PER_WIDE_INT)
224 l1 &= ~((HOST_WIDE_INT) (-1) << prec);
227 /* Then do sign extension if necessary. */
228 if (!sign_extended_type)
229 /* No sign extension */;
230 else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
231 /* Correct width already. */;
232 else if (prec > HOST_BITS_PER_WIDE_INT)
234 /* Sign extend top half? */
235 if (h1 & ((unsigned HOST_WIDE_INT)1
236 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
237 h1 |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
239 else if (prec == HOST_BITS_PER_WIDE_INT)
241 if ((HOST_WIDE_INT)l1 < 0)
246 /* Sign extend bottom half? */
247 if (l1 & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
250 l1 |= (HOST_WIDE_INT)(-1) << prec;
257 /* If the value didn't fit, signal overflow. */
258 return l1 != low0 || h1 != high0;
261 /* We force the double-int HIGH:LOW to the range of the type TYPE by
262 sign or zero extending it.
263 OVERFLOWABLE indicates if we are interested
264 in overflow of the value, when >0 we are only interested in signed
265 overflow, for <0 we are interested in any overflow. OVERFLOWED
266 indicates whether overflow has already occurred. CONST_OVERFLOWED
267 indicates whether constant overflow has already occurred. We force
268 T's value to be within range of T's type (by setting to 0 or 1 all
269 the bits outside the type's range). We set TREE_OVERFLOWED if,
270 OVERFLOWED is nonzero,
271 or OVERFLOWABLE is >0 and signed overflow occurs
272 or OVERFLOWABLE is <0 and any overflow occurs
273 We return a new tree node for the extended double-int. The node
274 is shared if no overflow flags are set. */
277 force_fit_type_double (tree type, unsigned HOST_WIDE_INT low,
278 HOST_WIDE_INT high, int overflowable,
281 int sign_extended_type;
284 /* Size types *are* sign extended. */
285 sign_extended_type = (!TYPE_UNSIGNED (type)
286 || (TREE_CODE (type) == INTEGER_TYPE
287 && TYPE_IS_SIZETYPE (type)));
289 overflow = fit_double_type (low, high, &low, &high, type);
291 /* If we need to set overflow flags, return a new unshared node. */
292 if (overflowed || overflow)
296 || (overflowable > 0 && sign_extended_type))
298 tree t = make_node (INTEGER_CST);
299 TREE_INT_CST_LOW (t) = low;
300 TREE_INT_CST_HIGH (t) = high;
301 TREE_TYPE (t) = type;
302 TREE_OVERFLOW (t) = 1;
307 /* Else build a shared node. */
308 return build_int_cst_wide (type, low, high);
311 /* Add two doubleword integers with doubleword result.
312 Return nonzero if the operation overflows according to UNSIGNED_P.
313 Each argument is given as two `HOST_WIDE_INT' pieces.
314 One argument is L1 and H1; the other, L2 and H2.
315 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
318 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
319 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
320 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
323 unsigned HOST_WIDE_INT l;
327 h = h1 + h2 + (l < l1);
333 return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
335 return OVERFLOW_SUM_SIGN (h1, h2, h);
338 /* Negate a doubleword integer with doubleword result.
339 Return nonzero if the operation overflows, assuming it's signed.
340 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
341 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
344 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
345 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
351 return (*hv & h1) < 0;
361 /* Multiply two doubleword integers with doubleword result.
362 Return nonzero if the operation overflows according to UNSIGNED_P.
363 Each argument is given as two `HOST_WIDE_INT' pieces.
364 One argument is L1 and H1; the other, L2 and H2.
365 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
368 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
369 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
370 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
373 HOST_WIDE_INT arg1[4];
374 HOST_WIDE_INT arg2[4];
375 HOST_WIDE_INT prod[4 * 2];
376 unsigned HOST_WIDE_INT carry;
378 unsigned HOST_WIDE_INT toplow, neglow;
379 HOST_WIDE_INT tophigh, neghigh;
381 encode (arg1, l1, h1);
382 encode (arg2, l2, h2);
384 memset (prod, 0, sizeof prod);
386 for (i = 0; i < 4; i++)
389 for (j = 0; j < 4; j++)
392 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
393 carry += arg1[i] * arg2[j];
394 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
396 prod[k] = LOWPART (carry);
397 carry = HIGHPART (carry);
402 decode (prod, lv, hv);
403 decode (prod + 4, &toplow, &tophigh);
405 /* Unsigned overflow is immediate. */
407 return (toplow | tophigh) != 0;
409 /* Check for signed overflow by calculating the signed representation of the
410 top half of the result; it should agree with the low half's sign bit. */
413 neg_double (l2, h2, &neglow, &neghigh);
414 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
418 neg_double (l1, h1, &neglow, &neghigh);
419 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
421 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
424 /* Shift the doubleword integer in L1, H1 left by COUNT places
425 keeping only PREC bits of result.
426 Shift right if COUNT is negative.
427 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
428 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
431 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
432 HOST_WIDE_INT count, unsigned int prec,
433 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
435 unsigned HOST_WIDE_INT signmask;
439 rshift_double (l1, h1, -count, prec, lv, hv, arith);
443 if (SHIFT_COUNT_TRUNCATED)
446 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
448 /* Shifting by the host word size is undefined according to the
449 ANSI standard, so we must handle this as a special case. */
453 else if (count >= HOST_BITS_PER_WIDE_INT)
455 *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
460 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
461 | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
465 /* Sign extend all bits that are beyond the precision. */
467 signmask = -((prec > HOST_BITS_PER_WIDE_INT
468 ? ((unsigned HOST_WIDE_INT) *hv
469 >> (prec - HOST_BITS_PER_WIDE_INT - 1))
470 : (*lv >> (prec - 1))) & 1);
472 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
474 else if (prec >= HOST_BITS_PER_WIDE_INT)
476 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
477 *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
482 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
483 *lv |= signmask << prec;
487 /* Shift the doubleword integer in L1, H1 right by COUNT places
488 keeping only PREC bits of result. COUNT must be positive.
489 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
490 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
493 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
494 HOST_WIDE_INT count, unsigned int prec,
495 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
498 unsigned HOST_WIDE_INT signmask;
501 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
504 if (SHIFT_COUNT_TRUNCATED)
507 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
509 /* Shifting by the host word size is undefined according to the
510 ANSI standard, so we must handle this as a special case. */
514 else if (count >= HOST_BITS_PER_WIDE_INT)
517 *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
521 *hv = (unsigned HOST_WIDE_INT) h1 >> count;
523 | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
526 /* Zero / sign extend all bits that are beyond the precision. */
528 if (count >= (HOST_WIDE_INT)prec)
533 else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
535 else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
537 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
538 *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
543 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
544 *lv |= signmask << (prec - count);
548 /* Rotate the doubleword integer in L1, H1 left by COUNT places
549 keeping only PREC bits of result.
550 Rotate right if COUNT is negative.
551 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
554 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
555 HOST_WIDE_INT count, unsigned int prec,
556 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
558 unsigned HOST_WIDE_INT s1l, s2l;
559 HOST_WIDE_INT s1h, s2h;
565 lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
566 rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
571 /* Rotate the doubleword integer in L1, H1 left by COUNT places
572 keeping only PREC bits of result. COUNT must be positive.
573 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
576 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
577 HOST_WIDE_INT count, unsigned int prec,
578 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
580 unsigned HOST_WIDE_INT s1l, s2l;
581 HOST_WIDE_INT s1h, s2h;
587 rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
588 lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
593 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
594 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
595 CODE is a tree code for a kind of division, one of
596 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
598 It controls how the quotient is rounded to an integer.
599 Return nonzero if the operation overflows.
600 UNS nonzero says do unsigned division. */
603 div_and_round_double (enum tree_code code, int uns,
604 unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
605 HOST_WIDE_INT hnum_orig,
606 unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
607 HOST_WIDE_INT hden_orig,
608 unsigned HOST_WIDE_INT *lquo,
609 HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
613 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
614 HOST_WIDE_INT den[4], quo[4];
616 unsigned HOST_WIDE_INT work;
617 unsigned HOST_WIDE_INT carry = 0;
618 unsigned HOST_WIDE_INT lnum = lnum_orig;
619 HOST_WIDE_INT hnum = hnum_orig;
620 unsigned HOST_WIDE_INT lden = lden_orig;
621 HOST_WIDE_INT hden = hden_orig;
624 if (hden == 0 && lden == 0)
625 overflow = 1, lden = 1;
627 /* Calculate quotient sign and convert operands to unsigned. */
633 /* (minimum integer) / (-1) is the only overflow case. */
634 if (neg_double (lnum, hnum, &lnum, &hnum)
635 && ((HOST_WIDE_INT) lden & hden) == -1)
641 neg_double (lden, hden, &lden, &hden);
645 if (hnum == 0 && hden == 0)
646 { /* single precision */
648 /* This unsigned division rounds toward zero. */
654 { /* trivial case: dividend < divisor */
655 /* hden != 0 already checked. */
662 memset (quo, 0, sizeof quo);
664 memset (num, 0, sizeof num); /* to zero 9th element */
665 memset (den, 0, sizeof den);
667 encode (num, lnum, hnum);
668 encode (den, lden, hden);
670 /* Special code for when the divisor < BASE. */
671 if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
673 /* hnum != 0 already checked. */
674 for (i = 4 - 1; i >= 0; i--)
676 work = num[i] + carry * BASE;
677 quo[i] = work / lden;
683 /* Full double precision division,
684 with thanks to Don Knuth's "Seminumerical Algorithms". */
685 int num_hi_sig, den_hi_sig;
686 unsigned HOST_WIDE_INT quo_est, scale;
688 /* Find the highest nonzero divisor digit. */
689 for (i = 4 - 1;; i--)
696 /* Insure that the first digit of the divisor is at least BASE/2.
697 This is required by the quotient digit estimation algorithm. */
699 scale = BASE / (den[den_hi_sig] + 1);
701 { /* scale divisor and dividend */
703 for (i = 0; i <= 4 - 1; i++)
705 work = (num[i] * scale) + carry;
706 num[i] = LOWPART (work);
707 carry = HIGHPART (work);
712 for (i = 0; i <= 4 - 1; i++)
714 work = (den[i] * scale) + carry;
715 den[i] = LOWPART (work);
716 carry = HIGHPART (work);
717 if (den[i] != 0) den_hi_sig = i;
724 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
726 /* Guess the next quotient digit, quo_est, by dividing the first
727 two remaining dividend digits by the high order quotient digit.
728 quo_est is never low and is at most 2 high. */
729 unsigned HOST_WIDE_INT tmp;
731 num_hi_sig = i + den_hi_sig + 1;
732 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
733 if (num[num_hi_sig] != den[den_hi_sig])
734 quo_est = work / den[den_hi_sig];
738 /* Refine quo_est so it's usually correct, and at most one high. */
739 tmp = work - quo_est * den[den_hi_sig];
741 && (den[den_hi_sig - 1] * quo_est
742 > (tmp * BASE + num[num_hi_sig - 2])))
745 /* Try QUO_EST as the quotient digit, by multiplying the
746 divisor by QUO_EST and subtracting from the remaining dividend.
747 Keep in mind that QUO_EST is the I - 1st digit. */
750 for (j = 0; j <= den_hi_sig; j++)
752 work = quo_est * den[j] + carry;
753 carry = HIGHPART (work);
754 work = num[i + j] - LOWPART (work);
755 num[i + j] = LOWPART (work);
756 carry += HIGHPART (work) != 0;
759 /* If quo_est was high by one, then num[i] went negative and
760 we need to correct things. */
761 if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
764 carry = 0; /* add divisor back in */
765 for (j = 0; j <= den_hi_sig; j++)
767 work = num[i + j] + den[j] + carry;
768 carry = HIGHPART (work);
769 num[i + j] = LOWPART (work);
772 num [num_hi_sig] += carry;
775 /* Store the quotient digit. */
780 decode (quo, lquo, hquo);
783 /* If result is negative, make it so. */
785 neg_double (*lquo, *hquo, lquo, hquo);
787 /* Compute trial remainder: rem = num - (quo * den) */
788 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
789 neg_double (*lrem, *hrem, lrem, hrem);
790 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
795 case TRUNC_MOD_EXPR: /* round toward zero */
796 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
800 case FLOOR_MOD_EXPR: /* round toward negative infinity */
801 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
804 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
812 case CEIL_MOD_EXPR: /* round toward positive infinity */
813 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
815 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
823 case ROUND_MOD_EXPR: /* round to closest integer */
825 unsigned HOST_WIDE_INT labs_rem = *lrem;
826 HOST_WIDE_INT habs_rem = *hrem;
827 unsigned HOST_WIDE_INT labs_den = lden, ltwice;
828 HOST_WIDE_INT habs_den = hden, htwice;
830 /* Get absolute values. */
832 neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
834 neg_double (lden, hden, &labs_den, &habs_den);
836 /* If (2 * abs (lrem) >= abs (lden)) */
837 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
838 labs_rem, habs_rem, <wice, &htwice);
840 if (((unsigned HOST_WIDE_INT) habs_den
841 < (unsigned HOST_WIDE_INT) htwice)
842 || (((unsigned HOST_WIDE_INT) habs_den
843 == (unsigned HOST_WIDE_INT) htwice)
844 && (labs_den < ltwice)))
848 add_double (*lquo, *hquo,
849 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
852 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
864 /* Compute true remainder: rem = num - (quo * den) */
865 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
866 neg_double (*lrem, *hrem, lrem, hrem);
867 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
871 /* If ARG2 divides ARG1 with zero remainder, carries out the division
872 of type CODE and returns the quotient.
873 Otherwise returns NULL_TREE. */
876 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
878 unsigned HOST_WIDE_INT int1l, int2l;
879 HOST_WIDE_INT int1h, int2h;
880 unsigned HOST_WIDE_INT quol, reml;
881 HOST_WIDE_INT quoh, remh;
882 tree type = TREE_TYPE (arg1);
883 int uns = TYPE_UNSIGNED (type);
885 int1l = TREE_INT_CST_LOW (arg1);
886 int1h = TREE_INT_CST_HIGH (arg1);
887 /* &obj[0] + -128 really should be compiled as &obj[-8] rather than
888 &obj[some_exotic_number]. */
889 if (POINTER_TYPE_P (type))
892 type = signed_type_for (type);
893 fit_double_type (int1l, int1h, &int1l, &int1h,
897 fit_double_type (int1l, int1h, &int1l, &int1h, type);
898 int2l = TREE_INT_CST_LOW (arg2);
899 int2h = TREE_INT_CST_HIGH (arg2);
901 div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
902 &quol, &quoh, &reml, &remh);
903 if (remh != 0 || reml != 0)
906 return build_int_cst_wide (type, quol, quoh);
909 /* This is nonzero if we should defer warnings about undefined
910 overflow. This facility exists because these warnings are a
911 special case. The code to estimate loop iterations does not want
912 to issue any warnings, since it works with expressions which do not
913 occur in user code. Various bits of cleanup code call fold(), but
914 only use the result if it has certain characteristics (e.g., is a
915 constant); that code only wants to issue a warning if the result is
918 static int fold_deferring_overflow_warnings;
920 /* If a warning about undefined overflow is deferred, this is the
921 warning. Note that this may cause us to turn two warnings into
922 one, but that is fine since it is sufficient to only give one
923 warning per expression. */
925 static const char* fold_deferred_overflow_warning;
927 /* If a warning about undefined overflow is deferred, this is the
928 level at which the warning should be emitted. */
930 static enum warn_strict_overflow_code fold_deferred_overflow_code;
932 /* Start deferring overflow warnings. We could use a stack here to
933 permit nested calls, but at present it is not necessary. */
936 fold_defer_overflow_warnings (void)
938 ++fold_deferring_overflow_warnings;
941 /* Stop deferring overflow warnings. If there is a pending warning,
942 and ISSUE is true, then issue the warning if appropriate. STMT is
943 the statement with which the warning should be associated (used for
944 location information); STMT may be NULL. CODE is the level of the
945 warning--a warn_strict_overflow_code value. This function will use
946 the smaller of CODE and the deferred code when deciding whether to
947 issue the warning. CODE may be zero to mean to always use the
951 fold_undefer_overflow_warnings (bool issue, const_tree stmt, int code)
956 gcc_assert (fold_deferring_overflow_warnings > 0);
957 --fold_deferring_overflow_warnings;
958 if (fold_deferring_overflow_warnings > 0)
960 if (fold_deferred_overflow_warning != NULL
962 && code < (int) fold_deferred_overflow_code)
963 fold_deferred_overflow_code = code;
967 warnmsg = fold_deferred_overflow_warning;
968 fold_deferred_overflow_warning = NULL;
970 if (!issue || warnmsg == NULL)
973 if (stmt != NULL_TREE && TREE_NO_WARNING (stmt))
976 /* Use the smallest code level when deciding to issue the
978 if (code == 0 || code > (int) fold_deferred_overflow_code)
979 code = fold_deferred_overflow_code;
981 if (!issue_strict_overflow_warning (code))
984 if (stmt == NULL_TREE || !expr_has_location (stmt))
985 locus = input_location;
987 locus = expr_location (stmt);
988 warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
991 /* Stop deferring overflow warnings, ignoring any deferred
995 fold_undefer_and_ignore_overflow_warnings (void)
997 fold_undefer_overflow_warnings (false, NULL_TREE, 0);
1000 /* Whether we are deferring overflow warnings. */
1003 fold_deferring_overflow_warnings_p (void)
1005 return fold_deferring_overflow_warnings > 0;
1008 /* This is called when we fold something based on the fact that signed
1009 overflow is undefined. */
1012 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
1014 gcc_assert (!flag_wrapv && !flag_trapv);
1015 if (fold_deferring_overflow_warnings > 0)
1017 if (fold_deferred_overflow_warning == NULL
1018 || wc < fold_deferred_overflow_code)
1020 fold_deferred_overflow_warning = gmsgid;
1021 fold_deferred_overflow_code = wc;
1024 else if (issue_strict_overflow_warning (wc))
1025 warning (OPT_Wstrict_overflow, gmsgid);
1028 /* Return true if the built-in mathematical function specified by CODE
1029 is odd, i.e. -f(x) == f(-x). */
1032 negate_mathfn_p (enum built_in_function code)
1036 CASE_FLT_FN (BUILT_IN_ASIN):
1037 CASE_FLT_FN (BUILT_IN_ASINH):
1038 CASE_FLT_FN (BUILT_IN_ATAN):
1039 CASE_FLT_FN (BUILT_IN_ATANH):
1040 CASE_FLT_FN (BUILT_IN_CASIN):
1041 CASE_FLT_FN (BUILT_IN_CASINH):
1042 CASE_FLT_FN (BUILT_IN_CATAN):
1043 CASE_FLT_FN (BUILT_IN_CATANH):
1044 CASE_FLT_FN (BUILT_IN_CBRT):
1045 CASE_FLT_FN (BUILT_IN_CPROJ):
1046 CASE_FLT_FN (BUILT_IN_CSIN):
1047 CASE_FLT_FN (BUILT_IN_CSINH):
1048 CASE_FLT_FN (BUILT_IN_CTAN):
1049 CASE_FLT_FN (BUILT_IN_CTANH):
1050 CASE_FLT_FN (BUILT_IN_ERF):
1051 CASE_FLT_FN (BUILT_IN_LLROUND):
1052 CASE_FLT_FN (BUILT_IN_LROUND):
1053 CASE_FLT_FN (BUILT_IN_ROUND):
1054 CASE_FLT_FN (BUILT_IN_SIN):
1055 CASE_FLT_FN (BUILT_IN_SINH):
1056 CASE_FLT_FN (BUILT_IN_TAN):
1057 CASE_FLT_FN (BUILT_IN_TANH):
1058 CASE_FLT_FN (BUILT_IN_TRUNC):
1061 CASE_FLT_FN (BUILT_IN_LLRINT):
1062 CASE_FLT_FN (BUILT_IN_LRINT):
1063 CASE_FLT_FN (BUILT_IN_NEARBYINT):
1064 CASE_FLT_FN (BUILT_IN_RINT):
1065 return !flag_rounding_math;
1073 /* Check whether we may negate an integer constant T without causing
1077 may_negate_without_overflow_p (const_tree t)
1079 unsigned HOST_WIDE_INT val;
1083 gcc_assert (TREE_CODE (t) == INTEGER_CST);
1085 type = TREE_TYPE (t);
1086 if (TYPE_UNSIGNED (type))
1089 prec = TYPE_PRECISION (type);
1090 if (prec > HOST_BITS_PER_WIDE_INT)
1092 if (TREE_INT_CST_LOW (t) != 0)
1094 prec -= HOST_BITS_PER_WIDE_INT;
1095 val = TREE_INT_CST_HIGH (t);
1098 val = TREE_INT_CST_LOW (t);
1099 if (prec < HOST_BITS_PER_WIDE_INT)
1100 val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1101 return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1104 /* Determine whether an expression T can be cheaply negated using
1105 the function negate_expr without introducing undefined overflow. */
1108 negate_expr_p (tree t)
1115 type = TREE_TYPE (t);
1117 STRIP_SIGN_NOPS (t);
1118 switch (TREE_CODE (t))
1121 if (TYPE_OVERFLOW_WRAPS (type))
1124 /* Check that -CST will not overflow type. */
1125 return may_negate_without_overflow_p (t);
1127 return (INTEGRAL_TYPE_P (type)
1128 && TYPE_OVERFLOW_WRAPS (type));
1136 return negate_expr_p (TREE_REALPART (t))
1137 && negate_expr_p (TREE_IMAGPART (t));
1140 return negate_expr_p (TREE_OPERAND (t, 0))
1141 && negate_expr_p (TREE_OPERAND (t, 1));
1144 return negate_expr_p (TREE_OPERAND (t, 0));
1147 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1148 || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1150 /* -(A + B) -> (-B) - A. */
1151 if (negate_expr_p (TREE_OPERAND (t, 1))
1152 && reorder_operands_p (TREE_OPERAND (t, 0),
1153 TREE_OPERAND (t, 1)))
1155 /* -(A + B) -> (-A) - B. */
1156 return negate_expr_p (TREE_OPERAND (t, 0));
1159 /* We can't turn -(A-B) into B-A when we honor signed zeros. */
1160 return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1161 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1162 && reorder_operands_p (TREE_OPERAND (t, 0),
1163 TREE_OPERAND (t, 1));
1166 if (TYPE_UNSIGNED (TREE_TYPE (t)))
1172 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1173 return negate_expr_p (TREE_OPERAND (t, 1))
1174 || negate_expr_p (TREE_OPERAND (t, 0));
1177 case TRUNC_DIV_EXPR:
1178 case ROUND_DIV_EXPR:
1179 case FLOOR_DIV_EXPR:
1181 case EXACT_DIV_EXPR:
1182 /* In general we can't negate A / B, because if A is INT_MIN and
1183 B is 1, we may turn this into INT_MIN / -1 which is undefined
1184 and actually traps on some architectures. But if overflow is
1185 undefined, we can negate, because - (INT_MIN / 1) is an
1187 if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1188 && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1190 return negate_expr_p (TREE_OPERAND (t, 1))
1191 || negate_expr_p (TREE_OPERAND (t, 0));
1194 /* Negate -((double)float) as (double)(-float). */
1195 if (TREE_CODE (type) == REAL_TYPE)
1197 tree tem = strip_float_extensions (t);
1199 return negate_expr_p (tem);
1204 /* Negate -f(x) as f(-x). */
1205 if (negate_mathfn_p (builtin_mathfn_code (t)))
1206 return negate_expr_p (CALL_EXPR_ARG (t, 0));
1210 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
1211 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1213 tree op1 = TREE_OPERAND (t, 1);
1214 if (TREE_INT_CST_HIGH (op1) == 0
1215 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1216 == TREE_INT_CST_LOW (op1))
1227 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1228 simplification is possible.
1229 If negate_expr_p would return true for T, NULL_TREE will never be
1233 fold_negate_expr (tree t)
1235 tree type = TREE_TYPE (t);
1238 switch (TREE_CODE (t))
1240 /* Convert - (~A) to A + 1. */
1242 if (INTEGRAL_TYPE_P (type))
1243 return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1244 build_int_cst (type, 1));
1248 tem = fold_negate_const (t, type);
1249 if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
1250 || !TYPE_OVERFLOW_TRAPS (type))
1255 tem = fold_negate_const (t, type);
1256 /* Two's complement FP formats, such as c4x, may overflow. */
1257 if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
1262 tem = fold_negate_const (t, type);
1267 tree rpart = negate_expr (TREE_REALPART (t));
1268 tree ipart = negate_expr (TREE_IMAGPART (t));
1270 if ((TREE_CODE (rpart) == REAL_CST
1271 && TREE_CODE (ipart) == REAL_CST)
1272 || (TREE_CODE (rpart) == INTEGER_CST
1273 && TREE_CODE (ipart) == INTEGER_CST))
1274 return build_complex (type, rpart, ipart);
1279 if (negate_expr_p (t))
1280 return fold_build2 (COMPLEX_EXPR, type,
1281 fold_negate_expr (TREE_OPERAND (t, 0)),
1282 fold_negate_expr (TREE_OPERAND (t, 1)));
1286 if (negate_expr_p (t))
1287 return fold_build1 (CONJ_EXPR, type,
1288 fold_negate_expr (TREE_OPERAND (t, 0)));
1292 return TREE_OPERAND (t, 0);
1295 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1296 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
1298 /* -(A + B) -> (-B) - A. */
1299 if (negate_expr_p (TREE_OPERAND (t, 1))
1300 && reorder_operands_p (TREE_OPERAND (t, 0),
1301 TREE_OPERAND (t, 1)))
1303 tem = negate_expr (TREE_OPERAND (t, 1));
1304 return fold_build2 (MINUS_EXPR, type,
1305 tem, TREE_OPERAND (t, 0));
1308 /* -(A + B) -> (-A) - B. */
1309 if (negate_expr_p (TREE_OPERAND (t, 0)))
1311 tem = negate_expr (TREE_OPERAND (t, 0));
1312 return fold_build2 (MINUS_EXPR, type,
1313 tem, TREE_OPERAND (t, 1));
1319 /* - (A - B) -> B - A */
1320 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
1321 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
1322 && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1323 return fold_build2 (MINUS_EXPR, type,
1324 TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1328 if (TYPE_UNSIGNED (type))
1334 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1336 tem = TREE_OPERAND (t, 1);
1337 if (negate_expr_p (tem))
1338 return fold_build2 (TREE_CODE (t), type,
1339 TREE_OPERAND (t, 0), negate_expr (tem));
1340 tem = TREE_OPERAND (t, 0);
1341 if (negate_expr_p (tem))
1342 return fold_build2 (TREE_CODE (t), type,
1343 negate_expr (tem), TREE_OPERAND (t, 1));
1347 case TRUNC_DIV_EXPR:
1348 case ROUND_DIV_EXPR:
1349 case FLOOR_DIV_EXPR:
1351 case EXACT_DIV_EXPR:
1352 /* In general we can't negate A / B, because if A is INT_MIN and
1353 B is 1, we may turn this into INT_MIN / -1 which is undefined
1354 and actually traps on some architectures. But if overflow is
1355 undefined, we can negate, because - (INT_MIN / 1) is an
1357 if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1359 const char * const warnmsg = G_("assuming signed overflow does not "
1360 "occur when negating a division");
1361 tem = TREE_OPERAND (t, 1);
1362 if (negate_expr_p (tem))
1364 if (INTEGRAL_TYPE_P (type)
1365 && (TREE_CODE (tem) != INTEGER_CST
1366 || integer_onep (tem)))
1367 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1368 return fold_build2 (TREE_CODE (t), type,
1369 TREE_OPERAND (t, 0), negate_expr (tem));
1371 tem = TREE_OPERAND (t, 0);
1372 if (negate_expr_p (tem))
1374 if (INTEGRAL_TYPE_P (type)
1375 && (TREE_CODE (tem) != INTEGER_CST
1376 || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1377 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1378 return fold_build2 (TREE_CODE (t), type,
1379 negate_expr (tem), TREE_OPERAND (t, 1));
1385 /* Convert -((double)float) into (double)(-float). */
1386 if (TREE_CODE (type) == REAL_TYPE)
1388 tem = strip_float_extensions (t);
1389 if (tem != t && negate_expr_p (tem))
1390 return fold_convert (type, negate_expr (tem));
1395 /* Negate -f(x) as f(-x). */
1396 if (negate_mathfn_p (builtin_mathfn_code (t))
1397 && negate_expr_p (CALL_EXPR_ARG (t, 0)))
1401 fndecl = get_callee_fndecl (t);
1402 arg = negate_expr (CALL_EXPR_ARG (t, 0));
1403 return build_call_expr (fndecl, 1, arg);
1408 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
1409 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1411 tree op1 = TREE_OPERAND (t, 1);
1412 if (TREE_INT_CST_HIGH (op1) == 0
1413 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1414 == TREE_INT_CST_LOW (op1))
1416 tree ntype = TYPE_UNSIGNED (type)
1417 ? signed_type_for (type)
1418 : unsigned_type_for (type);
1419 tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1420 temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1421 return fold_convert (type, temp);
1433 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1434 negated in a simpler way. Also allow for T to be NULL_TREE, in which case
1435 return NULL_TREE. */
1438 negate_expr (tree t)
1445 type = TREE_TYPE (t);
1446 STRIP_SIGN_NOPS (t);
1448 tem = fold_negate_expr (t);
1450 tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1451 return fold_convert (type, tem);
1454 /* Split a tree IN into a constant, literal and variable parts that could be
1455 combined with CODE to make IN. "constant" means an expression with
1456 TREE_CONSTANT but that isn't an actual constant. CODE must be a
1457 commutative arithmetic operation. Store the constant part into *CONP,
1458 the literal in *LITP and return the variable part. If a part isn't
1459 present, set it to null. If the tree does not decompose in this way,
1460 return the entire tree as the variable part and the other parts as null.
1462 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that
1463 case, we negate an operand that was subtracted. Except if it is a
1464 literal for which we use *MINUS_LITP instead.
1466 If NEGATE_P is true, we are negating all of IN, again except a literal
1467 for which we use *MINUS_LITP instead.
1469 If IN is itself a literal or constant, return it as appropriate.
1471 Note that we do not guarantee that any of the three values will be the
1472 same type as IN, but they will have the same signedness and mode. */
1475 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1476 tree *minus_litp, int negate_p)
1484 /* Strip any conversions that don't change the machine mode or signedness. */
1485 STRIP_SIGN_NOPS (in);
1487 if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
1488 || TREE_CODE (in) == FIXED_CST)
1490 else if (TREE_CODE (in) == code
1491 || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
1492 && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
1493 /* We can associate addition and subtraction together (even
1494 though the C standard doesn't say so) for integers because
1495 the value is not affected. For reals, the value might be
1496 affected, so we can't. */
1497 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1498 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1500 tree op0 = TREE_OPERAND (in, 0);
1501 tree op1 = TREE_OPERAND (in, 1);
1502 int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1503 int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1505 /* First see if either of the operands is a literal, then a constant. */
1506 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
1507 || TREE_CODE (op0) == FIXED_CST)
1508 *litp = op0, op0 = 0;
1509 else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
1510 || TREE_CODE (op1) == FIXED_CST)
1511 *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1513 if (op0 != 0 && TREE_CONSTANT (op0))
1514 *conp = op0, op0 = 0;
1515 else if (op1 != 0 && TREE_CONSTANT (op1))
1516 *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1518 /* If we haven't dealt with either operand, this is not a case we can
1519 decompose. Otherwise, VAR is either of the ones remaining, if any. */
1520 if (op0 != 0 && op1 != 0)
1525 var = op1, neg_var_p = neg1_p;
1527 /* Now do any needed negations. */
1529 *minus_litp = *litp, *litp = 0;
1531 *conp = negate_expr (*conp);
1533 var = negate_expr (var);
1535 else if (TREE_CONSTANT (in))
1543 *minus_litp = *litp, *litp = 0;
1544 else if (*minus_litp)
1545 *litp = *minus_litp, *minus_litp = 0;
1546 *conp = negate_expr (*conp);
1547 var = negate_expr (var);
1553 /* Re-associate trees split by the above function. T1 and T2 are either
1554 expressions to associate or null. Return the new expression, if any. If
1555 we build an operation, do it in TYPE and with CODE. */
1558 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1565 /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1566 try to fold this since we will have infinite recursion. But do
1567 deal with any NEGATE_EXPRs. */
1568 if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1569 || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1571 if (code == PLUS_EXPR)
1573 if (TREE_CODE (t1) == NEGATE_EXPR)
1574 return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1575 fold_convert (type, TREE_OPERAND (t1, 0)));
1576 else if (TREE_CODE (t2) == NEGATE_EXPR)
1577 return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1578 fold_convert (type, TREE_OPERAND (t2, 0)));
1579 else if (integer_zerop (t2))
1580 return fold_convert (type, t1);
1582 else if (code == MINUS_EXPR)
1584 if (integer_zerop (t2))
1585 return fold_convert (type, t1);
1588 return build2 (code, type, fold_convert (type, t1),
1589 fold_convert (type, t2));
1592 return fold_build2 (code, type, fold_convert (type, t1),
1593 fold_convert (type, t2));
1596 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
1597 for use in int_const_binop, size_binop and size_diffop. */
1600 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
1602 if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
1604 if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
1619 return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1620 && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1621 && TYPE_MODE (type1) == TYPE_MODE (type2);
1625 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1626 to produce a new constant. Return NULL_TREE if we don't know how
1627 to evaluate CODE at compile-time.
1629 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1632 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, int notrunc)
1634 unsigned HOST_WIDE_INT int1l, int2l;
1635 HOST_WIDE_INT int1h, int2h;
1636 unsigned HOST_WIDE_INT low;
1638 unsigned HOST_WIDE_INT garbagel;
1639 HOST_WIDE_INT garbageh;
1641 tree type = TREE_TYPE (arg1);
1642 int uns = TYPE_UNSIGNED (type);
1644 = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1647 int1l = TREE_INT_CST_LOW (arg1);
1648 int1h = TREE_INT_CST_HIGH (arg1);
1649 int2l = TREE_INT_CST_LOW (arg2);
1650 int2h = TREE_INT_CST_HIGH (arg2);
1655 low = int1l | int2l, hi = int1h | int2h;
1659 low = int1l ^ int2l, hi = int1h ^ int2h;
1663 low = int1l & int2l, hi = int1h & int2h;
1669 /* It's unclear from the C standard whether shifts can overflow.
1670 The following code ignores overflow; perhaps a C standard
1671 interpretation ruling is needed. */
1672 lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1679 lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1684 overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1688 neg_double (int2l, int2h, &low, &hi);
1689 add_double (int1l, int1h, low, hi, &low, &hi);
1690 overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1694 overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1697 case TRUNC_DIV_EXPR:
1698 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1699 case EXACT_DIV_EXPR:
1700 /* This is a shortcut for a common special case. */
1701 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1702 && !TREE_OVERFLOW (arg1)
1703 && !TREE_OVERFLOW (arg2)
1704 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1706 if (code == CEIL_DIV_EXPR)
1709 low = int1l / int2l, hi = 0;
1713 /* ... fall through ... */
1715 case ROUND_DIV_EXPR:
1716 if (int2h == 0 && int2l == 0)
1718 if (int2h == 0 && int2l == 1)
1720 low = int1l, hi = int1h;
1723 if (int1l == int2l && int1h == int2h
1724 && ! (int1l == 0 && int1h == 0))
1729 overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1730 &low, &hi, &garbagel, &garbageh);
1733 case TRUNC_MOD_EXPR:
1734 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1735 /* This is a shortcut for a common special case. */
1736 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1737 && !TREE_OVERFLOW (arg1)
1738 && !TREE_OVERFLOW (arg2)
1739 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1741 if (code == CEIL_MOD_EXPR)
1743 low = int1l % int2l, hi = 0;
1747 /* ... fall through ... */
1749 case ROUND_MOD_EXPR:
1750 if (int2h == 0 && int2l == 0)
1752 overflow = div_and_round_double (code, uns,
1753 int1l, int1h, int2l, int2h,
1754 &garbagel, &garbageh, &low, &hi);
1760 low = (((unsigned HOST_WIDE_INT) int1h
1761 < (unsigned HOST_WIDE_INT) int2h)
1762 || (((unsigned HOST_WIDE_INT) int1h
1763 == (unsigned HOST_WIDE_INT) int2h)
1766 low = (int1h < int2h
1767 || (int1h == int2h && int1l < int2l));
1769 if (low == (code == MIN_EXPR))
1770 low = int1l, hi = int1h;
1772 low = int2l, hi = int2h;
1781 t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1783 /* Propagate overflow flags ourselves. */
1784 if (((!uns || is_sizetype) && overflow)
1785 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1788 TREE_OVERFLOW (t) = 1;
1792 t = force_fit_type_double (TREE_TYPE (arg1), low, hi, 1,
1793 ((!uns || is_sizetype) && overflow)
1794 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1799 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1800 constant. We assume ARG1 and ARG2 have the same data type, or at least
1801 are the same kind of constant and the same machine mode. Return zero if
1802 combining the constants is not allowed in the current operating mode.
1804 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1807 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1809 /* Sanity check for the recursive cases. */
1816 if (TREE_CODE (arg1) == INTEGER_CST)
1817 return int_const_binop (code, arg1, arg2, notrunc);
1819 if (TREE_CODE (arg1) == REAL_CST)
1821 enum machine_mode mode;
1824 REAL_VALUE_TYPE value;
1825 REAL_VALUE_TYPE result;
1829 /* The following codes are handled by real_arithmetic. */
1844 d1 = TREE_REAL_CST (arg1);
1845 d2 = TREE_REAL_CST (arg2);
1847 type = TREE_TYPE (arg1);
1848 mode = TYPE_MODE (type);
1850 /* Don't perform operation if we honor signaling NaNs and
1851 either operand is a NaN. */
1852 if (HONOR_SNANS (mode)
1853 && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1856 /* Don't perform operation if it would raise a division
1857 by zero exception. */
1858 if (code == RDIV_EXPR
1859 && REAL_VALUES_EQUAL (d2, dconst0)
1860 && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1863 /* If either operand is a NaN, just return it. Otherwise, set up
1864 for floating-point trap; we return an overflow. */
1865 if (REAL_VALUE_ISNAN (d1))
1867 else if (REAL_VALUE_ISNAN (d2))
1870 inexact = real_arithmetic (&value, code, &d1, &d2);
1871 real_convert (&result, mode, &value);
1873 /* Don't constant fold this floating point operation if
1874 the result has overflowed and flag_trapping_math. */
1875 if (flag_trapping_math
1876 && MODE_HAS_INFINITIES (mode)
1877 && REAL_VALUE_ISINF (result)
1878 && !REAL_VALUE_ISINF (d1)
1879 && !REAL_VALUE_ISINF (d2))
1882 /* Don't constant fold this floating point operation if the
1883 result may dependent upon the run-time rounding mode and
1884 flag_rounding_math is set, or if GCC's software emulation
1885 is unable to accurately represent the result. */
1886 if ((flag_rounding_math
1887 || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1888 && !flag_unsafe_math_optimizations))
1889 && (inexact || !real_identical (&result, &value)))
1892 t = build_real (type, result);
1894 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1898 if (TREE_CODE (arg1) == FIXED_CST)
1900 FIXED_VALUE_TYPE f1;
1901 FIXED_VALUE_TYPE f2;
1902 FIXED_VALUE_TYPE result;
1907 /* The following codes are handled by fixed_arithmetic. */
1913 case TRUNC_DIV_EXPR:
1914 f2 = TREE_FIXED_CST (arg2);
1919 f2.data.high = TREE_INT_CST_HIGH (arg2);
1920 f2.data.low = TREE_INT_CST_LOW (arg2);
1928 f1 = TREE_FIXED_CST (arg1);
1929 type = TREE_TYPE (arg1);
1930 sat_p = TYPE_SATURATING (type);
1931 overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1932 t = build_fixed (type, result);
1933 /* Propagate overflow flags. */
1934 if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1936 TREE_OVERFLOW (t) = 1;
1937 TREE_CONSTANT_OVERFLOW (t) = 1;
1939 else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1940 TREE_CONSTANT_OVERFLOW (t) = 1;
1944 if (TREE_CODE (arg1) == COMPLEX_CST)
1946 tree type = TREE_TYPE (arg1);
1947 tree r1 = TREE_REALPART (arg1);
1948 tree i1 = TREE_IMAGPART (arg1);
1949 tree r2 = TREE_REALPART (arg2);
1950 tree i2 = TREE_IMAGPART (arg2);
1957 real = const_binop (code, r1, r2, notrunc);
1958 imag = const_binop (code, i1, i2, notrunc);
1962 real = const_binop (MINUS_EXPR,
1963 const_binop (MULT_EXPR, r1, r2, notrunc),
1964 const_binop (MULT_EXPR, i1, i2, notrunc),
1966 imag = const_binop (PLUS_EXPR,
1967 const_binop (MULT_EXPR, r1, i2, notrunc),
1968 const_binop (MULT_EXPR, i1, r2, notrunc),
1975 = const_binop (PLUS_EXPR,
1976 const_binop (MULT_EXPR, r2, r2, notrunc),
1977 const_binop (MULT_EXPR, i2, i2, notrunc),
1980 = const_binop (PLUS_EXPR,
1981 const_binop (MULT_EXPR, r1, r2, notrunc),
1982 const_binop (MULT_EXPR, i1, i2, notrunc),
1985 = const_binop (MINUS_EXPR,
1986 const_binop (MULT_EXPR, i1, r2, notrunc),
1987 const_binop (MULT_EXPR, r1, i2, notrunc),
1990 if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1991 code = TRUNC_DIV_EXPR;
1993 real = const_binop (code, t1, magsquared, notrunc);
1994 imag = const_binop (code, t2, magsquared, notrunc);
2003 return build_complex (type, real, imag);
2009 /* Create a size type INT_CST node with NUMBER sign extended. KIND
2010 indicates which particular sizetype to create. */
2013 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
2015 return build_int_cst (sizetype_tab[(int) kind], number);
2018 /* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE
2019 is a tree code. The type of the result is taken from the operands.
2020 Both must be equivalent integer types, ala int_binop_types_match_p.
2021 If the operands are constant, so is the result. */
2024 size_binop (enum tree_code code, tree arg0, tree arg1)
2026 tree type = TREE_TYPE (arg0);
2028 if (arg0 == error_mark_node || arg1 == error_mark_node)
2029 return error_mark_node;
2031 gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
2034 /* Handle the special case of two integer constants faster. */
2035 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2037 /* And some specific cases even faster than that. */
2038 if (code == PLUS_EXPR)
2040 if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
2042 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2045 else if (code == MINUS_EXPR)
2047 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
2050 else if (code == MULT_EXPR)
2052 if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
2056 /* Handle general case of two integer constants. */
2057 return int_const_binop (code, arg0, arg1, 0);
2060 return fold_build2 (code, type, arg0, arg1);
2063 /* Given two values, either both of sizetype or both of bitsizetype,
2064 compute the difference between the two values. Return the value
2065 in signed type corresponding to the type of the operands. */
2068 size_diffop (tree arg0, tree arg1)
2070 tree type = TREE_TYPE (arg0);
2073 gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
2076 /* If the type is already signed, just do the simple thing. */
2077 if (!TYPE_UNSIGNED (type))
2078 return size_binop (MINUS_EXPR, arg0, arg1);
2080 if (type == sizetype)
2082 else if (type == bitsizetype)
2083 ctype = sbitsizetype;
2085 ctype = signed_type_for (type);
2087 /* If either operand is not a constant, do the conversions to the signed
2088 type and subtract. The hardware will do the right thing with any
2089 overflow in the subtraction. */
2090 if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
2091 return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
2092 fold_convert (ctype, arg1));
2094 /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
2095 Otherwise, subtract the other way, convert to CTYPE (we know that can't
2096 overflow) and negate (which can't either). Special-case a result
2097 of zero while we're here. */
2098 if (tree_int_cst_equal (arg0, arg1))
2099 return build_int_cst (ctype, 0);
2100 else if (tree_int_cst_lt (arg1, arg0))
2101 return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
2103 return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
2104 fold_convert (ctype, size_binop (MINUS_EXPR,
2108 /* A subroutine of fold_convert_const handling conversions of an
2109 INTEGER_CST to another integer type. */
2112 fold_convert_const_int_from_int (tree type, const_tree arg1)
2116 /* Given an integer constant, make new constant with new type,
2117 appropriately sign-extended or truncated. */
2118 t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1),
2119 TREE_INT_CST_HIGH (arg1),
2120 /* Don't set the overflow when
2121 converting from a pointer, */
2122 !POINTER_TYPE_P (TREE_TYPE (arg1))
2123 /* or to a sizetype with same signedness
2124 and the precision is unchanged.
2125 ??? sizetype is always sign-extended,
2126 but its signedness depends on the
2127 frontend. Thus we see spurious overflows
2128 here if we do not check this. */
2129 && !((TYPE_PRECISION (TREE_TYPE (arg1))
2130 == TYPE_PRECISION (type))
2131 && (TYPE_UNSIGNED (TREE_TYPE (arg1))
2132 == TYPE_UNSIGNED (type))
2133 && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
2134 && TYPE_IS_SIZETYPE (TREE_TYPE (arg1)))
2135 || (TREE_CODE (type) == INTEGER_TYPE
2136 && TYPE_IS_SIZETYPE (type)))),
2137 (TREE_INT_CST_HIGH (arg1) < 0
2138 && (TYPE_UNSIGNED (type)
2139 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2140 | TREE_OVERFLOW (arg1));
2145 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2146 to an integer type. */
2149 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
2154 /* The following code implements the floating point to integer
2155 conversion rules required by the Java Language Specification,
2156 that IEEE NaNs are mapped to zero and values that overflow
2157 the target precision saturate, i.e. values greater than
2158 INT_MAX are mapped to INT_MAX, and values less than INT_MIN
2159 are mapped to INT_MIN. These semantics are allowed by the
2160 C and C++ standards that simply state that the behavior of
2161 FP-to-integer conversion is unspecified upon overflow. */
2163 HOST_WIDE_INT high, low;
2165 REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
2169 case FIX_TRUNC_EXPR:
2170 real_trunc (&r, VOIDmode, &x);
2177 /* If R is NaN, return zero and show we have an overflow. */
2178 if (REAL_VALUE_ISNAN (r))
2185 /* See if R is less than the lower bound or greater than the
2190 tree lt = TYPE_MIN_VALUE (type);
2191 REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2192 if (REAL_VALUES_LESS (r, l))
2195 high = TREE_INT_CST_HIGH (lt);
2196 low = TREE_INT_CST_LOW (lt);
2202 tree ut = TYPE_MAX_VALUE (type);
2205 REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2206 if (REAL_VALUES_LESS (u, r))
2209 high = TREE_INT_CST_HIGH (ut);
2210 low = TREE_INT_CST_LOW (ut);
2216 REAL_VALUE_TO_INT (&low, &high, r);
2218 t = force_fit_type_double (type, low, high, -1,
2219 overflow | TREE_OVERFLOW (arg1));
2223 /* A subroutine of fold_convert_const handling conversions of a
2224 FIXED_CST to an integer type. */
2227 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
2230 double_int temp, temp_trunc;
2233 /* Right shift FIXED_CST to temp by fbit. */
2234 temp = TREE_FIXED_CST (arg1).data;
2235 mode = TREE_FIXED_CST (arg1).mode;
2236 if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
2238 lshift_double (temp.low, temp.high,
2239 - GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2240 &temp.low, &temp.high, SIGNED_FIXED_POINT_MODE_P (mode));
2242 /* Left shift temp to temp_trunc by fbit. */
2243 lshift_double (temp.low, temp.high,
2244 GET_MODE_FBIT (mode), 2 * HOST_BITS_PER_WIDE_INT,
2245 &temp_trunc.low, &temp_trunc.high,
2246 SIGNED_FIXED_POINT_MODE_P (mode));
2253 temp_trunc.high = 0;
2256 /* If FIXED_CST is negative, we need to round the value toward 0.
2257 By checking if the fractional bits are not zero to add 1 to temp. */
2258 if (SIGNED_FIXED_POINT_MODE_P (mode) && temp_trunc.high < 0
2259 && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
2264 temp = double_int_add (temp, one);
2267 /* Given a fixed-point constant, make new constant with new type,
2268 appropriately sign-extended or truncated. */
2269 t = force_fit_type_double (type, temp.low, temp.high, -1,
2271 && (TYPE_UNSIGNED (type)
2272 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2273 | TREE_OVERFLOW (arg1));
2278 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2279 to another floating point type. */
2282 fold_convert_const_real_from_real (tree type, const_tree arg1)
2284 REAL_VALUE_TYPE value;
2287 real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2288 t = build_real (type, value);
2290 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2294 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2295 to a floating point type. */
2298 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2300 REAL_VALUE_TYPE value;
2303 real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2304 t = build_real (type, value);
2306 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2307 TREE_CONSTANT_OVERFLOW (t)
2308 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
2312 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2313 to another fixed-point type. */
2316 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2318 FIXED_VALUE_TYPE value;
2322 overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2323 TYPE_SATURATING (type));
2324 t = build_fixed (type, value);
2326 /* Propagate overflow flags. */
2327 if (overflow_p | TREE_OVERFLOW (arg1))
2329 TREE_OVERFLOW (t) = 1;
2330 TREE_CONSTANT_OVERFLOW (t) = 1;
2332 else if (TREE_CONSTANT_OVERFLOW (arg1))
2333 TREE_CONSTANT_OVERFLOW (t) = 1;
2337 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2338 to a fixed-point type. */
2341 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2343 FIXED_VALUE_TYPE value;
2347 overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
2348 TREE_INT_CST (arg1),
2349 TYPE_UNSIGNED (TREE_TYPE (arg1)),
2350 TYPE_SATURATING (type));
2351 t = build_fixed (type, value);
2353 /* Propagate overflow flags. */
2354 if (overflow_p | TREE_OVERFLOW (arg1))
2356 TREE_OVERFLOW (t) = 1;
2357 TREE_CONSTANT_OVERFLOW (t) = 1;
2359 else if (TREE_CONSTANT_OVERFLOW (arg1))
2360 TREE_CONSTANT_OVERFLOW (t) = 1;
2364 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2365 to a fixed-point type. */
2368 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2370 FIXED_VALUE_TYPE value;
2374 overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2375 &TREE_REAL_CST (arg1),
2376 TYPE_SATURATING (type));
2377 t = build_fixed (type, value);
2379 /* Propagate overflow flags. */
2380 if (overflow_p | TREE_OVERFLOW (arg1))
2382 TREE_OVERFLOW (t) = 1;
2383 TREE_CONSTANT_OVERFLOW (t) = 1;
2385 else if (TREE_CONSTANT_OVERFLOW (arg1))
2386 TREE_CONSTANT_OVERFLOW (t) = 1;
2390 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2391 type TYPE. If no simplification can be done return NULL_TREE. */
2394 fold_convert_const (enum tree_code code, tree type, tree arg1)
2396 if (TREE_TYPE (arg1) == type)
2399 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2401 if (TREE_CODE (arg1) == INTEGER_CST)
2402 return fold_convert_const_int_from_int (type, arg1);
2403 else if (TREE_CODE (arg1) == REAL_CST)
2404 return fold_convert_const_int_from_real (code, type, arg1);
2405 else if (TREE_CODE (arg1) == FIXED_CST)
2406 return fold_convert_const_int_from_fixed (type, arg1);
2408 else if (TREE_CODE (type) == REAL_TYPE)
2410 if (TREE_CODE (arg1) == INTEGER_CST)
2411 return build_real_from_int_cst (type, arg1);
2412 else if (TREE_CODE (arg1) == REAL_CST)
2413 return fold_convert_const_real_from_real (type, arg1);
2414 else if (TREE_CODE (arg1) == FIXED_CST)
2415 return fold_convert_const_real_from_fixed (type, arg1);
2417 else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2419 if (TREE_CODE (arg1) == FIXED_CST)
2420 return fold_convert_const_fixed_from_fixed (type, arg1);
2421 else if (TREE_CODE (arg1) == INTEGER_CST)
2422 return fold_convert_const_fixed_from_int (type, arg1);
2423 else if (TREE_CODE (arg1) == REAL_CST)
2424 return fold_convert_const_fixed_from_real (type, arg1);
2429 /* Construct a vector of zero elements of vector type TYPE. */
2432 build_zero_vector (tree type)
2437 elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2438 units = TYPE_VECTOR_SUBPARTS (type);
2441 for (i = 0; i < units; i++)
2442 list = tree_cons (NULL_TREE, elem, list);
2443 return build_vector (type, list);
2446 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR. */
2449 fold_convertible_p (const_tree type, const_tree arg)
2451 tree orig = TREE_TYPE (arg);
2456 if (TREE_CODE (arg) == ERROR_MARK
2457 || TREE_CODE (type) == ERROR_MARK
2458 || TREE_CODE (orig) == ERROR_MARK)
2461 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2464 switch (TREE_CODE (type))
2466 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2467 case POINTER_TYPE: case REFERENCE_TYPE:
2469 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2470 || TREE_CODE (orig) == OFFSET_TYPE)
2472 return (TREE_CODE (orig) == VECTOR_TYPE
2473 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2476 case FIXED_POINT_TYPE:
2480 return TREE_CODE (type) == TREE_CODE (orig);
2487 /* Convert expression ARG to type TYPE. Used by the middle-end for
2488 simple conversions in preference to calling the front-end's convert. */
2491 fold_convert (tree type, tree arg)
2493 tree orig = TREE_TYPE (arg);
2499 if (TREE_CODE (arg) == ERROR_MARK
2500 || TREE_CODE (type) == ERROR_MARK
2501 || TREE_CODE (orig) == ERROR_MARK)
2502 return error_mark_node;
2504 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2505 return fold_build1 (NOP_EXPR, type, arg);
2507 switch (TREE_CODE (type))
2509 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2510 case POINTER_TYPE: case REFERENCE_TYPE:
2512 if (TREE_CODE (arg) == INTEGER_CST)
2514 tem = fold_convert_const (NOP_EXPR, type, arg);
2515 if (tem != NULL_TREE)
2518 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2519 || TREE_CODE (orig) == OFFSET_TYPE)
2520 return fold_build1 (NOP_EXPR, type, arg);
2521 if (TREE_CODE (orig) == COMPLEX_TYPE)
2523 tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2524 return fold_convert (type, tem);
2526 gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2527 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2528 return fold_build1 (NOP_EXPR, type, arg);
2531 if (TREE_CODE (arg) == INTEGER_CST)
2533 tem = fold_convert_const (FLOAT_EXPR, type, arg);
2534 if (tem != NULL_TREE)
2537 else if (TREE_CODE (arg) == REAL_CST)
2539 tem = fold_convert_const (NOP_EXPR, type, arg);
2540 if (tem != NULL_TREE)
2543 else if (TREE_CODE (arg) == FIXED_CST)
2545 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2546 if (tem != NULL_TREE)
2550 switch (TREE_CODE (orig))
2553 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2554 case POINTER_TYPE: case REFERENCE_TYPE:
2555 return fold_build1 (FLOAT_EXPR, type, arg);
2558 return fold_build1 (NOP_EXPR, type, arg);
2560 case FIXED_POINT_TYPE:
2561 return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2564 tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2565 return fold_convert (type, tem);
2571 case FIXED_POINT_TYPE:
2572 if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2573 || TREE_CODE (arg) == REAL_CST)
2575 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2576 if (tem != NULL_TREE)
2580 switch (TREE_CODE (orig))
2582 case FIXED_POINT_TYPE:
2587 return fold_build1 (FIXED_CONVERT_EXPR, type, arg);
2590 tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2591 return fold_convert (type, tem);
2598 switch (TREE_CODE (orig))
2601 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2602 case POINTER_TYPE: case REFERENCE_TYPE:
2604 case FIXED_POINT_TYPE:
2605 return build2 (COMPLEX_EXPR, type,
2606 fold_convert (TREE_TYPE (type), arg),
2607 fold_convert (TREE_TYPE (type), integer_zero_node));
2612 if (TREE_CODE (arg) == COMPLEX_EXPR)
2614 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2615 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2616 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2619 arg = save_expr (arg);
2620 rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2621 ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2622 rpart = fold_convert (TREE_TYPE (type), rpart);
2623 ipart = fold_convert (TREE_TYPE (type), ipart);
2624 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2632 if (integer_zerop (arg))
2633 return build_zero_vector (type);
2634 gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2635 gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2636 || TREE_CODE (orig) == VECTOR_TYPE);
2637 return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2640 tem = fold_ignored_result (arg);
2641 if (TREE_CODE (tem) == GIMPLE_MODIFY_STMT)
2643 return fold_build1 (NOP_EXPR, type, tem);
2650 /* Return false if expr can be assumed not to be an lvalue, true
2654 maybe_lvalue_p (const_tree x)
2656 /* We only need to wrap lvalue tree codes. */
2657 switch (TREE_CODE (x))
2668 case ALIGN_INDIRECT_REF:
2669 case MISALIGNED_INDIRECT_REF:
2671 case ARRAY_RANGE_REF:
2677 case PREINCREMENT_EXPR:
2678 case PREDECREMENT_EXPR:
2680 case TRY_CATCH_EXPR:
2681 case WITH_CLEANUP_EXPR:
2684 case GIMPLE_MODIFY_STMT:
2693 /* Assume the worst for front-end tree codes. */
2694 if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2702 /* Return an expr equal to X but certainly not valid as an lvalue. */
2707 /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2712 if (! maybe_lvalue_p (x))
2714 return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2717 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2718 Zero means allow extended lvalues. */
2720 int pedantic_lvalues;
2722 /* When pedantic, return an expr equal to X but certainly not valid as a
2723 pedantic lvalue. Otherwise, return X. */
2726 pedantic_non_lvalue (tree x)
2728 if (pedantic_lvalues)
2729 return non_lvalue (x);
2734 /* Given a tree comparison code, return the code that is the logical inverse
2735 of the given code. It is not safe to do this for floating-point
2736 comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2737 as well: if reversing the comparison is unsafe, return ERROR_MARK. */
2740 invert_tree_comparison (enum tree_code code, bool honor_nans)
2742 if (honor_nans && flag_trapping_math)
2752 return honor_nans ? UNLE_EXPR : LE_EXPR;
2754 return honor_nans ? UNLT_EXPR : LT_EXPR;
2756 return honor_nans ? UNGE_EXPR : GE_EXPR;
2758 return honor_nans ? UNGT_EXPR : GT_EXPR;
2772 return UNORDERED_EXPR;
2773 case UNORDERED_EXPR:
2774 return ORDERED_EXPR;
2780 /* Similar, but return the comparison that results if the operands are
2781 swapped. This is safe for floating-point. */
2784 swap_tree_comparison (enum tree_code code)
2791 case UNORDERED_EXPR:
2817 /* Convert a comparison tree code from an enum tree_code representation
2818 into a compcode bit-based encoding. This function is the inverse of
2819 compcode_to_comparison. */
2821 static enum comparison_code
2822 comparison_to_compcode (enum tree_code code)
2839 return COMPCODE_ORD;
2840 case UNORDERED_EXPR:
2841 return COMPCODE_UNORD;
2843 return COMPCODE_UNLT;
2845 return COMPCODE_UNEQ;
2847 return COMPCODE_UNLE;
2849 return COMPCODE_UNGT;
2851 return COMPCODE_LTGT;
2853 return COMPCODE_UNGE;
2859 /* Convert a compcode bit-based encoding of a comparison operator back
2860 to GCC's enum tree_code representation. This function is the
2861 inverse of comparison_to_compcode. */
2863 static enum tree_code
2864 compcode_to_comparison (enum comparison_code code)
2881 return ORDERED_EXPR;
2882 case COMPCODE_UNORD:
2883 return UNORDERED_EXPR;
2901 /* Return a tree for the comparison which is the combination of
2902 doing the AND or OR (depending on CODE) of the two operations LCODE
2903 and RCODE on the identical operands LL_ARG and LR_ARG. Take into account
2904 the possibility of trapping if the mode has NaNs, and return NULL_TREE
2905 if this makes the transformation invalid. */
2908 combine_comparisons (enum tree_code code, enum tree_code lcode,
2909 enum tree_code rcode, tree truth_type,
2910 tree ll_arg, tree lr_arg)
2912 bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2913 enum comparison_code lcompcode = comparison_to_compcode (lcode);
2914 enum comparison_code rcompcode = comparison_to_compcode (rcode);
2915 enum comparison_code compcode;
2919 case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2920 compcode = lcompcode & rcompcode;
2923 case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2924 compcode = lcompcode | rcompcode;
2933 /* Eliminate unordered comparisons, as well as LTGT and ORD
2934 which are not used unless the mode has NaNs. */
2935 compcode &= ~COMPCODE_UNORD;
2936 if (compcode == COMPCODE_LTGT)
2937 compcode = COMPCODE_NE;
2938 else if (compcode == COMPCODE_ORD)
2939 compcode = COMPCODE_TRUE;
2941 else if (flag_trapping_math)
2943 /* Check that the original operation and the optimized ones will trap
2944 under the same condition. */
2945 bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2946 && (lcompcode != COMPCODE_EQ)
2947 && (lcompcode != COMPCODE_ORD);
2948 bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2949 && (rcompcode != COMPCODE_EQ)
2950 && (rcompcode != COMPCODE_ORD);
2951 bool trap = (compcode & COMPCODE_UNORD) == 0
2952 && (compcode != COMPCODE_EQ)
2953 && (compcode != COMPCODE_ORD);
2955 /* In a short-circuited boolean expression the LHS might be
2956 such that the RHS, if evaluated, will never trap. For
2957 example, in ORD (x, y) && (x < y), we evaluate the RHS only
2958 if neither x nor y is NaN. (This is a mixed blessing: for
2959 example, the expression above will never trap, hence
2960 optimizing it to x < y would be invalid). */
2961 if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2962 || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2965 /* If the comparison was short-circuited, and only the RHS
2966 trapped, we may now generate a spurious trap. */
2968 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2971 /* If we changed the conditions that cause a trap, we lose. */
2972 if ((ltrap || rtrap) != trap)
2976 if (compcode == COMPCODE_TRUE)
2977 return constant_boolean_node (true, truth_type);
2978 else if (compcode == COMPCODE_FALSE)
2979 return constant_boolean_node (false, truth_type);
2981 return fold_build2 (compcode_to_comparison (compcode),
2982 truth_type, ll_arg, lr_arg);
2985 /* Return nonzero if CODE is a tree code that represents a truth value. */
2988 truth_value_p (enum tree_code code)
2990 return (TREE_CODE_CLASS (code) == tcc_comparison
2991 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2992 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2993 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2996 /* Return nonzero if two operands (typically of the same tree node)
2997 are necessarily equal. If either argument has side-effects this
2998 function returns zero. FLAGS modifies behavior as follows:
3000 If OEP_ONLY_CONST is set, only return nonzero for constants.
3001 This function tests whether the operands are indistinguishable;
3002 it does not test whether they are equal using C's == operation.
3003 The distinction is important for IEEE floating point, because
3004 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
3005 (2) two NaNs may be indistinguishable, but NaN!=NaN.
3007 If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
3008 even though it may hold multiple values during a function.
3009 This is because a GCC tree node guarantees that nothing else is
3010 executed between the evaluation of its "operands" (which may often
3011 be evaluated in arbitrary order). Hence if the operands themselves
3012 don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
3013 same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST
3014 unset means assuming isochronic (or instantaneous) tree equivalence.
3015 Unless comparing arbitrary expression trees, such as from different
3016 statements, this flag can usually be left unset.
3018 If OEP_PURE_SAME is set, then pure functions with identical arguments
3019 are considered the same. It is used when the caller has other ways
3020 to ensure that global memory is unchanged in between. */
3023 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
3025 /* If either is ERROR_MARK, they aren't equal. */
3026 if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
3029 /* If both types don't have the same signedness, then we can't consider
3030 them equal. We must check this before the STRIP_NOPS calls
3031 because they may change the signedness of the arguments. */
3032 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3035 /* If both types don't have the same precision, then it is not safe
3037 if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
3043 /* In case both args are comparisons but with different comparison
3044 code, try to swap the comparison operands of one arg to produce
3045 a match and compare that variant. */
3046 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3047 && COMPARISON_CLASS_P (arg0)
3048 && COMPARISON_CLASS_P (arg1))
3050 enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
3052 if (TREE_CODE (arg0) == swap_code)
3053 return operand_equal_p (TREE_OPERAND (arg0, 0),
3054 TREE_OPERAND (arg1, 1), flags)
3055 && operand_equal_p (TREE_OPERAND (arg0, 1),
3056 TREE_OPERAND (arg1, 0), flags);
3059 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3060 /* This is needed for conversions and for COMPONENT_REF.
3061 Might as well play it safe and always test this. */
3062 || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
3063 || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
3064 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
3067 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
3068 We don't care about side effects in that case because the SAVE_EXPR
3069 takes care of that for us. In all other cases, two expressions are
3070 equal if they have no side effects. If we have two identical
3071 expressions with side effects that should be treated the same due
3072 to the only side effects being identical SAVE_EXPR's, that will
3073 be detected in the recursive calls below. */
3074 if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
3075 && (TREE_CODE (arg0) == SAVE_EXPR
3076 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
3079 /* Next handle constant cases, those for which we can return 1 even
3080 if ONLY_CONST is set. */
3081 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
3082 switch (TREE_CODE (arg0))
3085 return tree_int_cst_equal (arg0, arg1);
3088 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
3089 TREE_FIXED_CST (arg1));
3092 if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
3093 TREE_REAL_CST (arg1)))
3097 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
3099 /* If we do not distinguish between signed and unsigned zero,
3100 consider them equal. */
3101 if (real_zerop (arg0) && real_zerop (arg1))
3110 v1 = TREE_VECTOR_CST_ELTS (arg0);
3111 v2 = TREE_VECTOR_CST_ELTS (arg1);
3114 if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
3117 v1 = TREE_CHAIN (v1);
3118 v2 = TREE_CHAIN (v2);
3125 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
3127 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
3131 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
3132 && ! memcmp (TREE_STRING_POINTER (arg0),
3133 TREE_STRING_POINTER (arg1),
3134 TREE_STRING_LENGTH (arg0)));
3137 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
3143 if (flags & OEP_ONLY_CONST)
3146 /* Define macros to test an operand from arg0 and arg1 for equality and a
3147 variant that allows null and views null as being different from any
3148 non-null value. In the latter case, if either is null, the both
3149 must be; otherwise, do the normal comparison. */
3150 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N), \
3151 TREE_OPERAND (arg1, N), flags)
3153 #define OP_SAME_WITH_NULL(N) \
3154 ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
3155 ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
3157 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
3160 /* Two conversions are equal only if signedness and modes match. */
3161 switch (TREE_CODE (arg0))
3165 case FIX_TRUNC_EXPR:
3166 if (TYPE_UNSIGNED (TREE_TYPE (arg0))
3167 != TYPE_UNSIGNED (TREE_TYPE (arg1)))
3177 case tcc_comparison:
3179 if (OP_SAME (0) && OP_SAME (1))
3182 /* For commutative ops, allow the other order. */
3183 return (commutative_tree_code (TREE_CODE (arg0))
3184 && operand_equal_p (TREE_OPERAND (arg0, 0),
3185 TREE_OPERAND (arg1, 1), flags)
3186 && operand_equal_p (TREE_OPERAND (arg0, 1),
3187 TREE_OPERAND (arg1, 0), flags));
3190 /* If either of the pointer (or reference) expressions we are
3191 dereferencing contain a side effect, these cannot be equal. */
3192 if (TREE_SIDE_EFFECTS (arg0)
3193 || TREE_SIDE_EFFECTS (arg1))
3196 switch (TREE_CODE (arg0))
3199 case ALIGN_INDIRECT_REF:
3200 case MISALIGNED_INDIRECT_REF:
3206 case ARRAY_RANGE_REF:
3207 /* Operands 2 and 3 may be null.
3208 Compare the array index by value if it is constant first as we
3209 may have different types but same value here. */
3211 && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3212 TREE_OPERAND (arg1, 1))
3214 && OP_SAME_WITH_NULL (2)
3215 && OP_SAME_WITH_NULL (3));
3218 /* Handle operand 2 the same as for ARRAY_REF. Operand 0
3219 may be NULL when we're called to compare MEM_EXPRs. */
3220 return OP_SAME_WITH_NULL (0)
3222 && OP_SAME_WITH_NULL (2);
3225 return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3231 case tcc_expression:
3232 switch (TREE_CODE (arg0))
3235 case TRUTH_NOT_EXPR:
3238 case TRUTH_ANDIF_EXPR:
3239 case TRUTH_ORIF_EXPR:
3240 return OP_SAME (0) && OP_SAME (1);
3242 case TRUTH_AND_EXPR:
3244 case TRUTH_XOR_EXPR:
3245 if (OP_SAME (0) && OP_SAME (1))
3248 /* Otherwise take into account this is a commutative operation. */
3249 return (operand_equal_p (TREE_OPERAND (arg0, 0),
3250 TREE_OPERAND (arg1, 1), flags)
3251 && operand_equal_p (TREE_OPERAND (arg0, 1),
3252 TREE_OPERAND (arg1, 0), flags));
3259 switch (TREE_CODE (arg0))
3262 /* If the CALL_EXPRs call different functions, then they
3263 clearly can not be equal. */
3264 if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3269 unsigned int cef = call_expr_flags (arg0);
3270 if (flags & OEP_PURE_SAME)
3271 cef &= ECF_CONST | ECF_PURE;
3278 /* Now see if all the arguments are the same. */
3280 const_call_expr_arg_iterator iter0, iter1;
3282 for (a0 = first_const_call_expr_arg (arg0, &iter0),
3283 a1 = first_const_call_expr_arg (arg1, &iter1);
3285 a0 = next_const_call_expr_arg (&iter0),
3286 a1 = next_const_call_expr_arg (&iter1))
3287 if (! operand_equal_p (a0, a1, flags))
3290 /* If we get here and both argument lists are exhausted
3291 then the CALL_EXPRs are equal. */
3292 return ! (a0 || a1);
3298 case tcc_declaration:
3299 /* Consider __builtin_sqrt equal to sqrt. */
3300 return (TREE_CODE (arg0) == FUNCTION_DECL
3301 && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3302 && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3303 && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3310 #undef OP_SAME_WITH_NULL
3313 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3314 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3316 When in doubt, return 0. */
3319 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3321 int unsignedp1, unsignedpo;
3322 tree primarg0, primarg1, primother;
3323 unsigned int correct_width;
3325 if (operand_equal_p (arg0, arg1, 0))
3328 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3329 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3332 /* Discard any conversions that don't change the modes of ARG0 and ARG1
3333 and see if the inner values are the same. This removes any
3334 signedness comparison, which doesn't matter here. */
3335 primarg0 = arg0, primarg1 = arg1;
3336 STRIP_NOPS (primarg0);
3337 STRIP_NOPS (primarg1);
3338 if (operand_equal_p (primarg0, primarg1, 0))
3341 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3342 actual comparison operand, ARG0.
3344 First throw away any conversions to wider types
3345 already present in the operands. */
3347 primarg1 = get_narrower (arg1, &unsignedp1);
3348 primother = get_narrower (other, &unsignedpo);
3350 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3351 if (unsignedp1 == unsignedpo
3352 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3353 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3355 tree type = TREE_TYPE (arg0);
3357 /* Make sure shorter operand is extended the right way
3358 to match the longer operand. */
3359 primarg1 = fold_convert (signed_or_unsigned_type_for
3360 (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3362 if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3369 /* See if ARG is an expression that is either a comparison or is performing
3370 arithmetic on comparisons. The comparisons must only be comparing
3371 two different values, which will be stored in *CVAL1 and *CVAL2; if
3372 they are nonzero it means that some operands have already been found.
3373 No variables may be used anywhere else in the expression except in the
3374 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
3375 the expression and save_expr needs to be called with CVAL1 and CVAL2.
3377 If this is true, return 1. Otherwise, return zero. */
3380 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3382 enum tree_code code = TREE_CODE (arg);
3383 enum tree_code_class class = TREE_CODE_CLASS (code);
3385 /* We can handle some of the tcc_expression cases here. */
3386 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3388 else if (class == tcc_expression
3389 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3390 || code == COMPOUND_EXPR))
3393 else if (class == tcc_expression && code == SAVE_EXPR
3394 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3396 /* If we've already found a CVAL1 or CVAL2, this expression is
3397 two complex to handle. */
3398 if (*cval1 || *cval2)
3408 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3411 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3412 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3413 cval1, cval2, save_p));
3418 case tcc_expression:
3419 if (code == COND_EXPR)
3420 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3421 cval1, cval2, save_p)
3422 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3423 cval1, cval2, save_p)
3424 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3425 cval1, cval2, save_p));
3428 case tcc_comparison:
3429 /* First see if we can handle the first operand, then the second. For
3430 the second operand, we know *CVAL1 can't be zero. It must be that
3431 one side of the comparison is each of the values; test for the
3432 case where this isn't true by failing if the two operands
3435 if (operand_equal_p (TREE_OPERAND (arg, 0),
3436 TREE_OPERAND (arg, 1), 0))
3440 *cval1 = TREE_OPERAND (arg, 0);
3441 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3443 else if (*cval2 == 0)
3444 *cval2 = TREE_OPERAND (arg, 0);
3445 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3450 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3452 else if (*cval2 == 0)
3453 *cval2 = TREE_OPERAND (arg, 1);
3454 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3466 /* ARG is a tree that is known to contain just arithmetic operations and
3467 comparisons. Evaluate the operations in the tree substituting NEW0 for
3468 any occurrence of OLD0 as an operand of a comparison and likewise for
3472 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3474 tree type = TREE_TYPE (arg);
3475 enum tree_code code = TREE_CODE (arg);
3476 enum tree_code_class class = TREE_CODE_CLASS (code);
3478 /* We can handle some of the tcc_expression cases here. */
3479 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3481 else if (class == tcc_expression
3482 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3488 return fold_build1 (code, type,
3489 eval_subst (TREE_OPERAND (arg, 0),
3490 old0, new0, old1, new1));
3493 return fold_build2 (code, type,
3494 eval_subst (TREE_OPERAND (arg, 0),
3495 old0, new0, old1, new1),
3496 eval_subst (TREE_OPERAND (arg, 1),
3497 old0, new0, old1, new1));
3499 case tcc_expression:
3503 return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3506 return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3509 return fold_build3 (code, type,
3510 eval_subst (TREE_OPERAND (arg, 0),
3511 old0, new0, old1, new1),
3512 eval_subst (TREE_OPERAND (arg, 1),
3513 old0, new0, old1, new1),
3514 eval_subst (TREE_OPERAND (arg, 2),
3515 old0, new0, old1, new1));
3519 /* Fall through - ??? */
3521 case tcc_comparison:
3523 tree arg0 = TREE_OPERAND (arg, 0);
3524 tree arg1 = TREE_OPERAND (arg, 1);
3526 /* We need to check both for exact equality and tree equality. The
3527 former will be true if the operand has a side-effect. In that
3528 case, we know the operand occurred exactly once. */
3530 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3532 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3535 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3537 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3540 return fold_build2 (code, type, arg0, arg1);
3548 /* Return a tree for the case when the result of an expression is RESULT
3549 converted to TYPE and OMITTED was previously an operand of the expression
3550 but is now not needed (e.g., we folded OMITTED * 0).
3552 If OMITTED has side effects, we must evaluate it. Otherwise, just do
3553 the conversion of RESULT to TYPE. */
3556 omit_one_operand (tree type, tree result, tree omitted)
3558 tree t = fold_convert (type, result);
3560 /* If the resulting operand is an empty statement, just return the omitted
3561 statement casted to void. */
3562 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3563 return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3565 if (TREE_SIDE_EFFECTS (omitted))
3566 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3568 return non_lvalue (t);
3571 /* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
3574 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3576 tree t = fold_convert (type, result);
3578 /* If the resulting operand is an empty statement, just return the omitted
3579 statement casted to void. */
3580 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3581 return build1 (NOP_EXPR, void_type_node, fold_ignored_result (omitted));
3583 if (TREE_SIDE_EFFECTS (omitted))
3584 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3586 return pedantic_non_lvalue (t);
3589 /* Return a tree for the case when the result of an expression is RESULT
3590 converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3591 of the expression but are now not needed.
3593 If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3594 If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3595 evaluated before OMITTED2. Otherwise, if neither has side effects,
3596 just do the conversion of RESULT to TYPE. */
3599 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3601 tree t = fold_convert (type, result);
3603 if (TREE_SIDE_EFFECTS (omitted2))
3604 t = build2 (COMPOUND_EXPR, type, omitted2, t);
3605 if (TREE_SIDE_EFFECTS (omitted1))
3606 t = build2 (COMPOUND_EXPR, type, omitted1, t);
3608 return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3612 /* Return a simplified tree node for the truth-negation of ARG. This
3613 never alters ARG itself. We assume that ARG is an operation that
3614 returns a truth value (0 or 1).
3616 FIXME: one would think we would fold the result, but it causes
3617 problems with the dominator optimizer. */
3620 fold_truth_not_expr (tree arg)
3622 tree type = TREE_TYPE (arg);
3623 enum tree_code code = TREE_CODE (arg);
3625 /* If this is a comparison, we can simply invert it, except for
3626 floating-point non-equality comparisons, in which case we just
3627 enclose a TRUTH_NOT_EXPR around what we have. */
3629 if (TREE_CODE_CLASS (code) == tcc_comparison)
3631 tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3632 if (FLOAT_TYPE_P (op_type)
3633 && flag_trapping_math
3634 && code != ORDERED_EXPR && code != UNORDERED_EXPR
3635 && code != NE_EXPR && code != EQ_EXPR)
3639 code = invert_tree_comparison (code,
3640 HONOR_NANS (TYPE_MODE (op_type)));
3641 if (code == ERROR_MARK)
3644 return build2 (code, type,
3645 TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3652 return constant_boolean_node (integer_zerop (arg), type);
3654 case TRUTH_AND_EXPR:
3655 return build2 (TRUTH_OR_EXPR, type,
3656 invert_truthvalue (TREE_OPERAND (arg, 0)),
3657 invert_truthvalue (TREE_OPERAND (arg, 1)));
3660 return build2 (TRUTH_AND_EXPR, type,
3661 invert_truthvalue (TREE_OPERAND (arg, 0)),
3662 invert_truthvalue (TREE_OPERAND (arg, 1)));
3664 case TRUTH_XOR_EXPR:
3665 /* Here we can invert either operand. We invert the first operand
3666 unless the second operand is a TRUTH_NOT_EXPR in which case our
3667 result is the XOR of the first operand with the inside of the
3668 negation of the second operand. */
3670 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3671 return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3672 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3674 return build2 (TRUTH_XOR_EXPR, type,
3675 invert_truthvalue (TREE_OPERAND (arg, 0)),
3676 TREE_OPERAND (arg, 1));
3678 case TRUTH_ANDIF_EXPR:
3679 return build2 (TRUTH_ORIF_EXPR, type,
3680 invert_truthvalue (TREE_OPERAND (arg, 0)),
3681 invert_truthvalue (TREE_OPERAND (arg, 1)));
3683 case TRUTH_ORIF_EXPR:
3684 return build2 (TRUTH_ANDIF_EXPR, type,
3685 invert_truthvalue (TREE_OPERAND (arg, 0)),
3686 invert_truthvalue (TREE_OPERAND (arg, 1)));
3688 case TRUTH_NOT_EXPR:
3689 return TREE_OPERAND (arg, 0);
3693 tree arg1 = TREE_OPERAND (arg, 1);
3694 tree arg2 = TREE_OPERAND (arg, 2);
3695 /* A COND_EXPR may have a throw as one operand, which
3696 then has void type. Just leave void operands
3698 return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3699 VOID_TYPE_P (TREE_TYPE (arg1))
3700 ? arg1 : invert_truthvalue (arg1),
3701 VOID_TYPE_P (TREE_TYPE (arg2))
3702 ? arg2 : invert_truthvalue (arg2));
3706 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3707 invert_truthvalue (TREE_OPERAND (arg, 1)));
3709 case NON_LVALUE_EXPR:
3710 return invert_truthvalue (TREE_OPERAND (arg, 0));
3713 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3714 return build1 (TRUTH_NOT_EXPR, type, arg);
3718 return build1 (TREE_CODE (arg), type,
3719 invert_truthvalue (TREE_OPERAND (arg, 0)));
3722 if (!integer_onep (TREE_OPERAND (arg, 1)))
3724 return build2 (EQ_EXPR, type, arg,
3725 build_int_cst (type, 0));
3728 return build1 (TRUTH_NOT_EXPR, type, arg);
3730 case CLEANUP_POINT_EXPR:
3731 return build1 (CLEANUP_POINT_EXPR, type,
3732 invert_truthvalue (TREE_OPERAND (arg, 0)));
3741 /* Return a simplified tree node for the truth-negation of ARG. This
3742 never alters ARG itself. We assume that ARG is an operation that
3743 returns a truth value (0 or 1).
3745 FIXME: one would think we would fold the result, but it causes
3746 problems with the dominator optimizer. */
3749 invert_truthvalue (tree arg)
3753 if (TREE_CODE (arg) == ERROR_MARK)
3756 tem = fold_truth_not_expr (arg);
3758 tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3763 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3764 operands are another bit-wise operation with a common input. If so,
3765 distribute the bit operations to save an operation and possibly two if
3766 constants are involved. For example, convert
3767 (A | B) & (A | C) into A | (B & C)
3768 Further simplification will occur if B and C are constants.
3770 If this optimization cannot be done, 0 will be returned. */
3773 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3778 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3779 || TREE_CODE (arg0) == code
3780 || (TREE_CODE (arg0) != BIT_AND_EXPR
3781 && TREE_CODE (arg0) != BIT_IOR_EXPR))
3784 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3786 common = TREE_OPERAND (arg0, 0);
3787 left = TREE_OPERAND (arg0, 1);
3788 right = TREE_OPERAND (arg1, 1);
3790 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3792 common = TREE_OPERAND (arg0, 0);
3793 left = TREE_OPERAND (arg0, 1);
3794 right = TREE_OPERAND (arg1, 0);
3796 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3798 common = TREE_OPERAND (arg0, 1);
3799 left = TREE_OPERAND (arg0, 0);
3800 right = TREE_OPERAND (arg1, 1);
3802 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3804 common = TREE_OPERAND (arg0, 1);
3805 left = TREE_OPERAND (arg0, 0);
3806 right = TREE_OPERAND (arg1, 0);
3811 return fold_build2 (TREE_CODE (arg0), type, common,
3812 fold_build2 (code, type, left, right));
3815 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3816 with code CODE. This optimization is unsafe. */
3818 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3820 bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3821 bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3823 /* (A / C) +- (B / C) -> (A +- B) / C. */
3825 && operand_equal_p (TREE_OPERAND (arg0, 1),
3826 TREE_OPERAND (arg1, 1), 0))
3827 return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3828 fold_build2 (code, type,
3829 TREE_OPERAND (arg0, 0),
3830 TREE_OPERAND (arg1, 0)),
3831 TREE_OPERAND (arg0, 1));
3833 /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2). */
3834 if (operand_equal_p (TREE_OPERAND (arg0, 0),
3835 TREE_OPERAND (arg1, 0), 0)
3836 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3837 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3839 REAL_VALUE_TYPE r0, r1;
3840 r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3841 r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3843 real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3845 real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3846 real_arithmetic (&r0, code, &r0, &r1);
3847 return fold_build2 (MULT_EXPR, type,
3848 TREE_OPERAND (arg0, 0),
3849 build_real (type, r0));
3855 /* Subroutine for fold_truthop: decode a field reference.
3857 If EXP is a comparison reference, we return the innermost reference.
3859 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3860 set to the starting bit number.
3862 If the innermost field can be completely contained in a mode-sized
3863 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
3865 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3866 otherwise it is not changed.
3868 *PUNSIGNEDP is set to the signedness of the field.
3870 *PMASK is set to the mask used. This is either contained in a
3871 BIT_AND_EXPR or derived from the width of the field.
3873 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3875 Return 0 if this is not a component reference or is one that we can't
3876 do anything with. */
3879 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3880 HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3881 int *punsignedp, int *pvolatilep,
3882 tree *pmask, tree *pand_mask)
3884 tree outer_type = 0;
3886 tree mask, inner, offset;
3888 unsigned int precision;
3890 /* All the optimizations using this function assume integer fields.
3891 There are problems with FP fields since the type_for_size call
3892 below can fail for, e.g., XFmode. */
3893 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3896 /* We are interested in the bare arrangement of bits, so strip everything
3897 that doesn't affect the machine mode. However, record the type of the
3898 outermost expression if it may matter below. */
3899 if (TREE_CODE (exp) == NOP_EXPR
3900 || TREE_CODE (exp) == CONVERT_EXPR
3901 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3902 outer_type = TREE_TYPE (exp);
3905 if (TREE_CODE (exp) == BIT_AND_EXPR)
3907 and_mask = TREE_OPERAND (exp, 1);
3908 exp = TREE_OPERAND (exp, 0);
3909 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3910 if (TREE_CODE (and_mask) != INTEGER_CST)
3914 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3915 punsignedp, pvolatilep, false);
3916 if ((inner == exp && and_mask == 0)
3917 || *pbitsize < 0 || offset != 0
3918 || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3921 /* If the number of bits in the reference is the same as the bitsize of
3922 the outer type, then the outer type gives the signedness. Otherwise
3923 (in case of a small bitfield) the signedness is unchanged. */
3924 if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3925 *punsignedp = TYPE_UNSIGNED (outer_type);
3927 /* Compute the mask to access the bitfield. */
3928 unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3929 precision = TYPE_PRECISION (unsigned_type);
3931 mask = build_int_cst_type (unsigned_type, -1);
3933 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3934 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3936 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
3938 mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3939 fold_convert (unsigned_type, and_mask), mask);
3942 *pand_mask = and_mask;
3946 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3947 represents the sign bit of EXP's type. If EXP represents a sign
3948 or zero extension, also test VAL against the unextended type.
3949 The return value is the (sub)expression whose sign bit is VAL,
3950 or NULL_TREE otherwise. */
3953 sign_bit_p (tree exp, const_tree val)
3955 unsigned HOST_WIDE_INT mask_lo, lo;
3956 HOST_WIDE_INT mask_hi, hi;
3960 /* Tree EXP must have an integral type. */
3961 t = TREE_TYPE (exp);
3962 if (! INTEGRAL_TYPE_P (t))
3965 /* Tree VAL must be an integer constant. */
3966 if (TREE_CODE (val) != INTEGER_CST
3967 || TREE_OVERFLOW (val))
3970 width = TYPE_PRECISION (t);
3971 if (width > HOST_BITS_PER_WIDE_INT)
3973 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3976 mask_hi = ((unsigned HOST_WIDE_INT) -1
3977 >> (2 * HOST_BITS_PER_WIDE_INT - width));
3983 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3986 mask_lo = ((unsigned HOST_WIDE_INT) -1
3987 >> (HOST_BITS_PER_WIDE_INT - width));
3990 /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3991 treat VAL as if it were unsigned. */
3992 if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3993 && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3996 /* Handle extension from a narrower type. */
3997 if (TREE_CODE (exp) == NOP_EXPR
3998 && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3999 return sign_bit_p (TREE_OPERAND (exp, 0), val);
4004 /* Subroutine for fold_truthop: determine if an operand is simple enough
4005 to be evaluated unconditionally. */
4008 simple_operand_p (const_tree exp)
4010 /* Strip any conversions that don't change the machine mode. */
4013 return (CONSTANT_CLASS_P (exp)
4014 || TREE_CODE (exp) == SSA_NAME
4016 && ! TREE_ADDRESSABLE (exp)
4017 && ! TREE_THIS_VOLATILE (exp)
4018 && ! DECL_NONLOCAL (exp)
4019 /* Don't regard global variables as simple. They may be
4020 allocated in ways unknown to the compiler (shared memory,
4021 #pragma weak, etc). */
4022 && ! TREE_PUBLIC (exp)
4023 && ! DECL_EXTERNAL (exp)
4024 /* Loading a static variable is unduly expensive, but global
4025 registers aren't expensive. */
4026 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4029 /* The following functions are subroutines to fold_range_test and allow it to
4030 try to change a logical combination of comparisons into a range test.
4033 X == 2 || X == 3 || X == 4 || X == 5
4037 (unsigned) (X - 2) <= 3
4039 We describe each set of comparisons as being either inside or outside
4040 a range, using a variable named like IN_P, and then describe the
4041 range with a lower and upper bound. If one of the bounds is omitted,
4042 it represents either the highest or lowest value of the type.
4044 In the comments below, we represent a range by two numbers in brackets
4045 preceded by a "+" to designate being inside that range, or a "-" to
4046 designate being outside that range, so the condition can be inverted by
4047 flipping the prefix. An omitted bound is represented by a "-". For
4048 example, "- [-, 10]" means being outside the range starting at the lowest
4049 possible value and ending at 10, in other words, being greater than 10.
4050 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4053 We set up things so that the missing bounds are handled in a consistent
4054 manner so neither a missing bound nor "true" and "false" need to be
4055 handled using a special case. */
4057 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4058 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4059 and UPPER1_P are nonzero if the respective argument is an upper bound
4060 and zero for a lower. TYPE, if nonzero, is the type of the result; it
4061 must be specified for a comparison. ARG1 will be converted to ARG0's
4062 type if both are specified. */
4065 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4066 tree arg1, int upper1_p)
4072 /* If neither arg represents infinity, do the normal operation.
4073 Else, if not a comparison, return infinity. Else handle the special
4074 comparison rules. Note that most of the cases below won't occur, but
4075 are handled for consistency. */
4077 if (arg0 != 0 && arg1 != 0)
4079 tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4080 arg0, fold_convert (TREE_TYPE (arg0), arg1));
4082 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4085 if (TREE_CODE_CLASS (code) != tcc_comparison)
4088 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4089 for neither. In real maths, we cannot assume open ended ranges are
4090 the same. But, this is computer arithmetic, where numbers are finite.
4091 We can therefore make the transformation of any unbounded range with
4092 the value Z, Z being greater than any representable number. This permits
4093 us to treat unbounded ranges as equal. */
4094 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4095 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4099 result = sgn0 == sgn1;
4102 result = sgn0 != sgn1;
4105 result = sgn0 < sgn1;
4108 result = sgn0 <= sgn1;
4111 result = sgn0 > sgn1;
4114 result = sgn0 >= sgn1;
4120 return constant_boolean_node (result, type);
4123 /* Given EXP, a logical expression, set the range it is testing into
4124 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
4125 actually being tested. *PLOW and *PHIGH will be made of the same
4126 type as the returned expression. If EXP is not a comparison, we
4127 will most likely not be returning a useful value and range. Set
4128 *STRICT_OVERFLOW_P to true if the return value is only valid
4129 because signed overflow is undefined; otherwise, do not change
4130 *STRICT_OVERFLOW_P. */
4133 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4134 bool *strict_overflow_p)
4136 enum tree_code code;
4137 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
4138 tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
4140 tree low, high, n_low, n_high;
4142 /* Start with simply saying "EXP != 0" and then look at the code of EXP
4143 and see if we can refine the range. Some of the cases below may not
4144 happen, but it doesn't seem worth worrying about this. We "continue"
4145 the outer loop when we've changed something; otherwise we "break"
4146 the switch, which will "break" the while. */
4149 low = high = build_int_cst (TREE_TYPE (exp), 0);
4153 code = TREE_CODE (exp);
4154 exp_type = TREE_TYPE (exp);
4156 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4158 if (TREE_OPERAND_LENGTH (exp) > 0)
4159 arg0 = TREE_OPERAND (exp, 0);
4160 if (TREE_CODE_CLASS (code) == tcc_comparison
4161 || TREE_CODE_CLASS (code) == tcc_unary
4162 || TREE_CODE_CLASS (code) == tcc_binary)
4163 arg0_type = TREE_TYPE (arg0);
4164 if (TREE_CODE_CLASS (code) == tcc_binary
4165 || TREE_CODE_CLASS (code) == tcc_comparison
4166 || (TREE_CODE_CLASS (code) == tcc_expression
4167 && TREE_OPERAND_LENGTH (exp) > 1))
4168 arg1 = TREE_OPERAND (exp, 1);
4173 case TRUTH_NOT_EXPR:
4174 in_p = ! in_p, exp = arg0;
4177 case EQ_EXPR: case NE_EXPR:
4178 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4179 /* We can only do something if the range is testing for zero
4180 and if the second operand is an integer constant. Note that
4181 saying something is "in" the range we make is done by
4182 complementing IN_P since it will set in the initial case of
4183 being not equal to zero; "out" is leaving it alone. */
4184 if (low == 0 || high == 0
4185 || ! integer_zerop (low) || ! integer_zerop (high)
4186 || TREE_CODE (arg1) != INTEGER_CST)
4191 case NE_EXPR: /* - [c, c] */
4194 case EQ_EXPR: /* + [c, c] */
4195 in_p = ! in_p, low = high = arg1;
4197 case GT_EXPR: /* - [-, c] */
4198 low = 0, high = arg1;
4200 case GE_EXPR: /* + [c, -] */
4201 in_p = ! in_p, low = arg1, high = 0;
4203 case LT_EXPR: /* - [c, -] */
4204 low = arg1, high = 0;
4206 case LE_EXPR: /* + [-, c] */
4207 in_p = ! in_p, low = 0, high = arg1;
4213 /* If this is an unsigned comparison, we also know that EXP is
4214 greater than or equal to zero. We base the range tests we make
4215 on that fact, so we record it here so we can parse existing
4216 range tests. We test arg0_type since often the return type
4217 of, e.g. EQ_EXPR, is boolean. */
4218 if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4220 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4222 build_int_cst (arg0_type, 0),
4226 in_p = n_in_p, low = n_low, high = n_high;
4228 /* If the high bound is missing, but we have a nonzero low
4229 bound, reverse the range so it goes from zero to the low bound
4231 if (high == 0 && low && ! integer_zerop (low))
4234 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4235 integer_one_node, 0);
4236 low = build_int_cst (arg0_type, 0);
4244 /* (-x) IN [a,b] -> x in [-b, -a] */
4245 n_low = range_binop (MINUS_EXPR, exp_type,
4246 build_int_cst (exp_type, 0),
4248 n_high = range_binop (MINUS_EXPR, exp_type,
4249 build_int_cst (exp_type, 0),
4251 low = n_low, high = n_high;
4257 exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4258 build_int_cst (exp_type, 1));
4261 case PLUS_EXPR: case MINUS_EXPR:
4262 if (TREE_CODE (arg1) != INTEGER_CST)
4265 /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4266 move a constant to the other side. */
4267 if (!TYPE_UNSIGNED (arg0_type)
4268 && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4271 /* If EXP is signed, any overflow in the computation is undefined,
4272 so we don't worry about it so long as our computations on
4273 the bounds don't overflow. For unsigned, overflow is defined
4274 and this is exactly the right thing. */
4275 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4276 arg0_type, low, 0, arg1, 0);
4277 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4278 arg0_type, high, 1, arg1, 0);
4279 if ((n_low != 0 && TREE_OVERFLOW (n_low))
4280 || (n_high != 0 && TREE_OVERFLOW (n_high)))
4283 if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4284 *strict_overflow_p = true;
4286 /* Check for an unsigned range which has wrapped around the maximum
4287 value thus making n_high < n_low, and normalize it. */
4288 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4290 low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4291 integer_one_node, 0);
4292 high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4293 integer_one_node, 0);
4295 /* If the range is of the form +/- [ x+1, x ], we won't
4296 be able to normalize it. But then, it represents the
4297 whole range or the empty set, so make it
4299 if (tree_int_cst_equal (n_low, low)
4300 && tree_int_cst_equal (n_high, high))
4306 low = n_low, high = n_high;
4311 case NOP_EXPR: case NON_LVALUE_EXPR: case CONVERT_EXPR:
4312 if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4315 if (! INTEGRAL_TYPE_P (arg0_type)
4316 || (low != 0 && ! int_fits_type_p (low, arg0_type))
4317 || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4320 n_low = low, n_high = high;
4323 n_low = fold_convert (arg0_type, n_low);
4326 n_high = fold_convert (arg0_type, n_high);
4329 /* If we're converting arg0 from an unsigned type, to exp,
4330 a signed type, we will be doing the comparison as unsigned.
4331 The tests above have already verified that LOW and HIGH
4334 So we have to ensure that we will handle large unsigned
4335 values the same way that the current signed bounds treat
4338 if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4342 /* For fixed-point modes, we need to pass the saturating flag
4343 as the 2nd parameter. */
4344 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4345 equiv_type = lang_hooks.types.type_for_mode
4346 (TYPE_MODE (arg0_type),
4347 TYPE_SATURATING (arg0_type));
4349 equiv_type = lang_hooks.types.type_for_mode
4350 (TYPE_MODE (arg0_type), 1);
4352 /* A range without an upper bound is, naturally, unbounded.
4353 Since convert would have cropped a very large value, use
4354 the max value for the destination type. */
4356 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4357 : TYPE_MAX_VALUE (arg0_type);
4359 if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4360 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4361 fold_convert (arg0_type,
4363 build_int_cst (arg0_type, 1));
4365 /* If the low bound is specified, "and" the range with the
4366 range for which the original unsigned value will be
4370 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4371 1, n_low, n_high, 1,
4372 fold_convert (arg0_type,
4377 in_p = (n_in_p == in_p);
4381 /* Otherwise, "or" the range with the range of the input
4382 that will be interpreted as negative. */
4383 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4384 0, n_low, n_high, 1,
4385 fold_convert (arg0_type,
4390 in_p = (in_p != n_in_p);
4395 low = n_low, high = n_high;
4405 /* If EXP is a constant, we can evaluate whether this is true or false. */
4406 if (TREE_CODE (exp) == INTEGER_CST)
4408 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4410 && integer_onep (range_binop (LE_EXPR, integer_type_node,
4416 *pin_p = in_p, *plow = low, *phigh = high;
4420 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4421 type, TYPE, return an expression to test if EXP is in (or out of, depending
4422 on IN_P) the range. Return 0 if the test couldn't be created. */
4425 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4427 tree etype = TREE_TYPE (exp);
4430 #ifdef HAVE_canonicalize_funcptr_for_compare
4431 /* Disable this optimization for function pointer expressions
4432 on targets that require function pointer canonicalization. */
4433 if (HAVE_canonicalize_funcptr_for_compare
4434 && TREE_CODE (etype) == POINTER_TYPE
4435 && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4441 value = build_range_check (type, exp, 1, low, high);
4443 return invert_truthvalue (value);
4448 if (low == 0 && high == 0)
4449 return build_int_cst (type, 1);
4452 return fold_build2 (LE_EXPR, type, exp,
4453 fold_convert (etype, high));
4456 return fold_build2 (GE_EXPR, type, exp,
4457 fold_convert (etype, low));
4459 if (operand_equal_p (low, high, 0))
4460 return fold_build2 (EQ_EXPR, type, exp,
4461 fold_convert (etype, low));
4463 if (integer_zerop (low))
4465 if (! TYPE_UNSIGNED (etype))
4467 etype = unsigned_type_for (etype);
4468 high = fold_convert (etype, high);
4469 exp = fold_convert (etype, exp);
4471 return build_range_check (type, exp, 1, 0, high);
4474 /* Optimize (c>=1) && (c<=127) into (signed char)c > 0. */
4475 if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4477 unsigned HOST_WIDE_INT lo;
4481 prec = TYPE_PRECISION (etype);
4482 if (prec <= HOST_BITS_PER_WIDE_INT)
4485 lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4489 hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4490 lo = (unsigned HOST_WIDE_INT) -1;
4493 if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4495 if (TYPE_UNSIGNED (etype))
4497 etype = signed_type_for (etype);
4498 exp = fold_convert (etype, exp);
4500 return fold_build2 (GT_EXPR, type, exp,
4501 build_int_cst (etype, 0));
4505 /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4506 This requires wrap-around arithmetics for the type of the expression. */
4507 switch (TREE_CODE (etype))
4510 /* There is no requirement that LOW be within the range of ETYPE
4511 if the latter is a subtype. It must, however, be within the base
4512 type of ETYPE. So be sure we do the subtraction in that type. */
4513 if (TREE_TYPE (etype))
4514 etype = TREE_TYPE (etype);
4519 etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4520 TYPE_UNSIGNED (etype));
4527 /* If we don't have wrap-around arithmetics upfront, try to force it. */
4528 if (TREE_CODE (etype) == INTEGER_TYPE
4529 && !TYPE_OVERFLOW_WRAPS (etype))
4531 tree utype, minv, maxv;
4533 /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4534 for the type in question, as we rely on this here. */
4535 utype = unsigned_type_for (etype);
4536 maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4537 maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4538 integer_one_node, 1);
4539 minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4541 if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4548 high = fold_convert (etype, high);
4549 low = fold_convert (etype, low);
4550 exp = fold_convert (etype, exp);
4552 value = const_binop (MINUS_EXPR, high, low, 0);
4555 if (POINTER_TYPE_P (etype))
4557 if (value != 0 && !TREE_OVERFLOW (value))
4559 low = fold_convert (sizetype, low);
4560 low = fold_build1 (NEGATE_EXPR, sizetype, low);
4561 return build_range_check (type,
4562 fold_build2 (POINTER_PLUS_EXPR, etype, exp, low),
4563 1, build_int_cst (etype, 0), value);
4568 if (value != 0 && !TREE_OVERFLOW (value))
4569 return build_range_check (type,
4570 fold_build2 (MINUS_EXPR, etype, exp, low),
4571 1, build_int_cst (etype, 0), value);
4576 /* Return the predecessor of VAL in its type, handling the infinite case. */
4579 range_predecessor (tree val)
4581 tree type = TREE_TYPE (val);
4583 if (INTEGRAL_TYPE_P (type)
4584 && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4587 return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4590 /* Return the successor of VAL in its type, handling the infinite case. */
4593 range_successor (tree val)
4595 tree type = TREE_TYPE (val);
4597 if (INTEGRAL_TYPE_P (type)
4598 && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4601 return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4604 /* Given two ranges, see if we can merge them into one. Return 1 if we
4605 can, 0 if we can't. Set the output range into the specified parameters. */
4608 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4609 tree high0, int in1_p, tree low1, tree high1)
4617 int lowequal = ((low0 == 0 && low1 == 0)
4618 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4619 low0, 0, low1, 0)));
4620 int highequal = ((high0 == 0 && high1 == 0)
4621 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4622 high0, 1, high1, 1)));
4624 /* Make range 0 be the range that starts first, or ends last if they
4625 start at the same value. Swap them if it isn't. */
4626 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4629 && integer_onep (range_binop (GT_EXPR, integer_type_node,
4630 high1, 1, high0, 1))))
4632 temp = in0_p, in0_p = in1_p, in1_p = temp;
4633 tem = low0, low0 = low1, low1 = tem;
4634 tem = high0, high0 = high1, high1 = tem;
4637 /* Now flag two cases, whether the ranges are disjoint or whether the
4638 second range is totally subsumed in the first. Note that the tests
4639 below are simplified by the ones above. */
4640 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4641 high0, 1, low1, 0));
4642 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4643 high1, 1, high0, 1));
4645 /* We now have four cases, depending on whether we are including or
4646 excluding the two ranges. */
4649 /* If they don't overlap, the result is false. If the second range
4650 is a subset it is the result. Otherwise, the range is from the start
4651 of the second to the end of the first. */
4653 in_p = 0, low = high = 0;
4655 in_p = 1, low = low1, high = high1;
4657 in_p = 1, low = low1, high = high0;
4660 else if (in0_p && ! in1_p)
4662 /* If they don't overlap, the result is the first range. If they are
4663 equal, the result is false. If the second range is a subset of the
4664 first, and the ranges begin at the same place, we go from just after
4665 the end of the second range to the end of the first. If the second
4666 range is not a subset of the first, or if it is a subset and both
4667 ranges end at the same place, the range starts at the start of the
4668 first range and ends just before the second range.
4669 Otherwise, we can't describe this as a single range. */
4671 in_p = 1, low = low0, high = high0;
4672 else if (lowequal && highequal)
4673 in_p = 0, low = high = 0;
4674 else if (subset && lowequal)
4676 low = range_successor (high1);
4681 /* We are in the weird situation where high0 > high1 but
4682 high1 has no successor. Punt. */
4686 else if (! subset || highequal)
4689 high = range_predecessor (low1);
4693 /* low0 < low1 but low1 has no predecessor. Punt. */
4701 else if (! in0_p && in1_p)
4703 /* If they don't overlap, the result is the second range. If the second
4704 is a subset of the first, the result is false. Otherwise,
4705 the range starts just after the first range and ends at the
4706 end of the second. */
4708 in_p = 1, low = low1, high = high1;
4709 else if (subset || highequal)
4710 in_p = 0, low = high = 0;
4713 low = range_successor (high0);
4718 /* high1 > high0 but high0 has no successor. Punt. */
4726 /* The case where we are excluding both ranges. Here the complex case
4727 is if they don't overlap. In that case, the only time we have a
4728 range is if they are adjacent. If the second is a subset of the
4729 first, the result is the first. Otherwise, the range to exclude
4730 starts at the beginning of the first range and ends at the end of the
4734 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4735 range_successor (high0),
4737 in_p = 0, low = low0, high = high1;
4740 /* Canonicalize - [min, x] into - [-, x]. */
4741 if (low0 && TREE_CODE (low0) == INTEGER_CST)
4742 switch (TREE_CODE (TREE_TYPE (low0)))
4745 if (TYPE_PRECISION (TREE_TYPE (low0))
4746 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4750 if (tree_int_cst_equal (low0,
4751 TYPE_MIN_VALUE (TREE_TYPE (low0))))
4755 if (TYPE_UNSIGNED (TREE_TYPE (low0))
4756 && integer_zerop (low0))
4763 /* Canonicalize - [x, max] into - [x, -]. */
4764 if (high1 && TREE_CODE (high1) == INTEGER_CST)
4765 switch (TREE_CODE (TREE_TYPE (high1)))
4768 if (TYPE_PRECISION (TREE_TYPE (high1))
4769 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4773 if (tree_int_cst_equal (high1,
4774 TYPE_MAX_VALUE (TREE_TYPE (high1))))
4778 if (TYPE_UNSIGNED (TREE_TYPE (high1))
4779 && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4781 integer_one_node, 1)))
4788 /* The ranges might be also adjacent between the maximum and
4789 minimum values of the given type. For
4790 - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4791 return + [x + 1, y - 1]. */
4792 if (low0 == 0 && high1 == 0)
4794 low = range_successor (high0);
4795 high = range_predecessor (low1);
4796 if (low == 0 || high == 0)
4806 in_p = 0, low = low0, high = high0;
4808 in_p = 0, low = low0, high = high1;
4811 *pin_p = in_p, *plow = low, *phigh = high;
4816 /* Subroutine of fold, looking inside expressions of the form
4817 A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4818 of the COND_EXPR. This function is being used also to optimize
4819 A op B ? C : A, by reversing the comparison first.
4821 Return a folded expression whose code is not a COND_EXPR
4822 anymore, or NULL_TREE if no folding opportunity is found. */
4825 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4827 enum tree_code comp_code = TREE_CODE (arg0);
4828 tree arg00 = TREE_OPERAND (arg0, 0);
4829 tree arg01 = TREE_OPERAND (arg0, 1);
4830 tree arg1_type = TREE_TYPE (arg1);
4836 /* If we have A op 0 ? A : -A, consider applying the following
4839 A == 0? A : -A same as -A
4840 A != 0? A : -A same as A
4841 A >= 0? A : -A same as abs (A)
4842 A > 0? A : -A same as abs (A)
4843 A <= 0? A : -A same as -abs (A)
4844 A < 0? A : -A same as -abs (A)
4846 None of these transformations work for modes with signed
4847 zeros. If A is +/-0, the first two transformations will
4848 change the sign of the result (from +0 to -0, or vice
4849 versa). The last four will fix the sign of the result,
4850 even though the original expressions could be positive or
4851 negative, depending on the sign of A.
4853 Note that all these transformations are correct if A is
4854 NaN, since the two alternatives (A and -A) are also NaNs. */
4855 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4856 && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4857 ? real_zerop (arg01)
4858 : integer_zerop (arg01))
4859 && ((TREE_CODE (arg2) == NEGATE_EXPR
4860 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4861 /* In the case that A is of the form X-Y, '-A' (arg2) may
4862 have already been folded to Y-X, check for that. */
4863 || (TREE_CODE (arg1) == MINUS_EXPR
4864 && TREE_CODE (arg2) == MINUS_EXPR
4865 && operand_equal_p (TREE_OPERAND (arg1, 0),
4866 TREE_OPERAND (arg2, 1), 0)
4867 && operand_equal_p (TREE_OPERAND (arg1, 1),
4868 TREE_OPERAND (arg2, 0), 0))))
4873 tem = fold_convert (arg1_type, arg1);
4874 return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4877 return pedantic_non_lvalue (fold_convert (type, arg1));
4880 if (flag_trapping_math)
4885 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4886 arg1 = fold_convert (signed_type_for
4887 (TREE_TYPE (arg1)), arg1);
4888 tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4889 return pedantic_non_lvalue (fold_convert (type, tem));
4892 if (flag_trapping_math)
4896 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4897 arg1 = fold_convert (signed_type_for
4898 (TREE_TYPE (arg1)), arg1);
4899 tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4900 return negate_expr (fold_convert (type, tem));
4902 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4906 /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise
4907 A == 0 ? A : 0 is always 0 unless A is -0. Note that
4908 both transformations are correct when A is NaN: A != 0
4909 is then true, and A == 0 is false. */
4911 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4912 && integer_zerop (arg01) && integer_zerop (arg2))
4914 if (comp_code == NE_EXPR)
4915 return pedantic_non_lvalue (fold_convert (type, arg1));
4916 else if (comp_code == EQ_EXPR)
4917 return build_int_cst (type, 0);
4920 /* Try some transformations of A op B ? A : B.
4922 A == B? A : B same as B
4923 A != B? A : B same as A
4924 A >= B? A : B same as max (A, B)
4925 A > B? A : B same as max (B, A)
4926 A <= B? A : B same as min (A, B)
4927 A < B? A : B same as min (B, A)
4929 As above, these transformations don't work in the presence
4930 of signed zeros. For example, if A and B are zeros of
4931 opposite sign, the first two transformations will change
4932 the sign of the result. In the last four, the original
4933 expressions give different results for (A=+0, B=-0) and
4934 (A=-0, B=+0), but the transformed expressions do not.
4936 The first two transformations are correct if either A or B
4937 is a NaN. In the first transformation, the condition will
4938 be false, and B will indeed be chosen. In the case of the
4939 second transformation, the condition A != B will be true,
4940 and A will be chosen.
4942 The conversions to max() and min() are not correct if B is
4943 a number and A is not. The conditions in the original
4944 expressions will be false, so all four give B. The min()
4945 and max() versions would give a NaN instead. */
4946 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4947 && operand_equal_for_comparison_p (arg01, arg2, arg00)
4948 /* Avoid these transformations if the COND_EXPR may be used
4949 as an lvalue in the C++ front-end. PR c++/19199. */
4951 || (strcmp (lang_hooks.name, "GNU C++") != 0
4952 && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4953 || ! maybe_lvalue_p (arg1)
4954 || ! maybe_lvalue_p (arg2)))
4956 tree comp_op0 = arg00;
4957 tree comp_op1 = arg01;
4958 tree comp_type = TREE_TYPE (comp_op0);
4960 /* Avoid adding NOP_EXPRs in case this is an lvalue. */
4961 if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4971 return pedantic_non_lvalue (fold_convert (type, arg2));
4973 return pedantic_non_lvalue (fold_convert (type, arg1));
4978 /* In C++ a ?: expression can be an lvalue, so put the
4979 operand which will be used if they are equal first
4980 so that we can convert this back to the
4981 corresponding COND_EXPR. */
4982 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4984 comp_op0 = fold_convert (comp_type, comp_op0);
4985 comp_op1 = fold_convert (comp_type, comp_op1);
4986 tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4987 ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4988 : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4989 return pedantic_non_lvalue (fold_convert (type, tem));
4996 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4998 comp_op0 = fold_convert (comp_type, comp_op0);
4999 comp_op1 = fold_convert (comp_type, comp_op1);
5000 tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5001 ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
5002 : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
5003 return pedantic_non_lvalue (fold_convert (type, tem));
5007 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5008 return pedantic_non_lvalue (fold_convert (type, arg2));
5011 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5012 return pedantic_non_lvalue (fold_convert (type, arg1));
5015 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5020 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5021 we might still be able to simplify this. For example,
5022 if C1 is one less or one more than C2, this might have started
5023 out as a MIN or MAX and been transformed by this function.
5024 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
5026 if (INTEGRAL_TYPE_P (type)
5027 && TREE_CODE (arg01) == INTEGER_CST
5028 && TREE_CODE (arg2) == INTEGER_CST)
5032 /* We can replace A with C1 in this case. */
5033 arg1 = fold_convert (type, arg01);
5034 return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
5037 /* If C1 is C2 + 1, this is min(A, C2). */
5038 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5040 && operand_equal_p (arg01,
5041 const_binop (PLUS_EXPR, arg2,
5042 build_int_cst (type, 1), 0),
5044 return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5046 fold_convert (type, arg1),
5051 /* If C1 is C2 - 1, this is min(A, C2). */
5052 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5054 && operand_equal_p (arg01,
5055 const_binop (MINUS_EXPR, arg2,
5056 build_int_cst (type, 1), 0),
5058 return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
5060 fold_convert (type, arg1),
5065 /* If C1 is C2 - 1, this is max(A, C2). */
5066 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5068 && operand_equal_p (arg01,
5069 const_binop (MINUS_EXPR, arg2,
5070 build_int_cst (type, 1), 0),
5072 return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5074 fold_convert (type, arg1),
5079 /* If C1 is C2 + 1, this is max(A, C2). */
5080 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5082 && operand_equal_p (arg01,
5083 const_binop (PLUS_EXPR, arg2,
5084 build_int_cst (type, 1), 0),
5086 return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
5088 fold_convert (type, arg1),
5102 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5103 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
5106 /* EXP is some logical combination of boolean tests. See if we can
5107 merge it into some range test. Return the new tree if so. */
5110 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
5112 int or_op = (code == TRUTH_ORIF_EXPR
5113 || code == TRUTH_OR_EXPR);
5114 int in0_p, in1_p, in_p;
5115 tree low0, low1, low, high0, high1, high;
5116 bool strict_overflow_p = false;
5117 tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5118 tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5120 const char * const warnmsg = G_("assuming signed overflow does not occur "
5121 "when simplifying range test");
5123 /* If this is an OR operation, invert both sides; we will invert
5124 again at the end. */
5126 in0_p = ! in0_p, in1_p = ! in1_p;
5128 /* If both expressions are the same, if we can merge the ranges, and we
5129 can build the range test, return it or it inverted. If one of the
5130 ranges is always true or always false, consider it to be the same
5131 expression as the other. */
5132 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5133 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5135 && 0 != (tem = (build_range_check (type,
5137 : rhs != 0 ? rhs : integer_zero_node,
5140 if (strict_overflow_p)
5141 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5142 return or_op ? invert_truthvalue (tem) : tem;
5145 /* On machines where the branch cost is expensive, if this is a
5146 short-circuited branch and the underlying object on both sides
5147 is the same, make a non-short-circuit operation. */
5148 else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5149 && lhs != 0 && rhs != 0
5150 && (code == TRUTH_ANDIF_EXPR
5151 || code == TRUTH_ORIF_EXPR)
5152 && operand_equal_p (lhs, rhs, 0))
5154 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
5155 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5156 which cases we can't do this. */
5157 if (simple_operand_p (lhs))
5158 return build2 (code == TRUTH_ANDIF_EXPR
5159 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5162 else if (lang_hooks.decls.global_bindings_p () == 0
5163 && ! CONTAINS_PLACEHOLDER_P (lhs))
5165 tree common = save_expr (lhs);
5167 if (0 != (lhs = build_range_check (type, common,
5168 or_op ? ! in0_p : in0_p,
5170 && (0 != (rhs = build_range_check (type, common,
5171 or_op ? ! in1_p : in1_p,
5174 if (strict_overflow_p)
5175 fold_overflow_warning (warnmsg,
5176 WARN_STRICT_OVERFLOW_COMPARISON);
5177 return build2 (code == TRUTH_ANDIF_EXPR
5178 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5187 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
5188 bit value. Arrange things so the extra bits will be set to zero if and
5189 only if C is signed-extended to its full width. If MASK is nonzero,
5190 it is an INTEGER_CST that should be AND'ed with the extra bits. */
5193 unextend (tree c, int p, int unsignedp, tree mask)
5195 tree type = TREE_TYPE (c);
5196 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5199 if (p == modesize || unsignedp)
5202 /* We work by getting just the sign bit into the low-order bit, then
5203 into the high-order bit, then sign-extend. We then XOR that value
5205 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
5206 temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
5208 /* We must use a signed type in order to get an arithmetic right shift.
5209 However, we must also avoid introducing accidental overflows, so that
5210 a subsequent call to integer_zerop will work. Hence we must
5211 do the type conversion here. At this point, the constant is either
5212 zero or one, and the conversion to a signed type can never overflow.
5213 We could get an overflow if this conversion is done anywhere else. */
5214 if (TYPE_UNSIGNED (type))
5215 temp = fold_convert (signed_type_for (type), temp);
5217 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
5218 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
5220 temp = const_binop (BIT_AND_EXPR, temp,
5221 fold_convert (TREE_TYPE (c), mask), 0);
5222 /* If necessary, convert the type back to match the type of C. */
5223 if (TYPE_UNSIGNED (type))
5224 temp = fold_convert (type, temp);
5226 return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
5229 /* Find ways of folding logical expressions of LHS and RHS:
5230 Try to merge two comparisons to the same innermost item.
5231 Look for range tests like "ch >= '0' && ch <= '9'".
5232 Look for combinations of simple terms on machines with expensive branches
5233 and evaluate the RHS unconditionally.
5235 For example, if we have p->a == 2 && p->b == 4 and we can make an
5236 object large enough to span both A and B, we can do this with a comparison
5237 against the object ANDed with the a mask.
5239 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5240 operations to do this with one comparison.
5242 We check for both normal comparisons and the BIT_AND_EXPRs made this by
5243 function and the one above.
5245 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
5246 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5248 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5251 We return the simplified tree or 0 if no optimization is possible. */
5254 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5256 /* If this is the "or" of two comparisons, we can do something if
5257 the comparisons are NE_EXPR. If this is the "and", we can do something
5258 if the comparisons are EQ_EXPR. I.e.,
5259 (a->b == 2 && a->c == 4) can become (a->new == NEW).
5261 WANTED_CODE is this operation code. For single bit fields, we can
5262 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5263 comparison for one-bit fields. */
5265 enum tree_code wanted_code;
5266 enum tree_code lcode, rcode;
5267 tree ll_arg, lr_arg, rl_arg, rr_arg;
5268 tree ll_inner, lr_inner, rl_inner, rr_inner;
5269 HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5270 HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5271 HOST_WIDE_INT xll_bitpos, xrl_bitpos;
5272 HOST_WIDE_INT lnbitsize, lnbitpos;
5273 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5274 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5275 enum machine_mode lnmode;
5276 tree ll_mask, lr_mask, rl_mask, rr_mask;
5277 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5278 tree l_const, r_const;
5279 tree lntype, result;
5280 int first_bit, end_bit;
5282 tree orig_lhs = lhs, orig_rhs = rhs;
5283 enum tree_code orig_code = code;
5285 /* Start by getting the comparison codes. Fail if anything is volatile.
5286 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5287 it were surrounded with a NE_EXPR. */
5289 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5292 lcode = TREE_CODE (lhs);
5293 rcode = TREE_CODE (rhs);
5295 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5297 lhs = build2 (NE_EXPR, truth_type, lhs,
5298 build_int_cst (TREE_TYPE (lhs), 0));
5302 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5304 rhs = build2 (NE_EXPR, truth_type, rhs,
5305 build_int_cst (TREE_TYPE (rhs), 0));
5309 if (TREE_CODE_CLASS (lcode) != tcc_comparison
5310 || TREE_CODE_CLASS (rcode) != tcc_comparison)
5313 ll_arg = TREE_OPERAND (lhs, 0);
5314 lr_arg = TREE_OPERAND (lhs, 1);
5315 rl_arg = TREE_OPERAND (rhs, 0);
5316 rr_arg = TREE_OPERAND (rhs, 1);
5318 /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations. */
5319 if (simple_operand_p (ll_arg)
5320 && simple_operand_p (lr_arg))
5323 if (operand_equal_p (ll_arg, rl_arg, 0)
5324 && operand_equal_p (lr_arg, rr_arg, 0))
5326 result = combine_comparisons (code, lcode, rcode,
5327 truth_type, ll_arg, lr_arg);
5331 else if (operand_equal_p (ll_arg, rr_arg, 0)
5332 && operand_equal_p (lr_arg, rl_arg, 0))
5334 result = combine_comparisons (code, lcode,
5335 swap_tree_comparison (rcode),
5336 truth_type, ll_arg, lr_arg);
5342 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5343 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5345 /* If the RHS can be evaluated unconditionally and its operands are
5346 simple, it wins to evaluate the RHS unconditionally on machines
5347 with expensive branches. In this case, this isn't a comparison
5348 that can be merged. Avoid doing this if the RHS is a floating-point
5349 comparison since those can trap. */
5351 if (BRANCH_COST >= 2
5352 && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5353 && simple_operand_p (rl_arg)
5354 && simple_operand_p (rr_arg))
5356 /* Convert (a != 0) || (b != 0) into (a | b) != 0. */
5357 if (code == TRUTH_OR_EXPR
5358 && lcode == NE_EXPR && integer_zerop (lr_arg)
5359 && rcode == NE_EXPR && integer_zerop (rr_arg)
5360 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5361 return build2 (NE_EXPR, truth_type,
5362 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5364 build_int_cst (TREE_TYPE (ll_arg), 0));
5366 /* Convert (a == 0) && (b == 0) into (a | b) == 0. */
5367 if (code == TRUTH_AND_EXPR
5368 && lcode == EQ_EXPR && integer_zerop (lr_arg)
5369 && rcode == EQ_EXPR && integer_zerop (rr_arg)
5370 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5371 return build2 (EQ_EXPR, truth_type,
5372 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5374 build_int_cst (TREE_TYPE (ll_arg), 0));
5376 if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5378 if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5379 return build2 (code, truth_type, lhs, rhs);
5384 /* See if the comparisons can be merged. Then get all the parameters for
5387 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5388 || (rcode != EQ_EXPR && rcode != NE_EXPR))
5392 ll_inner = decode_field_reference (ll_arg,
5393 &ll_bitsize, &ll_bitpos, &ll_mode,
5394 &ll_unsignedp, &volatilep, &ll_mask,
5396 lr_inner = decode_field_reference (lr_arg,
5397 &lr_bitsize, &lr_bitpos, &lr_mode,
5398 &lr_unsignedp, &volatilep, &lr_mask,
5400 rl_inner = decode_field_reference (rl_arg,
5401 &rl_bitsize, &rl_bitpos, &rl_mode,
5402 &rl_unsignedp, &volatilep, &rl_mask,
5404 rr_inner = decode_field_reference (rr_arg,
5405 &rr_bitsize, &rr_bitpos, &rr_mode,
5406 &rr_unsignedp, &volatilep, &rr_mask,
5409 /* It must be true that the inner operation on the lhs of each
5410 comparison must be the same if we are to be able to do anything.
5411 Then see if we have constants. If not, the same must be true for
5413 if (volatilep || ll_inner == 0 || rl_inner == 0
5414 || ! operand_equal_p (ll_inner, rl_inner, 0))
5417 if (TREE_CODE (lr_arg) == INTEGER_CST
5418 && TREE_CODE (rr_arg) == INTEGER_CST)
5419 l_const = lr_arg, r_const = rr_arg;
5420 else if (lr_inner == 0 || rr_inner == 0
5421 || ! operand_equal_p (lr_inner, rr_inner, 0))
5424 l_const = r_const = 0;
5426 /* If either comparison code is not correct for our logical operation,
5427 fail. However, we can convert a one-bit comparison against zero into
5428 the opposite comparison against that bit being set in the field. */
5430 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5431 if (lcode != wanted_code)
5433 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5435 /* Make the left operand unsigned, since we are only interested
5436 in the value of one bit. Otherwise we are doing the wrong
5445 /* This is analogous to the code for l_const above. */
5446 if (rcode != wanted_code)
5448 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5457 /* See if we can find a mode that contains both fields being compared on
5458 the left. If we can't, fail. Otherwise, update all constants and masks
5459 to be relative to a field of that size. */
5460 first_bit = MIN (ll_bitpos, rl_bitpos);
5461 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5462 lnmode = get_best_mode (end_bit - first_bit, first_bit,
5463 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5465 if (lnmode == VOIDmode)
5468 lnbitsize = GET_MODE_BITSIZE (lnmode);
5469 lnbitpos = first_bit & ~ (lnbitsize - 1);
5470 lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5471 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5473 if (BYTES_BIG_ENDIAN)
5475 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5476 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5479 ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5480 size_int (xll_bitpos), 0);
5481 rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5482 size_int (xrl_bitpos), 0);
5486 l_const = fold_convert (lntype, l_const);
5487 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5488 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5489 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5490 fold_build1 (BIT_NOT_EXPR,
5494 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5496 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5501 r_const = fold_convert (lntype, r_const);
5502 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5503 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5504 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5505 fold_build1 (BIT_NOT_EXPR,
5509 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5511 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5515 /* Handle the case of comparisons with constants. If there is something in
5516 common between the masks, those bits of the constants must be the same.
5517 If not, the condition is always false. Test for this to avoid generating
5518 incorrect code below. */
5519 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5520 if (! integer_zerop (result)
5521 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5522 const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5524 if (wanted_code == NE_EXPR)
5526 warning (0, "%<or%> of unmatched not-equal tests is always 1");
5527 return constant_boolean_node (true, truth_type);
5531 warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5532 return constant_boolean_node (false, truth_type);
5539 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5543 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5546 enum tree_code op_code;
5547 tree comp_const = op1;
5549 int consts_equal, consts_lt;
5552 STRIP_SIGN_NOPS (arg0);
5554 op_code = TREE_CODE (arg0);
5555 minmax_const = TREE_OPERAND (arg0, 1);
5556 consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5557 consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5558 inner = TREE_OPERAND (arg0, 0);
5560 /* If something does not permit us to optimize, return the original tree. */
5561 if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5562 || TREE_CODE (comp_const) != INTEGER_CST
5563 || TREE_OVERFLOW (comp_const)
5564 || TREE_CODE (minmax_const) != INTEGER_CST
5565 || TREE_OVERFLOW (minmax_const))
5568 /* Now handle all the various comparison codes. We only handle EQ_EXPR
5569 and GT_EXPR, doing the rest with recursive calls using logical
5573 case NE_EXPR: case LT_EXPR: case LE_EXPR:
5575 tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5578 return invert_truthvalue (tem);
5584 fold_build2 (TRUTH_ORIF_EXPR, type,
5585 optimize_minmax_comparison
5586 (EQ_EXPR, type, arg0, comp_const),
5587 optimize_minmax_comparison
5588 (GT_EXPR, type, arg0, comp_const));
5591 if (op_code == MAX_EXPR && consts_equal)
5592 /* MAX (X, 0) == 0 -> X <= 0 */
5593 return fold_build2 (LE_EXPR, type, inner, comp_const);
5595 else if (op_code == MAX_EXPR && consts_lt)
5596 /* MAX (X, 0) == 5 -> X == 5 */
5597 return fold_build2 (EQ_EXPR, type, inner, comp_const);
5599 else if (op_code == MAX_EXPR)
5600 /* MAX (X, 0) == -1 -> false */
5601 return omit_one_operand (type, integer_zero_node, inner);
5603 else if (consts_equal)
5604 /* MIN (X, 0) == 0 -> X >= 0 */
5605 return fold_build2 (GE_EXPR, type, inner, comp_const);
5608 /* MIN (X, 0) == 5 -> false */
5609 return omit_one_operand (type, integer_zero_node, inner);
5612 /* MIN (X, 0) == -1 -> X == -1 */
5613 return fold_build2 (EQ_EXPR, type, inner, comp_const);
5616 if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5617 /* MAX (X, 0) > 0 -> X > 0
5618 MAX (X, 0) > 5 -> X > 5 */
5619 return fold_build2 (GT_EXPR, type, inner, comp_const);
5621 else if (op_code == MAX_EXPR)
5622 /* MAX (X, 0) > -1 -> true */
5623 return omit_one_operand (type, integer_one_node, inner);
5625 else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5626 /* MIN (X, 0) > 0 -> false
5627 MIN (X, 0) > 5 -> false */
5628 return omit_one_operand (type, integer_zero_node, inner);
5631 /* MIN (X, 0) > -1 -> X > -1 */
5632 return fold_build2 (GT_EXPR, type, inner, comp_const);
5639 /* T is an integer expression that is being multiplied, divided, or taken a
5640 modulus (CODE says which and what kind of divide or modulus) by a
5641 constant C. See if we can eliminate that operation by folding it with
5642 other operations already in T. WIDE_TYPE, if non-null, is a type that
5643 should be used for the computation if wider than our type.
5645 For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5646 (X * 2) + (Y * 4). We must, however, be assured that either the original
5647 expression would not overflow or that overflow is undefined for the type
5648 in the language in question.
5650 We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5651 the machine has a multiply-accumulate insn or that this is part of an
5652 addressing calculation.
5654 If we return a non-null expression, it is an equivalent form of the
5655 original computation, but need not be in the original type.
5657 We set *STRICT_OVERFLOW_P to true if the return values depends on
5658 signed overflow being undefined. Otherwise we do not change
5659 *STRICT_OVERFLOW_P. */
5662 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5663 bool *strict_overflow_p)
5665 /* To avoid exponential search depth, refuse to allow recursion past
5666 three levels. Beyond that (1) it's highly unlikely that we'll find
5667 something interesting and (2) we've probably processed it before
5668 when we built the inner expression. */
5677 ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5684 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5685 bool *strict_overflow_p)
5687 tree type = TREE_TYPE (t);
5688 enum tree_code tcode = TREE_CODE (t);
5689 tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5690 > GET_MODE_SIZE (TYPE_MODE (type)))
5691 ? wide_type : type);
5693 int same_p = tcode == code;
5694 tree op0 = NULL_TREE, op1 = NULL_TREE;
5695 bool sub_strict_overflow_p;
5697 /* Don't deal with constants of zero here; they confuse the code below. */
5698 if (integer_zerop (c))
5701 if (TREE_CODE_CLASS (tcode) == tcc_unary)
5702 op0 = TREE_OPERAND (t, 0);
5704 if (TREE_CODE_CLASS (tcode) == tcc_binary)
5705 op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5707 /* Note that we need not handle conditional operations here since fold
5708 already handles those cases. So just do arithmetic here. */
5712 /* For a constant, we can always simplify if we are a multiply
5713 or (for divide and modulus) if it is a multiple of our constant. */
5714 if (code == MULT_EXPR
5715 || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5716 return const_binop (code, fold_convert (ctype, t),
5717 fold_convert (ctype, c), 0);
5720 case CONVERT_EXPR: case NON_LVALUE_EXPR: case NOP_EXPR:
5721 /* If op0 is an expression ... */
5722 if ((COMPARISON_CLASS_P (op0)
5723 || UNARY_CLASS_P (op0)
5724 || BINARY_CLASS_P (op0)
5725 || VL_EXP_CLASS_P (op0)
5726 || EXPRESSION_CLASS_P (op0))
5727 /* ... and is unsigned, and its type is smaller than ctype,
5728 then we cannot pass through as widening. */
5729 && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5730 && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5731 && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5732 && (GET_MODE_SIZE (TYPE_MODE (ctype))
5733 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5734 /* ... or this is a truncation (t is narrower than op0),
5735 then we cannot pass through this narrowing. */
5736 || (GET_MODE_SIZE (TYPE_MODE (type))
5737 < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5738 /* ... or signedness changes for division or modulus,
5739 then we cannot pass through this conversion. */
5740 || (code != MULT_EXPR
5741 && (TYPE_UNSIGNED (ctype)
5742 != TYPE_UNSIGNED (TREE_TYPE (op0))))
5743 /* ... or has undefined overflow while the converted to
5744 type has not, we cannot do the operation in the inner type
5745 as that would introduce undefined overflow. */
5746 || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5747 && !TYPE_OVERFLOW_UNDEFINED (type))))
5750 /* Pass the constant down and see if we can make a simplification. If
5751 we can, replace this expression with the inner simplification for
5752 possible later conversion to our or some other type. */
5753 if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5754 && TREE_CODE (t2) == INTEGER_CST
5755 && !TREE_OVERFLOW (t2)
5756 && (0 != (t1 = extract_muldiv (op0, t2, code,
5758 ? ctype : NULL_TREE,
5759 strict_overflow_p))))
5764 /* If widening the type changes it from signed to unsigned, then we
5765 must avoid building ABS_EXPR itself as unsigned. */
5766 if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5768 tree cstype = (*signed_type_for) (ctype);
5769 if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5772 t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5773 return fold_convert (ctype, t1);
5777 /* If the constant is negative, we cannot simplify this. */
5778 if (tree_int_cst_sgn (c) == -1)
5782 if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5784 return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5787 case MIN_EXPR: case MAX_EXPR:
5788 /* If widening the type changes the signedness, then we can't perform
5789 this optimization as that changes the result. */
5790 if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5793 /* MIN (a, b) / 5 -> MIN (a / 5, b / 5) */
5794 sub_strict_overflow_p = false;
5795 if ((t1 = extract_muldiv (op0, c, code, wide_type,
5796 &sub_strict_overflow_p)) != 0
5797 && (t2 = extract_muldiv (op1, c, code, wide_type,
5798 &sub_strict_overflow_p)) != 0)
5800 if (tree_int_cst_sgn (c) < 0)
5801 tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5802 if (sub_strict_overflow_p)
5803 *strict_overflow_p = true;
5804 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5805 fold_convert (ctype, t2));
5809 case LSHIFT_EXPR: case RSHIFT_EXPR:
5810 /* If the second operand is constant, this is a multiplication
5811 or floor division, by a power of two, so we can treat it that
5812 way unless the multiplier or divisor overflows. Signed
5813 left-shift overflow is implementation-defined rather than
5814 undefined in C90, so do not convert signed left shift into
5816 if (TREE_CODE (op1) == INTEGER_CST
5817 && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5818 /* const_binop may not detect overflow correctly,
5819 so check for it explicitly here. */
5820 && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5821 && TREE_INT_CST_HIGH (op1) == 0
5822 && 0 != (t1 = fold_convert (ctype,
5823 const_binop (LSHIFT_EXPR,
5826 && !TREE_OVERFLOW (t1))
5827 return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5828 ? MULT_EXPR : FLOOR_DIV_EXPR,
5829 ctype, fold_convert (ctype, op0), t1),
5830 c, code, wide_type, strict_overflow_p);
5833 case PLUS_EXPR: case MINUS_EXPR:
5834 /* See if we can eliminate the operation on both sides. If we can, we
5835 can return a new PLUS or MINUS. If we can't, the only remaining
5836 cases where we can do anything are if the second operand is a
5838 sub_strict_overflow_p = false;
5839 t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5840 t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5841 if (t1 != 0 && t2 != 0
5842 && (code == MULT_EXPR
5843 /* If not multiplication, we can only do this if both operands
5844 are divisible by c. */
5845 || (multiple_of_p (ctype, op0, c)
5846 && multiple_of_p (ctype, op1, c))))
5848 if (sub_strict_overflow_p)
5849 *strict_overflow_p = true;
5850 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5851 fold_convert (ctype, t2));
5854 /* If this was a subtraction, negate OP1 and set it to be an addition.
5855 This simplifies the logic below. */
5856 if (tcode == MINUS_EXPR)
5857 tcode = PLUS_EXPR, op1 = negate_expr (op1);
5859 if (TREE_CODE (op1) != INTEGER_CST)
5862 /* If either OP1 or C are negative, this optimization is not safe for
5863 some of the division and remainder types while for others we need
5864 to change the code. */
5865 if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5867 if (code == CEIL_DIV_EXPR)
5868 code = FLOOR_DIV_EXPR;
5869 else if (code == FLOOR_DIV_EXPR)
5870 code = CEIL_DIV_EXPR;
5871 else if (code != MULT_EXPR
5872 && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5876 /* If it's a multiply or a division/modulus operation of a multiple
5877 of our constant, do the operation and verify it doesn't overflow. */
5878 if (code == MULT_EXPR
5879 || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5881 op1 = const_binop (code, fold_convert (ctype, op1),
5882 fold_convert (ctype, c), 0);
5883 /* We allow the constant to overflow with wrapping semantics. */
5885 || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5891 /* If we have an unsigned type is not a sizetype, we cannot widen
5892 the operation since it will change the result if the original
5893 computation overflowed. */
5894 if (TYPE_UNSIGNED (ctype)
5895 && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5899 /* If we were able to eliminate our operation from the first side,
5900 apply our operation to the second side and reform the PLUS. */
5901 if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5902 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5904 /* The last case is if we are a multiply. In that case, we can
5905 apply the distributive law to commute the multiply and addition
5906 if the multiplication of the constants doesn't overflow. */
5907 if (code == MULT_EXPR)
5908 return fold_build2 (tcode, ctype,
5909 fold_build2 (code, ctype,
5910 fold_convert (ctype, op0),
5911 fold_convert (ctype, c)),
5917 /* We have a special case here if we are doing something like
5918 (C * 8) % 4 since we know that's zero. */
5919 if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5920 || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5921 && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5922 && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5923 return omit_one_operand (type, integer_zero_node, op0);
5925 /* ... fall through ... */
5927 case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR:
5928 case ROUND_DIV_EXPR: case EXACT_DIV_EXPR:
5929 /* If we can extract our operation from the LHS, do so and return a
5930 new operation. Likewise for the RHS from a MULT_EXPR. Otherwise,
5931 do something only if the second operand is a constant. */
5933 && (t1 = extract_muldiv (op0, c, code, wide_type,
5934 strict_overflow_p)) != 0)
5935 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5936 fold_convert (ctype, op1));
5937 else if (tcode == MULT_EXPR && code == MULT_EXPR
5938 && (t1 = extract_muldiv (op1, c, code, wide_type,
5939 strict_overflow_p)) != 0)
5940 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5941 fold_convert (ctype, t1));
5942 else if (TREE_CODE (op1) != INTEGER_CST)
5945 /* If these are the same operation types, we can associate them
5946 assuming no overflow. */
5948 && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5949 fold_convert (ctype, c), 0))
5950 && !TREE_OVERFLOW (t1))
5951 return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5953 /* If these operations "cancel" each other, we have the main
5954 optimizations of this pass, which occur when either constant is a
5955 multiple of the other, in which case we replace this with either an
5956 operation or CODE or TCODE.
5958 If we have an unsigned type that is not a sizetype, we cannot do
5959 this since it will change the result if the original computation
5961 if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5962 || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5963 && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5964 || (tcode == MULT_EXPR
5965 && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5966 && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5967 && code != MULT_EXPR)))
5969 if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5971 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5972 *strict_overflow_p = true;
5973 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5974 fold_convert (ctype,
5975 const_binop (TRUNC_DIV_EXPR,
5978 else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5980 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5981 *strict_overflow_p = true;
5982 return fold_build2 (code, ctype, fold_convert (ctype, op0),
5983 fold_convert (ctype,
5984 const_binop (TRUNC_DIV_EXPR,
5997 /* Return a node which has the indicated constant VALUE (either 0 or
5998 1), and is of the indicated TYPE. */
6001 constant_boolean_node (int value, tree type)
6003 if (type == integer_type_node)
6004 return value ? integer_one_node : integer_zero_node;
6005 else if (type == boolean_type_node)
6006 return value ? boolean_true_node : boolean_false_node;
6008 return build_int_cst (type, value);
6012 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6013 Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here
6014 CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6015 expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the
6016 COND is the first argument to CODE; otherwise (as in the example
6017 given here), it is the second argument. TYPE is the type of the
6018 original expression. Return NULL_TREE if no simplification is
6022 fold_binary_op_with_conditional_arg (enum tree_code code,
6023 tree type, tree op0, tree op1,
6024 tree cond, tree arg, int cond_first_p)
6026 tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6027 tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6028 tree test, true_value, false_value;
6029 tree lhs = NULL_TREE;
6030 tree rhs = NULL_TREE;
6032 /* This transformation is only worthwhile if we don't have to wrap
6033 arg in a SAVE_EXPR, and the operation can be simplified on at least
6034 one of the branches once its pushed inside the COND_EXPR. */
6035 if (!TREE_CONSTANT (arg))
6038 if (TREE_CODE (cond) == COND_EXPR)
6040 test = TREE_OPERAND (cond, 0);
6041 true_value = TREE_OPERAND (cond, 1);
6042 false_value = TREE_OPERAND (cond, 2);
6043 /* If this operand throws an expression, then it does not make
6044 sense to try to perform a logical or arithmetic operation
6046 if (VOID_TYPE_P (TREE_TYPE (true_value)))
6048 if (VOID_TYPE_P (TREE_TYPE (false_value)))
6053 tree testtype = TREE_TYPE (cond);
6055 true_value = constant_boolean_node (true, testtype);
6056 false_value = constant_boolean_node (false, testtype);
6059 arg = fold_convert (arg_type, arg);
6062 true_value = fold_convert (cond_type, true_value);
6064 lhs = fold_build2 (code, type, true_value, arg);
6066 lhs = fold_build2 (code, type, arg, true_value);
6070 false_value = fold_convert (cond_type, false_value);
6072 rhs = fold_build2 (code, type, false_value, arg);
6074 rhs = fold_build2 (code, type, arg, false_value);
6077 test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6078 return fold_convert (type, test);
6082 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6084 If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6085 TYPE, X + ADDEND is the same as X. If NEGATE, return true if X -
6086 ADDEND is the same as X.
6088 X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6089 and finite. The problematic cases are when X is zero, and its mode
6090 has signed zeros. In the case of rounding towards -infinity,
6091 X - 0 is not the same as X because 0 - 0 is -0. In other rounding
6092 modes, X + 0 is not the same as X because -0 + 0 is 0. */
6095 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6097 if (!real_zerop (addend))
6100 /* Don't allow the fold with -fsignaling-nans. */
6101 if (HONOR_SNANS (TYPE_MODE (type)))
6104 /* Allow the fold if zeros aren't signed, or their sign isn't important. */
6105 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6108 /* Treat x + -0 as x - 0 and x - -0 as x + 0. */
6109 if (TREE_CODE (addend) == REAL_CST
6110 && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6113 /* The mode has signed zeros, and we have to honor their sign.
6114 In this situation, there is only one case we can return true for.
6115 X - 0 is the same as X unless rounding towards -infinity is
6117 return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6120 /* Subroutine of fold() that checks comparisons of built-in math
6121 functions against real constants.
6123 FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6124 operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR. TYPE
6125 is the type of the result and ARG0 and ARG1 are the operands of the
6126 comparison. ARG1 must be a TREE_REAL_CST.
6128 The function returns the constant folded tree if a simplification
6129 can be made, and NULL_TREE otherwise. */
6132 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6133 tree type, tree arg0, tree arg1)
6137 if (BUILTIN_SQRT_P (fcode))
6139 tree arg = CALL_EXPR_ARG (arg0, 0);
6140 enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6142 c = TREE_REAL_CST (arg1);
6143 if (REAL_VALUE_NEGATIVE (c))
6145 /* sqrt(x) < y is always false, if y is negative. */
6146 if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6147 return omit_one_operand (type, integer_zero_node, arg);
6149 /* sqrt(x) > y is always true, if y is negative and we
6150 don't care about NaNs, i.e. negative values of x. */
6151 if (code == NE_EXPR || !HONOR_NANS (mode))
6152 return omit_one_operand (type, integer_one_node, arg);
6154 /* sqrt(x) > y is the same as x >= 0, if y is negative. */
6155 return fold_build2 (GE_EXPR, type, arg,
6156 build_real (TREE_TYPE (arg), dconst0));
6158 else if (code == GT_EXPR || code == GE_EXPR)
6162 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6163 real_convert (&c2, mode, &c2);
6165 if (REAL_VALUE_ISINF (c2))
6167 /* sqrt(x) > y is x == +Inf, when y is very large. */
6168 if (HONOR_INFINITIES (mode))
6169 return fold_build2 (EQ_EXPR, type, arg,
6170 build_real (TREE_TYPE (arg), c2));
6172 /* sqrt(x) > y is always false, when y is very large
6173 and we don't care about infinities. */
6174 return omit_one_operand (type, integer_zero_node, arg);
6177 /* sqrt(x) > c is the same as x > c*c. */
6178 return fold_build2 (code, type, arg,
6179 build_real (TREE_TYPE (arg), c2));
6181 else if (code == LT_EXPR || code == LE_EXPR)
6185 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6186 real_convert (&c2, mode, &c2);
6188 if (REAL_VALUE_ISINF (c2))
6190 /* sqrt(x) < y is always true, when y is a very large
6191 value and we don't care about NaNs or Infinities. */
6192 if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6193 return omit_one_operand (type, integer_one_node, arg);
6195 /* sqrt(x) < y is x != +Inf when y is very large and we
6196 don't care about NaNs. */
6197 if (! HONOR_NANS (mode))
6198 return fold_build2 (NE_EXPR, type, arg,
6199 build_real (TREE_TYPE (arg), c2));
6201 /* sqrt(x) < y is x >= 0 when y is very large and we
6202 don't care about Infinities. */
6203 if (! HONOR_INFINITIES (mode))
6204 return fold_build2 (GE_EXPR, type, arg,
6205 build_real (TREE_TYPE (arg), dconst0));
6207 /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */
6208 if (lang_hooks.decls.global_bindings_p () != 0
6209 || CONTAINS_PLACEHOLDER_P (arg))
6212 arg = save_expr (arg);
6213 return fold_build2 (TRUTH_ANDIF_EXPR, type,
6214 fold_build2 (GE_EXPR, type, arg,
6215 build_real (TREE_TYPE (arg),
6217 fold_build2 (NE_EXPR, type, arg,
6218 build_real (TREE_TYPE (arg),
6222 /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */
6223 if (! HONOR_NANS (mode))
6224 return fold_build2 (code, type, arg,
6225 build_real (TREE_TYPE (arg), c2));
6227 /* sqrt(x) < c is the same as x >= 0 && x < c*c. */
6228 if (lang_hooks.decls.global_bindings_p () == 0
6229 && ! CONTAINS_PLACEHOLDER_P (arg))
6231 arg = save_expr (arg);
6232 return fold_build2 (TRUTH_ANDIF_EXPR, type,
6233 fold_build2 (GE_EXPR, type, arg,
6234 build_real (TREE_TYPE (arg),
6236 fold_build2 (code, type, arg,
6237 build_real (TREE_TYPE (arg),
6246 /* Subroutine of fold() that optimizes comparisons against Infinities,
6247 either +Inf or -Inf.
6249 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6250 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6251 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6253 The function returns the constant folded tree if a simplification
6254 can be made, and NULL_TREE otherwise. */
6257 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6259 enum machine_mode mode;
6260 REAL_VALUE_TYPE max;
6264 mode = TYPE_MODE (TREE_TYPE (arg0));
6266 /* For negative infinity swap the sense of the comparison. */
6267 neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6269 code = swap_tree_comparison (code);
6274 /* x > +Inf is always false, if with ignore sNANs. */
6275 if (HONOR_SNANS (mode))
6277 return omit_one_operand (type, integer_zero_node, arg0);
6280 /* x <= +Inf is always true, if we don't case about NaNs. */
6281 if (! HONOR_NANS (mode))
6282 return omit_one_operand (type, integer_one_node, arg0);
6284 /* x <= +Inf is the same as x == x, i.e. isfinite(x). */
6285 if (lang_hooks.decls.global_bindings_p () == 0
6286 && ! CONTAINS_PLACEHOLDER_P (arg0))
6288 arg0 = save_expr (arg0);
6289 return fold_build2 (EQ_EXPR, type, arg0, arg0);
6295 /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX. */
6296 real_maxval (&max, neg, mode);
6297 return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6298 arg0, build_real (TREE_TYPE (arg0), max));
6301 /* x < +Inf is always equal to x <= DBL_MAX. */
6302 real_maxval (&max, neg, mode);
6303 return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6304 arg0, build_real (TREE_TYPE (arg0), max));
6307 /* x != +Inf is always equal to !(x > DBL_MAX). */
6308 real_maxval (&max, neg, mode);
6309 if (! HONOR_NANS (mode))
6310 return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6311 arg0, build_real (TREE_TYPE (arg0), max));
6313 temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6314 arg0, build_real (TREE_TYPE (arg0), max));
6315 return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6324 /* Subroutine of fold() that optimizes comparisons of a division by
6325 a nonzero integer constant against an integer constant, i.e.
6328 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6329 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6330 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6332 The function returns the constant folded tree if a simplification
6333 can be made, and NULL_TREE otherwise. */
6336 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6338 tree prod, tmp, hi, lo;
6339 tree arg00 = TREE_OPERAND (arg0, 0);
6340 tree arg01 = TREE_OPERAND (arg0, 1);
6341 unsigned HOST_WIDE_INT lpart;
6342 HOST_WIDE_INT hpart;
6343 bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6347 /* We have to do this the hard way to detect unsigned overflow.
6348 prod = int_const_binop (MULT_EXPR, arg01, arg1, 0); */
6349 overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6350 TREE_INT_CST_HIGH (arg01),
6351 TREE_INT_CST_LOW (arg1),
6352 TREE_INT_CST_HIGH (arg1),
6353 &lpart, &hpart, unsigned_p);
6354 prod = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6356 neg_overflow = false;
6360 tmp = int_const_binop (MINUS_EXPR, arg01,
6361 build_int_cst (TREE_TYPE (arg01), 1), 0);
6364 /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0). */
6365 overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6366 TREE_INT_CST_HIGH (prod),
6367 TREE_INT_CST_LOW (tmp),
6368 TREE_INT_CST_HIGH (tmp),
6369 &lpart, &hpart, unsigned_p);
6370 hi = force_fit_type_double (TREE_TYPE (arg00), lpart, hpart,
6371 -1, overflow | TREE_OVERFLOW (prod));
6373 else if (tree_int_cst_sgn (arg01) >= 0)
6375 tmp = int_const_binop (MINUS_EXPR, arg01,
6376 build_int_cst (TREE_TYPE (arg01), 1), 0);
6377 switch (tree_int_cst_sgn (arg1))
6380 neg_overflow = true;
6381 lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6386 lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6391 hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6401 /* A negative divisor reverses the relational operators. */
6402 code = swap_tree_comparison (code);
6404 tmp = int_const_binop (PLUS_EXPR, arg01,
6405 build_int_cst (TREE_TYPE (arg01), 1), 0);
6406 switch (tree_int_cst_sgn (arg1))
6409 hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6414 hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6419 neg_overflow = true;
6420 lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6432 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6433 return omit_one_operand (type, integer_zero_node, arg00);
6434 if (TREE_OVERFLOW (hi))
6435 return fold_build2 (GE_EXPR, type, arg00, lo);
6436 if (TREE_OVERFLOW (lo))
6437 return fold_build2 (LE_EXPR, type, arg00, hi);
6438 return build_range_check (type, arg00, 1, lo, hi);
6441 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6442 return omit_one_operand (type, integer_one_node, arg00);
6443 if (TREE_OVERFLOW (hi))
6444 return fold_build2 (LT_EXPR, type, arg00, lo);
6445 if (TREE_OVERFLOW (lo))
6446 return fold_build2 (GT_EXPR, type, arg00, hi);
6447 return build_range_check (type, arg00, 0, lo, hi);
6450 if (TREE_OVERFLOW (lo))
6452 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6453 return omit_one_operand (type, tmp, arg00);
6455 return fold_build2 (LT_EXPR, type, arg00, lo);
6458 if (TREE_OVERFLOW (hi))
6460 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6461 return omit_one_operand (type, tmp, arg00);
6463 return fold_build2 (LE_EXPR, type, arg00, hi);
6466 if (TREE_OVERFLOW (hi))
6468 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6469 return omit_one_operand (type, tmp, arg00);
6471 return fold_build2 (GT_EXPR, type, arg00, hi);
6474 if (TREE_OVERFLOW (lo))
6476 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6477 return omit_one_operand (type, tmp, arg00);
6479 return fold_build2 (GE_EXPR, type, arg00, lo);
6489 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6490 equality/inequality test, then return a simplified form of the test
6491 using a sign testing. Otherwise return NULL. TYPE is the desired
6495 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6498 /* If this is testing a single bit, we can optimize the test. */
6499 if ((code == NE_EXPR || code == EQ_EXPR)
6500 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6501 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6503 /* If we have (A & C) != 0 where C is the sign bit of A, convert
6504 this into A < 0. Similarly for (A & C) == 0 into A >= 0. */
6505 tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6507 if (arg00 != NULL_TREE
6508 /* This is only a win if casting to a signed type is cheap,
6509 i.e. when arg00's type is not a partial mode. */
6510 && TYPE_PRECISION (TREE_TYPE (arg00))
6511 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6513 tree stype = signed_type_for (TREE_TYPE (arg00));
6514 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6515 result_type, fold_convert (stype, arg00),
6516 build_int_cst (stype, 0));
6523 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6524 equality/inequality test, then return a simplified form of
6525 the test using shifts and logical operations. Otherwise return
6526 NULL. TYPE is the desired result type. */
6529 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6532 /* If this is testing a single bit, we can optimize the test. */
6533 if ((code == NE_EXPR || code == EQ_EXPR)
6534 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6535 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6537 tree inner = TREE_OPERAND (arg0, 0);
6538 tree type = TREE_TYPE (arg0);
6539 int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6540 enum machine_mode operand_mode = TYPE_MODE (type);
6542 tree signed_type, unsigned_type, intermediate_type;
6545 /* First, see if we can fold the single bit test into a sign-bit
6547 tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6552 /* Otherwise we have (A & C) != 0 where C is a single bit,
6553 convert that into ((A >> C2) & 1). Where C2 = log2(C).
6554 Similarly for (A & C) == 0. */
6556 /* If INNER is a right shift of a constant and it plus BITNUM does
6557 not overflow, adjust BITNUM and INNER. */
6558 if (TREE_CODE (inner) == RSHIFT_EXPR
6559 && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6560 && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6561 && bitnum < TYPE_PRECISION (type)
6562 && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6563 bitnum - TYPE_PRECISION (type)))
6565 bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6566 inner = TREE_OPERAND (inner, 0);
6569 /* If we are going to be able to omit the AND below, we must do our
6570 operations as unsigned. If we must use the AND, we have a choice.
6571 Normally unsigned is faster, but for some machines signed is. */
6572 #ifdef LOAD_EXTEND_OP
6573 ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
6574 && !flag_syntax_only) ? 0 : 1;
6579 signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6580 unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6581 intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6582 inner = fold_convert (intermediate_type, inner);
6585 inner = build2 (RSHIFT_EXPR, intermediate_type,
6586 inner, size_int (bitnum));
6588 one = build_int_cst (intermediate_type, 1);
6590 if (code == EQ_EXPR)
6591 inner = fold_build2 (BIT_XOR_EXPR, intermediate_type, inner, one);
6593 /* Put the AND last so it can combine with more things. */
6594 inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6596 /* Make sure to return the proper type. */
6597 inner = fold_convert (result_type, inner);
6604 /* Check whether we are allowed to reorder operands arg0 and arg1,
6605 such that the evaluation of arg1 occurs before arg0. */
6608 reorder_operands_p (const_tree arg0, const_tree arg1)
6610 if (! flag_evaluation_order)
6612 if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6614 return ! TREE_SIDE_EFFECTS (arg0)
6615 && ! TREE_SIDE_EFFECTS (arg1);
6618 /* Test whether it is preferable two swap two operands, ARG0 and
6619 ARG1, for example because ARG0 is an integer constant and ARG1
6620 isn't. If REORDER is true, only recommend swapping if we can
6621 evaluate the operands in reverse order. */
6624 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6626 STRIP_SIGN_NOPS (arg0);
6627 STRIP_SIGN_NOPS (arg1);
6629 if (TREE_CODE (arg1) == INTEGER_CST)
6631 if (TREE_CODE (arg0) == INTEGER_CST)
6634 if (TREE_CODE (arg1) == REAL_CST)
6636 if (TREE_CODE (arg0) == REAL_CST)
6639 if (TREE_CODE (arg1) == FIXED_CST)
6641 if (TREE_CODE (arg0) == FIXED_CST)
6644 if (TREE_CODE (arg1) == COMPLEX_CST)
6646 if (TREE_CODE (arg0) == COMPLEX_CST)
6649 if (TREE_CONSTANT (arg1))
6651 if (TREE_CONSTANT (arg0))
6657 if (reorder && flag_evaluation_order
6658 && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6661 /* It is preferable to swap two SSA_NAME to ensure a canonical form
6662 for commutative and comparison operators. Ensuring a canonical
6663 form allows the optimizers to find additional redundancies without
6664 having to explicitly check for both orderings. */
6665 if (TREE_CODE (arg0) == SSA_NAME
6666 && TREE_CODE (arg1) == SSA_NAME
6667 && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6670 /* Put SSA_NAMEs last. */
6671 if (TREE_CODE (arg1) == SSA_NAME)
6673 if (TREE_CODE (arg0) == SSA_NAME)
6676 /* Put variables last. */
6685 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6686 ARG0 is extended to a wider type. */
6689 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6691 tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6693 tree shorter_type, outer_type;
6697 if (arg0_unw == arg0)
6699 shorter_type = TREE_TYPE (arg0_unw);
6701 #ifdef HAVE_canonicalize_funcptr_for_compare
6702 /* Disable this optimization if we're casting a function pointer
6703 type on targets that require function pointer canonicalization. */
6704 if (HAVE_canonicalize_funcptr_for_compare
6705 && TREE_CODE (shorter_type) == POINTER_TYPE
6706 && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6710 if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6713 arg1_unw = get_unwidened (arg1, NULL_TREE);
6715 /* If possible, express the comparison in the shorter mode. */
6716 if ((code == EQ_EXPR || code == NE_EXPR
6717 || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6718 && (TREE_TYPE (arg1_unw) == shorter_type
6719 || (TYPE_PRECISION (shorter_type)
6720 >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6721 || (TREE_CODE (arg1_unw) == INTEGER_CST
6722 && (TREE_CODE (shorter_type) == INTEGER_TYPE
6723 || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6724 && int_fits_type_p (arg1_unw, shorter_type))))
6725 return fold_build2 (code, type, arg0_unw,
6726 fold_convert (shorter_type, arg1_unw));
6728 if (TREE_CODE (arg1_unw) != INTEGER_CST
6729 || TREE_CODE (shorter_type) != INTEGER_TYPE
6730 || !int_fits_type_p (arg1_unw, shorter_type))
6733 /* If we are comparing with the integer that does not fit into the range
6734 of the shorter type, the result is known. */
6735 outer_type = TREE_TYPE (arg1_unw);
6736 min = lower_bound_in_type (outer_type, shorter_type);
6737 max = upper_bound_in_type (outer_type, shorter_type);
6739 above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6741 below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6748 return omit_one_operand (type, integer_zero_node, arg0);
6753 return omit_one_operand (type, integer_one_node, arg0);
6759 return omit_one_operand (type, integer_one_node, arg0);
6761 return omit_one_operand (type, integer_zero_node, arg0);
6766 return omit_one_operand (type, integer_zero_node, arg0);
6768 return omit_one_operand (type, integer_one_node, arg0);
6777 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6778 ARG0 just the signedness is changed. */
6781 fold_sign_changed_comparison (enum tree_code code, tree type,
6782 tree arg0, tree arg1)
6785 tree inner_type, outer_type;
6787 if (TREE_CODE (arg0) != NOP_EXPR
6788 && TREE_CODE (arg0) != CONVERT_EXPR)
6791 outer_type = TREE_TYPE (arg0);
6792 arg0_inner = TREE_OPERAND (arg0, 0);
6793 inner_type = TREE_TYPE (arg0_inner);
6795 #ifdef HAVE_canonicalize_funcptr_for_compare
6796 /* Disable this optimization if we're casting a function pointer
6797 type on targets that require function pointer canonicalization. */
6798 if (HAVE_canonicalize_funcptr_for_compare
6799 && TREE_CODE (inner_type) == POINTER_TYPE
6800 && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6804 if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6807 if (TREE_CODE (arg1) != INTEGER_CST
6808 && !((TREE_CODE (arg1) == NOP_EXPR
6809 || TREE_CODE (arg1) == CONVERT_EXPR)
6810 && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6813 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6818 if (TREE_CODE (arg1) == INTEGER_CST)
6819 arg1 = force_fit_type_double (inner_type, TREE_INT_CST_LOW (arg1),
6820 TREE_INT_CST_HIGH (arg1), 0,
6821 TREE_OVERFLOW (arg1));
6823 arg1 = fold_convert (inner_type, arg1);
6825 return fold_build2 (code, type, arg0_inner, arg1);
6828 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6829 step of the array. Reconstructs s and delta in the case of s * delta
6830 being an integer constant (and thus already folded).
6831 ADDR is the address. MULT is the multiplicative expression.
6832 If the function succeeds, the new address expression is returned. Otherwise
6833 NULL_TREE is returned. */
6836 try_move_mult_to_index (tree addr, tree op1)
6838 tree s, delta, step;
6839 tree ref = TREE_OPERAND (addr, 0), pref;
6844 /* Strip the nops that might be added when converting op1 to sizetype. */
6847 /* Canonicalize op1 into a possibly non-constant delta
6848 and an INTEGER_CST s. */
6849 if (TREE_CODE (op1) == MULT_EXPR)
6851 tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6856 if (TREE_CODE (arg0) == INTEGER_CST)
6861 else if (TREE_CODE (arg1) == INTEGER_CST)
6869 else if (TREE_CODE (op1) == INTEGER_CST)
6876 /* Simulate we are delta * 1. */
6878 s = integer_one_node;
6881 for (;; ref = TREE_OPERAND (ref, 0))
6883 if (TREE_CODE (ref) == ARRAY_REF)
6885 /* Remember if this was a multi-dimensional array. */
6886 if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6889 itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6893 step = array_ref_element_size (ref);
6894 if (TREE_CODE (step) != INTEGER_CST)
6899 if (! tree_int_cst_equal (step, s))
6904 /* Try if delta is a multiple of step. */
6905 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6911 /* Only fold here if we can verify we do not overflow one
6912 dimension of a multi-dimensional array. */
6917 if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
6918 || !INTEGRAL_TYPE_P (itype)
6919 || !TYPE_MAX_VALUE (itype)
6920 || TREE_CODE (TYPE_MAX_VALUE (itype)) != INTEGER_CST)
6923 tmp = fold_binary (PLUS_EXPR, itype,
6924 fold_convert (itype,
6925 TREE_OPERAND (ref, 1)),
6926 fold_convert (itype, delta));
6928 || TREE_CODE (tmp) != INTEGER_CST
6929 || tree_int_cst_lt (TYPE_MAX_VALUE (itype), tmp))
6938 if (!handled_component_p (ref))
6942 /* We found the suitable array reference. So copy everything up to it,
6943 and replace the index. */
6945 pref = TREE_OPERAND (addr, 0);
6946 ret = copy_node (pref);
6951 pref = TREE_OPERAND (pref, 0);
6952 TREE_OPERAND (pos, 0) = copy_node (pref);
6953 pos = TREE_OPERAND (pos, 0);
6956 TREE_OPERAND (pos, 1) = fold_build2 (PLUS_EXPR, itype,
6957 fold_convert (itype,
6958 TREE_OPERAND (pos, 1)),
6959 fold_convert (itype, delta));
6961 return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6965 /* Fold A < X && A + 1 > Y to A < X && A >= Y. Normally A + 1 > Y
6966 means A >= Y && A != MAX, but in this case we know that
6967 A < X <= MAX. INEQ is A + 1 > Y, BOUND is A < X. */
6970 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6972 tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6974 if (TREE_CODE (bound) == LT_EXPR)
6975 a = TREE_OPERAND (bound, 0);
6976 else if (TREE_CODE (bound) == GT_EXPR)
6977 a = TREE_OPERAND (bound, 1);
6981 typea = TREE_TYPE (a);
6982 if (!INTEGRAL_TYPE_P (typea)
6983 && !POINTER_TYPE_P (typea))
6986 if (TREE_CODE (ineq) == LT_EXPR)
6988 a1 = TREE_OPERAND (ineq, 1);
6989 y = TREE_OPERAND (ineq, 0);
6991 else if (TREE_CODE (ineq) == GT_EXPR)
6993 a1 = TREE_OPERAND (ineq, 0);
6994 y = TREE_OPERAND (ineq, 1);
6999 if (TREE_TYPE (a1) != typea)
7002 if (POINTER_TYPE_P (typea))
7004 /* Convert the pointer types into integer before taking the difference. */
7005 tree ta = fold_convert (ssizetype, a);
7006 tree ta1 = fold_convert (ssizetype, a1);
7007 diff = fold_binary (MINUS_EXPR, ssizetype, ta1, ta);
7010 diff = fold_binary (MINUS_EXPR, typea, a1, a);
7012 if (!diff || !integer_onep (diff))
7015 return fold_build2 (GE_EXPR, type, a, y);
7018 /* Fold a sum or difference of at least one multiplication.
7019 Returns the folded tree or NULL if no simplification could be made. */
7022 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
7024 tree arg00, arg01, arg10, arg11;
7025 tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7027 /* (A * C) +- (B * C) -> (A+-B) * C.
7028 (A * C) +- A -> A * (C+-1).
7029 We are most concerned about the case where C is a constant,
7030 but other combinations show up during loop reduction. Since
7031 it is not difficult, try all four possibilities. */
7033 if (TREE_CODE (arg0) == MULT_EXPR)
7035 arg00 = TREE_OPERAND (arg0, 0);
7036 arg01 = TREE_OPERAND (arg0, 1);
7038 else if (TREE_CODE (arg0) == INTEGER_CST)
7040 arg00 = build_one_cst (type);
7045 /* We cannot generate constant 1 for fract. */
7046 if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7049 arg01 = build_one_cst (type);
7051 if (TREE_CODE (arg1) == MULT_EXPR)
7053 arg10 = TREE_OPERAND (arg1, 0);
7054 arg11 = TREE_OPERAND (arg1, 1);
7056 else if (TREE_CODE (arg1) == INTEGER_CST)
7058 arg10 = build_one_cst (type);
7063 /* We cannot generate constant 1 for fract. */
7064 if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7067 arg11 = build_one_cst (type);
7071 if (operand_equal_p (arg01, arg11, 0))
7072 same = arg01, alt0 = arg00, alt1 = arg10;
7073 else if (operand_equal_p (arg00, arg10, 0))
7074 same = arg00, alt0 = arg01, alt1 = arg11;
7075 else if (operand_equal_p (arg00, arg11, 0))
7076 same = arg00, alt0 = arg01, alt1 = arg10;
7077 else if (operand_equal_p (arg01, arg10, 0))
7078 same = arg01, alt0 = arg00, alt1 = arg11;
7080 /* No identical multiplicands; see if we can find a common
7081 power-of-two factor in non-power-of-two multiplies. This
7082 can help in multi-dimensional array access. */
7083 else if (host_integerp (arg01, 0)
7084 && host_integerp (arg11, 0))
7086 HOST_WIDE_INT int01, int11, tmp;
7089 int01 = TREE_INT_CST_LOW (arg01);
7090 int11 = TREE_INT_CST_LOW (arg11);
7092 /* Move min of absolute values to int11. */
7093 if ((int01 >= 0 ? int01 : -int01)
7094 < (int11 >= 0 ? int11 : -int11))
7096 tmp = int01, int01 = int11, int11 = tmp;
7097 alt0 = arg00, arg00 = arg10, arg10 = alt0;
7104 if (exact_log2 (abs (int11)) > 0 && int01 % int11 == 0)
7106 alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
7107 build_int_cst (TREE_TYPE (arg00),
7112 maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7117 return fold_build2 (MULT_EXPR, type,
7118 fold_build2 (code, type,
7119 fold_convert (type, alt0),
7120 fold_convert (type, alt1)),
7121 fold_convert (type, same));
7126 /* Subroutine of native_encode_expr. Encode the INTEGER_CST
7127 specified by EXPR into the buffer PTR of length LEN bytes.
7128 Return the number of bytes placed in the buffer, or zero
7132 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7134 tree type = TREE_TYPE (expr);
7135 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7136 int byte, offset, word, words;
7137 unsigned char value;
7139 if (total_bytes > len)
7141 words = total_bytes / UNITS_PER_WORD;
7143 for (byte = 0; byte < total_bytes; byte++)
7145 int bitpos = byte * BITS_PER_UNIT;
7146 if (bitpos < HOST_BITS_PER_WIDE_INT)
7147 value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7149 value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7150 >> (bitpos - HOST_BITS_PER_WIDE_INT));
7152 if (total_bytes > UNITS_PER_WORD)
7154 word = byte / UNITS_PER_WORD;
7155 if (WORDS_BIG_ENDIAN)
7156 word = (words - 1) - word;
7157 offset = word * UNITS_PER_WORD;
7158 if (BYTES_BIG_ENDIAN)
7159 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7161 offset += byte % UNITS_PER_WORD;
7164 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7165 ptr[offset] = value;
7171 /* Subroutine of native_encode_expr. Encode the REAL_CST
7172 specified by EXPR into the buffer PTR of length LEN bytes.
7173 Return the number of bytes placed in the buffer, or zero
7177 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7179 tree type = TREE_TYPE (expr);
7180 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7181 int byte, offset, word, words, bitpos;
7182 unsigned char value;
7184 /* There are always 32 bits in each long, no matter the size of
7185 the hosts long. We handle floating point representations with
7189 if (total_bytes > len)
7191 words = 32 / UNITS_PER_WORD;
7193 real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7195 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7196 bitpos += BITS_PER_UNIT)
7198 byte = (bitpos / BITS_PER_UNIT) & 3;
7199 value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7201 if (UNITS_PER_WORD < 4)
7203 word = byte / UNITS_PER_WORD;
7204 if (WORDS_BIG_ENDIAN)
7205 word = (words - 1) - word;
7206 offset = word * UNITS_PER_WORD;
7207 if (BYTES_BIG_ENDIAN)
7208 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7210 offset += byte % UNITS_PER_WORD;
7213 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7214 ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7219 /* Subroutine of native_encode_expr. Encode the COMPLEX_CST
7220 specified by EXPR into the buffer PTR of length LEN bytes.
7221 Return the number of bytes placed in the buffer, or zero
7225 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7230 part = TREE_REALPART (expr);
7231 rsize = native_encode_expr (part, ptr, len);
7234 part = TREE_IMAGPART (expr);
7235 isize = native_encode_expr (part, ptr+rsize, len-rsize);
7238 return rsize + isize;
7242 /* Subroutine of native_encode_expr. Encode the VECTOR_CST
7243 specified by EXPR into the buffer PTR of length LEN bytes.
7244 Return the number of bytes placed in the buffer, or zero
7248 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7250 int i, size, offset, count;
7251 tree itype, elem, elements;
7254 elements = TREE_VECTOR_CST_ELTS (expr);
7255 count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7256 itype = TREE_TYPE (TREE_TYPE (expr));
7257 size = GET_MODE_SIZE (TYPE_MODE (itype));
7258 for (i = 0; i < count; i++)
7262 elem = TREE_VALUE (elements);
7263 elements = TREE_CHAIN (elements);
7270 if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7275 if (offset + size > len)
7277 memset (ptr+offset, 0, size);
7285 /* Subroutine of fold_view_convert_expr. Encode the INTEGER_CST,
7286 REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7287 buffer PTR of length LEN bytes. Return the number of bytes
7288 placed in the buffer, or zero upon failure. */
7291 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7293 switch (TREE_CODE (expr))
7296 return native_encode_int (expr, ptr, len);
7299 return native_encode_real (expr, ptr, len);
7302 return native_encode_complex (expr, ptr, len);
7305 return native_encode_vector (expr, ptr, len);
7313 /* Subroutine of native_interpret_expr. Interpret the contents of
7314 the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7315 If the buffer cannot be interpreted, return NULL_TREE. */
7318 native_interpret_int (tree type, const unsigned char *ptr, int len)
7320 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7321 int byte, offset, word, words;
7322 unsigned char value;
7323 unsigned int HOST_WIDE_INT lo = 0;
7324 HOST_WIDE_INT hi = 0;
7326 if (total_bytes > len)
7328 if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7330 words = total_bytes / UNITS_PER_WORD;
7332 for (byte = 0; byte < total_bytes; byte++)
7334 int bitpos = byte * BITS_PER_UNIT;
7335 if (total_bytes > UNITS_PER_WORD)
7337 word = byte / UNITS_PER_WORD;
7338 if (WORDS_BIG_ENDIAN)
7339 word = (words - 1) - word;
7340 offset = word * UNITS_PER_WORD;
7341 if (BYTES_BIG_ENDIAN)
7342 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7344 offset += byte % UNITS_PER_WORD;
7347 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7348 value = ptr[offset];
7350 if (bitpos < HOST_BITS_PER_WIDE_INT)
7351 lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7353 hi |= (unsigned HOST_WIDE_INT) value
7354 << (bitpos - HOST_BITS_PER_WIDE_INT);
7357 return build_int_cst_wide_type (type, lo, hi);
7361 /* Subroutine of native_interpret_expr. Interpret the contents of
7362 the buffer PTR of length LEN as a REAL_CST of type TYPE.
7363 If the buffer cannot be interpreted, return NULL_TREE. */
7366 native_interpret_real (tree type, const unsigned char *ptr, int len)
7368 enum machine_mode mode = TYPE_MODE (type);
7369 int total_bytes = GET_MODE_SIZE (mode);
7370 int byte, offset, word, words, bitpos;
7371 unsigned char value;
7372 /* There are always 32 bits in each long, no matter the size of
7373 the hosts long. We handle floating point representations with
7378 total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7379 if (total_bytes > len || total_bytes > 24)
7381 words = 32 / UNITS_PER_WORD;
7383 memset (tmp, 0, sizeof (tmp));
7384 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7385 bitpos += BITS_PER_UNIT)
7387 byte = (bitpos / BITS_PER_UNIT) & 3;
7388 if (UNITS_PER_WORD < 4)
7390 word = byte / UNITS_PER_WORD;
7391 if (WORDS_BIG_ENDIAN)
7392 word = (words - 1) - word;
7393 offset = word * UNITS_PER_WORD;
7394 if (BYTES_BIG_ENDIAN)
7395 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7397 offset += byte % UNITS_PER_WORD;
7400 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7401 value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7403 tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7406 real_from_target (&r, tmp, mode);
7407 return build_real (type, r);
7411 /* Subroutine of native_interpret_expr. Interpret the contents of
7412 the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7413 If the buffer cannot be interpreted, return NULL_TREE. */
7416 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7418 tree etype, rpart, ipart;
7421 etype = TREE_TYPE (type);
7422 size = GET_MODE_SIZE (TYPE_MODE (etype));
7425 rpart = native_interpret_expr (etype, ptr, size);
7428 ipart = native_interpret_expr (etype, ptr+size, size);
7431 return build_complex (type, rpart, ipart);
7435 /* Subroutine of native_interpret_expr. Interpret the contents of
7436 the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7437 If the buffer cannot be interpreted, return NULL_TREE. */
7440 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7442 tree etype, elem, elements;
7445 etype = TREE_TYPE (type);
7446 size = GET_MODE_SIZE (TYPE_MODE (etype));
7447 count = TYPE_VECTOR_SUBPARTS (type);
7448 if (size * count > len)
7451 elements = NULL_TREE;
7452 for (i = count - 1; i >= 0; i--)
7454 elem = native_interpret_expr (etype, ptr+(i*size), size);
7457 elements = tree_cons (NULL_TREE, elem, elements);
7459 return build_vector (type, elements);
7463 /* Subroutine of fold_view_convert_expr. Interpret the contents of
7464 the buffer PTR of length LEN as a constant of type TYPE. For
7465 INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7466 we return a REAL_CST, etc... If the buffer cannot be interpreted,
7467 return NULL_TREE. */
7470 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7472 switch (TREE_CODE (type))
7477 return native_interpret_int (type, ptr, len);
7480 return native_interpret_real (type, ptr, len);
7483 return native_interpret_complex (type, ptr, len);
7486 return native_interpret_vector (type, ptr, len);
7494 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7495 TYPE at compile-time. If we're unable to perform the conversion
7496 return NULL_TREE. */
7499 fold_view_convert_expr (tree type, tree expr)
7501 /* We support up to 512-bit values (for V8DFmode). */
7502 unsigned char buffer[64];
7505 /* Check that the host and target are sane. */
7506 if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7509 len = native_encode_expr (expr, buffer, sizeof (buffer));
7513 return native_interpret_expr (type, buffer, len);
7516 /* Build an expression for the address of T. Folds away INDIRECT_REF
7517 to avoid confusing the gimplify process. When IN_FOLD is true
7518 avoid modifications of T. */
7521 build_fold_addr_expr_with_type_1 (tree t, tree ptrtype, bool in_fold)
7523 /* The size of the object is not relevant when talking about its address. */
7524 if (TREE_CODE (t) == WITH_SIZE_EXPR)
7525 t = TREE_OPERAND (t, 0);
7527 /* Note: doesn't apply to ALIGN_INDIRECT_REF */
7528 if (TREE_CODE (t) == INDIRECT_REF
7529 || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
7531 t = TREE_OPERAND (t, 0);
7533 if (TREE_TYPE (t) != ptrtype)
7534 t = build1 (NOP_EXPR, ptrtype, t);
7540 while (handled_component_p (base))
7541 base = TREE_OPERAND (base, 0);
7544 TREE_ADDRESSABLE (base) = 1;
7546 t = build1 (ADDR_EXPR, ptrtype, t);
7549 t = build1 (ADDR_EXPR, ptrtype, t);
7554 /* Build an expression for the address of T with type PTRTYPE. This
7555 function modifies the input parameter 'T' by sometimes setting the
7556 TREE_ADDRESSABLE flag. */
7559 build_fold_addr_expr_with_type (tree t, tree ptrtype)
7561 return build_fold_addr_expr_with_type_1 (t, ptrtype, false);
7564 /* Build an expression for the address of T. This function modifies
7565 the input parameter 'T' by sometimes setting the TREE_ADDRESSABLE
7566 flag. When called from fold functions, use fold_addr_expr instead. */
7569 build_fold_addr_expr (tree t)
7571 return build_fold_addr_expr_with_type_1 (t,
7572 build_pointer_type (TREE_TYPE (t)),
7576 /* Same as build_fold_addr_expr, builds an expression for the address
7577 of T, but avoids touching the input node 't'. Fold functions
7578 should use this version. */
7581 fold_addr_expr (tree t)
7583 tree ptrtype = build_pointer_type (TREE_TYPE (t));
7585 return build_fold_addr_expr_with_type_1 (t, ptrtype, true);
7588 /* Fold a unary expression of code CODE and type TYPE with operand
7589 OP0. Return the folded expression if folding is successful.
7590 Otherwise, return NULL_TREE. */
7593 fold_unary (enum tree_code code, tree type, tree op0)
7597 enum tree_code_class kind = TREE_CODE_CLASS (code);
7599 gcc_assert (IS_EXPR_CODE_CLASS (kind)
7600 && TREE_CODE_LENGTH (code) == 1);
7605 if (code == NOP_EXPR || code == CONVERT_EXPR
7606 || code == FLOAT_EXPR || code == ABS_EXPR)
7608 /* Don't use STRIP_NOPS, because signedness of argument type
7610 STRIP_SIGN_NOPS (arg0);
7614 /* Strip any conversions that don't change the mode. This
7615 is safe for every expression, except for a comparison
7616 expression because its signedness is derived from its
7619 Note that this is done as an internal manipulation within
7620 the constant folder, in order to find the simplest
7621 representation of the arguments so that their form can be
7622 studied. In any cases, the appropriate type conversions
7623 should be put back in the tree that will get out of the
7629 if (TREE_CODE_CLASS (code) == tcc_unary)
7631 if (TREE_CODE (arg0) == COMPOUND_EXPR)
7632 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7633 fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7634 else if (TREE_CODE (arg0) == COND_EXPR)
7636 tree arg01 = TREE_OPERAND (arg0, 1);
7637 tree arg02 = TREE_OPERAND (arg0, 2);
7638 if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7639 arg01 = fold_build1 (code, type, arg01);
7640 if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7641 arg02 = fold_build1 (code, type, arg02);
7642 tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7645 /* If this was a conversion, and all we did was to move into
7646 inside the COND_EXPR, bring it back out. But leave it if
7647 it is a conversion from integer to integer and the
7648 result precision is no wider than a word since such a
7649 conversion is cheap and may be optimized away by combine,
7650 while it couldn't if it were outside the COND_EXPR. Then return
7651 so we don't get into an infinite recursion loop taking the
7652 conversion out and then back in. */
7654 if ((code == NOP_EXPR || code == CONVERT_EXPR
7655 || code == NON_LVALUE_EXPR)
7656 && TREE_CODE (tem) == COND_EXPR
7657 && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7658 && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7659 && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7660 && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7661 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7662 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7663 && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7665 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7666 && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7667 || flag_syntax_only))
7668 tem = build1 (code, type,
7670 TREE_TYPE (TREE_OPERAND
7671 (TREE_OPERAND (tem, 1), 0)),
7672 TREE_OPERAND (tem, 0),
7673 TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7674 TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7677 else if (COMPARISON_CLASS_P (arg0))
7679 if (TREE_CODE (type) == BOOLEAN_TYPE)
7681 arg0 = copy_node (arg0);
7682 TREE_TYPE (arg0) = type;
7685 else if (TREE_CODE (type) != INTEGER_TYPE)
7686 return fold_build3 (COND_EXPR, type, arg0,
7687 fold_build1 (code, type,
7689 fold_build1 (code, type,
7690 integer_zero_node));
7697 /* Re-association barriers around constants and other re-association
7698 barriers can be removed. */
7699 if (CONSTANT_CLASS_P (op0)
7700 || TREE_CODE (op0) == PAREN_EXPR)
7701 return fold_convert (type, op0);
7707 case FIX_TRUNC_EXPR:
7708 if (TREE_TYPE (op0) == type)
7711 /* If we have (type) (a CMP b) and type is an integral type, return
7712 new expression involving the new type. */
7713 if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7714 return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7715 TREE_OPERAND (op0, 1));
7717 /* Handle cases of two conversions in a row. */
7718 if (TREE_CODE (op0) == NOP_EXPR
7719 || TREE_CODE (op0) == CONVERT_EXPR)
7721 tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7722 tree inter_type = TREE_TYPE (op0);
7723 int inside_int = INTEGRAL_TYPE_P (inside_type);
7724 int inside_ptr = POINTER_TYPE_P (inside_type);
7725 int inside_float = FLOAT_TYPE_P (inside_type);
7726 int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7727 unsigned int inside_prec = TYPE_PRECISION (inside_type);
7728 int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7729 int inter_int = INTEGRAL_TYPE_P (inter_type);
7730 int inter_ptr = POINTER_TYPE_P (inter_type);
7731 int inter_float = FLOAT_TYPE_P (inter_type);
7732 int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7733 unsigned int inter_prec = TYPE_PRECISION (inter_type);
7734 int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7735 int final_int = INTEGRAL_TYPE_P (type);
7736 int final_ptr = POINTER_TYPE_P (type);
7737 int final_float = FLOAT_TYPE_P (type);
7738 int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7739 unsigned int final_prec = TYPE_PRECISION (type);
7740 int final_unsignedp = TYPE_UNSIGNED (type);
7742 /* In addition to the cases of two conversions in a row
7743 handled below, if we are converting something to its own
7744 type via an object of identical or wider precision, neither
7745 conversion is needed. */
7746 if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7747 && (((inter_int || inter_ptr) && final_int)
7748 || (inter_float && final_float))
7749 && inter_prec >= final_prec)
7750 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7752 /* Likewise, if the intermediate and final types are either both
7753 float or both integer, we don't need the middle conversion if
7754 it is wider than the final type and doesn't change the signedness
7755 (for integers). Avoid this if the final type is a pointer
7756 since then we sometimes need the inner conversion. Likewise if
7757 the outer has a precision not equal to the size of its mode. */
7758 if (((inter_int && inside_int)
7759 || (inter_float && inside_float)
7760 || (inter_vec && inside_vec))
7761 && inter_prec >= inside_prec
7762 && (inter_float || inter_vec
7763 || inter_unsignedp == inside_unsignedp)
7764 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7765 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7767 && (! final_vec || inter_prec == inside_prec))
7768 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7770 /* If we have a sign-extension of a zero-extended value, we can
7771 replace that by a single zero-extension. */
7772 if (inside_int && inter_int && final_int
7773 && inside_prec < inter_prec && inter_prec < final_prec
7774 && inside_unsignedp && !inter_unsignedp)
7775 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7777 /* Two conversions in a row are not needed unless:
7778 - some conversion is floating-point (overstrict for now), or
7779 - some conversion is a vector (overstrict for now), or
7780 - the intermediate type is narrower than both initial and
7782 - the intermediate type and innermost type differ in signedness,
7783 and the outermost type is wider than the intermediate, or
7784 - the initial type is a pointer type and the precisions of the
7785 intermediate and final types differ, or
7786 - the final type is a pointer type and the precisions of the
7787 initial and intermediate types differ.
7788 - the initial type is a pointer to an array and the final type
7790 if (! inside_float && ! inter_float && ! final_float
7791 && ! inside_vec && ! inter_vec && ! final_vec
7792 && (inter_prec >= inside_prec || inter_prec >= final_prec)
7793 && ! (inside_int && inter_int
7794 && inter_unsignedp != inside_unsignedp
7795 && inter_prec < final_prec)
7796 && ((inter_unsignedp && inter_prec > inside_prec)
7797 == (final_unsignedp && final_prec > inter_prec))
7798 && ! (inside_ptr && inter_prec != final_prec)
7799 && ! (final_ptr && inside_prec != inter_prec)
7800 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7801 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7802 && ! (inside_ptr && final_ptr
7803 && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
7804 && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
7805 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7808 /* Handle (T *)&A.B.C for A being of type T and B and C
7809 living at offset zero. This occurs frequently in
7810 C++ upcasting and then accessing the base. */
7811 if (TREE_CODE (op0) == ADDR_EXPR
7812 && POINTER_TYPE_P (type)
7813 && handled_component_p (TREE_OPERAND (op0, 0)))
7815 HOST_WIDE_INT bitsize, bitpos;
7817 enum machine_mode mode;
7818 int unsignedp, volatilep;
7819 tree base = TREE_OPERAND (op0, 0);
7820 base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7821 &mode, &unsignedp, &volatilep, false);
7822 /* If the reference was to a (constant) zero offset, we can use
7823 the address of the base if it has the same base type
7824 as the result type. */
7825 if (! offset && bitpos == 0
7826 && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7827 == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7828 return fold_convert (type, fold_addr_expr (base));
7831 if ((TREE_CODE (op0) == MODIFY_EXPR
7832 || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
7833 && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
7834 /* Detect assigning a bitfield. */
7835 && !(TREE_CODE (GENERIC_TREE_OPERAND (op0, 0)) == COMPONENT_REF
7837 (TREE_OPERAND (GENERIC_TREE_OPERAND (op0, 0), 1))))
7839 /* Don't leave an assignment inside a conversion
7840 unless assigning a bitfield. */
7841 tem = fold_build1 (code, type, GENERIC_TREE_OPERAND (op0, 1));
7842 /* First do the assignment, then return converted constant. */
7843 tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7844 TREE_NO_WARNING (tem) = 1;
7845 TREE_USED (tem) = 1;
7849 /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7850 constants (if x has signed type, the sign bit cannot be set
7851 in c). This folds extension into the BIT_AND_EXPR. */
7852 if (INTEGRAL_TYPE_P (type)
7853 && TREE_CODE (type) != BOOLEAN_TYPE
7854 && TREE_CODE (op0) == BIT_AND_EXPR
7855 && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7858 tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7861 if (TYPE_UNSIGNED (TREE_TYPE (and))
7862 || (TYPE_PRECISION (type)
7863 <= TYPE_PRECISION (TREE_TYPE (and))))
7865 else if (TYPE_PRECISION (TREE_TYPE (and1))
7866 <= HOST_BITS_PER_WIDE_INT
7867 && host_integerp (and1, 1))
7869 unsigned HOST_WIDE_INT cst;
7871 cst = tree_low_cst (and1, 1);
7872 cst &= (HOST_WIDE_INT) -1
7873 << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7874 change = (cst == 0);
7875 #ifdef LOAD_EXTEND_OP
7877 && !flag_syntax_only
7878 && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7881 tree uns = unsigned_type_for (TREE_TYPE (and0));
7882 and0 = fold_convert (uns, and0);
7883 and1 = fold_convert (uns, and1);
7889 tem = force_fit_type_double (type, TREE_INT_CST_LOW (and1),
7890 TREE_INT_CST_HIGH (and1), 0,
7891 TREE_OVERFLOW (and1));
7892 return fold_build2 (BIT_AND_EXPR, type,
7893 fold_convert (type, and0), tem);
7897 /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
7898 when one of the new casts will fold away. Conservatively we assume
7899 that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
7900 if (POINTER_TYPE_P (type)
7901 && TREE_CODE (arg0) == POINTER_PLUS_EXPR
7902 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7903 || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7904 || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
7906 tree arg00 = TREE_OPERAND (arg0, 0);
7907 tree arg01 = TREE_OPERAND (arg0, 1);
7909 return fold_build2 (TREE_CODE (arg0), type, fold_convert (type, arg00),
7910 fold_convert (sizetype, arg01));
7913 /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7914 of the same precision, and X is an integer type not narrower than
7915 types T1 or T2, i.e. the cast (T2)X isn't an extension. */
7916 if (INTEGRAL_TYPE_P (type)
7917 && TREE_CODE (op0) == BIT_NOT_EXPR
7918 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7919 && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7920 || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7921 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7923 tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7924 if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7925 && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7926 return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7929 tem = fold_convert_const (code, type, op0);
7930 return tem ? tem : NULL_TREE;
7932 case FIXED_CONVERT_EXPR:
7933 tem = fold_convert_const (code, type, arg0);
7934 return tem ? tem : NULL_TREE;
7936 case VIEW_CONVERT_EXPR:
7937 if (TREE_TYPE (op0) == type)
7939 if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7940 return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7942 /* For integral conversions with the same precision or pointer
7943 conversions use a NOP_EXPR instead. */
7944 if ((INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7945 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))
7946 /* Do not muck with VIEW_CONVERT_EXPRs that convert from
7947 a sub-type to its base type as generated by the Ada FE. */
7948 && !TREE_TYPE (TREE_TYPE (op0)))
7949 || (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE (op0))))
7950 return fold_convert (type, op0);
7952 /* Strip inner integral conversions that do not change the precision. */
7953 if ((TREE_CODE (op0) == NOP_EXPR
7954 || TREE_CODE (op0) == CONVERT_EXPR)
7955 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7956 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
7957 && (TYPE_PRECISION (TREE_TYPE (op0))
7958 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
7959 return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7961 return fold_view_convert_expr (type, op0);
7964 tem = fold_negate_expr (arg0);
7966 return fold_convert (type, tem);
7970 if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7971 return fold_abs_const (arg0, type);
7972 else if (TREE_CODE (arg0) == NEGATE_EXPR)
7973 return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7974 /* Convert fabs((double)float) into (double)fabsf(float). */
7975 else if (TREE_CODE (arg0) == NOP_EXPR
7976 && TREE_CODE (type) == REAL_TYPE)
7978 tree targ0 = strip_float_extensions (arg0);
7980 return fold_convert (type, fold_build1 (ABS_EXPR,
7984 /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on. */
7985 else if (TREE_CODE (arg0) == ABS_EXPR)
7987 else if (tree_expr_nonnegative_p (arg0))
7990 /* Strip sign ops from argument. */
7991 if (TREE_CODE (type) == REAL_TYPE)
7993 tem = fold_strip_sign_ops (arg0);
7995 return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
8000 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8001 return fold_convert (type, arg0);
8002 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8004 tree itype = TREE_TYPE (type);
8005 tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
8006 tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
8007 return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
8009 if (TREE_CODE (arg0) == COMPLEX_CST)
8011 tree itype = TREE_TYPE (type);
8012 tree rpart = fold_convert (itype, TREE_REALPART (arg0));
8013 tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
8014 return build_complex (type, rpart, negate_expr (ipart));
8016 if (TREE_CODE (arg0) == CONJ_EXPR)
8017 return fold_convert (type, TREE_OPERAND (arg0, 0));
8021 if (TREE_CODE (arg0) == INTEGER_CST)
8022 return fold_not_const (arg0, type);
8023 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8024 return fold_convert (type, TREE_OPERAND (arg0, 0));
8025 /* Convert ~ (-A) to A - 1. */
8026 else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8027 return fold_build2 (MINUS_EXPR, type,
8028 fold_convert (type, TREE_OPERAND (arg0, 0)),
8029 build_int_cst (type, 1));
8030 /* Convert ~ (A - 1) or ~ (A + -1) to -A. */
8031 else if (INTEGRAL_TYPE_P (type)
8032 && ((TREE_CODE (arg0) == MINUS_EXPR
8033 && integer_onep (TREE_OPERAND (arg0, 1)))
8034 || (TREE_CODE (arg0) == PLUS_EXPR
8035 && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8036 return fold_build1 (NEGATE_EXPR, type,
8037 fold_convert (type, TREE_OPERAND (arg0, 0)));
8038 /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. */
8039 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8040 && (tem = fold_unary (BIT_NOT_EXPR, type,
8042 TREE_OPERAND (arg0, 0)))))
8043 return fold_build2 (BIT_XOR_EXPR, type, tem,
8044 fold_convert (type, TREE_OPERAND (arg0, 1)));
8045 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8046 && (tem = fold_unary (BIT_NOT_EXPR, type,
8048 TREE_OPERAND (arg0, 1)))))
8049 return fold_build2 (BIT_XOR_EXPR, type,
8050 fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
8051 /* Perform BIT_NOT_EXPR on each element individually. */
8052 else if (TREE_CODE (arg0) == VECTOR_CST)
8054 tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8055 int count = TYPE_VECTOR_SUBPARTS (type), i;
8057 for (i = 0; i < count; i++)
8061 elem = TREE_VALUE (elements);
8062 elem = fold_unary (BIT_NOT_EXPR, TREE_TYPE (type), elem);
8063 if (elem == NULL_TREE)
8065 elements = TREE_CHAIN (elements);
8068 elem = build_int_cst (TREE_TYPE (type), -1);
8069 list = tree_cons (NULL_TREE, elem, list);
8072 return build_vector (type, nreverse (list));
8077 case TRUTH_NOT_EXPR:
8078 /* The argument to invert_truthvalue must have Boolean type. */
8079 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8080 arg0 = fold_convert (boolean_type_node, arg0);
8082 /* Note that the operand of this must be an int
8083 and its values must be 0 or 1.
8084 ("true" is a fixed value perhaps depending on the language,
8085 but we don't handle values other than 1 correctly yet.) */
8086 tem = fold_truth_not_expr (arg0);
8089 return fold_convert (type, tem);
8092 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8093 return fold_convert (type, arg0);
8094 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8095 return omit_one_operand (type, TREE_OPERAND (arg0, 0),
8096 TREE_OPERAND (arg0, 1));
8097 if (TREE_CODE (arg0) == COMPLEX_CST)
8098 return fold_convert (type, TREE_REALPART (arg0));
8099 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8101 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8102 tem = fold_build2 (TREE_CODE (arg0), itype,
8103 fold_build1 (REALPART_EXPR, itype,
8104 TREE_OPERAND (arg0, 0)),
8105 fold_build1 (REALPART_EXPR, itype,
8106 TREE_OPERAND (arg0, 1)));
8107 return fold_convert (type, tem);
8109 if (TREE_CODE (arg0) == CONJ_EXPR)
8111 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8112 tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8113 return fold_convert (type, tem);
8115 if (TREE_CODE (arg0) == CALL_EXPR)
8117 tree fn = get_callee_fndecl (arg0);
8118 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8119 switch (DECL_FUNCTION_CODE (fn))
8121 CASE_FLT_FN (BUILT_IN_CEXPI):
8122 fn = mathfn_built_in (type, BUILT_IN_COS);
8124 return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8134 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8135 return fold_convert (type, integer_zero_node);
8136 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8137 return omit_one_operand (type, TREE_OPERAND (arg0, 1),
8138 TREE_OPERAND (arg0, 0));
8139 if (TREE_CODE (arg0) == COMPLEX_CST)
8140 return fold_convert (type, TREE_IMAGPART (arg0));
8141 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8143 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8144 tem = fold_build2 (TREE_CODE (arg0), itype,
8145 fold_build1 (IMAGPART_EXPR, itype,
8146 TREE_OPERAND (arg0, 0)),
8147 fold_build1 (IMAGPART_EXPR, itype,
8148 TREE_OPERAND (arg0, 1)));
8149 return fold_convert (type, tem);
8151 if (TREE_CODE (arg0) == CONJ_EXPR)
8153 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8154 tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8155 return fold_convert (type, negate_expr (tem));
8157 if (TREE_CODE (arg0) == CALL_EXPR)
8159 tree fn = get_callee_fndecl (arg0);
8160 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8161 switch (DECL_FUNCTION_CODE (fn))
8163 CASE_FLT_FN (BUILT_IN_CEXPI):
8164 fn = mathfn_built_in (type, BUILT_IN_SIN);
8166 return build_call_expr (fn, 1, CALL_EXPR_ARG (arg0, 0));
8177 } /* switch (code) */
8180 /* Fold a binary expression of code CODE and type TYPE with operands
8181 OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8182 Return the folded expression if folding is successful. Otherwise,
8183 return NULL_TREE. */
8186 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
8188 enum tree_code compl_code;
8190 if (code == MIN_EXPR)
8191 compl_code = MAX_EXPR;
8192 else if (code == MAX_EXPR)
8193 compl_code = MIN_EXPR;
8197 /* MIN (MAX (a, b), b) == b. */
8198 if (TREE_CODE (op0) == compl_code
8199 && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8200 return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
8202 /* MIN (MAX (b, a), b) == b. */
8203 if (TREE_CODE (op0) == compl_code
8204 && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8205 && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8206 return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
8208 /* MIN (a, MAX (a, b)) == a. */
8209 if (TREE_CODE (op1) == compl_code
8210 && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8211 && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8212 return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
8214 /* MIN (a, MAX (b, a)) == a. */
8215 if (TREE_CODE (op1) == compl_code
8216 && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8217 && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8218 return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
8223 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8224 by changing CODE to reduce the magnitude of constants involved in
8225 ARG0 of the comparison.
8226 Returns a canonicalized comparison tree if a simplification was
8227 possible, otherwise returns NULL_TREE.
8228 Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8229 valid if signed overflow is undefined. */
8232 maybe_canonicalize_comparison_1 (enum tree_code code, tree type,
8233 tree arg0, tree arg1,
8234 bool *strict_overflow_p)
8236 enum tree_code code0 = TREE_CODE (arg0);
8237 tree t, cst0 = NULL_TREE;
8241 /* Match A +- CST code arg1 and CST code arg1. */
8242 if (!(((code0 == MINUS_EXPR
8243 || code0 == PLUS_EXPR)
8244 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8245 || code0 == INTEGER_CST))
8248 /* Identify the constant in arg0 and its sign. */
8249 if (code0 == INTEGER_CST)
8252 cst0 = TREE_OPERAND (arg0, 1);
8253 sgn0 = tree_int_cst_sgn (cst0);
8255 /* Overflowed constants and zero will cause problems. */
8256 if (integer_zerop (cst0)
8257 || TREE_OVERFLOW (cst0))
8260 /* See if we can reduce the magnitude of the constant in
8261 arg0 by changing the comparison code. */
8262 if (code0 == INTEGER_CST)
8264 /* CST <= arg1 -> CST-1 < arg1. */
8265 if (code == LE_EXPR && sgn0 == 1)
8267 /* -CST < arg1 -> -CST-1 <= arg1. */
8268 else if (code == LT_EXPR && sgn0 == -1)
8270 /* CST > arg1 -> CST-1 >= arg1. */
8271 else if (code == GT_EXPR && sgn0 == 1)
8273 /* -CST >= arg1 -> -CST-1 > arg1. */
8274 else if (code == GE_EXPR && sgn0 == -1)
8278 /* arg1 code' CST' might be more canonical. */
8283 /* A - CST < arg1 -> A - CST-1 <= arg1. */
8285 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8287 /* A + CST > arg1 -> A + CST-1 >= arg1. */
8288 else if (code == GT_EXPR
8289 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8291 /* A + CST <= arg1 -> A + CST-1 < arg1. */
8292 else if (code == LE_EXPR
8293 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8295 /* A - CST >= arg1 -> A - CST-1 > arg1. */
8296 else if (code == GE_EXPR
8297 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8301 *strict_overflow_p = true;
8304 /* Now build the constant reduced in magnitude. */
8305 t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8306 cst0, build_int_cst (TREE_TYPE (cst0), 1), 0);
8307 if (code0 != INTEGER_CST)
8308 t = fold_build2 (code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8310 /* If swapping might yield to a more canonical form, do so. */
8312 return fold_build2 (swap_tree_comparison (code), type, arg1, t);
8314 return fold_build2 (code, type, t, arg1);
8317 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8318 overflow further. Try to decrease the magnitude of constants involved
8319 by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8320 and put sole constants at the second argument position.
8321 Returns the canonicalized tree if changed, otherwise NULL_TREE. */
8324 maybe_canonicalize_comparison (enum tree_code code, tree type,
8325 tree arg0, tree arg1)
8328 bool strict_overflow_p;
8329 const char * const warnmsg = G_("assuming signed overflow does not occur "
8330 "when reducing constant in comparison");
8332 /* In principle pointers also have undefined overflow behavior,
8333 but that causes problems elsewhere. */
8334 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8335 || POINTER_TYPE_P (TREE_TYPE (arg0)))
8338 /* Try canonicalization by simplifying arg0. */
8339 strict_overflow_p = false;
8340 t = maybe_canonicalize_comparison_1 (code, type, arg0, arg1,
8341 &strict_overflow_p);
8344 if (strict_overflow_p)
8345 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8349 /* Try canonicalization by simplifying arg1 using the swapped
8351 code = swap_tree_comparison (code);
8352 strict_overflow_p = false;
8353 t = maybe_canonicalize_comparison_1 (code, type, arg1, arg0,
8354 &strict_overflow_p);
8355 if (t && strict_overflow_p)
8356 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8360 /* Subroutine of fold_binary. This routine performs all of the
8361 transformations that are common to the equality/inequality
8362 operators (EQ_EXPR and NE_EXPR) and the ordering operators
8363 (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR). Callers other than
8364 fold_binary should call fold_binary. Fold a comparison with
8365 tree code CODE and type TYPE with operands OP0 and OP1. Return
8366 the folded comparison or NULL_TREE. */
8369 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
8371 tree arg0, arg1, tem;
8376 STRIP_SIGN_NOPS (arg0);
8377 STRIP_SIGN_NOPS (arg1);
8379 tem = fold_relational_const (code, type, arg0, arg1);
8380 if (tem != NULL_TREE)
8383 /* If one arg is a real or integer constant, put it last. */
8384 if (tree_swap_operands_p (arg0, arg1, true))
8385 return fold_build2 (swap_tree_comparison (code), type, op1, op0);
8387 /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1. */
8388 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8389 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8390 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8391 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8392 && (TREE_CODE (arg1) == INTEGER_CST
8393 && !TREE_OVERFLOW (arg1)))
8395 tree const1 = TREE_OPERAND (arg0, 1);
8397 tree variable = TREE_OPERAND (arg0, 0);
8400 lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8402 lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8403 TREE_TYPE (arg1), const2, const1);
8405 /* If the constant operation overflowed this can be
8406 simplified as a comparison against INT_MAX/INT_MIN. */
8407 if (TREE_CODE (lhs) == INTEGER_CST
8408 && TREE_OVERFLOW (lhs))
8410 int const1_sgn = tree_int_cst_sgn (const1);
8411 enum tree_code code2 = code;
8413 /* Get the sign of the constant on the lhs if the
8414 operation were VARIABLE + CONST1. */
8415 if (TREE_CODE (arg0) == MINUS_EXPR)
8416 const1_sgn = -const1_sgn;
8418 /* The sign of the constant determines if we overflowed
8419 INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8420 Canonicalize to the INT_MIN overflow by swapping the comparison
8422 if (const1_sgn == -1)
8423 code2 = swap_tree_comparison (code);
8425 /* We now can look at the canonicalized case
8426 VARIABLE + 1 CODE2 INT_MIN
8427 and decide on the result. */
8428 if (code2 == LT_EXPR
8430 || code2 == EQ_EXPR)
8431 return omit_one_operand (type, boolean_false_node, variable);
8432 else if (code2 == NE_EXPR
8434 || code2 == GT_EXPR)
8435 return omit_one_operand (type, boolean_true_node, variable);
8438 if (TREE_CODE (lhs) == TREE_CODE (arg1)
8439 && (TREE_CODE (lhs) != INTEGER_CST
8440 || !TREE_OVERFLOW (lhs)))
8442 fold_overflow_warning (("assuming signed overflow does not occur "
8443 "when changing X +- C1 cmp C2 to "
8445 WARN_STRICT_OVERFLOW_COMPARISON);
8446 return fold_build2 (code, type, variable, lhs);
8450 /* For comparisons of pointers we can decompose it to a compile time
8451 comparison of the base objects and the offsets into the object.
8452 This requires at least one operand being an ADDR_EXPR or a
8453 POINTER_PLUS_EXPR to do more than the operand_equal_p test below. */
8454 if (POINTER_TYPE_P (TREE_TYPE (arg0))
8455 && (TREE_CODE (arg0) == ADDR_EXPR
8456 || TREE_CODE (arg1) == ADDR_EXPR
8457 || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8458 || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8460 tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8461 HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8462 enum machine_mode mode;
8463 int volatilep, unsignedp;
8464 bool indirect_base0 = false;
8466 /* Get base and offset for the access. Strip ADDR_EXPR for
8467 get_inner_reference, but put it back by stripping INDIRECT_REF
8468 off the base object if possible. */
8470 if (TREE_CODE (arg0) == ADDR_EXPR)
8472 base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8473 &bitsize, &bitpos0, &offset0, &mode,
8474 &unsignedp, &volatilep, false);
8475 if (TREE_CODE (base0) == INDIRECT_REF)
8476 base0 = TREE_OPERAND (base0, 0);
8478 indirect_base0 = true;
8480 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8482 base0 = TREE_OPERAND (arg0, 0);
8483 offset0 = TREE_OPERAND (arg0, 1);
8487 if (TREE_CODE (arg1) == ADDR_EXPR)
8489 base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8490 &bitsize, &bitpos1, &offset1, &mode,
8491 &unsignedp, &volatilep, false);
8492 /* We have to make sure to have an indirect/non-indirect base1
8493 just the same as we did for base0. */
8494 if (TREE_CODE (base1) == INDIRECT_REF
8496 base1 = TREE_OPERAND (base1, 0);
8497 else if (!indirect_base0)
8500 else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8502 base1 = TREE_OPERAND (arg1, 0);
8503 offset1 = TREE_OPERAND (arg1, 1);
8505 else if (indirect_base0)
8508 /* If we have equivalent bases we might be able to simplify. */
8510 && operand_equal_p (base0, base1, 0))
8512 /* We can fold this expression to a constant if the non-constant
8513 offset parts are equal. */
8514 if (offset0 == offset1
8515 || (offset0 && offset1
8516 && operand_equal_p (offset0, offset1, 0)))
8521 return build_int_cst (boolean_type_node, bitpos0 == bitpos1);
8523 return build_int_cst (boolean_type_node, bitpos0 != bitpos1);
8525 return build_int_cst (boolean_type_node, bitpos0 < bitpos1);
8527 return build_int_cst (boolean_type_node, bitpos0 <= bitpos1);
8529 return build_int_cst (boolean_type_node, bitpos0 >= bitpos1);
8531 return build_int_cst (boolean_type_node, bitpos0 > bitpos1);
8535 /* We can simplify the comparison to a comparison of the variable
8536 offset parts if the constant offset parts are equal.
8537 Be careful to use signed size type here because otherwise we
8538 mess with array offsets in the wrong way. This is possible
8539 because pointer arithmetic is restricted to retain within an
8540 object and overflow on pointer differences is undefined as of
8541 6.5.6/8 and /9 with respect to the signed ptrdiff_t. */
8542 else if (bitpos0 == bitpos1)
8544 tree signed_size_type_node;
8545 signed_size_type_node = signed_type_for (size_type_node);
8547 /* By converting to signed size type we cover middle-end pointer
8548 arithmetic which operates on unsigned pointer types of size
8549 type size and ARRAY_REF offsets which are properly sign or
8550 zero extended from their type in case it is narrower than
8552 if (offset0 == NULL_TREE)
8553 offset0 = build_int_cst (signed_size_type_node, 0);
8555 offset0 = fold_convert (signed_size_type_node, offset0);
8556 if (offset1 == NULL_TREE)
8557 offset1 = build_int_cst (signed_size_type_node, 0);
8559 offset1 = fold_convert (signed_size_type_node, offset1);
8561 return fold_build2 (code, type, offset0, offset1);
8566 /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
8567 X CMP Y +- C2 +- C1 for signed X, Y. This is valid if
8568 the resulting offset is smaller in absolute value than the
8570 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8571 && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8572 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8573 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8574 && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
8575 && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8576 && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
8578 tree const1 = TREE_OPERAND (arg0, 1);
8579 tree const2 = TREE_OPERAND (arg1, 1);
8580 tree variable1 = TREE_OPERAND (arg0, 0);
8581 tree variable2 = TREE_OPERAND (arg1, 0);
8583 const char * const warnmsg = G_("assuming signed overflow does not "
8584 "occur when combining constants around "
8587 /* Put the constant on the side where it doesn't overflow and is
8588 of lower absolute value than before. */
8589 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8590 ? MINUS_EXPR : PLUS_EXPR,
8592 if (!TREE_OVERFLOW (cst)
8593 && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
8595 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8596 return fold_build2 (code, type,
8598 fold_build2 (TREE_CODE (arg1), TREE_TYPE (arg1),
8602 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
8603 ? MINUS_EXPR : PLUS_EXPR,
8605 if (!TREE_OVERFLOW (cst)
8606 && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
8608 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
8609 return fold_build2 (code, type,
8610 fold_build2 (TREE_CODE (arg0), TREE_TYPE (arg0),
8616 /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
8617 signed arithmetic case. That form is created by the compiler
8618 often enough for folding it to be of value. One example is in
8619 computing loop trip counts after Operator Strength Reduction. */
8620 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8621 && TREE_CODE (arg0) == MULT_EXPR
8622 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8623 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
8624 && integer_zerop (arg1))
8626 tree const1 = TREE_OPERAND (arg0, 1);
8627 tree const2 = arg1; /* zero */
8628 tree variable1 = TREE_OPERAND (arg0, 0);
8629 enum tree_code cmp_code = code;
8631 gcc_assert (!integer_zerop (const1));
8633 fold_overflow_warning (("assuming signed overflow does not occur when "
8634 "eliminating multiplication in comparison "
8636 WARN_STRICT_OVERFLOW_COMPARISON);
8638 /* If const1 is negative we swap the sense of the comparison. */
8639 if (tree_int_cst_sgn (const1) < 0)
8640 cmp_code = swap_tree_comparison (cmp_code);
8642 return fold_build2 (cmp_code, type, variable1, const2);
8645 tem = maybe_canonicalize_comparison (code, type, op0, op1);
8649 if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8651 tree targ0 = strip_float_extensions (arg0);
8652 tree targ1 = strip_float_extensions (arg1);
8653 tree newtype = TREE_TYPE (targ0);
8655 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8656 newtype = TREE_TYPE (targ1);
8658 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
8659 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8660 return fold_build2 (code, type, fold_convert (newtype, targ0),
8661 fold_convert (newtype, targ1));
8663 /* (-a) CMP (-b) -> b CMP a */
8664 if (TREE_CODE (arg0) == NEGATE_EXPR
8665 && TREE_CODE (arg1) == NEGATE_EXPR)
8666 return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8667 TREE_OPERAND (arg0, 0));
8669 if (TREE_CODE (arg1) == REAL_CST)
8671 REAL_VALUE_TYPE cst;
8672 cst = TREE_REAL_CST (arg1);
8674 /* (-a) CMP CST -> a swap(CMP) (-CST) */
8675 if (TREE_CODE (arg0) == NEGATE_EXPR)
8676 return fold_build2 (swap_tree_comparison (code), type,
8677 TREE_OPERAND (arg0, 0),
8678 build_real (TREE_TYPE (arg1),
8679 REAL_VALUE_NEGATE (cst)));
8681 /* IEEE doesn't distinguish +0 and -0 in comparisons. */
8682 /* a CMP (-0) -> a CMP 0 */
8683 if (REAL_VALUE_MINUS_ZERO (cst))
8684 return fold_build2 (code, type, arg0,
8685 build_real (TREE_TYPE (arg1), dconst0));
8687 /* x != NaN is always true, other ops are always false. */
8688 if (REAL_VALUE_ISNAN (cst)
8689 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8691 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8692 return omit_one_operand (type, tem, arg0);
8695 /* Fold comparisons against infinity. */
8696 if (REAL_VALUE_ISINF (cst))
8698 tem = fold_inf_compare (code, type, arg0, arg1);
8699 if (tem != NULL_TREE)
8704 /* If this is a comparison of a real constant with a PLUS_EXPR
8705 or a MINUS_EXPR of a real constant, we can convert it into a
8706 comparison with a revised real constant as long as no overflow
8707 occurs when unsafe_math_optimizations are enabled. */
8708 if (flag_unsafe_math_optimizations
8709 && TREE_CODE (arg1) == REAL_CST
8710 && (TREE_CODE (arg0) == PLUS_EXPR
8711 || TREE_CODE (arg0) == MINUS_EXPR)
8712 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8713 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8714 ? MINUS_EXPR : PLUS_EXPR,
8715 arg1, TREE_OPERAND (arg0, 1), 0))
8716 && !TREE_OVERFLOW (tem))
8717 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8719 /* Likewise, we can simplify a comparison of a real constant with
8720 a MINUS_EXPR whose first operand is also a real constant, i.e.
8721 (c1 - x) < c2 becomes x > c1-c2. Reordering is allowed on
8722 floating-point types only if -fassociative-math is set. */
8723 if (flag_associative_math
8724 && TREE_CODE (arg1) == REAL_CST
8725 && TREE_CODE (arg0) == MINUS_EXPR
8726 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8727 && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8729 && !TREE_OVERFLOW (tem))
8730 return fold_build2 (swap_tree_comparison (code), type,
8731 TREE_OPERAND (arg0, 1), tem);
8733 /* Fold comparisons against built-in math functions. */
8734 if (TREE_CODE (arg1) == REAL_CST
8735 && flag_unsafe_math_optimizations
8736 && ! flag_errno_math)
8738 enum built_in_function fcode = builtin_mathfn_code (arg0);
8740 if (fcode != END_BUILTINS)
8742 tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8743 if (tem != NULL_TREE)
8749 if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8750 && (TREE_CODE (arg0) == NOP_EXPR
8751 || TREE_CODE (arg0) == CONVERT_EXPR))
8753 /* If we are widening one operand of an integer comparison,
8754 see if the other operand is similarly being widened. Perhaps we
8755 can do the comparison in the narrower type. */
8756 tem = fold_widened_comparison (code, type, arg0, arg1);
8760 /* Or if we are changing signedness. */
8761 tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8766 /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8767 constant, we can simplify it. */
8768 if (TREE_CODE (arg1) == INTEGER_CST
8769 && (TREE_CODE (arg0) == MIN_EXPR
8770 || TREE_CODE (arg0) == MAX_EXPR)
8771 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8773 tem = optimize_minmax_comparison (code, type, op0, op1);
8778 /* Simplify comparison of something with itself. (For IEEE
8779 floating-point, we can only do some of these simplifications.) */
8780 if (operand_equal_p (arg0, arg1, 0))
8785 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8786 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8787 return constant_boolean_node (1, type);
8792 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8793 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8794 return constant_boolean_node (1, type);
8795 return fold_build2 (EQ_EXPR, type, arg0, arg1);
8798 /* For NE, we can only do this simplification if integer
8799 or we don't honor IEEE floating point NaNs. */
8800 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8801 && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8803 /* ... fall through ... */
8806 return constant_boolean_node (0, type);
8812 /* If we are comparing an expression that just has comparisons
8813 of two integer values, arithmetic expressions of those comparisons,
8814 and constants, we can simplify it. There are only three cases
8815 to check: the two values can either be equal, the first can be
8816 greater, or the second can be greater. Fold the expression for
8817 those three values. Since each value must be 0 or 1, we have
8818 eight possibilities, each of which corresponds to the constant 0
8819 or 1 or one of the six possible comparisons.
8821 This handles common cases like (a > b) == 0 but also handles
8822 expressions like ((x > y) - (y > x)) > 0, which supposedly
8823 occur in macroized code. */
8825 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8827 tree cval1 = 0, cval2 = 0;
8830 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8831 /* Don't handle degenerate cases here; they should already
8832 have been handled anyway. */
8833 && cval1 != 0 && cval2 != 0
8834 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8835 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8836 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8837 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8838 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8839 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8840 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8842 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8843 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8845 /* We can't just pass T to eval_subst in case cval1 or cval2
8846 was the same as ARG1. */
8849 = fold_build2 (code, type,
8850 eval_subst (arg0, cval1, maxval,
8854 = fold_build2 (code, type,
8855 eval_subst (arg0, cval1, maxval,
8859 = fold_build2 (code, type,
8860 eval_subst (arg0, cval1, minval,
8864 /* All three of these results should be 0 or 1. Confirm they are.
8865 Then use those values to select the proper code to use. */
8867 if (TREE_CODE (high_result) == INTEGER_CST
8868 && TREE_CODE (equal_result) == INTEGER_CST
8869 && TREE_CODE (low_result) == INTEGER_CST)
8871 /* Make a 3-bit mask with the high-order bit being the
8872 value for `>', the next for '=', and the low for '<'. */
8873 switch ((integer_onep (high_result) * 4)
8874 + (integer_onep (equal_result) * 2)
8875 + integer_onep (low_result))
8879 return omit_one_operand (type, integer_zero_node, arg0);
8900 return omit_one_operand (type, integer_one_node, arg0);
8904 return save_expr (build2 (code, type, cval1, cval2));
8905 return fold_build2 (code, type, cval1, cval2);
8910 /* Fold a comparison of the address of COMPONENT_REFs with the same
8911 type and component to a comparison of the address of the base
8912 object. In short, &x->a OP &y->a to x OP y and
8913 &x->a OP &y.a to x OP &y */
8914 if (TREE_CODE (arg0) == ADDR_EXPR
8915 && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8916 && TREE_CODE (arg1) == ADDR_EXPR
8917 && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8919 tree cref0 = TREE_OPERAND (arg0, 0);
8920 tree cref1 = TREE_OPERAND (arg1, 0);
8921 if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8923 tree op0 = TREE_OPERAND (cref0, 0);
8924 tree op1 = TREE_OPERAND (cref1, 0);
8925 return fold_build2 (code, type,
8926 fold_addr_expr (op0),
8927 fold_addr_expr (op1));
8931 /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8932 into a single range test. */
8933 if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8934 || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8935 && TREE_CODE (arg1) == INTEGER_CST
8936 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8937 && !integer_zerop (TREE_OPERAND (arg0, 1))
8938 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8939 && !TREE_OVERFLOW (arg1))
8941 tem = fold_div_compare (code, type, arg0, arg1);
8942 if (tem != NULL_TREE)
8946 /* Fold ~X op ~Y as Y op X. */
8947 if (TREE_CODE (arg0) == BIT_NOT_EXPR
8948 && TREE_CODE (arg1) == BIT_NOT_EXPR)
8950 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8951 return fold_build2 (code, type,
8952 fold_convert (cmp_type, TREE_OPERAND (arg1, 0)),
8953 TREE_OPERAND (arg0, 0));
8956 /* Fold ~X op C as X op' ~C, where op' is the swapped comparison. */
8957 if (TREE_CODE (arg0) == BIT_NOT_EXPR
8958 && TREE_CODE (arg1) == INTEGER_CST)
8960 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
8961 return fold_build2 (swap_tree_comparison (code), type,
8962 TREE_OPERAND (arg0, 0),
8963 fold_build1 (BIT_NOT_EXPR, cmp_type,
8964 fold_convert (cmp_type, arg1)));
8971 /* Subroutine of fold_binary. Optimize complex multiplications of the
8972 form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2). The
8973 argument EXPR represents the expression "z" of type TYPE. */
8976 fold_mult_zconjz (tree type, tree expr)
8978 tree itype = TREE_TYPE (type);
8979 tree rpart, ipart, tem;
8981 if (TREE_CODE (expr) == COMPLEX_EXPR)
8983 rpart = TREE_OPERAND (expr, 0);
8984 ipart = TREE_OPERAND (expr, 1);
8986 else if (TREE_CODE (expr) == COMPLEX_CST)
8988 rpart = TREE_REALPART (expr);
8989 ipart = TREE_IMAGPART (expr);
8993 expr = save_expr (expr);
8994 rpart = fold_build1 (REALPART_EXPR, itype, expr);
8995 ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8998 rpart = save_expr (rpart);
8999 ipart = save_expr (ipart);
9000 tem = fold_build2 (PLUS_EXPR, itype,
9001 fold_build2 (MULT_EXPR, itype, rpart, rpart),
9002 fold_build2 (MULT_EXPR, itype, ipart, ipart));
9003 return fold_build2 (COMPLEX_EXPR, type, tem,
9004 fold_convert (itype, integer_zero_node));
9008 /* Subroutine of fold_binary. If P is the value of EXPR, computes
9009 power-of-two M and (arbitrary) N such that M divides (P-N). This condition
9010 guarantees that P and N have the same least significant log2(M) bits.
9011 N is not otherwise constrained. In particular, N is not normalized to
9012 0 <= N < M as is common. In general, the precise value of P is unknown.
9013 M is chosen as large as possible such that constant N can be determined.
9015 Returns M and sets *RESIDUE to N. */
9017 static unsigned HOST_WIDE_INT
9018 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue)
9020 enum tree_code code;
9024 code = TREE_CODE (expr);
9025 if (code == ADDR_EXPR)
9027 expr = TREE_OPERAND (expr, 0);
9028 if (handled_component_p (expr))
9030 HOST_WIDE_INT bitsize, bitpos;
9032 enum machine_mode mode;
9033 int unsignedp, volatilep;
9035 expr = get_inner_reference (expr, &bitsize, &bitpos, &offset,
9036 &mode, &unsignedp, &volatilep, false);
9037 *residue = bitpos / BITS_PER_UNIT;
9040 if (TREE_CODE (offset) == INTEGER_CST)
9041 *residue += TREE_INT_CST_LOW (offset);
9043 /* We don't handle more complicated offset expressions. */
9049 return DECL_ALIGN_UNIT (expr);
9051 else if (code == POINTER_PLUS_EXPR)
9054 unsigned HOST_WIDE_INT modulus;
9055 enum tree_code inner_code;
9057 op0 = TREE_OPERAND (expr, 0);
9059 modulus = get_pointer_modulus_and_residue (op0, residue);
9061 op1 = TREE_OPERAND (expr, 1);
9063 inner_code = TREE_CODE (op1);
9064 if (inner_code == INTEGER_CST)
9066 *residue += TREE_INT_CST_LOW (op1);
9069 else if (inner_code == MULT_EXPR)
9071 op1 = TREE_OPERAND (op1, 1);
9072 if (TREE_CODE (op1) == INTEGER_CST)
9074 unsigned HOST_WIDE_INT align;
9076 /* Compute the greatest power-of-2 divisor of op1. */
9077 align = TREE_INT_CST_LOW (op1);
9080 /* If align is non-zero and less than *modulus, replace
9081 *modulus with align., If align is 0, then either op1 is 0
9082 or the greatest power-of-2 divisor of op1 doesn't fit in an
9083 unsigned HOST_WIDE_INT. In either case, no additional
9084 constraint is imposed. */
9086 modulus = MIN (modulus, align);
9093 /* If we get here, we were unable to determine anything useful about the
9099 /* Fold a binary expression of code CODE and type TYPE with operands
9100 OP0 and OP1. Return the folded expression if folding is
9101 successful. Otherwise, return NULL_TREE. */
9104 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
9106 enum tree_code_class kind = TREE_CODE_CLASS (code);
9107 tree arg0, arg1, tem;
9108 tree t1 = NULL_TREE;
9109 bool strict_overflow_p;
9111 gcc_assert ((IS_EXPR_CODE_CLASS (kind)
9112 || IS_GIMPLE_STMT_CODE_CLASS (kind))
9113 && TREE_CODE_LENGTH (code) == 2
9115 && op1 != NULL_TREE);
9120 /* Strip any conversions that don't change the mode. This is
9121 safe for every expression, except for a comparison expression
9122 because its signedness is derived from its operands. So, in
9123 the latter case, only strip conversions that don't change the
9126 Note that this is done as an internal manipulation within the
9127 constant folder, in order to find the simplest representation
9128 of the arguments so that their form can be studied. In any
9129 cases, the appropriate type conversions should be put back in
9130 the tree that will get out of the constant folder. */
9132 if (kind == tcc_comparison)
9134 STRIP_SIGN_NOPS (arg0);
9135 STRIP_SIGN_NOPS (arg1);
9143 /* Note that TREE_CONSTANT isn't enough: static var addresses are
9144 constant but we can't do arithmetic on them. */
9145 if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9146 || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9147 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9148 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9149 || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9150 || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9152 if (kind == tcc_binary)
9154 /* Make sure type and arg0 have the same saturating flag. */
9155 gcc_assert (TYPE_SATURATING (type)
9156 == TYPE_SATURATING (TREE_TYPE (arg0)));
9157 tem = const_binop (code, arg0, arg1, 0);
9159 else if (kind == tcc_comparison)
9160 tem = fold_relational_const (code, type, arg0, arg1);
9164 if (tem != NULL_TREE)
9166 if (TREE_TYPE (tem) != type)
9167 tem = fold_convert (type, tem);
9172 /* If this is a commutative operation, and ARG0 is a constant, move it
9173 to ARG1 to reduce the number of tests below. */
9174 if (commutative_tree_code (code)
9175 && tree_swap_operands_p (arg0, arg1, true))
9176 return fold_build2 (code, type, op1, op0);
9178 /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9180 First check for cases where an arithmetic operation is applied to a
9181 compound, conditional, or comparison operation. Push the arithmetic
9182 operation inside the compound or conditional to see if any folding
9183 can then be done. Convert comparison to conditional for this purpose.
9184 The also optimizes non-constant cases that used to be done in
9187 Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9188 one of the operands is a comparison and the other is a comparison, a
9189 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
9190 code below would make the expression more complex. Change it to a
9191 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
9192 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
9194 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9195 || code == EQ_EXPR || code == NE_EXPR)
9196 && ((truth_value_p (TREE_CODE (arg0))
9197 && (truth_value_p (TREE_CODE (arg1))
9198 || (TREE_CODE (arg1) == BIT_AND_EXPR
9199 && integer_onep (TREE_OPERAND (arg1, 1)))))
9200 || (truth_value_p (TREE_CODE (arg1))
9201 && (truth_value_p (TREE_CODE (arg0))
9202 || (TREE_CODE (arg0) == BIT_AND_EXPR
9203 && integer_onep (TREE_OPERAND (arg0, 1)))))))
9205 tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9206 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9209 fold_convert (boolean_type_node, arg0),
9210 fold_convert (boolean_type_node, arg1));
9212 if (code == EQ_EXPR)
9213 tem = invert_truthvalue (tem);
9215 return fold_convert (type, tem);
9218 if (TREE_CODE_CLASS (code) == tcc_binary
9219 || TREE_CODE_CLASS (code) == tcc_comparison)
9221 if (TREE_CODE (arg0) == COMPOUND_EXPR)
9222 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9223 fold_build2 (code, type,
9224 fold_convert (TREE_TYPE (op0),
9225 TREE_OPERAND (arg0, 1)),
9227 if (TREE_CODE (arg1) == COMPOUND_EXPR
9228 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9229 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9230 fold_build2 (code, type, op0,
9231 fold_convert (TREE_TYPE (op1),
9232 TREE_OPERAND (arg1, 1))));
9234 if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9236 tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9238 /*cond_first_p=*/1);
9239 if (tem != NULL_TREE)
9243 if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9245 tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
9247 /*cond_first_p=*/0);
9248 if (tem != NULL_TREE)
9255 case POINTER_PLUS_EXPR:
9256 /* 0 +p index -> (type)index */
9257 if (integer_zerop (arg0))
9258 return non_lvalue (fold_convert (type, arg1));
9260 /* PTR +p 0 -> PTR */
9261 if (integer_zerop (arg1))
9262 return non_lvalue (fold_convert (type, arg0));
9264 /* INT +p INT -> (PTR)(INT + INT). Stripping types allows for this. */
9265 if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9266 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9267 return fold_convert (type, fold_build2 (PLUS_EXPR, sizetype,
9268 fold_convert (sizetype, arg1),
9269 fold_convert (sizetype, arg0)));
9271 /* index +p PTR -> PTR +p index */
9272 if (POINTER_TYPE_P (TREE_TYPE (arg1))
9273 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9274 return fold_build2 (POINTER_PLUS_EXPR, type,
9275 fold_convert (type, arg1),
9276 fold_convert (sizetype, arg0));
9278 /* (PTR +p B) +p A -> PTR +p (B + A) */
9279 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9282 tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1));
9283 tree arg00 = TREE_OPERAND (arg0, 0);
9284 inner = fold_build2 (PLUS_EXPR, sizetype,
9285 arg01, fold_convert (sizetype, arg1));
9286 return fold_convert (type,
9287 fold_build2 (POINTER_PLUS_EXPR,
9288 TREE_TYPE (arg00), arg00, inner));
9291 /* PTR_CST +p CST -> CST1 */
9292 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9293 return fold_build2 (PLUS_EXPR, type, arg0, fold_convert (type, arg1));
9295 /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9296 of the array. Loop optimizer sometimes produce this type of
9298 if (TREE_CODE (arg0) == ADDR_EXPR)
9300 tem = try_move_mult_to_index (arg0, fold_convert (sizetype, arg1));
9302 return fold_convert (type, tem);
9308 /* PTR + INT -> (INT)(PTR p+ INT) */
9309 if (POINTER_TYPE_P (TREE_TYPE (arg0))
9310 && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
9311 return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9314 fold_convert (sizetype, arg1)));
9315 /* INT + PTR -> (INT)(PTR p+ INT) */
9316 if (POINTER_TYPE_P (TREE_TYPE (arg1))
9317 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9318 return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
9321 fold_convert (sizetype, arg0)));
9322 /* A + (-B) -> A - B */
9323 if (TREE_CODE (arg1) == NEGATE_EXPR)
9324 return fold_build2 (MINUS_EXPR, type,
9325 fold_convert (type, arg0),
9326 fold_convert (type, TREE_OPERAND (arg1, 0)));
9327 /* (-A) + B -> B - A */
9328 if (TREE_CODE (arg0) == NEGATE_EXPR
9329 && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
9330 return fold_build2 (MINUS_EXPR, type,
9331 fold_convert (type, arg1),
9332 fold_convert (type, TREE_OPERAND (arg0, 0)));
9334 if (INTEGRAL_TYPE_P (type))
9336 /* Convert ~A + 1 to -A. */
9337 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9338 && integer_onep (arg1))
9339 return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
9342 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9343 && !TYPE_OVERFLOW_TRAPS (type))
9345 tree tem = TREE_OPERAND (arg0, 0);
9348 if (operand_equal_p (tem, arg1, 0))
9350 t1 = build_int_cst_type (type, -1);
9351 return omit_one_operand (type, t1, arg1);
9356 if (TREE_CODE (arg1) == BIT_NOT_EXPR
9357 && !TYPE_OVERFLOW_TRAPS (type))
9359 tree tem = TREE_OPERAND (arg1, 0);
9362 if (operand_equal_p (arg0, tem, 0))
9364 t1 = build_int_cst_type (type, -1);
9365 return omit_one_operand (type, t1, arg0);
9369 /* X + (X / CST) * -CST is X % CST. */
9370 if (TREE_CODE (arg1) == MULT_EXPR
9371 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9372 && operand_equal_p (arg0,
9373 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
9375 tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
9376 tree cst1 = TREE_OPERAND (arg1, 1);
9377 tree sum = fold_binary (PLUS_EXPR, TREE_TYPE (cst1), cst1, cst0);
9378 if (sum && integer_zerop (sum))
9379 return fold_convert (type,
9380 fold_build2 (TRUNC_MOD_EXPR,
9381 TREE_TYPE (arg0), arg0, cst0));
9385 /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
9386 same or one. Make sure type is not saturating.
9387 fold_plusminus_mult_expr will re-associate. */
9388 if ((TREE_CODE (arg0) == MULT_EXPR
9389 || TREE_CODE (arg1) == MULT_EXPR)
9390 && !TYPE_SATURATING (type)
9391 && (!FLOAT_TYPE_P (type) || flag_associative_math))
9393 tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9398 if (! FLOAT_TYPE_P (type))
9400 if (integer_zerop (arg1))
9401 return non_lvalue (fold_convert (type, arg0));
9403 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
9404 with a constant, and the two constants have no bits in common,
9405 we should treat this as a BIT_IOR_EXPR since this may produce more
9407 if (TREE_CODE (arg0) == BIT_AND_EXPR
9408 && TREE_CODE (arg1) == BIT_AND_EXPR
9409 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9410 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9411 && integer_zerop (const_binop (BIT_AND_EXPR,
9412 TREE_OPERAND (arg0, 1),
9413 TREE_OPERAND (arg1, 1), 0)))
9415 code = BIT_IOR_EXPR;
9419 /* Reassociate (plus (plus (mult) (foo)) (mult)) as
9420 (plus (plus (mult) (mult)) (foo)) so that we can
9421 take advantage of the factoring cases below. */
9422 if (((TREE_CODE (arg0) == PLUS_EXPR
9423 || TREE_CODE (arg0) == MINUS_EXPR)
9424 && TREE_CODE (arg1) == MULT_EXPR)
9425 || ((TREE_CODE (arg1) == PLUS_EXPR
9426 || TREE_CODE (arg1) == MINUS_EXPR)
9427 && TREE_CODE (arg0) == MULT_EXPR))
9429 tree parg0, parg1, parg, marg;
9430 enum tree_code pcode;
9432 if (TREE_CODE (arg1) == MULT_EXPR)
9433 parg = arg0, marg = arg1;
9435 parg = arg1, marg = arg0;
9436 pcode = TREE_CODE (parg);
9437 parg0 = TREE_OPERAND (parg, 0);
9438 parg1 = TREE_OPERAND (parg, 1);
9442 if (TREE_CODE (parg0) == MULT_EXPR
9443 && TREE_CODE (parg1) != MULT_EXPR)
9444 return fold_build2 (pcode, type,
9445 fold_build2 (PLUS_EXPR, type,
9446 fold_convert (type, parg0),
9447 fold_convert (type, marg)),
9448 fold_convert (type, parg1));
9449 if (TREE_CODE (parg0) != MULT_EXPR
9450 && TREE_CODE (parg1) == MULT_EXPR)
9451 return fold_build2 (PLUS_EXPR, type,
9452 fold_convert (type, parg0),
9453 fold_build2 (pcode, type,
9454 fold_convert (type, marg),
9461 /* See if ARG1 is zero and X + ARG1 reduces to X. */
9462 if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
9463 return non_lvalue (fold_convert (type, arg0));
9465 /* Likewise if the operands are reversed. */
9466 if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9467 return non_lvalue (fold_convert (type, arg1));
9469 /* Convert X + -C into X - C. */
9470 if (TREE_CODE (arg1) == REAL_CST
9471 && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
9473 tem = fold_negate_const (arg1, type);
9474 if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
9475 return fold_build2 (MINUS_EXPR, type,
9476 fold_convert (type, arg0),
9477 fold_convert (type, tem));
9480 /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
9481 to __complex__ ( x, y ). This is not the same for SNaNs or
9482 if signed zeros are involved. */
9483 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9484 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9485 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9487 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9488 tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9489 tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9490 bool arg0rz = false, arg0iz = false;
9491 if ((arg0r && (arg0rz = real_zerop (arg0r)))
9492 || (arg0i && (arg0iz = real_zerop (arg0i))))
9494 tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9495 tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9496 if (arg0rz && arg1i && real_zerop (arg1i))
9498 tree rp = arg1r ? arg1r
9499 : build1 (REALPART_EXPR, rtype, arg1);
9500 tree ip = arg0i ? arg0i
9501 : build1 (IMAGPART_EXPR, rtype, arg0);
9502 return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9504 else if (arg0iz && arg1r && real_zerop (arg1r))
9506 tree rp = arg0r ? arg0r
9507 : build1 (REALPART_EXPR, rtype, arg0);
9508 tree ip = arg1i ? arg1i
9509 : build1 (IMAGPART_EXPR, rtype, arg1);
9510 return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9515 if (flag_unsafe_math_optimizations
9516 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9517 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9518 && (tem = distribute_real_division (code, type, arg0, arg1)))
9521 /* Convert x+x into x*2.0. */
9522 if (operand_equal_p (arg0, arg1, 0)
9523 && SCALAR_FLOAT_TYPE_P (type))
9524 return fold_build2 (MULT_EXPR, type, arg0,
9525 build_real (type, dconst2));
9527 /* Convert a + (b*c + d*e) into (a + b*c) + d*e.
9528 We associate floats only if the user has specified
9529 -fassociative-math. */
9530 if (flag_associative_math
9531 && TREE_CODE (arg1) == PLUS_EXPR
9532 && TREE_CODE (arg0) != MULT_EXPR)
9534 tree tree10 = TREE_OPERAND (arg1, 0);
9535 tree tree11 = TREE_OPERAND (arg1, 1);
9536 if (TREE_CODE (tree11) == MULT_EXPR
9537 && TREE_CODE (tree10) == MULT_EXPR)
9540 tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
9541 return fold_build2 (PLUS_EXPR, type, tree0, tree11);
9544 /* Convert (b*c + d*e) + a into b*c + (d*e +a).
9545 We associate floats only if the user has specified
9546 -fassociative-math. */
9547 if (flag_associative_math
9548 && TREE_CODE (arg0) == PLUS_EXPR
9549 && TREE_CODE (arg1) != MULT_EXPR)
9551 tree tree00 = TREE_OPERAND (arg0, 0);
9552 tree tree01 = TREE_OPERAND (arg0, 1);
9553 if (TREE_CODE (tree01) == MULT_EXPR
9554 && TREE_CODE (tree00) == MULT_EXPR)
9557 tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
9558 return fold_build2 (PLUS_EXPR, type, tree00, tree0);
9564 /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
9565 is a rotate of A by C1 bits. */
9566 /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
9567 is a rotate of A by B bits. */
9569 enum tree_code code0, code1;
9571 code0 = TREE_CODE (arg0);
9572 code1 = TREE_CODE (arg1);
9573 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
9574 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
9575 && operand_equal_p (TREE_OPERAND (arg0, 0),
9576 TREE_OPERAND (arg1, 0), 0)
9577 && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
9578 TYPE_UNSIGNED (rtype))
9579 /* Only create rotates in complete modes. Other cases are not
9580 expanded properly. */
9581 && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
9583 tree tree01, tree11;
9584 enum tree_code code01, code11;
9586 tree01 = TREE_OPERAND (arg0, 1);
9587 tree11 = TREE_OPERAND (arg1, 1);
9588 STRIP_NOPS (tree01);
9589 STRIP_NOPS (tree11);
9590 code01 = TREE_CODE (tree01);
9591 code11 = TREE_CODE (tree11);
9592 if (code01 == INTEGER_CST
9593 && code11 == INTEGER_CST
9594 && TREE_INT_CST_HIGH (tree01) == 0
9595 && TREE_INT_CST_HIGH (tree11) == 0
9596 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
9597 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
9598 return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
9599 code0 == LSHIFT_EXPR ? tree01 : tree11);
9600 else if (code11 == MINUS_EXPR)
9602 tree tree110, tree111;
9603 tree110 = TREE_OPERAND (tree11, 0);
9604 tree111 = TREE_OPERAND (tree11, 1);
9605 STRIP_NOPS (tree110);
9606 STRIP_NOPS (tree111);
9607 if (TREE_CODE (tree110) == INTEGER_CST
9608 && 0 == compare_tree_int (tree110,
9610 (TREE_TYPE (TREE_OPERAND
9612 && operand_equal_p (tree01, tree111, 0))
9613 return build2 ((code0 == LSHIFT_EXPR
9616 type, TREE_OPERAND (arg0, 0), tree01);
9618 else if (code01 == MINUS_EXPR)
9620 tree tree010, tree011;
9621 tree010 = TREE_OPERAND (tree01, 0);
9622 tree011 = TREE_OPERAND (tree01, 1);
9623 STRIP_NOPS (tree010);
9624 STRIP_NOPS (tree011);
9625 if (TREE_CODE (tree010) == INTEGER_CST
9626 && 0 == compare_tree_int (tree010,
9628 (TREE_TYPE (TREE_OPERAND
9630 && operand_equal_p (tree11, tree011, 0))
9631 return build2 ((code0 != LSHIFT_EXPR
9634 type, TREE_OPERAND (arg0, 0), tree11);
9640 /* In most languages, can't associate operations on floats through
9641 parentheses. Rather than remember where the parentheses were, we
9642 don't associate floats at all, unless the user has specified
9644 And, we need to make sure type is not saturating. */
9646 if ((! FLOAT_TYPE_P (type) || flag_associative_math)
9647 && !TYPE_SATURATING (type))
9649 tree var0, con0, lit0, minus_lit0;
9650 tree var1, con1, lit1, minus_lit1;
9653 /* Split both trees into variables, constants, and literals. Then
9654 associate each group together, the constants with literals,
9655 then the result with variables. This increases the chances of
9656 literals being recombined later and of generating relocatable
9657 expressions for the sum of a constant and literal. */
9658 var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
9659 var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
9660 code == MINUS_EXPR);
9662 /* With undefined overflow we can only associate constants
9663 with one variable. */
9664 if ((POINTER_TYPE_P (type)
9665 || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
9671 if (TREE_CODE (tmp0) == NEGATE_EXPR)
9672 tmp0 = TREE_OPERAND (tmp0, 0);
9673 if (TREE_CODE (tmp1) == NEGATE_EXPR)
9674 tmp1 = TREE_OPERAND (tmp1, 0);
9675 /* The only case we can still associate with two variables
9676 is if they are the same, modulo negation. */
9677 if (!operand_equal_p (tmp0, tmp1, 0))
9681 /* Only do something if we found more than two objects. Otherwise,
9682 nothing has changed and we risk infinite recursion. */
9684 && (2 < ((var0 != 0) + (var1 != 0)
9685 + (con0 != 0) + (con1 != 0)
9686 + (lit0 != 0) + (lit1 != 0)
9687 + (minus_lit0 != 0) + (minus_lit1 != 0))))
9689 /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
9690 if (code == MINUS_EXPR)
9693 var0 = associate_trees (var0, var1, code, type);
9694 con0 = associate_trees (con0, con1, code, type);
9695 lit0 = associate_trees (lit0, lit1, code, type);
9696 minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
9698 /* Preserve the MINUS_EXPR if the negative part of the literal is
9699 greater than the positive part. Otherwise, the multiplicative
9700 folding code (i.e extract_muldiv) may be fooled in case
9701 unsigned constants are subtracted, like in the following
9702 example: ((X*2 + 4) - 8U)/2. */
9703 if (minus_lit0 && lit0)
9705 if (TREE_CODE (lit0) == INTEGER_CST
9706 && TREE_CODE (minus_lit0) == INTEGER_CST
9707 && tree_int_cst_lt (lit0, minus_lit0))
9709 minus_lit0 = associate_trees (minus_lit0, lit0,
9715 lit0 = associate_trees (lit0, minus_lit0,
9723 return fold_convert (type,
9724 associate_trees (var0, minus_lit0,
9728 con0 = associate_trees (con0, minus_lit0,
9730 return fold_convert (type,
9731 associate_trees (var0, con0,
9736 con0 = associate_trees (con0, lit0, code, type);
9737 return fold_convert (type, associate_trees (var0, con0,
9745 /* Pointer simplifications for subtraction, simple reassociations. */
9746 if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
9748 /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
9749 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
9750 && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
9752 tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9753 tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9754 tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9755 tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9756 return fold_build2 (PLUS_EXPR, type,
9757 fold_build2 (MINUS_EXPR, type, arg00, arg10),
9758 fold_build2 (MINUS_EXPR, type, arg01, arg11));
9760 /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
9761 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9763 tree arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
9764 tree arg01 = fold_convert (type, TREE_OPERAND (arg0, 1));
9765 tree tmp = fold_binary (MINUS_EXPR, type, arg00, fold_convert (type, arg1));
9767 return fold_build2 (PLUS_EXPR, type, tmp, arg01);
9770 /* A - (-B) -> A + B */
9771 if (TREE_CODE (arg1) == NEGATE_EXPR)
9772 return fold_build2 (PLUS_EXPR, type, op0,
9773 fold_convert (type, TREE_OPERAND (arg1, 0)));
9774 /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */
9775 if (TREE_CODE (arg0) == NEGATE_EXPR
9776 && (FLOAT_TYPE_P (type)
9777 || INTEGRAL_TYPE_P (type))
9778 && negate_expr_p (arg1)
9779 && reorder_operands_p (arg0, arg1))
9780 return fold_build2 (MINUS_EXPR, type,
9781 fold_convert (type, negate_expr (arg1)),
9782 fold_convert (type, TREE_OPERAND (arg0, 0)));
9783 /* Convert -A - 1 to ~A. */
9784 if (INTEGRAL_TYPE_P (type)
9785 && TREE_CODE (arg0) == NEGATE_EXPR
9786 && integer_onep (arg1)
9787 && !TYPE_OVERFLOW_TRAPS (type))
9788 return fold_build1 (BIT_NOT_EXPR, type,
9789 fold_convert (type, TREE_OPERAND (arg0, 0)));
9791 /* Convert -1 - A to ~A. */
9792 if (INTEGRAL_TYPE_P (type)
9793 && integer_all_onesp (arg0))
9794 return fold_build1 (BIT_NOT_EXPR, type, op1);
9797 /* X - (X / CST) * CST is X % CST. */
9798 if (INTEGRAL_TYPE_P (type)
9799 && TREE_CODE (arg1) == MULT_EXPR
9800 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
9801 && operand_equal_p (arg0,
9802 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
9803 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
9804 TREE_OPERAND (arg1, 1), 0))
9805 return fold_convert (type,
9806 fold_build2 (TRUNC_MOD_EXPR, TREE_TYPE (arg0),
9807 arg0, TREE_OPERAND (arg1, 1)));
9809 if (! FLOAT_TYPE_P (type))
9811 if (integer_zerop (arg0))
9812 return negate_expr (fold_convert (type, arg1));
9813 if (integer_zerop (arg1))
9814 return non_lvalue (fold_convert (type, arg0));
9816 /* Fold A - (A & B) into ~B & A. */
9817 if (!TREE_SIDE_EFFECTS (arg0)
9818 && TREE_CODE (arg1) == BIT_AND_EXPR)
9820 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
9822 tree arg10 = fold_convert (type, TREE_OPERAND (arg1, 0));
9823 return fold_build2 (BIT_AND_EXPR, type,
9824 fold_build1 (BIT_NOT_EXPR, type, arg10),
9825 fold_convert (type, arg0));
9827 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9829 tree arg11 = fold_convert (type, TREE_OPERAND (arg1, 1));
9830 return fold_build2 (BIT_AND_EXPR, type,
9831 fold_build1 (BIT_NOT_EXPR, type, arg11),
9832 fold_convert (type, arg0));
9836 /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9837 any power of 2 minus 1. */
9838 if (TREE_CODE (arg0) == BIT_AND_EXPR
9839 && TREE_CODE (arg1) == BIT_AND_EXPR
9840 && operand_equal_p (TREE_OPERAND (arg0, 0),
9841 TREE_OPERAND (arg1, 0), 0))
9843 tree mask0 = TREE_OPERAND (arg0, 1);
9844 tree mask1 = TREE_OPERAND (arg1, 1);
9845 tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9847 if (operand_equal_p (tem, mask1, 0))
9849 tem = fold_build2 (BIT_XOR_EXPR, type,
9850 TREE_OPERAND (arg0, 0), mask1);
9851 return fold_build2 (MINUS_EXPR, type, tem, mask1);
9856 /* See if ARG1 is zero and X - ARG1 reduces to X. */
9857 else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9858 return non_lvalue (fold_convert (type, arg0));
9860 /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether
9861 ARG0 is zero and X + ARG0 reduces to X, since that would mean
9862 (-ARG1 + ARG0) reduces to -ARG1. */
9863 else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9864 return negate_expr (fold_convert (type, arg1));
9866 /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
9867 __complex__ ( x, -y ). This is not the same for SNaNs or if
9868 signed zeros are involved. */
9869 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9870 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9871 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
9873 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
9874 tree arg0r = fold_unary (REALPART_EXPR, rtype, arg0);
9875 tree arg0i = fold_unary (IMAGPART_EXPR, rtype, arg0);
9876 bool arg0rz = false, arg0iz = false;
9877 if ((arg0r && (arg0rz = real_zerop (arg0r)))
9878 || (arg0i && (arg0iz = real_zerop (arg0i))))
9880 tree arg1r = fold_unary (REALPART_EXPR, rtype, arg1);
9881 tree arg1i = fold_unary (IMAGPART_EXPR, rtype, arg1);
9882 if (arg0rz && arg1i && real_zerop (arg1i))
9884 tree rp = fold_build1 (NEGATE_EXPR, rtype,
9886 : build1 (REALPART_EXPR, rtype, arg1));
9887 tree ip = arg0i ? arg0i
9888 : build1 (IMAGPART_EXPR, rtype, arg0);
9889 return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9891 else if (arg0iz && arg1r && real_zerop (arg1r))
9893 tree rp = arg0r ? arg0r
9894 : build1 (REALPART_EXPR, rtype, arg0);
9895 tree ip = fold_build1 (NEGATE_EXPR, rtype,
9897 : build1 (IMAGPART_EXPR, rtype, arg1));
9898 return fold_build2 (COMPLEX_EXPR, type, rp, ip);
9903 /* Fold &x - &x. This can happen from &x.foo - &x.
9904 This is unsafe for certain floats even in non-IEEE formats.
9905 In IEEE, it is unsafe because it does wrong for NaNs.
9906 Also note that operand_equal_p is always false if an operand
9909 if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
9910 && operand_equal_p (arg0, arg1, 0))
9911 return fold_convert (type, integer_zero_node);
9913 /* A - B -> A + (-B) if B is easily negatable. */
9914 if (negate_expr_p (arg1)
9915 && ((FLOAT_TYPE_P (type)
9916 /* Avoid this transformation if B is a positive REAL_CST. */
9917 && (TREE_CODE (arg1) != REAL_CST
9918 || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9919 || INTEGRAL_TYPE_P (type)))
9920 return fold_build2 (PLUS_EXPR, type,
9921 fold_convert (type, arg0),
9922 fold_convert (type, negate_expr (arg1)));
9924 /* Try folding difference of addresses. */
9928 if ((TREE_CODE (arg0) == ADDR_EXPR
9929 || TREE_CODE (arg1) == ADDR_EXPR)
9930 && ptr_difference_const (arg0, arg1, &diff))
9931 return build_int_cst_type (type, diff);
9934 /* Fold &a[i] - &a[j] to i-j. */
9935 if (TREE_CODE (arg0) == ADDR_EXPR
9936 && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9937 && TREE_CODE (arg1) == ADDR_EXPR
9938 && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9940 tree aref0 = TREE_OPERAND (arg0, 0);
9941 tree aref1 = TREE_OPERAND (arg1, 0);
9942 if (operand_equal_p (TREE_OPERAND (aref0, 0),
9943 TREE_OPERAND (aref1, 0), 0))
9945 tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9946 tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9947 tree esz = array_ref_element_size (aref0);
9948 tree diff = build2 (MINUS_EXPR, type, op0, op1);
9949 return fold_build2 (MULT_EXPR, type, diff,
9950 fold_convert (type, esz));
9955 if (flag_unsafe_math_optimizations
9956 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9957 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9958 && (tem = distribute_real_division (code, type, arg0, arg1)))
9961 /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9962 same or one. Make sure type is not saturating.
9963 fold_plusminus_mult_expr will re-associate. */
9964 if ((TREE_CODE (arg0) == MULT_EXPR
9965 || TREE_CODE (arg1) == MULT_EXPR)
9966 && !TYPE_SATURATING (type)
9967 && (!FLOAT_TYPE_P (type) || flag_associative_math))
9969 tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9977 /* (-A) * (-B) -> A * B */
9978 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9979 return fold_build2 (MULT_EXPR, type,
9980 fold_convert (type, TREE_OPERAND (arg0, 0)),
9981 fold_convert (type, negate_expr (arg1)));
9982 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9983 return fold_build2 (MULT_EXPR, type,
9984 fold_convert (type, negate_expr (arg0)),
9985 fold_convert (type, TREE_OPERAND (arg1, 0)));
9987 if (! FLOAT_TYPE_P (type))
9989 if (integer_zerop (arg1))
9990 return omit_one_operand (type, arg1, arg0);
9991 if (integer_onep (arg1))
9992 return non_lvalue (fold_convert (type, arg0));
9993 /* Transform x * -1 into -x. Make sure to do the negation
9994 on the original operand with conversions not stripped
9995 because we can only strip non-sign-changing conversions. */
9996 if (integer_all_onesp (arg1))
9997 return fold_convert (type, negate_expr (op0));
9998 /* Transform x * -C into -x * C if x is easily negatable. */
9999 if (TREE_CODE (arg1) == INTEGER_CST
10000 && tree_int_cst_sgn (arg1) == -1
10001 && negate_expr_p (arg0)
10002 && (tem = negate_expr (arg1)) != arg1
10003 && !TREE_OVERFLOW (tem))
10004 return fold_build2 (MULT_EXPR, type,
10005 fold_convert (type, negate_expr (arg0)), tem);
10007 /* (a * (1 << b)) is (a << b) */
10008 if (TREE_CODE (arg1) == LSHIFT_EXPR
10009 && integer_onep (TREE_OPERAND (arg1, 0)))
10010 return fold_build2 (LSHIFT_EXPR, type, op0,
10011 TREE_OPERAND (arg1, 1));
10012 if (TREE_CODE (arg0) == LSHIFT_EXPR
10013 && integer_onep (TREE_OPERAND (arg0, 0)))
10014 return fold_build2 (LSHIFT_EXPR, type, op1,
10015 TREE_OPERAND (arg0, 1));
10017 strict_overflow_p = false;
10018 if (TREE_CODE (arg1) == INTEGER_CST
10019 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10020 &strict_overflow_p)))
10022 if (strict_overflow_p)
10023 fold_overflow_warning (("assuming signed overflow does not "
10024 "occur when simplifying "
10026 WARN_STRICT_OVERFLOW_MISC);
10027 return fold_convert (type, tem);
10030 /* Optimize z * conj(z) for integer complex numbers. */
10031 if (TREE_CODE (arg0) == CONJ_EXPR
10032 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10033 return fold_mult_zconjz (type, arg1);
10034 if (TREE_CODE (arg1) == CONJ_EXPR
10035 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10036 return fold_mult_zconjz (type, arg0);
10040 /* Maybe fold x * 0 to 0. The expressions aren't the same
10041 when x is NaN, since x * 0 is also NaN. Nor are they the
10042 same in modes with signed zeros, since multiplying a
10043 negative value by 0 gives -0, not +0. */
10044 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10045 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10046 && real_zerop (arg1))
10047 return omit_one_operand (type, arg1, arg0);
10048 /* In IEEE floating point, x*1 is not equivalent to x for snans. */
10049 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10050 && real_onep (arg1))
10051 return non_lvalue (fold_convert (type, arg0));
10053 /* Transform x * -1.0 into -x. */
10054 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10055 && real_minus_onep (arg1))
10056 return fold_convert (type, negate_expr (arg0));
10058 /* Convert (C1/X)*C2 into (C1*C2)/X. This transformation may change
10059 the result for floating point types due to rounding so it is applied
10060 only if -fassociative-math was specify. */
10061 if (flag_associative_math
10062 && TREE_CODE (arg0) == RDIV_EXPR
10063 && TREE_CODE (arg1) == REAL_CST
10064 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10066 tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10069 return fold_build2 (RDIV_EXPR, type, tem,
10070 TREE_OPERAND (arg0, 1));
10073 /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y. */
10074 if (operand_equal_p (arg0, arg1, 0))
10076 tree tem = fold_strip_sign_ops (arg0);
10077 if (tem != NULL_TREE)
10079 tem = fold_convert (type, tem);
10080 return fold_build2 (MULT_EXPR, type, tem, tem);
10084 /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10085 This is not the same for NaNs or if signed zeros are
10087 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10088 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10089 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10090 && TREE_CODE (arg1) == COMPLEX_CST
10091 && real_zerop (TREE_REALPART (arg1)))
10093 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10094 if (real_onep (TREE_IMAGPART (arg1)))
10095 return fold_build2 (COMPLEX_EXPR, type,
10096 negate_expr (fold_build1 (IMAGPART_EXPR,
10098 fold_build1 (REALPART_EXPR, rtype, arg0));
10099 else if (real_minus_onep (TREE_IMAGPART (arg1)))
10100 return fold_build2 (COMPLEX_EXPR, type,
10101 fold_build1 (IMAGPART_EXPR, rtype, arg0),
10102 negate_expr (fold_build1 (REALPART_EXPR,
10106 /* Optimize z * conj(z) for floating point complex numbers.
10107 Guarded by flag_unsafe_math_optimizations as non-finite
10108 imaginary components don't produce scalar results. */
10109 if (flag_unsafe_math_optimizations
10110 && TREE_CODE (arg0) == CONJ_EXPR
10111 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10112 return fold_mult_zconjz (type, arg1);
10113 if (flag_unsafe_math_optimizations
10114 && TREE_CODE (arg1) == CONJ_EXPR
10115 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10116 return fold_mult_zconjz (type, arg0);
10118 if (flag_unsafe_math_optimizations)
10120 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10121 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10123 /* Optimizations of root(...)*root(...). */
10124 if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10127 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10128 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10130 /* Optimize sqrt(x)*sqrt(x) as x. */
10131 if (BUILTIN_SQRT_P (fcode0)
10132 && operand_equal_p (arg00, arg10, 0)
10133 && ! HONOR_SNANS (TYPE_MODE (type)))
10136 /* Optimize root(x)*root(y) as root(x*y). */
10137 rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10138 arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10139 return build_call_expr (rootfn, 1, arg);
10142 /* Optimize expN(x)*expN(y) as expN(x+y). */
10143 if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10145 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10146 tree arg = fold_build2 (PLUS_EXPR, type,
10147 CALL_EXPR_ARG (arg0, 0),
10148 CALL_EXPR_ARG (arg1, 0));
10149 return build_call_expr (expfn, 1, arg);
10152 /* Optimizations of pow(...)*pow(...). */
10153 if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10154 || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10155 || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10157 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10158 tree arg01 = CALL_EXPR_ARG (arg0, 1);
10159 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10160 tree arg11 = CALL_EXPR_ARG (arg1, 1);
10162 /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y). */
10163 if (operand_equal_p (arg01, arg11, 0))
10165 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10166 tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
10167 return build_call_expr (powfn, 2, arg, arg01);
10170 /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z). */
10171 if (operand_equal_p (arg00, arg10, 0))
10173 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10174 tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
10175 return build_call_expr (powfn, 2, arg00, arg);
10179 /* Optimize tan(x)*cos(x) as sin(x). */
10180 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10181 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10182 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10183 || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10184 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10185 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10186 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10187 CALL_EXPR_ARG (arg1, 0), 0))
10189 tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10191 if (sinfn != NULL_TREE)
10192 return build_call_expr (sinfn, 1, CALL_EXPR_ARG (arg0, 0));
10195 /* Optimize x*pow(x,c) as pow(x,c+1). */
10196 if (fcode1 == BUILT_IN_POW
10197 || fcode1 == BUILT_IN_POWF
10198 || fcode1 == BUILT_IN_POWL)
10200 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10201 tree arg11 = CALL_EXPR_ARG (arg1, 1);
10202 if (TREE_CODE (arg11) == REAL_CST
10203 && !TREE_OVERFLOW (arg11)
10204 && operand_equal_p (arg0, arg10, 0))
10206 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10210 c = TREE_REAL_CST (arg11);
10211 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10212 arg = build_real (type, c);
10213 return build_call_expr (powfn, 2, arg0, arg);
10217 /* Optimize pow(x,c)*x as pow(x,c+1). */
10218 if (fcode0 == BUILT_IN_POW
10219 || fcode0 == BUILT_IN_POWF
10220 || fcode0 == BUILT_IN_POWL)
10222 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10223 tree arg01 = CALL_EXPR_ARG (arg0, 1);
10224 if (TREE_CODE (arg01) == REAL_CST
10225 && !TREE_OVERFLOW (arg01)
10226 && operand_equal_p (arg1, arg00, 0))
10228 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10232 c = TREE_REAL_CST (arg01);
10233 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10234 arg = build_real (type, c);
10235 return build_call_expr (powfn, 2, arg1, arg);
10239 /* Optimize x*x as pow(x,2.0), which is expanded as x*x. */
10240 if (! optimize_size
10241 && operand_equal_p (arg0, arg1, 0))
10243 tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10247 tree arg = build_real (type, dconst2);
10248 return build_call_expr (powfn, 2, arg0, arg);
10257 if (integer_all_onesp (arg1))
10258 return omit_one_operand (type, arg1, arg0);
10259 if (integer_zerop (arg1))
10260 return non_lvalue (fold_convert (type, arg0));
10261 if (operand_equal_p (arg0, arg1, 0))
10262 return non_lvalue (fold_convert (type, arg0));
10264 /* ~X | X is -1. */
10265 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10266 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10268 t1 = fold_convert (type, integer_zero_node);
10269 t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10270 return omit_one_operand (type, t1, arg1);
10273 /* X | ~X is -1. */
10274 if (TREE_CODE (arg1) == BIT_NOT_EXPR
10275 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10277 t1 = fold_convert (type, integer_zero_node);
10278 t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10279 return omit_one_operand (type, t1, arg0);
10282 /* Canonicalize (X & C1) | C2. */
10283 if (TREE_CODE (arg0) == BIT_AND_EXPR
10284 && TREE_CODE (arg1) == INTEGER_CST
10285 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10287 unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, hi3, lo3, mlo, mhi;
10288 int width = TYPE_PRECISION (type), w;
10289 hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
10290 lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10291 hi2 = TREE_INT_CST_HIGH (arg1);
10292 lo2 = TREE_INT_CST_LOW (arg1);
10294 /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2). */
10295 if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
10296 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10298 if (width > HOST_BITS_PER_WIDE_INT)
10300 mhi = (unsigned HOST_WIDE_INT) -1
10301 >> (2 * HOST_BITS_PER_WIDE_INT - width);
10307 mlo = (unsigned HOST_WIDE_INT) -1
10308 >> (HOST_BITS_PER_WIDE_INT - width);
10311 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
10312 if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
10313 return fold_build2 (BIT_IOR_EXPR, type,
10314 TREE_OPERAND (arg0, 0), arg1);
10316 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
10317 unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
10318 mode which allows further optimizations. */
10325 for (w = BITS_PER_UNIT;
10326 w <= width && w <= HOST_BITS_PER_WIDE_INT;
10329 unsigned HOST_WIDE_INT mask
10330 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
10331 if (((lo1 | lo2) & mask) == mask
10332 && (lo1 & ~mask) == 0 && hi1 == 0)
10339 if (hi3 != hi1 || lo3 != lo1)
10340 return fold_build2 (BIT_IOR_EXPR, type,
10341 fold_build2 (BIT_AND_EXPR, type,
10342 TREE_OPERAND (arg0, 0),
10343 build_int_cst_wide (type,
10348 /* (X & Y) | Y is (X, Y). */
10349 if (TREE_CODE (arg0) == BIT_AND_EXPR
10350 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10351 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10352 /* (X & Y) | X is (Y, X). */
10353 if (TREE_CODE (arg0) == BIT_AND_EXPR
10354 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10355 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10356 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10357 /* X | (X & Y) is (Y, X). */
10358 if (TREE_CODE (arg1) == BIT_AND_EXPR
10359 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10360 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10361 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10362 /* X | (Y & X) is (Y, X). */
10363 if (TREE_CODE (arg1) == BIT_AND_EXPR
10364 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10365 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10366 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10368 t1 = distribute_bit_expr (code, type, arg0, arg1);
10369 if (t1 != NULL_TREE)
10372 /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
10374 This results in more efficient code for machines without a NAND
10375 instruction. Combine will canonicalize to the first form
10376 which will allow use of NAND instructions provided by the
10377 backend if they exist. */
10378 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10379 && TREE_CODE (arg1) == BIT_NOT_EXPR)
10381 return fold_build1 (BIT_NOT_EXPR, type,
10382 build2 (BIT_AND_EXPR, type,
10383 TREE_OPERAND (arg0, 0),
10384 TREE_OPERAND (arg1, 0)));
10387 /* See if this can be simplified into a rotate first. If that
10388 is unsuccessful continue in the association code. */
10392 if (integer_zerop (arg1))
10393 return non_lvalue (fold_convert (type, arg0));
10394 if (integer_all_onesp (arg1))
10395 return fold_build1 (BIT_NOT_EXPR, type, op0);
10396 if (operand_equal_p (arg0, arg1, 0))
10397 return omit_one_operand (type, integer_zero_node, arg0);
10399 /* ~X ^ X is -1. */
10400 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10401 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10403 t1 = fold_convert (type, integer_zero_node);
10404 t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10405 return omit_one_operand (type, t1, arg1);
10408 /* X ^ ~X is -1. */
10409 if (TREE_CODE (arg1) == BIT_NOT_EXPR
10410 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10412 t1 = fold_convert (type, integer_zero_node);
10413 t1 = fold_unary (BIT_NOT_EXPR, type, t1);
10414 return omit_one_operand (type, t1, arg0);
10417 /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
10418 with a constant, and the two constants have no bits in common,
10419 we should treat this as a BIT_IOR_EXPR since this may produce more
10420 simplifications. */
10421 if (TREE_CODE (arg0) == BIT_AND_EXPR
10422 && TREE_CODE (arg1) == BIT_AND_EXPR
10423 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10424 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10425 && integer_zerop (const_binop (BIT_AND_EXPR,
10426 TREE_OPERAND (arg0, 1),
10427 TREE_OPERAND (arg1, 1), 0)))
10429 code = BIT_IOR_EXPR;
10433 /* (X | Y) ^ X -> Y & ~ X*/
10434 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10435 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10437 tree t2 = TREE_OPERAND (arg0, 1);
10438 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10440 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10441 fold_convert (type, t1));
10445 /* (Y | X) ^ X -> Y & ~ X*/
10446 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10447 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10449 tree t2 = TREE_OPERAND (arg0, 0);
10450 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
10452 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10453 fold_convert (type, t1));
10457 /* X ^ (X | Y) -> Y & ~ X*/
10458 if (TREE_CODE (arg1) == BIT_IOR_EXPR
10459 && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
10461 tree t2 = TREE_OPERAND (arg1, 1);
10462 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10464 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10465 fold_convert (type, t1));
10469 /* X ^ (Y | X) -> Y & ~ X*/
10470 if (TREE_CODE (arg1) == BIT_IOR_EXPR
10471 && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
10473 tree t2 = TREE_OPERAND (arg1, 0);
10474 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
10476 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
10477 fold_convert (type, t1));
10481 /* Convert ~X ^ ~Y to X ^ Y. */
10482 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10483 && TREE_CODE (arg1) == BIT_NOT_EXPR)
10484 return fold_build2 (code, type,
10485 fold_convert (type, TREE_OPERAND (arg0, 0)),
10486 fold_convert (type, TREE_OPERAND (arg1, 0)));
10488 /* Convert ~X ^ C to X ^ ~C. */
10489 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10490 && TREE_CODE (arg1) == INTEGER_CST)
10491 return fold_build2 (code, type,
10492 fold_convert (type, TREE_OPERAND (arg0, 0)),
10493 fold_build1 (BIT_NOT_EXPR, type, arg1));
10495 /* Fold (X & 1) ^ 1 as (X & 1) == 0. */
10496 if (TREE_CODE (arg0) == BIT_AND_EXPR
10497 && integer_onep (TREE_OPERAND (arg0, 1))
10498 && integer_onep (arg1))
10499 return fold_build2 (EQ_EXPR, type, arg0,
10500 build_int_cst (TREE_TYPE (arg0), 0));
10502 /* Fold (X & Y) ^ Y as ~X & Y. */
10503 if (TREE_CODE (arg0) == BIT_AND_EXPR
10504 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10506 tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10507 return fold_build2 (BIT_AND_EXPR, type,
10508 fold_build1 (BIT_NOT_EXPR, type, tem),
10509 fold_convert (type, arg1));
10511 /* Fold (X & Y) ^ X as ~Y & X. */
10512 if (TREE_CODE (arg0) == BIT_AND_EXPR
10513 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10514 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10516 tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10517 return fold_build2 (BIT_AND_EXPR, type,
10518 fold_build1 (BIT_NOT_EXPR, type, tem),
10519 fold_convert (type, arg1));
10521 /* Fold X ^ (X & Y) as X & ~Y. */
10522 if (TREE_CODE (arg1) == BIT_AND_EXPR
10523 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10525 tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10526 return fold_build2 (BIT_AND_EXPR, type,
10527 fold_convert (type, arg0),
10528 fold_build1 (BIT_NOT_EXPR, type, tem));
10530 /* Fold X ^ (Y & X) as ~Y & X. */
10531 if (TREE_CODE (arg1) == BIT_AND_EXPR
10532 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10533 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10535 tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10536 return fold_build2 (BIT_AND_EXPR, type,
10537 fold_build1 (BIT_NOT_EXPR, type, tem),
10538 fold_convert (type, arg0));
10541 /* See if this can be simplified into a rotate first. If that
10542 is unsuccessful continue in the association code. */
10546 if (integer_all_onesp (arg1))
10547 return non_lvalue (fold_convert (type, arg0));
10548 if (integer_zerop (arg1))
10549 return omit_one_operand (type, arg1, arg0);
10550 if (operand_equal_p (arg0, arg1, 0))
10551 return non_lvalue (fold_convert (type, arg0));
10553 /* ~X & X is always zero. */
10554 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10555 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10556 return omit_one_operand (type, integer_zero_node, arg1);
10558 /* X & ~X is always zero. */
10559 if (TREE_CODE (arg1) == BIT_NOT_EXPR
10560 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10561 return omit_one_operand (type, integer_zero_node, arg0);
10563 /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2). */
10564 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10565 && TREE_CODE (arg1) == INTEGER_CST
10566 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10568 tree tmp1 = fold_convert (TREE_TYPE (arg0), arg1);
10569 tree tmp2 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10570 TREE_OPERAND (arg0, 0), tmp1);
10571 tree tmp3 = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10572 TREE_OPERAND (arg0, 1), tmp1);
10573 return fold_convert (type,
10574 fold_build2 (BIT_IOR_EXPR, TREE_TYPE (arg0),
10578 /* (X | Y) & Y is (X, Y). */
10579 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10580 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10581 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
10582 /* (X | Y) & X is (Y, X). */
10583 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10584 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10585 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10586 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
10587 /* X & (X | Y) is (Y, X). */
10588 if (TREE_CODE (arg1) == BIT_IOR_EXPR
10589 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
10590 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
10591 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
10592 /* X & (Y | X) is (Y, X). */
10593 if (TREE_CODE (arg1) == BIT_IOR_EXPR
10594 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10595 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10596 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
10598 /* Fold (X ^ 1) & 1 as (X & 1) == 0. */
10599 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10600 && integer_onep (TREE_OPERAND (arg0, 1))
10601 && integer_onep (arg1))
10603 tem = TREE_OPERAND (arg0, 0);
10604 return fold_build2 (EQ_EXPR, type,
10605 fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10606 build_int_cst (TREE_TYPE (tem), 1)),
10607 build_int_cst (TREE_TYPE (tem), 0));
10609 /* Fold ~X & 1 as (X & 1) == 0. */
10610 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10611 && integer_onep (arg1))
10613 tem = TREE_OPERAND (arg0, 0);
10614 return fold_build2 (EQ_EXPR, type,
10615 fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
10616 build_int_cst (TREE_TYPE (tem), 1)),
10617 build_int_cst (TREE_TYPE (tem), 0));
10620 /* Fold (X ^ Y) & Y as ~X & Y. */
10621 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10622 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10624 tem = fold_convert (type, TREE_OPERAND (arg0, 0));
10625 return fold_build2 (BIT_AND_EXPR, type,
10626 fold_build1 (BIT_NOT_EXPR, type, tem),
10627 fold_convert (type, arg1));
10629 /* Fold (X ^ Y) & X as ~Y & X. */
10630 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10631 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10632 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10634 tem = fold_convert (type, TREE_OPERAND (arg0, 1));
10635 return fold_build2 (BIT_AND_EXPR, type,
10636 fold_build1 (BIT_NOT_EXPR, type, tem),
10637 fold_convert (type, arg1));
10639 /* Fold X & (X ^ Y) as X & ~Y. */
10640 if (TREE_CODE (arg1) == BIT_XOR_EXPR
10641 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10643 tem = fold_convert (type, TREE_OPERAND (arg1, 1));
10644 return fold_build2 (BIT_AND_EXPR, type,
10645 fold_convert (type, arg0),
10646 fold_build1 (BIT_NOT_EXPR, type, tem));
10648 /* Fold X & (Y ^ X) as ~Y & X. */
10649 if (TREE_CODE (arg1) == BIT_XOR_EXPR
10650 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
10651 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10653 tem = fold_convert (type, TREE_OPERAND (arg1, 0));
10654 return fold_build2 (BIT_AND_EXPR, type,
10655 fold_build1 (BIT_NOT_EXPR, type, tem),
10656 fold_convert (type, arg0));
10659 t1 = distribute_bit_expr (code, type, arg0, arg1);
10660 if (t1 != NULL_TREE)
10662 /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */
10663 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
10664 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
10667 = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
10669 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
10670 && (~TREE_INT_CST_LOW (arg1)
10671 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
10672 return fold_convert (type, TREE_OPERAND (arg0, 0));
10675 /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
10677 This results in more efficient code for machines without a NOR
10678 instruction. Combine will canonicalize to the first form
10679 which will allow use of NOR instructions provided by the
10680 backend if they exist. */
10681 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10682 && TREE_CODE (arg1) == BIT_NOT_EXPR)
10684 return fold_build1 (BIT_NOT_EXPR, type,
10685 build2 (BIT_IOR_EXPR, type,
10686 fold_convert (type,
10687 TREE_OPERAND (arg0, 0)),
10688 fold_convert (type,
10689 TREE_OPERAND (arg1, 0))));
10692 /* If arg0 is derived from the address of an object or function, we may
10693 be able to fold this expression using the object or function's
10695 if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
10697 unsigned HOST_WIDE_INT modulus, residue;
10698 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
10700 modulus = get_pointer_modulus_and_residue (arg0, &residue);
10702 /* This works because modulus is a power of 2. If this weren't the
10703 case, we'd have to replace it by its greatest power-of-2
10704 divisor: modulus & -modulus. */
10706 return build_int_cst (type, residue & low);
10709 /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
10710 (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
10711 if the new mask might be further optimized. */
10712 if ((TREE_CODE (arg0) == LSHIFT_EXPR
10713 || TREE_CODE (arg0) == RSHIFT_EXPR)
10714 && host_integerp (TREE_OPERAND (arg0, 1), 1)
10715 && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
10716 && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
10717 < TYPE_PRECISION (TREE_TYPE (arg0))
10718 && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
10719 && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
10721 unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
10722 unsigned HOST_WIDE_INT mask
10723 = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
10724 unsigned HOST_WIDE_INT newmask, zerobits = 0;
10725 tree shift_type = TREE_TYPE (arg0);
10727 if (TREE_CODE (arg0) == LSHIFT_EXPR)
10728 zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
10729 else if (TREE_CODE (arg0) == RSHIFT_EXPR
10730 && TYPE_PRECISION (TREE_TYPE (arg0))
10731 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
10733 unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
10734 tree arg00 = TREE_OPERAND (arg0, 0);
10735 /* See if more bits can be proven as zero because of
10737 if (TREE_CODE (arg00) == NOP_EXPR
10738 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
10740 tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
10741 if (TYPE_PRECISION (inner_type)
10742 == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
10743 && TYPE_PRECISION (inner_type) < prec)
10745 prec = TYPE_PRECISION (inner_type);
10746 /* See if we can shorten the right shift. */
10748 shift_type = inner_type;
10751 zerobits = ~(unsigned HOST_WIDE_INT) 0;
10752 zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
10753 zerobits <<= prec - shiftc;
10754 /* For arithmetic shift if sign bit could be set, zerobits
10755 can contain actually sign bits, so no transformation is
10756 possible, unless MASK masks them all away. In that
10757 case the shift needs to be converted into logical shift. */
10758 if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
10759 && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
10761 if ((mask & zerobits) == 0)
10762 shift_type = unsigned_type_for (TREE_TYPE (arg0));
10768 /* ((X << 16) & 0xff00) is (X, 0). */
10769 if ((mask & zerobits) == mask)
10770 return omit_one_operand (type, build_int_cst (type, 0), arg0);
10772 newmask = mask | zerobits;
10773 if (newmask != mask && (newmask & (newmask + 1)) == 0)
10777 /* Only do the transformation if NEWMASK is some integer
10779 for (prec = BITS_PER_UNIT;
10780 prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
10781 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
10783 if (prec < HOST_BITS_PER_WIDE_INT
10784 || newmask == ~(unsigned HOST_WIDE_INT) 0)
10786 if (shift_type != TREE_TYPE (arg0))
10788 tem = fold_build2 (TREE_CODE (arg0), shift_type,
10789 fold_convert (shift_type,
10790 TREE_OPERAND (arg0, 0)),
10791 TREE_OPERAND (arg0, 1));
10792 tem = fold_convert (type, tem);
10796 return fold_build2 (BIT_AND_EXPR, type, tem,
10797 build_int_cst_type (TREE_TYPE (op1),
10806 /* Don't touch a floating-point divide by zero unless the mode
10807 of the constant can represent infinity. */
10808 if (TREE_CODE (arg1) == REAL_CST
10809 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
10810 && real_zerop (arg1))
10813 /* Optimize A / A to 1.0 if we don't care about
10814 NaNs or Infinities. Skip the transformation
10815 for non-real operands. */
10816 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
10817 && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10818 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
10819 && operand_equal_p (arg0, arg1, 0))
10821 tree r = build_real (TREE_TYPE (arg0), dconst1);
10823 return omit_two_operands (type, r, arg0, arg1);
10826 /* The complex version of the above A / A optimization. */
10827 if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10828 && operand_equal_p (arg0, arg1, 0))
10830 tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
10831 if (! HONOR_NANS (TYPE_MODE (elem_type))
10832 && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
10834 tree r = build_real (elem_type, dconst1);
10835 /* omit_two_operands will call fold_convert for us. */
10836 return omit_two_operands (type, r, arg0, arg1);
10840 /* (-A) / (-B) -> A / B */
10841 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10842 return fold_build2 (RDIV_EXPR, type,
10843 TREE_OPERAND (arg0, 0),
10844 negate_expr (arg1));
10845 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10846 return fold_build2 (RDIV_EXPR, type,
10847 negate_expr (arg0),
10848 TREE_OPERAND (arg1, 0));
10850 /* In IEEE floating point, x/1 is not equivalent to x for snans. */
10851 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10852 && real_onep (arg1))
10853 return non_lvalue (fold_convert (type, arg0));
10855 /* In IEEE floating point, x/-1 is not equivalent to -x for snans. */
10856 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10857 && real_minus_onep (arg1))
10858 return non_lvalue (fold_convert (type, negate_expr (arg0)));
10860 /* If ARG1 is a constant, we can convert this to a multiply by the
10861 reciprocal. This does not have the same rounding properties,
10862 so only do this if -freciprocal-math. We can actually
10863 always safely do it if ARG1 is a power of two, but it's hard to
10864 tell if it is or not in a portable manner. */
10865 if (TREE_CODE (arg1) == REAL_CST)
10867 if (flag_reciprocal_math
10868 && 0 != (tem = const_binop (code, build_real (type, dconst1),
10870 return fold_build2 (MULT_EXPR, type, arg0, tem);
10871 /* Find the reciprocal if optimizing and the result is exact. */
10875 r = TREE_REAL_CST (arg1);
10876 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
10878 tem = build_real (type, r);
10879 return fold_build2 (MULT_EXPR, type,
10880 fold_convert (type, arg0), tem);
10884 /* Convert A/B/C to A/(B*C). */
10885 if (flag_reciprocal_math
10886 && TREE_CODE (arg0) == RDIV_EXPR)
10887 return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
10888 fold_build2 (MULT_EXPR, type,
10889 TREE_OPERAND (arg0, 1), arg1));
10891 /* Convert A/(B/C) to (A/B)*C. */
10892 if (flag_reciprocal_math
10893 && TREE_CODE (arg1) == RDIV_EXPR)
10894 return fold_build2 (MULT_EXPR, type,
10895 fold_build2 (RDIV_EXPR, type, arg0,
10896 TREE_OPERAND (arg1, 0)),
10897 TREE_OPERAND (arg1, 1));
10899 /* Convert C1/(X*C2) into (C1/C2)/X. */
10900 if (flag_reciprocal_math
10901 && TREE_CODE (arg1) == MULT_EXPR
10902 && TREE_CODE (arg0) == REAL_CST
10903 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
10905 tree tem = const_binop (RDIV_EXPR, arg0,
10906 TREE_OPERAND (arg1, 1), 0);
10908 return fold_build2 (RDIV_EXPR, type, tem,
10909 TREE_OPERAND (arg1, 0));
10912 if (flag_unsafe_math_optimizations)
10914 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10915 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10917 /* Optimize sin(x)/cos(x) as tan(x). */
10918 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
10919 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
10920 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
10921 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10922 CALL_EXPR_ARG (arg1, 0), 0))
10924 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10926 if (tanfn != NULL_TREE)
10927 return build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10930 /* Optimize cos(x)/sin(x) as 1.0/tan(x). */
10931 if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
10932 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
10933 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
10934 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10935 CALL_EXPR_ARG (arg1, 0), 0))
10937 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
10939 if (tanfn != NULL_TREE)
10941 tree tmp = build_call_expr (tanfn, 1, CALL_EXPR_ARG (arg0, 0));
10942 return fold_build2 (RDIV_EXPR, type,
10943 build_real (type, dconst1), tmp);
10947 /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
10948 NaNs or Infinities. */
10949 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
10950 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
10951 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
10953 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10954 tree arg01 = CALL_EXPR_ARG (arg1, 0);
10956 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10957 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10958 && operand_equal_p (arg00, arg01, 0))
10960 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10962 if (cosfn != NULL_TREE)
10963 return build_call_expr (cosfn, 1, arg00);
10967 /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
10968 NaNs or Infinities. */
10969 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
10970 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
10971 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
10973 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10974 tree arg01 = CALL_EXPR_ARG (arg1, 0);
10976 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
10977 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
10978 && operand_equal_p (arg00, arg01, 0))
10980 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
10982 if (cosfn != NULL_TREE)
10984 tree tmp = build_call_expr (cosfn, 1, arg00);
10985 return fold_build2 (RDIV_EXPR, type,
10986 build_real (type, dconst1),
10992 /* Optimize pow(x,c)/x as pow(x,c-1). */
10993 if (fcode0 == BUILT_IN_POW
10994 || fcode0 == BUILT_IN_POWF
10995 || fcode0 == BUILT_IN_POWL)
10997 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10998 tree arg01 = CALL_EXPR_ARG (arg0, 1);
10999 if (TREE_CODE (arg01) == REAL_CST
11000 && !TREE_OVERFLOW (arg01)
11001 && operand_equal_p (arg1, arg00, 0))
11003 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11007 c = TREE_REAL_CST (arg01);
11008 real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11009 arg = build_real (type, c);
11010 return build_call_expr (powfn, 2, arg1, arg);
11014 /* Optimize a/root(b/c) into a*root(c/b). */
11015 if (BUILTIN_ROOT_P (fcode1))
11017 tree rootarg = CALL_EXPR_ARG (arg1, 0);
11019 if (TREE_CODE (rootarg) == RDIV_EXPR)
11021 tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11022 tree b = TREE_OPERAND (rootarg, 0);
11023 tree c = TREE_OPERAND (rootarg, 1);
11025 tree tmp = fold_build2 (RDIV_EXPR, type, c, b);
11027 tmp = build_call_expr (rootfn, 1, tmp);
11028 return fold_build2 (MULT_EXPR, type, arg0, tmp);
11032 /* Optimize x/expN(y) into x*expN(-y). */
11033 if (BUILTIN_EXPONENT_P (fcode1))
11035 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11036 tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11037 arg1 = build_call_expr (expfn, 1, fold_convert (type, arg));
11038 return fold_build2 (MULT_EXPR, type, arg0, arg1);
11041 /* Optimize x/pow(y,z) into x*pow(y,-z). */
11042 if (fcode1 == BUILT_IN_POW
11043 || fcode1 == BUILT_IN_POWF
11044 || fcode1 == BUILT_IN_POWL)
11046 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11047 tree arg10 = CALL_EXPR_ARG (arg1, 0);
11048 tree arg11 = CALL_EXPR_ARG (arg1, 1);
11049 tree neg11 = fold_convert (type, negate_expr (arg11));
11050 arg1 = build_call_expr (powfn, 2, arg10, neg11);
11051 return fold_build2 (MULT_EXPR, type, arg0, arg1);
11056 case TRUNC_DIV_EXPR:
11057 case FLOOR_DIV_EXPR:
11058 /* Simplify A / (B << N) where A and B are positive and B is
11059 a power of 2, to A >> (N + log2(B)). */
11060 strict_overflow_p = false;
11061 if (TREE_CODE (arg1) == LSHIFT_EXPR
11062 && (TYPE_UNSIGNED (type)
11063 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11065 tree sval = TREE_OPERAND (arg1, 0);
11066 if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11068 tree sh_cnt = TREE_OPERAND (arg1, 1);
11069 unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
11071 if (strict_overflow_p)
11072 fold_overflow_warning (("assuming signed overflow does not "
11073 "occur when simplifying A / (B << N)"),
11074 WARN_STRICT_OVERFLOW_MISC);
11076 sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
11077 sh_cnt, build_int_cst (NULL_TREE, pow2));
11078 return fold_build2 (RSHIFT_EXPR, type,
11079 fold_convert (type, arg0), sh_cnt);
11083 /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
11084 TRUNC_DIV_EXPR. Rewrite into the latter in this case. */
11085 if (INTEGRAL_TYPE_P (type)
11086 && TYPE_UNSIGNED (type)
11087 && code == FLOOR_DIV_EXPR)
11088 return fold_build2 (TRUNC_DIV_EXPR, type, op0, op1);
11092 case ROUND_DIV_EXPR:
11093 case CEIL_DIV_EXPR:
11094 case EXACT_DIV_EXPR:
11095 if (integer_onep (arg1))
11096 return non_lvalue (fold_convert (type, arg0));
11097 if (integer_zerop (arg1))
11099 /* X / -1 is -X. */
11100 if (!TYPE_UNSIGNED (type)
11101 && TREE_CODE (arg1) == INTEGER_CST
11102 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11103 && TREE_INT_CST_HIGH (arg1) == -1)
11104 return fold_convert (type, negate_expr (arg0));
11106 /* Convert -A / -B to A / B when the type is signed and overflow is
11108 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11109 && TREE_CODE (arg0) == NEGATE_EXPR
11110 && negate_expr_p (arg1))
11112 if (INTEGRAL_TYPE_P (type))
11113 fold_overflow_warning (("assuming signed overflow does not occur "
11114 "when distributing negation across "
11116 WARN_STRICT_OVERFLOW_MISC);
11117 return fold_build2 (code, type,
11118 fold_convert (type, TREE_OPERAND (arg0, 0)),
11119 negate_expr (arg1));
11121 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11122 && TREE_CODE (arg1) == NEGATE_EXPR
11123 && negate_expr_p (arg0))
11125 if (INTEGRAL_TYPE_P (type))
11126 fold_overflow_warning (("assuming signed overflow does not occur "
11127 "when distributing negation across "
11129 WARN_STRICT_OVERFLOW_MISC);
11130 return fold_build2 (code, type, negate_expr (arg0),
11131 TREE_OPERAND (arg1, 0));
11134 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11135 operation, EXACT_DIV_EXPR.
11137 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11138 At one time others generated faster code, it's not clear if they do
11139 after the last round to changes to the DIV code in expmed.c. */
11140 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11141 && multiple_of_p (type, arg0, arg1))
11142 return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
11144 strict_overflow_p = false;
11145 if (TREE_CODE (arg1) == INTEGER_CST
11146 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11147 &strict_overflow_p)))
11149 if (strict_overflow_p)
11150 fold_overflow_warning (("assuming signed overflow does not occur "
11151 "when simplifying division"),
11152 WARN_STRICT_OVERFLOW_MISC);
11153 return fold_convert (type, tem);
11158 case CEIL_MOD_EXPR:
11159 case FLOOR_MOD_EXPR:
11160 case ROUND_MOD_EXPR:
11161 case TRUNC_MOD_EXPR:
11162 /* X % 1 is always zero, but be sure to preserve any side
11164 if (integer_onep (arg1))
11165 return omit_one_operand (type, integer_zero_node, arg0);
11167 /* X % 0, return X % 0 unchanged so that we can get the
11168 proper warnings and errors. */
11169 if (integer_zerop (arg1))
11172 /* 0 % X is always zero, but be sure to preserve any side
11173 effects in X. Place this after checking for X == 0. */
11174 if (integer_zerop (arg0))
11175 return omit_one_operand (type, integer_zero_node, arg1);
11177 /* X % -1 is zero. */
11178 if (!TYPE_UNSIGNED (type)
11179 && TREE_CODE (arg1) == INTEGER_CST
11180 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
11181 && TREE_INT_CST_HIGH (arg1) == -1)
11182 return omit_one_operand (type, integer_zero_node, arg0);
11184 /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11185 i.e. "X % C" into "X & (C - 1)", if X and C are positive. */
11186 strict_overflow_p = false;
11187 if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11188 && (TYPE_UNSIGNED (type)
11189 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11192 /* Also optimize A % (C << N) where C is a power of 2,
11193 to A & ((C << N) - 1). */
11194 if (TREE_CODE (arg1) == LSHIFT_EXPR)
11195 c = TREE_OPERAND (arg1, 0);
11197 if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11199 tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1), arg1,
11200 build_int_cst (TREE_TYPE (arg1), 1));
11201 if (strict_overflow_p)
11202 fold_overflow_warning (("assuming signed overflow does not "
11203 "occur when simplifying "
11204 "X % (power of two)"),
11205 WARN_STRICT_OVERFLOW_MISC);
11206 return fold_build2 (BIT_AND_EXPR, type,
11207 fold_convert (type, arg0),
11208 fold_convert (type, mask));
11212 /* X % -C is the same as X % C. */
11213 if (code == TRUNC_MOD_EXPR
11214 && !TYPE_UNSIGNED (type)
11215 && TREE_CODE (arg1) == INTEGER_CST
11216 && !TREE_OVERFLOW (arg1)
11217 && TREE_INT_CST_HIGH (arg1) < 0
11218 && !TYPE_OVERFLOW_TRAPS (type)
11219 /* Avoid this transformation if C is INT_MIN, i.e. C == -C. */
11220 && !sign_bit_p (arg1, arg1))
11221 return fold_build2 (code, type, fold_convert (type, arg0),
11222 fold_convert (type, negate_expr (arg1)));
11224 /* X % -Y is the same as X % Y. */
11225 if (code == TRUNC_MOD_EXPR
11226 && !TYPE_UNSIGNED (type)
11227 && TREE_CODE (arg1) == NEGATE_EXPR
11228 && !TYPE_OVERFLOW_TRAPS (type))
11229 return fold_build2 (code, type, fold_convert (type, arg0),
11230 fold_convert (type, TREE_OPERAND (arg1, 0)));
11232 if (TREE_CODE (arg1) == INTEGER_CST
11233 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11234 &strict_overflow_p)))
11236 if (strict_overflow_p)
11237 fold_overflow_warning (("assuming signed overflow does not occur "
11238 "when simplifying modulos"),
11239 WARN_STRICT_OVERFLOW_MISC);
11240 return fold_convert (type, tem);
11247 if (integer_all_onesp (arg0))
11248 return omit_one_operand (type, arg0, arg1);
11252 /* Optimize -1 >> x for arithmetic right shifts. */
11253 if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
11254 return omit_one_operand (type, arg0, arg1);
11255 /* ... fall through ... */
11259 if (integer_zerop (arg1))
11260 return non_lvalue (fold_convert (type, arg0));
11261 if (integer_zerop (arg0))
11262 return omit_one_operand (type, arg0, arg1);
11264 /* Since negative shift count is not well-defined,
11265 don't try to compute it in the compiler. */
11266 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
11269 /* Turn (a OP c1) OP c2 into a OP (c1+c2). */
11270 if (TREE_CODE (op0) == code && host_integerp (arg1, false)
11271 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11272 && host_integerp (TREE_OPERAND (arg0, 1), false)
11273 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11275 HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
11276 + TREE_INT_CST_LOW (arg1));
11278 /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
11279 being well defined. */
11280 if (low >= TYPE_PRECISION (type))
11282 if (code == LROTATE_EXPR || code == RROTATE_EXPR)
11283 low = low % TYPE_PRECISION (type);
11284 else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
11285 return build_int_cst (type, 0);
11287 low = TYPE_PRECISION (type) - 1;
11290 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11291 build_int_cst (type, low));
11294 /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
11295 into x & ((unsigned)-1 >> c) for unsigned types. */
11296 if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
11297 || (TYPE_UNSIGNED (type)
11298 && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
11299 && host_integerp (arg1, false)
11300 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
11301 && host_integerp (TREE_OPERAND (arg0, 1), false)
11302 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
11304 HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
11305 HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
11311 arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
11313 lshift = build_int_cst (type, -1);
11314 lshift = int_const_binop (code, lshift, arg1, 0);
11316 return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
11320 /* Rewrite an LROTATE_EXPR by a constant into an
11321 RROTATE_EXPR by a new constant. */
11322 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
11324 tree tem = build_int_cst (TREE_TYPE (arg1),
11325 TYPE_PRECISION (type));
11326 tem = const_binop (MINUS_EXPR, tem, arg1, 0);
11327 return fold_build2 (RROTATE_EXPR, type, op0, tem);
11330 /* If we have a rotate of a bit operation with the rotate count and
11331 the second operand of the bit operation both constant,
11332 permute the two operations. */
11333 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11334 && (TREE_CODE (arg0) == BIT_AND_EXPR
11335 || TREE_CODE (arg0) == BIT_IOR_EXPR
11336 || TREE_CODE (arg0) == BIT_XOR_EXPR)
11337 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11338 return fold_build2 (TREE_CODE (arg0), type,
11339 fold_build2 (code, type,
11340 TREE_OPERAND (arg0, 0), arg1),
11341 fold_build2 (code, type,
11342 TREE_OPERAND (arg0, 1), arg1));
11344 /* Two consecutive rotates adding up to the precision of the
11345 type can be ignored. */
11346 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
11347 && TREE_CODE (arg0) == RROTATE_EXPR
11348 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11349 && TREE_INT_CST_HIGH (arg1) == 0
11350 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
11351 && ((TREE_INT_CST_LOW (arg1)
11352 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
11353 == (unsigned int) TYPE_PRECISION (type)))
11354 return TREE_OPERAND (arg0, 0);
11356 /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
11357 (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
11358 if the latter can be further optimized. */
11359 if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
11360 && TREE_CODE (arg0) == BIT_AND_EXPR
11361 && TREE_CODE (arg1) == INTEGER_CST
11362 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11364 tree mask = fold_build2 (code, type,
11365 fold_convert (type, TREE_OPERAND (arg0, 1)),
11367 tree shift = fold_build2 (code, type,
11368 fold_convert (type, TREE_OPERAND (arg0, 0)),
11370 tem = fold_binary (BIT_AND_EXPR, type, shift, mask);
11378 if (operand_equal_p (arg0, arg1, 0))
11379 return omit_one_operand (type, arg0, arg1);
11380 if (INTEGRAL_TYPE_P (type)
11381 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
11382 return omit_one_operand (type, arg1, arg0);
11383 tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
11389 if (operand_equal_p (arg0, arg1, 0))
11390 return omit_one_operand (type, arg0, arg1);
11391 if (INTEGRAL_TYPE_P (type)
11392 && TYPE_MAX_VALUE (type)
11393 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
11394 return omit_one_operand (type, arg1, arg0);
11395 tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
11400 case TRUTH_ANDIF_EXPR:
11401 /* Note that the operands of this must be ints
11402 and their values must be 0 or 1.
11403 ("true" is a fixed value perhaps depending on the language.) */
11404 /* If first arg is constant zero, return it. */
11405 if (integer_zerop (arg0))
11406 return fold_convert (type, arg0);
11407 case TRUTH_AND_EXPR:
11408 /* If either arg is constant true, drop it. */
11409 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11410 return non_lvalue (fold_convert (type, arg1));
11411 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
11412 /* Preserve sequence points. */
11413 && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11414 return non_lvalue (fold_convert (type, arg0));
11415 /* If second arg is constant zero, result is zero, but first arg
11416 must be evaluated. */
11417 if (integer_zerop (arg1))
11418 return omit_one_operand (type, arg1, arg0);
11419 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
11420 case will be handled here. */
11421 if (integer_zerop (arg0))
11422 return omit_one_operand (type, arg0, arg1);
11424 /* !X && X is always false. */
11425 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11426 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11427 return omit_one_operand (type, integer_zero_node, arg1);
11428 /* X && !X is always false. */
11429 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11430 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11431 return omit_one_operand (type, integer_zero_node, arg0);
11433 /* A < X && A + 1 > Y ==> A < X && A >= Y. Normally A + 1 > Y
11434 means A >= Y && A != MAX, but in this case we know that
11437 if (!TREE_SIDE_EFFECTS (arg0)
11438 && !TREE_SIDE_EFFECTS (arg1))
11440 tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
11441 if (tem && !operand_equal_p (tem, arg0, 0))
11442 return fold_build2 (code, type, tem, arg1);
11444 tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
11445 if (tem && !operand_equal_p (tem, arg1, 0))
11446 return fold_build2 (code, type, arg0, tem);
11450 /* We only do these simplifications if we are optimizing. */
11454 /* Check for things like (A || B) && (A || C). We can convert this
11455 to A || (B && C). Note that either operator can be any of the four
11456 truth and/or operations and the transformation will still be
11457 valid. Also note that we only care about order for the
11458 ANDIF and ORIF operators. If B contains side effects, this
11459 might change the truth-value of A. */
11460 if (TREE_CODE (arg0) == TREE_CODE (arg1)
11461 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
11462 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
11463 || TREE_CODE (arg0) == TRUTH_AND_EXPR
11464 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
11465 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
11467 tree a00 = TREE_OPERAND (arg0, 0);
11468 tree a01 = TREE_OPERAND (arg0, 1);
11469 tree a10 = TREE_OPERAND (arg1, 0);
11470 tree a11 = TREE_OPERAND (arg1, 1);
11471 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
11472 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
11473 && (code == TRUTH_AND_EXPR
11474 || code == TRUTH_OR_EXPR));
11476 if (operand_equal_p (a00, a10, 0))
11477 return fold_build2 (TREE_CODE (arg0), type, a00,
11478 fold_build2 (code, type, a01, a11));
11479 else if (commutative && operand_equal_p (a00, a11, 0))
11480 return fold_build2 (TREE_CODE (arg0), type, a00,
11481 fold_build2 (code, type, a01, a10));
11482 else if (commutative && operand_equal_p (a01, a10, 0))
11483 return fold_build2 (TREE_CODE (arg0), type, a01,
11484 fold_build2 (code, type, a00, a11));
11486 /* This case if tricky because we must either have commutative
11487 operators or else A10 must not have side-effects. */
11489 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
11490 && operand_equal_p (a01, a11, 0))
11491 return fold_build2 (TREE_CODE (arg0), type,
11492 fold_build2 (code, type, a00, a10),
11496 /* See if we can build a range comparison. */
11497 if (0 != (tem = fold_range_test (code, type, op0, op1)))
11500 /* Check for the possibility of merging component references. If our
11501 lhs is another similar operation, try to merge its rhs with our
11502 rhs. Then try to merge our lhs and rhs. */
11503 if (TREE_CODE (arg0) == code
11504 && 0 != (tem = fold_truthop (code, type,
11505 TREE_OPERAND (arg0, 1), arg1)))
11506 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11508 if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
11513 case TRUTH_ORIF_EXPR:
11514 /* Note that the operands of this must be ints
11515 and their values must be 0 or true.
11516 ("true" is a fixed value perhaps depending on the language.) */
11517 /* If first arg is constant true, return it. */
11518 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11519 return fold_convert (type, arg0);
11520 case TRUTH_OR_EXPR:
11521 /* If either arg is constant zero, drop it. */
11522 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
11523 return non_lvalue (fold_convert (type, arg1));
11524 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
11525 /* Preserve sequence points. */
11526 && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
11527 return non_lvalue (fold_convert (type, arg0));
11528 /* If second arg is constant true, result is true, but we must
11529 evaluate first arg. */
11530 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
11531 return omit_one_operand (type, arg1, arg0);
11532 /* Likewise for first arg, but note this only occurs here for
11534 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
11535 return omit_one_operand (type, arg0, arg1);
11537 /* !X || X is always true. */
11538 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11539 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11540 return omit_one_operand (type, integer_one_node, arg1);
11541 /* X || !X is always true. */
11542 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11543 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11544 return omit_one_operand (type, integer_one_node, arg0);
11548 case TRUTH_XOR_EXPR:
11549 /* If the second arg is constant zero, drop it. */
11550 if (integer_zerop (arg1))
11551 return non_lvalue (fold_convert (type, arg0));
11552 /* If the second arg is constant true, this is a logical inversion. */
11553 if (integer_onep (arg1))
11555 /* Only call invert_truthvalue if operand is a truth value. */
11556 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
11557 tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
11559 tem = invert_truthvalue (arg0);
11560 return non_lvalue (fold_convert (type, tem));
11562 /* Identical arguments cancel to zero. */
11563 if (operand_equal_p (arg0, arg1, 0))
11564 return omit_one_operand (type, integer_zero_node, arg0);
11566 /* !X ^ X is always true. */
11567 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11568 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11569 return omit_one_operand (type, integer_one_node, arg1);
11571 /* X ^ !X is always true. */
11572 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
11573 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11574 return omit_one_operand (type, integer_one_node, arg0);
11580 tem = fold_comparison (code, type, op0, op1);
11581 if (tem != NULL_TREE)
11584 /* bool_var != 0 becomes bool_var. */
11585 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11586 && code == NE_EXPR)
11587 return non_lvalue (fold_convert (type, arg0));
11589 /* bool_var == 1 becomes bool_var. */
11590 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11591 && code == EQ_EXPR)
11592 return non_lvalue (fold_convert (type, arg0));
11594 /* bool_var != 1 becomes !bool_var. */
11595 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
11596 && code == NE_EXPR)
11597 return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11599 /* bool_var == 0 becomes !bool_var. */
11600 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
11601 && code == EQ_EXPR)
11602 return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
11604 /* If this is an equality comparison of the address of two non-weak,
11605 unaliased symbols neither of which are extern (since we do not
11606 have access to attributes for externs), then we know the result. */
11607 if (TREE_CODE (arg0) == ADDR_EXPR
11608 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
11609 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
11610 && ! lookup_attribute ("alias",
11611 DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
11612 && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
11613 && TREE_CODE (arg1) == ADDR_EXPR
11614 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
11615 && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
11616 && ! lookup_attribute ("alias",
11617 DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
11618 && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
11620 /* We know that we're looking at the address of two
11621 non-weak, unaliased, static _DECL nodes.
11623 It is both wasteful and incorrect to call operand_equal_p
11624 to compare the two ADDR_EXPR nodes. It is wasteful in that
11625 all we need to do is test pointer equality for the arguments
11626 to the two ADDR_EXPR nodes. It is incorrect to use
11627 operand_equal_p as that function is NOT equivalent to a
11628 C equality test. It can in fact return false for two
11629 objects which would test as equal using the C equality
11631 bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
11632 return constant_boolean_node (equal
11633 ? code == EQ_EXPR : code != EQ_EXPR,
11637 /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
11638 a MINUS_EXPR of a constant, we can convert it into a comparison with
11639 a revised constant as long as no overflow occurs. */
11640 if (TREE_CODE (arg1) == INTEGER_CST
11641 && (TREE_CODE (arg0) == PLUS_EXPR
11642 || TREE_CODE (arg0) == MINUS_EXPR)
11643 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11644 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
11645 ? MINUS_EXPR : PLUS_EXPR,
11646 fold_convert (TREE_TYPE (arg0), arg1),
11647 TREE_OPERAND (arg0, 1), 0))
11648 && !TREE_OVERFLOW (tem))
11649 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11651 /* Similarly for a NEGATE_EXPR. */
11652 if (TREE_CODE (arg0) == NEGATE_EXPR
11653 && TREE_CODE (arg1) == INTEGER_CST
11654 && 0 != (tem = negate_expr (arg1))
11655 && TREE_CODE (tem) == INTEGER_CST
11656 && !TREE_OVERFLOW (tem))
11657 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
11659 /* Similarly for a BIT_XOR_EXPR; X ^ C1 == C2 is X == (C1 ^ C2). */
11660 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11661 && TREE_CODE (arg1) == INTEGER_CST
11662 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11663 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11664 fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg0),
11665 fold_convert (TREE_TYPE (arg0), arg1),
11666 TREE_OPERAND (arg0, 1)));
11668 /* Transform comparisons of the form X +- C CMP X. */
11669 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
11670 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11671 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11672 && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11673 || POINTER_TYPE_P (TREE_TYPE (arg0))))
11675 tree cst = TREE_OPERAND (arg0, 1);
11677 if (code == EQ_EXPR
11678 && !integer_zerop (cst))
11679 return omit_two_operands (type, boolean_false_node,
11680 TREE_OPERAND (arg0, 0), arg1);
11682 return omit_two_operands (type, boolean_true_node,
11683 TREE_OPERAND (arg0, 0), arg1);
11686 /* If we have X - Y == 0, we can convert that to X == Y and similarly
11687 for !=. Don't do this for ordered comparisons due to overflow. */
11688 if (TREE_CODE (arg0) == MINUS_EXPR
11689 && integer_zerop (arg1))
11690 return fold_build2 (code, type,
11691 TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
11693 /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */
11694 if (TREE_CODE (arg0) == ABS_EXPR
11695 && (integer_zerop (arg1) || real_zerop (arg1)))
11696 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
11698 /* If this is an EQ or NE comparison with zero and ARG0 is
11699 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
11700 two operations, but the latter can be done in one less insn
11701 on machines that have only two-operand insns or on which a
11702 constant cannot be the first operand. */
11703 if (TREE_CODE (arg0) == BIT_AND_EXPR
11704 && integer_zerop (arg1))
11706 tree arg00 = TREE_OPERAND (arg0, 0);
11707 tree arg01 = TREE_OPERAND (arg0, 1);
11708 if (TREE_CODE (arg00) == LSHIFT_EXPR
11709 && integer_onep (TREE_OPERAND (arg00, 0)))
11711 tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
11712 arg01, TREE_OPERAND (arg00, 1));
11713 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11714 build_int_cst (TREE_TYPE (arg0), 1));
11715 return fold_build2 (code, type,
11716 fold_convert (TREE_TYPE (arg1), tem), arg1);
11718 else if (TREE_CODE (arg01) == LSHIFT_EXPR
11719 && integer_onep (TREE_OPERAND (arg01, 0)))
11721 tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
11722 arg00, TREE_OPERAND (arg01, 1));
11723 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
11724 build_int_cst (TREE_TYPE (arg0), 1));
11725 return fold_build2 (code, type,
11726 fold_convert (TREE_TYPE (arg1), tem), arg1);
11730 /* If this is an NE or EQ comparison of zero against the result of a
11731 signed MOD operation whose second operand is a power of 2, make
11732 the MOD operation unsigned since it is simpler and equivalent. */
11733 if (integer_zerop (arg1)
11734 && !TYPE_UNSIGNED (TREE_TYPE (arg0))
11735 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
11736 || TREE_CODE (arg0) == CEIL_MOD_EXPR
11737 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
11738 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
11739 && integer_pow2p (TREE_OPERAND (arg0, 1)))
11741 tree newtype = unsigned_type_for (TREE_TYPE (arg0));
11742 tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
11743 fold_convert (newtype,
11744 TREE_OPERAND (arg0, 0)),
11745 fold_convert (newtype,
11746 TREE_OPERAND (arg0, 1)));
11748 return fold_build2 (code, type, newmod,
11749 fold_convert (newtype, arg1));
11752 /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
11753 C1 is a valid shift constant, and C2 is a power of two, i.e.
11755 if (TREE_CODE (arg0) == BIT_AND_EXPR
11756 && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
11757 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
11759 && integer_pow2p (TREE_OPERAND (arg0, 1))
11760 && integer_zerop (arg1))
11762 tree itype = TREE_TYPE (arg0);
11763 unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
11764 tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
11766 /* Check for a valid shift count. */
11767 if (TREE_INT_CST_HIGH (arg001) == 0
11768 && TREE_INT_CST_LOW (arg001) < prec)
11770 tree arg01 = TREE_OPERAND (arg0, 1);
11771 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11772 unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
11773 /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
11774 can be rewritten as (X & (C2 << C1)) != 0. */
11775 if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
11777 tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
11778 tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
11779 return fold_build2 (code, type, tem, arg1);
11781 /* Otherwise, for signed (arithmetic) shifts,
11782 ((X >> C1) & C2) != 0 is rewritten as X < 0, and
11783 ((X >> C1) & C2) == 0 is rewritten as X >= 0. */
11784 else if (!TYPE_UNSIGNED (itype))
11785 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
11786 arg000, build_int_cst (itype, 0));
11787 /* Otherwise, of unsigned (logical) shifts,
11788 ((X >> C1) & C2) != 0 is rewritten as (X,false), and
11789 ((X >> C1) & C2) == 0 is rewritten as (X,true). */
11791 return omit_one_operand (type,
11792 code == EQ_EXPR ? integer_one_node
11793 : integer_zero_node,
11798 /* If this is an NE comparison of zero with an AND of one, remove the
11799 comparison since the AND will give the correct value. */
11800 if (code == NE_EXPR
11801 && integer_zerop (arg1)
11802 && TREE_CODE (arg0) == BIT_AND_EXPR
11803 && integer_onep (TREE_OPERAND (arg0, 1)))
11804 return fold_convert (type, arg0);
11806 /* If we have (A & C) == C where C is a power of 2, convert this into
11807 (A & C) != 0. Similarly for NE_EXPR. */
11808 if (TREE_CODE (arg0) == BIT_AND_EXPR
11809 && integer_pow2p (TREE_OPERAND (arg0, 1))
11810 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11811 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11812 arg0, fold_convert (TREE_TYPE (arg0),
11813 integer_zero_node));
11815 /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
11816 bit, then fold the expression into A < 0 or A >= 0. */
11817 tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
11821 /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
11822 Similarly for NE_EXPR. */
11823 if (TREE_CODE (arg0) == BIT_AND_EXPR
11824 && TREE_CODE (arg1) == INTEGER_CST
11825 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11827 tree notc = fold_build1 (BIT_NOT_EXPR,
11828 TREE_TYPE (TREE_OPERAND (arg0, 1)),
11829 TREE_OPERAND (arg0, 1));
11830 tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11832 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11833 if (integer_nonzerop (dandnotc))
11834 return omit_one_operand (type, rslt, arg0);
11837 /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
11838 Similarly for NE_EXPR. */
11839 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11840 && TREE_CODE (arg1) == INTEGER_CST
11841 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11843 tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
11844 tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11845 TREE_OPERAND (arg0, 1), notd);
11846 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
11847 if (integer_nonzerop (candnotd))
11848 return omit_one_operand (type, rslt, arg0);
11851 /* Optimize comparisons of strlen vs zero to a compare of the
11852 first character of the string vs zero. To wit,
11853 strlen(ptr) == 0 => *ptr == 0
11854 strlen(ptr) != 0 => *ptr != 0
11855 Other cases should reduce to one of these two (or a constant)
11856 due to the return value of strlen being unsigned. */
11857 if (TREE_CODE (arg0) == CALL_EXPR
11858 && integer_zerop (arg1))
11860 tree fndecl = get_callee_fndecl (arg0);
11863 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
11864 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
11865 && call_expr_nargs (arg0) == 1
11866 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
11868 tree iref = build_fold_indirect_ref (CALL_EXPR_ARG (arg0, 0));
11869 return fold_build2 (code, type, iref,
11870 build_int_cst (TREE_TYPE (iref), 0));
11874 /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
11875 of X. Similarly fold (X >> C) == 0 into X >= 0. */
11876 if (TREE_CODE (arg0) == RSHIFT_EXPR
11877 && integer_zerop (arg1)
11878 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11880 tree arg00 = TREE_OPERAND (arg0, 0);
11881 tree arg01 = TREE_OPERAND (arg0, 1);
11882 tree itype = TREE_TYPE (arg00);
11883 if (TREE_INT_CST_HIGH (arg01) == 0
11884 && TREE_INT_CST_LOW (arg01)
11885 == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
11887 if (TYPE_UNSIGNED (itype))
11889 itype = signed_type_for (itype);
11890 arg00 = fold_convert (itype, arg00);
11892 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
11893 type, arg00, build_int_cst (itype, 0));
11897 /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y. */
11898 if (integer_zerop (arg1)
11899 && TREE_CODE (arg0) == BIT_XOR_EXPR)
11900 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11901 TREE_OPERAND (arg0, 1));
11903 /* (X ^ Y) == Y becomes X == 0. We know that Y has no side-effects. */
11904 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11905 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11906 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11907 build_int_cst (TREE_TYPE (arg1), 0));
11908 /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */
11909 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11910 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11911 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11912 return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
11913 build_int_cst (TREE_TYPE (arg1), 0));
11915 /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */
11916 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11917 && TREE_CODE (arg1) == INTEGER_CST
11918 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11919 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
11920 fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
11921 TREE_OPERAND (arg0, 1), arg1));
11923 /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
11924 (X & C) == 0 when C is a single bit. */
11925 if (TREE_CODE (arg0) == BIT_AND_EXPR
11926 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
11927 && integer_zerop (arg1)
11928 && integer_pow2p (TREE_OPERAND (arg0, 1)))
11930 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
11931 TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
11932 TREE_OPERAND (arg0, 1));
11933 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
11937 /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
11938 constant C is a power of two, i.e. a single bit. */
11939 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11940 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11941 && integer_zerop (arg1)
11942 && integer_pow2p (TREE_OPERAND (arg0, 1))
11943 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11944 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11946 tree arg00 = TREE_OPERAND (arg0, 0);
11947 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11948 arg00, build_int_cst (TREE_TYPE (arg00), 0));
11951 /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
11952 when is C is a power of two, i.e. a single bit. */
11953 if (TREE_CODE (arg0) == BIT_AND_EXPR
11954 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
11955 && integer_zerop (arg1)
11956 && integer_pow2p (TREE_OPERAND (arg0, 1))
11957 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11958 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
11960 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
11961 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
11962 arg000, TREE_OPERAND (arg0, 1));
11963 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
11964 tem, build_int_cst (TREE_TYPE (tem), 0));
11967 if (integer_zerop (arg1)
11968 && tree_expr_nonzero_p (arg0))
11970 tree res = constant_boolean_node (code==NE_EXPR, type);
11971 return omit_one_operand (type, res, arg0);
11974 /* Fold -X op -Y as X op Y, where op is eq/ne. */
11975 if (TREE_CODE (arg0) == NEGATE_EXPR
11976 && TREE_CODE (arg1) == NEGATE_EXPR)
11977 return fold_build2 (code, type,
11978 TREE_OPERAND (arg0, 0),
11979 TREE_OPERAND (arg1, 0));
11981 /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries. */
11982 if (TREE_CODE (arg0) == BIT_AND_EXPR
11983 && TREE_CODE (arg1) == BIT_AND_EXPR)
11985 tree arg00 = TREE_OPERAND (arg0, 0);
11986 tree arg01 = TREE_OPERAND (arg0, 1);
11987 tree arg10 = TREE_OPERAND (arg1, 0);
11988 tree arg11 = TREE_OPERAND (arg1, 1);
11989 tree itype = TREE_TYPE (arg0);
11991 if (operand_equal_p (arg01, arg11, 0))
11992 return fold_build2 (code, type,
11993 fold_build2 (BIT_AND_EXPR, itype,
11994 fold_build2 (BIT_XOR_EXPR, itype,
11997 build_int_cst (itype, 0));
11999 if (operand_equal_p (arg01, arg10, 0))
12000 return fold_build2 (code, type,
12001 fold_build2 (BIT_AND_EXPR, itype,
12002 fold_build2 (BIT_XOR_EXPR, itype,
12005 build_int_cst (itype, 0));
12007 if (operand_equal_p (arg00, arg11, 0))
12008 return fold_build2 (code, type,
12009 fold_build2 (BIT_AND_EXPR, itype,
12010 fold_build2 (BIT_XOR_EXPR, itype,
12013 build_int_cst (itype, 0));
12015 if (operand_equal_p (arg00, arg10, 0))
12016 return fold_build2 (code, type,
12017 fold_build2 (BIT_AND_EXPR, itype,
12018 fold_build2 (BIT_XOR_EXPR, itype,
12021 build_int_cst (itype, 0));
12024 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12025 && TREE_CODE (arg1) == BIT_XOR_EXPR)
12027 tree arg00 = TREE_OPERAND (arg0, 0);
12028 tree arg01 = TREE_OPERAND (arg0, 1);
12029 tree arg10 = TREE_OPERAND (arg1, 0);
12030 tree arg11 = TREE_OPERAND (arg1, 1);
12031 tree itype = TREE_TYPE (arg0);
12033 /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12034 operand_equal_p guarantees no side-effects so we don't need
12035 to use omit_one_operand on Z. */
12036 if (operand_equal_p (arg01, arg11, 0))
12037 return fold_build2 (code, type, arg00, arg10);
12038 if (operand_equal_p (arg01, arg10, 0))
12039 return fold_build2 (code, type, arg00, arg11);
12040 if (operand_equal_p (arg00, arg11, 0))
12041 return fold_build2 (code, type, arg01, arg10);
12042 if (operand_equal_p (arg00, arg10, 0))
12043 return fold_build2 (code, type, arg01, arg11);
12045 /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y. */
12046 if (TREE_CODE (arg01) == INTEGER_CST
12047 && TREE_CODE (arg11) == INTEGER_CST)
12048 return fold_build2 (code, type,
12049 fold_build2 (BIT_XOR_EXPR, itype, arg00,
12050 fold_build2 (BIT_XOR_EXPR, itype,
12055 /* Attempt to simplify equality/inequality comparisons of complex
12056 values. Only lower the comparison if the result is known or
12057 can be simplified to a single scalar comparison. */
12058 if ((TREE_CODE (arg0) == COMPLEX_EXPR
12059 || TREE_CODE (arg0) == COMPLEX_CST)
12060 && (TREE_CODE (arg1) == COMPLEX_EXPR
12061 || TREE_CODE (arg1) == COMPLEX_CST))
12063 tree real0, imag0, real1, imag1;
12066 if (TREE_CODE (arg0) == COMPLEX_EXPR)
12068 real0 = TREE_OPERAND (arg0, 0);
12069 imag0 = TREE_OPERAND (arg0, 1);
12073 real0 = TREE_REALPART (arg0);
12074 imag0 = TREE_IMAGPART (arg0);
12077 if (TREE_CODE (arg1) == COMPLEX_EXPR)
12079 real1 = TREE_OPERAND (arg1, 0);
12080 imag1 = TREE_OPERAND (arg1, 1);
12084 real1 = TREE_REALPART (arg1);
12085 imag1 = TREE_IMAGPART (arg1);
12088 rcond = fold_binary (code, type, real0, real1);
12089 if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12091 if (integer_zerop (rcond))
12093 if (code == EQ_EXPR)
12094 return omit_two_operands (type, boolean_false_node,
12096 return fold_build2 (NE_EXPR, type, imag0, imag1);
12100 if (code == NE_EXPR)
12101 return omit_two_operands (type, boolean_true_node,
12103 return fold_build2 (EQ_EXPR, type, imag0, imag1);
12107 icond = fold_binary (code, type, imag0, imag1);
12108 if (icond && TREE_CODE (icond) == INTEGER_CST)
12110 if (integer_zerop (icond))
12112 if (code == EQ_EXPR)
12113 return omit_two_operands (type, boolean_false_node,
12115 return fold_build2 (NE_EXPR, type, real0, real1);
12119 if (code == NE_EXPR)
12120 return omit_two_operands (type, boolean_true_node,
12122 return fold_build2 (EQ_EXPR, type, real0, real1);
12133 tem = fold_comparison (code, type, op0, op1);
12134 if (tem != NULL_TREE)
12137 /* Transform comparisons of the form X +- C CMP X. */
12138 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12139 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12140 && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12141 && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
12142 || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12143 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12145 tree arg01 = TREE_OPERAND (arg0, 1);
12146 enum tree_code code0 = TREE_CODE (arg0);
12149 if (TREE_CODE (arg01) == REAL_CST)
12150 is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12152 is_positive = tree_int_cst_sgn (arg01);
12154 /* (X - c) > X becomes false. */
12155 if (code == GT_EXPR
12156 && ((code0 == MINUS_EXPR && is_positive >= 0)
12157 || (code0 == PLUS_EXPR && is_positive <= 0)))
12159 if (TREE_CODE (arg01) == INTEGER_CST
12160 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12161 fold_overflow_warning (("assuming signed overflow does not "
12162 "occur when assuming that (X - c) > X "
12163 "is always false"),
12164 WARN_STRICT_OVERFLOW_ALL);
12165 return constant_boolean_node (0, type);
12168 /* Likewise (X + c) < X becomes false. */
12169 if (code == LT_EXPR
12170 && ((code0 == PLUS_EXPR && is_positive >= 0)
12171 || (code0 == MINUS_EXPR && is_positive <= 0)))
12173 if (TREE_CODE (arg01) == INTEGER_CST
12174 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12175 fold_overflow_warning (("assuming signed overflow does not "
12176 "occur when assuming that "
12177 "(X + c) < X is always false"),
12178 WARN_STRICT_OVERFLOW_ALL);
12179 return constant_boolean_node (0, type);
12182 /* Convert (X - c) <= X to true. */
12183 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12185 && ((code0 == MINUS_EXPR && is_positive >= 0)
12186 || (code0 == PLUS_EXPR && is_positive <= 0)))
12188 if (TREE_CODE (arg01) == INTEGER_CST
12189 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12190 fold_overflow_warning (("assuming signed overflow does not "
12191 "occur when assuming that "
12192 "(X - c) <= X is always true"),
12193 WARN_STRICT_OVERFLOW_ALL);
12194 return constant_boolean_node (1, type);
12197 /* Convert (X + c) >= X to true. */
12198 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
12200 && ((code0 == PLUS_EXPR && is_positive >= 0)
12201 || (code0 == MINUS_EXPR && is_positive <= 0)))
12203 if (TREE_CODE (arg01) == INTEGER_CST
12204 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12205 fold_overflow_warning (("assuming signed overflow does not "
12206 "occur when assuming that "
12207 "(X + c) >= X is always true"),
12208 WARN_STRICT_OVERFLOW_ALL);
12209 return constant_boolean_node (1, type);
12212 if (TREE_CODE (arg01) == INTEGER_CST)
12214 /* Convert X + c > X and X - c < X to true for integers. */
12215 if (code == GT_EXPR
12216 && ((code0 == PLUS_EXPR && is_positive > 0)
12217 || (code0 == MINUS_EXPR && is_positive < 0)))
12219 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12220 fold_overflow_warning (("assuming signed overflow does "
12221 "not occur when assuming that "
12222 "(X + c) > X is always true"),
12223 WARN_STRICT_OVERFLOW_ALL);
12224 return constant_boolean_node (1, type);
12227 if (code == LT_EXPR
12228 && ((code0 == MINUS_EXPR && is_positive > 0)
12229 || (code0 == PLUS_EXPR && is_positive < 0)))
12231 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12232 fold_overflow_warning (("assuming signed overflow does "
12233 "not occur when assuming that "
12234 "(X - c) < X is always true"),
12235 WARN_STRICT_OVERFLOW_ALL);
12236 return constant_boolean_node (1, type);
12239 /* Convert X + c <= X and X - c >= X to false for integers. */
12240 if (code == LE_EXPR
12241 && ((code0 == PLUS_EXPR && is_positive > 0)
12242 || (code0 == MINUS_EXPR && is_positive < 0)))
12244 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12245 fold_overflow_warning (("assuming signed overflow does "
12246 "not occur when assuming that "
12247 "(X + c) <= X is always false"),
12248 WARN_STRICT_OVERFLOW_ALL);
12249 return constant_boolean_node (0, type);
12252 if (code == GE_EXPR
12253 && ((code0 == MINUS_EXPR && is_positive > 0)
12254 || (code0 == PLUS_EXPR && is_positive < 0)))
12256 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12257 fold_overflow_warning (("assuming signed overflow does "
12258 "not occur when assuming that "
12259 "(X - c) >= X is always false"),
12260 WARN_STRICT_OVERFLOW_ALL);
12261 return constant_boolean_node (0, type);
12266 /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
12267 This transformation affects the cases which are handled in later
12268 optimizations involving comparisons with non-negative constants. */
12269 if (TREE_CODE (arg1) == INTEGER_CST
12270 && TREE_CODE (arg0) != INTEGER_CST
12271 && tree_int_cst_sgn (arg1) > 0)
12273 if (code == GE_EXPR)
12275 arg1 = const_binop (MINUS_EXPR, arg1,
12276 build_int_cst (TREE_TYPE (arg1), 1), 0);
12277 return fold_build2 (GT_EXPR, type, arg0,
12278 fold_convert (TREE_TYPE (arg0), arg1));
12280 if (code == LT_EXPR)
12282 arg1 = const_binop (MINUS_EXPR, arg1,
12283 build_int_cst (TREE_TYPE (arg1), 1), 0);
12284 return fold_build2 (LE_EXPR, type, arg0,
12285 fold_convert (TREE_TYPE (arg0), arg1));
12289 /* Comparisons with the highest or lowest possible integer of
12290 the specified precision will have known values. */
12292 tree arg1_type = TREE_TYPE (arg1);
12293 unsigned int width = TYPE_PRECISION (arg1_type);
12295 if (TREE_CODE (arg1) == INTEGER_CST
12296 && !TREE_OVERFLOW (arg1)
12297 && width <= 2 * HOST_BITS_PER_WIDE_INT
12298 && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12300 HOST_WIDE_INT signed_max_hi;
12301 unsigned HOST_WIDE_INT signed_max_lo;
12302 unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
12304 if (width <= HOST_BITS_PER_WIDE_INT)
12306 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12311 if (TYPE_UNSIGNED (arg1_type))
12313 max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12319 max_lo = signed_max_lo;
12320 min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12326 width -= HOST_BITS_PER_WIDE_INT;
12327 signed_max_lo = -1;
12328 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
12333 if (TYPE_UNSIGNED (arg1_type))
12335 max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
12340 max_hi = signed_max_hi;
12341 min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
12345 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
12346 && TREE_INT_CST_LOW (arg1) == max_lo)
12350 return omit_one_operand (type, integer_zero_node, arg0);
12353 return fold_build2 (EQ_EXPR, type, op0, op1);
12356 return omit_one_operand (type, integer_one_node, arg0);
12359 return fold_build2 (NE_EXPR, type, op0, op1);
12361 /* The GE_EXPR and LT_EXPR cases above are not normally
12362 reached because of previous transformations. */
12367 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12369 && TREE_INT_CST_LOW (arg1) == max_lo - 1)
12373 arg1 = const_binop (PLUS_EXPR, arg1,
12374 build_int_cst (TREE_TYPE (arg1), 1), 0);
12375 return fold_build2 (EQ_EXPR, type,
12376 fold_convert (TREE_TYPE (arg1), arg0),
12379 arg1 = const_binop (PLUS_EXPR, arg1,
12380 build_int_cst (TREE_TYPE (arg1), 1), 0);
12381 return fold_build2 (NE_EXPR, type,
12382 fold_convert (TREE_TYPE (arg1), arg0),
12387 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12389 && TREE_INT_CST_LOW (arg1) == min_lo)
12393 return omit_one_operand (type, integer_zero_node, arg0);
12396 return fold_build2 (EQ_EXPR, type, op0, op1);
12399 return omit_one_operand (type, integer_one_node, arg0);
12402 return fold_build2 (NE_EXPR, type, op0, op1);
12407 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
12409 && TREE_INT_CST_LOW (arg1) == min_lo + 1)
12413 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12414 return fold_build2 (NE_EXPR, type,
12415 fold_convert (TREE_TYPE (arg1), arg0),
12418 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
12419 return fold_build2 (EQ_EXPR, type,
12420 fold_convert (TREE_TYPE (arg1), arg0),
12426 else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
12427 && TREE_INT_CST_LOW (arg1) == signed_max_lo
12428 && TYPE_UNSIGNED (arg1_type)
12429 /* We will flip the signedness of the comparison operator
12430 associated with the mode of arg1, so the sign bit is
12431 specified by this mode. Check that arg1 is the signed
12432 max associated with this sign bit. */
12433 && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
12434 /* signed_type does not work on pointer types. */
12435 && INTEGRAL_TYPE_P (arg1_type))
12437 /* The following case also applies to X < signed_max+1
12438 and X >= signed_max+1 because previous transformations. */
12439 if (code == LE_EXPR || code == GT_EXPR)
12442 st = signed_type_for (TREE_TYPE (arg1));
12443 return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
12444 type, fold_convert (st, arg0),
12445 build_int_cst (st, 0));
12451 /* If we are comparing an ABS_EXPR with a constant, we can
12452 convert all the cases into explicit comparisons, but they may
12453 well not be faster than doing the ABS and one comparison.
12454 But ABS (X) <= C is a range comparison, which becomes a subtraction
12455 and a comparison, and is probably faster. */
12456 if (code == LE_EXPR
12457 && TREE_CODE (arg1) == INTEGER_CST
12458 && TREE_CODE (arg0) == ABS_EXPR
12459 && ! TREE_SIDE_EFFECTS (arg0)
12460 && (0 != (tem = negate_expr (arg1)))
12461 && TREE_CODE (tem) == INTEGER_CST
12462 && !TREE_OVERFLOW (tem))
12463 return fold_build2 (TRUTH_ANDIF_EXPR, type,
12464 build2 (GE_EXPR, type,
12465 TREE_OPERAND (arg0, 0), tem),
12466 build2 (LE_EXPR, type,
12467 TREE_OPERAND (arg0, 0), arg1));
12469 /* Convert ABS_EXPR<x> >= 0 to true. */
12470 strict_overflow_p = false;
12471 if (code == GE_EXPR
12472 && (integer_zerop (arg1)
12473 || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
12474 && real_zerop (arg1)))
12475 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12477 if (strict_overflow_p)
12478 fold_overflow_warning (("assuming signed overflow does not occur "
12479 "when simplifying comparison of "
12480 "absolute value and zero"),
12481 WARN_STRICT_OVERFLOW_CONDITIONAL);
12482 return omit_one_operand (type, integer_one_node, arg0);
12485 /* Convert ABS_EXPR<x> < 0 to false. */
12486 strict_overflow_p = false;
12487 if (code == LT_EXPR
12488 && (integer_zerop (arg1) || real_zerop (arg1))
12489 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
12491 if (strict_overflow_p)
12492 fold_overflow_warning (("assuming signed overflow does not occur "
12493 "when simplifying comparison of "
12494 "absolute value and zero"),
12495 WARN_STRICT_OVERFLOW_CONDITIONAL);
12496 return omit_one_operand (type, integer_zero_node, arg0);
12499 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
12500 and similarly for >= into !=. */
12501 if ((code == LT_EXPR || code == GE_EXPR)
12502 && TYPE_UNSIGNED (TREE_TYPE (arg0))
12503 && TREE_CODE (arg1) == LSHIFT_EXPR
12504 && integer_onep (TREE_OPERAND (arg1, 0)))
12505 return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12506 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12507 TREE_OPERAND (arg1, 1)),
12508 build_int_cst (TREE_TYPE (arg0), 0));
12510 if ((code == LT_EXPR || code == GE_EXPR)
12511 && TYPE_UNSIGNED (TREE_TYPE (arg0))
12512 && (TREE_CODE (arg1) == NOP_EXPR
12513 || TREE_CODE (arg1) == CONVERT_EXPR)
12514 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
12515 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
12517 build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
12518 fold_convert (TREE_TYPE (arg0),
12519 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
12520 TREE_OPERAND (TREE_OPERAND (arg1, 0),
12522 build_int_cst (TREE_TYPE (arg0), 0));
12526 case UNORDERED_EXPR:
12534 if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
12536 t1 = fold_relational_const (code, type, arg0, arg1);
12537 if (t1 != NULL_TREE)
12541 /* If the first operand is NaN, the result is constant. */
12542 if (TREE_CODE (arg0) == REAL_CST
12543 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
12544 && (code != LTGT_EXPR || ! flag_trapping_math))
12546 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12547 ? integer_zero_node
12548 : integer_one_node;
12549 return omit_one_operand (type, t1, arg1);
12552 /* If the second operand is NaN, the result is constant. */
12553 if (TREE_CODE (arg1) == REAL_CST
12554 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
12555 && (code != LTGT_EXPR || ! flag_trapping_math))
12557 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
12558 ? integer_zero_node
12559 : integer_one_node;
12560 return omit_one_operand (type, t1, arg0);
12563 /* Simplify unordered comparison of something with itself. */
12564 if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
12565 && operand_equal_p (arg0, arg1, 0))
12566 return constant_boolean_node (1, type);
12568 if (code == LTGT_EXPR
12569 && !flag_trapping_math
12570 && operand_equal_p (arg0, arg1, 0))
12571 return constant_boolean_node (0, type);
12573 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
12575 tree targ0 = strip_float_extensions (arg0);
12576 tree targ1 = strip_float_extensions (arg1);
12577 tree newtype = TREE_TYPE (targ0);
12579 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
12580 newtype = TREE_TYPE (targ1);
12582 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
12583 return fold_build2 (code, type, fold_convert (newtype, targ0),
12584 fold_convert (newtype, targ1));
12589 case COMPOUND_EXPR:
12590 /* When pedantic, a compound expression can be neither an lvalue
12591 nor an integer constant expression. */
12592 if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
12594 /* Don't let (0, 0) be null pointer constant. */
12595 tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
12596 : fold_convert (type, arg1);
12597 return pedantic_non_lvalue (tem);
12600 if ((TREE_CODE (arg0) == REAL_CST
12601 && TREE_CODE (arg1) == REAL_CST)
12602 || (TREE_CODE (arg0) == INTEGER_CST
12603 && TREE_CODE (arg1) == INTEGER_CST))
12604 return build_complex (type, arg0, arg1);
12608 /* An ASSERT_EXPR should never be passed to fold_binary. */
12609 gcc_unreachable ();
12613 } /* switch (code) */
12616 /* Callback for walk_tree, looking for LABEL_EXPR.
12617 Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
12618 Do not check the sub-tree of GOTO_EXPR. */
12621 contains_label_1 (tree *tp,
12622 int *walk_subtrees,
12623 void *data ATTRIBUTE_UNUSED)
12625 switch (TREE_CODE (*tp))
12630 *walk_subtrees = 0;
12637 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
12638 accessible from outside the sub-tree. Returns NULL_TREE if no
12639 addressable label is found. */
12642 contains_label_p (tree st)
12644 return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
12647 /* Fold a ternary expression of code CODE and type TYPE with operands
12648 OP0, OP1, and OP2. Return the folded expression if folding is
12649 successful. Otherwise, return NULL_TREE. */
12652 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
12655 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
12656 enum tree_code_class kind = TREE_CODE_CLASS (code);
12658 gcc_assert (IS_EXPR_CODE_CLASS (kind)
12659 && TREE_CODE_LENGTH (code) == 3);
12661 /* Strip any conversions that don't change the mode. This is safe
12662 for every expression, except for a comparison expression because
12663 its signedness is derived from its operands. So, in the latter
12664 case, only strip conversions that don't change the signedness.
12666 Note that this is done as an internal manipulation within the
12667 constant folder, in order to find the simplest representation of
12668 the arguments so that their form can be studied. In any cases,
12669 the appropriate type conversions should be put back in the tree
12670 that will get out of the constant folder. */
12685 case COMPONENT_REF:
12686 if (TREE_CODE (arg0) == CONSTRUCTOR
12687 && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
12689 unsigned HOST_WIDE_INT idx;
12691 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
12698 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
12699 so all simple results must be passed through pedantic_non_lvalue. */
12700 if (TREE_CODE (arg0) == INTEGER_CST)
12702 tree unused_op = integer_zerop (arg0) ? op1 : op2;
12703 tem = integer_zerop (arg0) ? op2 : op1;
12704 /* Only optimize constant conditions when the selected branch
12705 has the same type as the COND_EXPR. This avoids optimizing
12706 away "c ? x : throw", where the throw has a void type.
12707 Avoid throwing away that operand which contains label. */
12708 if ((!TREE_SIDE_EFFECTS (unused_op)
12709 || !contains_label_p (unused_op))
12710 && (! VOID_TYPE_P (TREE_TYPE (tem))
12711 || VOID_TYPE_P (type)))
12712 return pedantic_non_lvalue (tem);
12715 if (operand_equal_p (arg1, op2, 0))
12716 return pedantic_omit_one_operand (type, arg1, arg0);
12718 /* If we have A op B ? A : C, we may be able to convert this to a
12719 simpler expression, depending on the operation and the values
12720 of B and C. Signed zeros prevent all of these transformations,
12721 for reasons given above each one.
12723 Also try swapping the arguments and inverting the conditional. */
12724 if (COMPARISON_CLASS_P (arg0)
12725 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12726 arg1, TREE_OPERAND (arg0, 1))
12727 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
12729 tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
12734 if (COMPARISON_CLASS_P (arg0)
12735 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
12737 TREE_OPERAND (arg0, 1))
12738 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
12740 tem = fold_truth_not_expr (arg0);
12741 if (tem && COMPARISON_CLASS_P (tem))
12743 tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
12749 /* If the second operand is simpler than the third, swap them
12750 since that produces better jump optimization results. */
12751 if (truth_value_p (TREE_CODE (arg0))
12752 && tree_swap_operands_p (op1, op2, false))
12754 /* See if this can be inverted. If it can't, possibly because
12755 it was a floating-point inequality comparison, don't do
12757 tem = fold_truth_not_expr (arg0);
12759 return fold_build3 (code, type, tem, op2, op1);
12762 /* Convert A ? 1 : 0 to simply A. */
12763 if (integer_onep (op1)
12764 && integer_zerop (op2)
12765 /* If we try to convert OP0 to our type, the
12766 call to fold will try to move the conversion inside
12767 a COND, which will recurse. In that case, the COND_EXPR
12768 is probably the best choice, so leave it alone. */
12769 && type == TREE_TYPE (arg0))
12770 return pedantic_non_lvalue (arg0);
12772 /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR
12773 over COND_EXPR in cases such as floating point comparisons. */
12774 if (integer_zerop (op1)
12775 && integer_onep (op2)
12776 && truth_value_p (TREE_CODE (arg0)))
12777 return pedantic_non_lvalue (fold_convert (type,
12778 invert_truthvalue (arg0)));
12780 /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>). */
12781 if (TREE_CODE (arg0) == LT_EXPR
12782 && integer_zerop (TREE_OPERAND (arg0, 1))
12783 && integer_zerop (op2)
12784 && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
12786 /* sign_bit_p only checks ARG1 bits within A's precision.
12787 If <sign bit of A> has wider type than A, bits outside
12788 of A's precision in <sign bit of A> need to be checked.
12789 If they are all 0, this optimization needs to be done
12790 in unsigned A's type, if they are all 1 in signed A's type,
12791 otherwise this can't be done. */
12792 if (TYPE_PRECISION (TREE_TYPE (tem))
12793 < TYPE_PRECISION (TREE_TYPE (arg1))
12794 && TYPE_PRECISION (TREE_TYPE (tem))
12795 < TYPE_PRECISION (type))
12797 unsigned HOST_WIDE_INT mask_lo;
12798 HOST_WIDE_INT mask_hi;
12799 int inner_width, outer_width;
12802 inner_width = TYPE_PRECISION (TREE_TYPE (tem));
12803 outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
12804 if (outer_width > TYPE_PRECISION (type))
12805 outer_width = TYPE_PRECISION (type);
12807 if (outer_width > HOST_BITS_PER_WIDE_INT)
12809 mask_hi = ((unsigned HOST_WIDE_INT) -1
12810 >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
12816 mask_lo = ((unsigned HOST_WIDE_INT) -1
12817 >> (HOST_BITS_PER_WIDE_INT - outer_width));
12819 if (inner_width > HOST_BITS_PER_WIDE_INT)
12821 mask_hi &= ~((unsigned HOST_WIDE_INT) -1
12822 >> (HOST_BITS_PER_WIDE_INT - inner_width));
12826 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
12827 >> (HOST_BITS_PER_WIDE_INT - inner_width));
12829 if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
12830 && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
12832 tem_type = signed_type_for (TREE_TYPE (tem));
12833 tem = fold_convert (tem_type, tem);
12835 else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
12836 && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
12838 tem_type = unsigned_type_for (TREE_TYPE (tem));
12839 tem = fold_convert (tem_type, tem);
12846 return fold_convert (type,
12847 fold_build2 (BIT_AND_EXPR,
12848 TREE_TYPE (tem), tem,
12849 fold_convert (TREE_TYPE (tem),
12853 /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was
12854 already handled above. */
12855 if (TREE_CODE (arg0) == BIT_AND_EXPR
12856 && integer_onep (TREE_OPERAND (arg0, 1))
12857 && integer_zerop (op2)
12858 && integer_pow2p (arg1))
12860 tree tem = TREE_OPERAND (arg0, 0);
12862 if (TREE_CODE (tem) == RSHIFT_EXPR
12863 && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
12864 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
12865 TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
12866 return fold_build2 (BIT_AND_EXPR, type,
12867 TREE_OPERAND (tem, 0), arg1);
12870 /* A & N ? N : 0 is simply A & N if N is a power of two. This
12871 is probably obsolete because the first operand should be a
12872 truth value (that's why we have the two cases above), but let's
12873 leave it in until we can confirm this for all front-ends. */
12874 if (integer_zerop (op2)
12875 && TREE_CODE (arg0) == NE_EXPR
12876 && integer_zerop (TREE_OPERAND (arg0, 1))
12877 && integer_pow2p (arg1)
12878 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12879 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12880 arg1, OEP_ONLY_CONST))
12881 return pedantic_non_lvalue (fold_convert (type,
12882 TREE_OPERAND (arg0, 0)));
12884 /* Convert A ? B : 0 into A && B if A and B are truth values. */
12885 if (integer_zerop (op2)
12886 && truth_value_p (TREE_CODE (arg0))
12887 && truth_value_p (TREE_CODE (arg1)))
12888 return fold_build2 (TRUTH_ANDIF_EXPR, type,
12889 fold_convert (type, arg0),
12892 /* Convert A ? B : 1 into !A || B if A and B are truth values. */
12893 if (integer_onep (op2)
12894 && truth_value_p (TREE_CODE (arg0))
12895 && truth_value_p (TREE_CODE (arg1)))
12897 /* Only perform transformation if ARG0 is easily inverted. */
12898 tem = fold_truth_not_expr (arg0);
12900 return fold_build2 (TRUTH_ORIF_EXPR, type,
12901 fold_convert (type, tem),
12905 /* Convert A ? 0 : B into !A && B if A and B are truth values. */
12906 if (integer_zerop (arg1)
12907 && truth_value_p (TREE_CODE (arg0))
12908 && truth_value_p (TREE_CODE (op2)))
12910 /* Only perform transformation if ARG0 is easily inverted. */
12911 tem = fold_truth_not_expr (arg0);
12913 return fold_build2 (TRUTH_ANDIF_EXPR, type,
12914 fold_convert (type, tem),
12918 /* Convert A ? 1 : B into A || B if A and B are truth values. */
12919 if (integer_onep (arg1)
12920 && truth_value_p (TREE_CODE (arg0))
12921 && truth_value_p (TREE_CODE (op2)))
12922 return fold_build2 (TRUTH_ORIF_EXPR, type,
12923 fold_convert (type, arg0),
12929 /* CALL_EXPRs used to be ternary exprs. Catch any mistaken uses
12930 of fold_ternary on them. */
12931 gcc_unreachable ();
12933 case BIT_FIELD_REF:
12934 if ((TREE_CODE (arg0) == VECTOR_CST
12935 || (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
12936 && type == TREE_TYPE (TREE_TYPE (arg0)))
12938 unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
12939 unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
12942 && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
12943 && (idx % width) == 0
12944 && (idx = idx / width)
12945 < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
12947 tree elements = NULL_TREE;
12949 if (TREE_CODE (arg0) == VECTOR_CST)
12950 elements = TREE_VECTOR_CST_ELTS (arg0);
12953 unsigned HOST_WIDE_INT idx;
12956 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
12957 elements = tree_cons (NULL_TREE, value, elements);
12959 while (idx-- > 0 && elements)
12960 elements = TREE_CHAIN (elements);
12962 return TREE_VALUE (elements);
12964 return fold_convert (type, integer_zero_node);
12971 } /* switch (code) */
12974 /* Perform constant folding and related simplification of EXPR.
12975 The related simplifications include x*1 => x, x*0 => 0, etc.,
12976 and application of the associative law.
12977 NOP_EXPR conversions may be removed freely (as long as we
12978 are careful not to change the type of the overall expression).
12979 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
12980 but we can constant-fold them if they have constant operands. */
12982 #ifdef ENABLE_FOLD_CHECKING
12983 # define fold(x) fold_1 (x)
12984 static tree fold_1 (tree);
12990 const tree t = expr;
12991 enum tree_code code = TREE_CODE (t);
12992 enum tree_code_class kind = TREE_CODE_CLASS (code);
12995 /* Return right away if a constant. */
12996 if (kind == tcc_constant)
12999 /* CALL_EXPR-like objects with variable numbers of operands are
13000 treated specially. */
13001 if (kind == tcc_vl_exp)
13003 if (code == CALL_EXPR)
13005 tem = fold_call_expr (expr, false);
13006 return tem ? tem : expr;
13011 if (IS_EXPR_CODE_CLASS (kind)
13012 || IS_GIMPLE_STMT_CODE_CLASS (kind))
13014 tree type = TREE_TYPE (t);
13015 tree op0, op1, op2;
13017 switch (TREE_CODE_LENGTH (code))
13020 op0 = TREE_OPERAND (t, 0);
13021 tem = fold_unary (code, type, op0);
13022 return tem ? tem : expr;
13024 op0 = TREE_OPERAND (t, 0);
13025 op1 = TREE_OPERAND (t, 1);
13026 tem = fold_binary (code, type, op0, op1);
13027 return tem ? tem : expr;
13029 op0 = TREE_OPERAND (t, 0);
13030 op1 = TREE_OPERAND (t, 1);
13031 op2 = TREE_OPERAND (t, 2);
13032 tem = fold_ternary (code, type, op0, op1, op2);
13033 return tem ? tem : expr;
13042 return fold (DECL_INITIAL (t));
13046 } /* switch (code) */
13049 #ifdef ENABLE_FOLD_CHECKING
13052 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
13053 static void fold_check_failed (const_tree, const_tree);
13054 void print_fold_checksum (const_tree);
13056 /* When --enable-checking=fold, compute a digest of expr before
13057 and after actual fold call to see if fold did not accidentally
13058 change original expr. */
13064 struct md5_ctx ctx;
13065 unsigned char checksum_before[16], checksum_after[16];
13068 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13069 md5_init_ctx (&ctx);
13070 fold_checksum_tree (expr, &ctx, ht);
13071 md5_finish_ctx (&ctx, checksum_before);
13074 ret = fold_1 (expr);
13076 md5_init_ctx (&ctx);
13077 fold_checksum_tree (expr, &ctx, ht);
13078 md5_finish_ctx (&ctx, checksum_after);
13081 if (memcmp (checksum_before, checksum_after, 16))
13082 fold_check_failed (expr, ret);
13088 print_fold_checksum (const_tree expr)
13090 struct md5_ctx ctx;
13091 unsigned char checksum[16], cnt;
13094 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13095 md5_init_ctx (&ctx);
13096 fold_checksum_tree (expr, &ctx, ht);
13097 md5_finish_ctx (&ctx, checksum);
13099 for (cnt = 0; cnt < 16; ++cnt)
13100 fprintf (stderr, "%02x", checksum[cnt]);
13101 putc ('\n', stderr);
13105 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
13107 internal_error ("fold check: original tree changed by fold");
13111 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
13114 enum tree_code code;
13115 struct tree_function_decl buf;
13120 gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
13121 <= sizeof (struct tree_function_decl))
13122 && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
13125 slot = (const void **) htab_find_slot (ht, expr, INSERT);
13129 code = TREE_CODE (expr);
13130 if (TREE_CODE_CLASS (code) == tcc_declaration
13131 && DECL_ASSEMBLER_NAME_SET_P (expr))
13133 /* Allow DECL_ASSEMBLER_NAME to be modified. */
13134 memcpy ((char *) &buf, expr, tree_size (expr));
13135 SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
13136 expr = (tree) &buf;
13138 else if (TREE_CODE_CLASS (code) == tcc_type
13139 && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
13140 || TYPE_CACHED_VALUES_P (expr)
13141 || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
13143 /* Allow these fields to be modified. */
13145 memcpy ((char *) &buf, expr, tree_size (expr));
13146 expr = tmp = (tree) &buf;
13147 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
13148 TYPE_POINTER_TO (tmp) = NULL;
13149 TYPE_REFERENCE_TO (tmp) = NULL;
13150 if (TYPE_CACHED_VALUES_P (tmp))
13152 TYPE_CACHED_VALUES_P (tmp) = 0;
13153 TYPE_CACHED_VALUES (tmp) = NULL;
13156 md5_process_bytes (expr, tree_size (expr), ctx);
13157 fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
13158 if (TREE_CODE_CLASS (code) != tcc_type
13159 && TREE_CODE_CLASS (code) != tcc_declaration
13160 && code != TREE_LIST
13161 && code != SSA_NAME)
13162 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
13163 switch (TREE_CODE_CLASS (code))
13169 md5_process_bytes (TREE_STRING_POINTER (expr),
13170 TREE_STRING_LENGTH (expr), ctx);
13173 fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
13174 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
13177 fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
13183 case tcc_exceptional:
13187 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
13188 fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
13189 expr = TREE_CHAIN (expr);
13190 goto recursive_label;
13193 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
13194 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
13200 case tcc_expression:
13201 case tcc_reference:
13202 case tcc_comparison:
13205 case tcc_statement:
13207 len = TREE_OPERAND_LENGTH (expr);
13208 for (i = 0; i < len; ++i)
13209 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
13211 case tcc_declaration:
13212 fold_checksum_tree (DECL_NAME (expr), ctx, ht);
13213 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
13214 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
13216 fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
13217 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
13218 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
13219 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
13220 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
13222 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
13223 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
13225 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
13227 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
13228 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
13229 fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
13233 if (TREE_CODE (expr) == ENUMERAL_TYPE)
13234 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
13235 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
13236 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
13237 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
13238 fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
13239 if (INTEGRAL_TYPE_P (expr)
13240 || SCALAR_FLOAT_TYPE_P (expr))
13242 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
13243 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
13245 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
13246 if (TREE_CODE (expr) == RECORD_TYPE
13247 || TREE_CODE (expr) == UNION_TYPE
13248 || TREE_CODE (expr) == QUAL_UNION_TYPE)
13249 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
13250 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
13257 /* Helper function for outputting the checksum of a tree T. When
13258 debugging with gdb, you can "define mynext" to be "next" followed
13259 by "call debug_fold_checksum (op0)", then just trace down till the
13263 debug_fold_checksum (const_tree t)
13266 unsigned char checksum[16];
13267 struct md5_ctx ctx;
13268 htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13270 md5_init_ctx (&ctx);
13271 fold_checksum_tree (t, &ctx, ht);
13272 md5_finish_ctx (&ctx, checksum);
13275 for (i = 0; i < 16; i++)
13276 fprintf (stderr, "%d ", checksum[i]);
13278 fprintf (stderr, "\n");
13283 /* Fold a unary tree expression with code CODE of type TYPE with an
13284 operand OP0. Return a folded expression if successful. Otherwise,
13285 return a tree expression with code CODE of type TYPE with an
13289 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
13292 #ifdef ENABLE_FOLD_CHECKING
13293 unsigned char checksum_before[16], checksum_after[16];
13294 struct md5_ctx ctx;
13297 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13298 md5_init_ctx (&ctx);
13299 fold_checksum_tree (op0, &ctx, ht);
13300 md5_finish_ctx (&ctx, checksum_before);
13304 tem = fold_unary (code, type, op0);
13306 tem = build1_stat (code, type, op0 PASS_MEM_STAT);
13308 #ifdef ENABLE_FOLD_CHECKING
13309 md5_init_ctx (&ctx);
13310 fold_checksum_tree (op0, &ctx, ht);
13311 md5_finish_ctx (&ctx, checksum_after);
13314 if (memcmp (checksum_before, checksum_after, 16))
13315 fold_check_failed (op0, tem);
13320 /* Fold a binary tree expression with code CODE of type TYPE with
13321 operands OP0 and OP1. Return a folded expression if successful.
13322 Otherwise, return a tree expression with code CODE of type TYPE
13323 with operands OP0 and OP1. */
13326 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
13330 #ifdef ENABLE_FOLD_CHECKING
13331 unsigned char checksum_before_op0[16],
13332 checksum_before_op1[16],
13333 checksum_after_op0[16],
13334 checksum_after_op1[16];
13335 struct md5_ctx ctx;
13338 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13339 md5_init_ctx (&ctx);
13340 fold_checksum_tree (op0, &ctx, ht);
13341 md5_finish_ctx (&ctx, checksum_before_op0);
13344 md5_init_ctx (&ctx);
13345 fold_checksum_tree (op1, &ctx, ht);
13346 md5_finish_ctx (&ctx, checksum_before_op1);
13350 tem = fold_binary (code, type, op0, op1);
13352 tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
13354 #ifdef ENABLE_FOLD_CHECKING
13355 md5_init_ctx (&ctx);
13356 fold_checksum_tree (op0, &ctx, ht);
13357 md5_finish_ctx (&ctx, checksum_after_op0);
13360 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13361 fold_check_failed (op0, tem);
13363 md5_init_ctx (&ctx);
13364 fold_checksum_tree (op1, &ctx, ht);
13365 md5_finish_ctx (&ctx, checksum_after_op1);
13368 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13369 fold_check_failed (op1, tem);
13374 /* Fold a ternary tree expression with code CODE of type TYPE with
13375 operands OP0, OP1, and OP2. Return a folded expression if
13376 successful. Otherwise, return a tree expression with code CODE of
13377 type TYPE with operands OP0, OP1, and OP2. */
13380 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
13384 #ifdef ENABLE_FOLD_CHECKING
13385 unsigned char checksum_before_op0[16],
13386 checksum_before_op1[16],
13387 checksum_before_op2[16],
13388 checksum_after_op0[16],
13389 checksum_after_op1[16],
13390 checksum_after_op2[16];
13391 struct md5_ctx ctx;
13394 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13395 md5_init_ctx (&ctx);
13396 fold_checksum_tree (op0, &ctx, ht);
13397 md5_finish_ctx (&ctx, checksum_before_op0);
13400 md5_init_ctx (&ctx);
13401 fold_checksum_tree (op1, &ctx, ht);
13402 md5_finish_ctx (&ctx, checksum_before_op1);
13405 md5_init_ctx (&ctx);
13406 fold_checksum_tree (op2, &ctx, ht);
13407 md5_finish_ctx (&ctx, checksum_before_op2);
13411 gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
13412 tem = fold_ternary (code, type, op0, op1, op2);
13414 tem = build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
13416 #ifdef ENABLE_FOLD_CHECKING
13417 md5_init_ctx (&ctx);
13418 fold_checksum_tree (op0, &ctx, ht);
13419 md5_finish_ctx (&ctx, checksum_after_op0);
13422 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
13423 fold_check_failed (op0, tem);
13425 md5_init_ctx (&ctx);
13426 fold_checksum_tree (op1, &ctx, ht);
13427 md5_finish_ctx (&ctx, checksum_after_op1);
13430 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
13431 fold_check_failed (op1, tem);
13433 md5_init_ctx (&ctx);
13434 fold_checksum_tree (op2, &ctx, ht);
13435 md5_finish_ctx (&ctx, checksum_after_op2);
13438 if (memcmp (checksum_before_op2, checksum_after_op2, 16))
13439 fold_check_failed (op2, tem);
13444 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
13445 arguments in ARGARRAY, and a null static chain.
13446 Return a folded expression if successful. Otherwise, return a CALL_EXPR
13447 of type TYPE from the given operands as constructed by build_call_array. */
13450 fold_build_call_array (tree type, tree fn, int nargs, tree *argarray)
13453 #ifdef ENABLE_FOLD_CHECKING
13454 unsigned char checksum_before_fn[16],
13455 checksum_before_arglist[16],
13456 checksum_after_fn[16],
13457 checksum_after_arglist[16];
13458 struct md5_ctx ctx;
13462 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
13463 md5_init_ctx (&ctx);
13464 fold_checksum_tree (fn, &ctx, ht);
13465 md5_finish_ctx (&ctx, checksum_before_fn);
13468 md5_init_ctx (&ctx);
13469 for (i = 0; i < nargs; i++)
13470 fold_checksum_tree (argarray[i], &ctx, ht);
13471 md5_finish_ctx (&ctx, checksum_before_arglist);
13475 tem = fold_builtin_call_array (type, fn, nargs, argarray);
13477 #ifdef ENABLE_FOLD_CHECKING
13478 md5_init_ctx (&ctx);
13479 fold_checksum_tree (fn, &ctx, ht);
13480 md5_finish_ctx (&ctx, checksum_after_fn);
13483 if (memcmp (checksum_before_fn, checksum_after_fn, 16))
13484 fold_check_failed (fn, tem);
13486 md5_init_ctx (&ctx);
13487 for (i = 0; i < nargs; i++)
13488 fold_checksum_tree (argarray[i], &ctx, ht);
13489 md5_finish_ctx (&ctx, checksum_after_arglist);
13492 if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
13493 fold_check_failed (NULL_TREE, tem);
13498 /* Perform constant folding and related simplification of initializer
13499 expression EXPR. These behave identically to "fold_buildN" but ignore
13500 potential run-time traps and exceptions that fold must preserve. */
13502 #define START_FOLD_INIT \
13503 int saved_signaling_nans = flag_signaling_nans;\
13504 int saved_trapping_math = flag_trapping_math;\
13505 int saved_rounding_math = flag_rounding_math;\
13506 int saved_trapv = flag_trapv;\
13507 int saved_folding_initializer = folding_initializer;\
13508 flag_signaling_nans = 0;\
13509 flag_trapping_math = 0;\
13510 flag_rounding_math = 0;\
13512 folding_initializer = 1;
13514 #define END_FOLD_INIT \
13515 flag_signaling_nans = saved_signaling_nans;\
13516 flag_trapping_math = saved_trapping_math;\
13517 flag_rounding_math = saved_rounding_math;\
13518 flag_trapv = saved_trapv;\
13519 folding_initializer = saved_folding_initializer;
13522 fold_build1_initializer (enum tree_code code, tree type, tree op)
13527 result = fold_build1 (code, type, op);
13534 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
13539 result = fold_build2 (code, type, op0, op1);
13546 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
13552 result = fold_build3 (code, type, op0, op1, op2);
13559 fold_build_call_array_initializer (tree type, tree fn,
13560 int nargs, tree *argarray)
13565 result = fold_build_call_array (type, fn, nargs, argarray);
13571 #undef START_FOLD_INIT
13572 #undef END_FOLD_INIT
13574 /* Determine if first argument is a multiple of second argument. Return 0 if
13575 it is not, or we cannot easily determined it to be.
13577 An example of the sort of thing we care about (at this point; this routine
13578 could surely be made more general, and expanded to do what the *_DIV_EXPR's
13579 fold cases do now) is discovering that
13581 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13587 when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
13589 This code also handles discovering that
13591 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
13593 is a multiple of 8 so we don't have to worry about dealing with a
13594 possible remainder.
13596 Note that we *look* inside a SAVE_EXPR only to determine how it was
13597 calculated; it is not safe for fold to do much of anything else with the
13598 internals of a SAVE_EXPR, since it cannot know when it will be evaluated
13599 at run time. For example, the latter example above *cannot* be implemented
13600 as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
13601 evaluation time of the original SAVE_EXPR is not necessarily the same at
13602 the time the new expression is evaluated. The only optimization of this
13603 sort that would be valid is changing
13605 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
13609 SAVE_EXPR (I) * SAVE_EXPR (J)
13611 (where the same SAVE_EXPR (J) is used in the original and the
13612 transformed version). */
13615 multiple_of_p (tree type, const_tree top, const_tree bottom)
13617 if (operand_equal_p (top, bottom, 0))
13620 if (TREE_CODE (type) != INTEGER_TYPE)
13623 switch (TREE_CODE (top))
13626 /* Bitwise and provides a power of two multiple. If the mask is
13627 a multiple of BOTTOM then TOP is a multiple of BOTTOM. */
13628 if (!integer_pow2p (bottom))
13633 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13634 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13638 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
13639 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
13642 if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
13646 op1 = TREE_OPERAND (top, 1);
13647 /* const_binop may not detect overflow correctly,
13648 so check for it explicitly here. */
13649 if (TYPE_PRECISION (TREE_TYPE (size_one_node))
13650 > TREE_INT_CST_LOW (op1)
13651 && TREE_INT_CST_HIGH (op1) == 0
13652 && 0 != (t1 = fold_convert (type,
13653 const_binop (LSHIFT_EXPR,
13656 && !TREE_OVERFLOW (t1))
13657 return multiple_of_p (type, t1, bottom);
13662 /* Can't handle conversions from non-integral or wider integral type. */
13663 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
13664 || (TYPE_PRECISION (type)
13665 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
13668 /* .. fall through ... */
13671 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
13674 if (TREE_CODE (bottom) != INTEGER_CST
13675 || integer_zerop (bottom)
13676 || (TYPE_UNSIGNED (type)
13677 && (tree_int_cst_sgn (top) < 0
13678 || tree_int_cst_sgn (bottom) < 0)))
13680 return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
13688 /* Return true if CODE or TYPE is known to be non-negative. */
13691 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
13693 if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
13694 && truth_value_p (code))
13695 /* Truth values evaluate to 0 or 1, which is nonnegative unless we
13696 have a signed:1 type (where the value is -1 and 0). */
13701 /* Return true if (CODE OP0) is known to be non-negative. If the return
13702 value is based on the assumption that signed overflow is undefined,
13703 set *STRICT_OVERFLOW_P to true; otherwise, don't change
13704 *STRICT_OVERFLOW_P. */
13707 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13708 bool *strict_overflow_p)
13710 if (TYPE_UNSIGNED (type))
13716 /* We can't return 1 if flag_wrapv is set because
13717 ABS_EXPR<INT_MIN> = INT_MIN. */
13718 if (!INTEGRAL_TYPE_P (type))
13720 if (TYPE_OVERFLOW_UNDEFINED (type))
13722 *strict_overflow_p = true;
13727 case NON_LVALUE_EXPR:
13729 case FIX_TRUNC_EXPR:
13730 return tree_expr_nonnegative_warnv_p (op0,
13731 strict_overflow_p);
13735 tree inner_type = TREE_TYPE (op0);
13736 tree outer_type = type;
13738 if (TREE_CODE (outer_type) == REAL_TYPE)
13740 if (TREE_CODE (inner_type) == REAL_TYPE)
13741 return tree_expr_nonnegative_warnv_p (op0,
13742 strict_overflow_p);
13743 if (TREE_CODE (inner_type) == INTEGER_TYPE)
13745 if (TYPE_UNSIGNED (inner_type))
13747 return tree_expr_nonnegative_warnv_p (op0,
13748 strict_overflow_p);
13751 else if (TREE_CODE (outer_type) == INTEGER_TYPE)
13753 if (TREE_CODE (inner_type) == REAL_TYPE)
13754 return tree_expr_nonnegative_warnv_p (op0,
13755 strict_overflow_p);
13756 if (TREE_CODE (inner_type) == INTEGER_TYPE)
13757 return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
13758 && TYPE_UNSIGNED (inner_type);
13764 return tree_simple_nonnegative_warnv_p (code, type);
13767 /* We don't know sign of `t', so be conservative and return false. */
13771 /* Return true if (CODE OP0 OP1) is known to be non-negative. If the return
13772 value is based on the assumption that signed overflow is undefined,
13773 set *STRICT_OVERFLOW_P to true; otherwise, don't change
13774 *STRICT_OVERFLOW_P. */
13777 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
13778 tree op1, bool *strict_overflow_p)
13780 if (TYPE_UNSIGNED (type))
13785 case POINTER_PLUS_EXPR:
13787 if (FLOAT_TYPE_P (type))
13788 return (tree_expr_nonnegative_warnv_p (op0,
13790 && tree_expr_nonnegative_warnv_p (op1,
13791 strict_overflow_p));
13793 /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
13794 both unsigned and at least 2 bits shorter than the result. */
13795 if (TREE_CODE (type) == INTEGER_TYPE
13796 && TREE_CODE (op0) == NOP_EXPR
13797 && TREE_CODE (op1) == NOP_EXPR)
13799 tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13800 tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13801 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13802 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13804 unsigned int prec = MAX (TYPE_PRECISION (inner1),
13805 TYPE_PRECISION (inner2)) + 1;
13806 return prec < TYPE_PRECISION (type);
13812 if (FLOAT_TYPE_P (type))
13814 /* x * x for floating point x is always non-negative. */
13815 if (operand_equal_p (op0, op1, 0))
13817 return (tree_expr_nonnegative_warnv_p (op0,
13819 && tree_expr_nonnegative_warnv_p (op1,
13820 strict_overflow_p));
13823 /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
13824 both unsigned and their total bits is shorter than the result. */
13825 if (TREE_CODE (type) == INTEGER_TYPE
13826 && TREE_CODE (op0) == NOP_EXPR
13827 && TREE_CODE (op1) == NOP_EXPR)
13829 tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
13830 tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
13831 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
13832 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
13833 return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
13834 < TYPE_PRECISION (type);
13840 return (tree_expr_nonnegative_warnv_p (op0,
13842 || tree_expr_nonnegative_warnv_p (op1,
13843 strict_overflow_p));
13849 case TRUNC_DIV_EXPR:
13850 case CEIL_DIV_EXPR:
13851 case FLOOR_DIV_EXPR:
13852 case ROUND_DIV_EXPR:
13853 return (tree_expr_nonnegative_warnv_p (op0,
13855 && tree_expr_nonnegative_warnv_p (op1,
13856 strict_overflow_p));
13858 case TRUNC_MOD_EXPR:
13859 case CEIL_MOD_EXPR:
13860 case FLOOR_MOD_EXPR:
13861 case ROUND_MOD_EXPR:
13862 return tree_expr_nonnegative_warnv_p (op0,
13863 strict_overflow_p);
13865 return tree_simple_nonnegative_warnv_p (code, type);
13868 /* We don't know sign of `t', so be conservative and return false. */
13872 /* Return true if T is known to be non-negative. If the return
13873 value is based on the assumption that signed overflow is undefined,
13874 set *STRICT_OVERFLOW_P to true; otherwise, don't change
13875 *STRICT_OVERFLOW_P. */
13878 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13880 if (TYPE_UNSIGNED (TREE_TYPE (t)))
13883 switch (TREE_CODE (t))
13886 /* Query VRP to see if it has recorded any information about
13887 the range of this object. */
13888 return ssa_name_nonnegative_p (t);
13891 return tree_int_cst_sgn (t) >= 0;
13894 return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
13897 return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
13900 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
13902 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
13903 strict_overflow_p));
13905 return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
13908 /* We don't know sign of `t', so be conservative and return false. */
13912 /* Return true if T is known to be non-negative. If the return
13913 value is based on the assumption that signed overflow is undefined,
13914 set *STRICT_OVERFLOW_P to true; otherwise, don't change
13915 *STRICT_OVERFLOW_P. */
13918 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
13920 enum tree_code code = TREE_CODE (t);
13921 if (TYPE_UNSIGNED (TREE_TYPE (t)))
13928 tree temp = TARGET_EXPR_SLOT (t);
13929 t = TARGET_EXPR_INITIAL (t);
13931 /* If the initializer is non-void, then it's a normal expression
13932 that will be assigned to the slot. */
13933 if (!VOID_TYPE_P (t))
13934 return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
13936 /* Otherwise, the initializer sets the slot in some way. One common
13937 way is an assignment statement at the end of the initializer. */
13940 if (TREE_CODE (t) == BIND_EXPR)
13941 t = expr_last (BIND_EXPR_BODY (t));
13942 else if (TREE_CODE (t) == TRY_FINALLY_EXPR
13943 || TREE_CODE (t) == TRY_CATCH_EXPR)
13944 t = expr_last (TREE_OPERAND (t, 0));
13945 else if (TREE_CODE (t) == STATEMENT_LIST)
13950 if ((TREE_CODE (t) == MODIFY_EXPR
13951 || TREE_CODE (t) == GIMPLE_MODIFY_STMT)
13952 && GENERIC_TREE_OPERAND (t, 0) == temp)
13953 return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
13954 strict_overflow_p);
13961 tree fndecl = get_callee_fndecl (t);
13962 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
13963 switch (DECL_FUNCTION_CODE (fndecl))
13965 CASE_FLT_FN (BUILT_IN_ACOS):
13966 CASE_FLT_FN (BUILT_IN_ACOSH):
13967 CASE_FLT_FN (BUILT_IN_CABS):
13968 CASE_FLT_FN (BUILT_IN_COSH):
13969 CASE_FLT_FN (BUILT_IN_ERFC):
13970 CASE_FLT_FN (BUILT_IN_EXP):
13971 CASE_FLT_FN (BUILT_IN_EXP10):
13972 CASE_FLT_FN (BUILT_IN_EXP2):
13973 CASE_FLT_FN (BUILT_IN_FABS):
13974 CASE_FLT_FN (BUILT_IN_FDIM):
13975 CASE_FLT_FN (BUILT_IN_HYPOT):
13976 CASE_FLT_FN (BUILT_IN_POW10):
13977 CASE_INT_FN (BUILT_IN_FFS):
13978 CASE_INT_FN (BUILT_IN_PARITY):
13979 CASE_INT_FN (BUILT_IN_POPCOUNT):
13980 case BUILT_IN_BSWAP32:
13981 case BUILT_IN_BSWAP64:
13985 CASE_FLT_FN (BUILT_IN_SQRT):
13986 /* sqrt(-0.0) is -0.0. */
13987 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
13989 return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
13990 strict_overflow_p);
13992 CASE_FLT_FN (BUILT_IN_ASINH):
13993 CASE_FLT_FN (BUILT_IN_ATAN):
13994 CASE_FLT_FN (BUILT_IN_ATANH):
13995 CASE_FLT_FN (BUILT_IN_CBRT):
13996 CASE_FLT_FN (BUILT_IN_CEIL):
13997 CASE_FLT_FN (BUILT_IN_ERF):
13998 CASE_FLT_FN (BUILT_IN_EXPM1):
13999 CASE_FLT_FN (BUILT_IN_FLOOR):
14000 CASE_FLT_FN (BUILT_IN_FMOD):
14001 CASE_FLT_FN (BUILT_IN_FREXP):
14002 CASE_FLT_FN (BUILT_IN_LCEIL):
14003 CASE_FLT_FN (BUILT_IN_LDEXP):
14004 CASE_FLT_FN (BUILT_IN_LFLOOR):
14005 CASE_FLT_FN (BUILT_IN_LLCEIL):
14006 CASE_FLT_FN (BUILT_IN_LLFLOOR):
14007 CASE_FLT_FN (BUILT_IN_LLRINT):
14008 CASE_FLT_FN (BUILT_IN_LLROUND):
14009 CASE_FLT_FN (BUILT_IN_LRINT):
14010 CASE_FLT_FN (BUILT_IN_LROUND):
14011 CASE_FLT_FN (BUILT_IN_MODF):
14012 CASE_FLT_FN (BUILT_IN_NEARBYINT):
14013 CASE_FLT_FN (BUILT_IN_RINT):
14014 CASE_FLT_FN (BUILT_IN_ROUND):
14015 CASE_FLT_FN (BUILT_IN_SCALB):
14016 CASE_FLT_FN (BUILT_IN_SCALBLN):
14017 CASE_FLT_FN (BUILT_IN_SCALBN):
14018 CASE_FLT_FN (BUILT_IN_SIGNBIT):
14019 CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14020 CASE_FLT_FN (BUILT_IN_SINH):
14021 CASE_FLT_FN (BUILT_IN_TANH):
14022 CASE_FLT_FN (BUILT_IN_TRUNC):
14023 /* True if the 1st argument is nonnegative. */
14024 return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14025 strict_overflow_p);
14027 CASE_FLT_FN (BUILT_IN_FMAX):
14028 /* True if the 1st OR 2nd arguments are nonnegative. */
14029 return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14031 || (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14032 strict_overflow_p)));
14034 CASE_FLT_FN (BUILT_IN_FMIN):
14035 /* True if the 1st AND 2nd arguments are nonnegative. */
14036 return (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14038 && (tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14039 strict_overflow_p)));
14041 CASE_FLT_FN (BUILT_IN_COPYSIGN):
14042 /* True if the 2nd argument is nonnegative. */
14043 return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 1),
14044 strict_overflow_p);
14046 CASE_FLT_FN (BUILT_IN_POWI):
14047 /* True if the 1st argument is nonnegative or the second
14048 argument is an even integer. */
14049 if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == INTEGER_CST)
14051 tree arg1 = CALL_EXPR_ARG (t, 1);
14052 if ((TREE_INT_CST_LOW (arg1) & 1) == 0)
14055 return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14056 strict_overflow_p);
14058 CASE_FLT_FN (BUILT_IN_POW):
14059 /* True if the 1st argument is nonnegative or the second
14060 argument is an even integer valued real. */
14061 if (TREE_CODE (CALL_EXPR_ARG (t, 1)) == REAL_CST)
14066 c = TREE_REAL_CST (CALL_EXPR_ARG (t, 1));
14067 n = real_to_integer (&c);
14070 REAL_VALUE_TYPE cint;
14071 real_from_integer (&cint, VOIDmode, n,
14072 n < 0 ? -1 : 0, 0);
14073 if (real_identical (&c, &cint))
14077 return tree_expr_nonnegative_warnv_p (CALL_EXPR_ARG (t, 0),
14078 strict_overflow_p);
14083 return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14088 case COMPOUND_EXPR:
14090 case GIMPLE_MODIFY_STMT:
14091 return tree_expr_nonnegative_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14092 strict_overflow_p);
14094 return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
14095 strict_overflow_p);
14097 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
14098 strict_overflow_p);
14101 return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14105 /* We don't know sign of `t', so be conservative and return false. */
14109 /* Return true if T is known to be non-negative. If the return
14110 value is based on the assumption that signed overflow is undefined,
14111 set *STRICT_OVERFLOW_P to true; otherwise, don't change
14112 *STRICT_OVERFLOW_P. */
14115 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14117 enum tree_code code;
14118 if (t == error_mark_node)
14121 code = TREE_CODE (t);
14122 switch (TREE_CODE_CLASS (code))
14125 case tcc_comparison:
14126 return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14128 TREE_OPERAND (t, 0),
14129 TREE_OPERAND (t, 1),
14130 strict_overflow_p);
14133 return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14135 TREE_OPERAND (t, 0),
14136 strict_overflow_p);
14139 case tcc_declaration:
14140 case tcc_reference:
14141 return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14149 case TRUTH_AND_EXPR:
14150 case TRUTH_OR_EXPR:
14151 case TRUTH_XOR_EXPR:
14152 return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
14154 TREE_OPERAND (t, 0),
14155 TREE_OPERAND (t, 1),
14156 strict_overflow_p);
14157 case TRUTH_NOT_EXPR:
14158 return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
14160 TREE_OPERAND (t, 0),
14161 strict_overflow_p);
14168 case WITH_SIZE_EXPR:
14172 return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
14175 return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
14179 /* Return true if `t' is known to be non-negative. Handle warnings
14180 about undefined signed overflow. */
14183 tree_expr_nonnegative_p (tree t)
14185 bool ret, strict_overflow_p;
14187 strict_overflow_p = false;
14188 ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
14189 if (strict_overflow_p)
14190 fold_overflow_warning (("assuming signed overflow does not occur when "
14191 "determining that expression is always "
14193 WARN_STRICT_OVERFLOW_MISC);
14198 /* Return true when (CODE OP0) is an address and is known to be nonzero.
14199 For floating point we further ensure that T is not denormal.
14200 Similar logic is present in nonzero_address in rtlanal.h.
14202 If the return value is based on the assumption that signed overflow
14203 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14204 change *STRICT_OVERFLOW_P. */
14207 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
14208 bool *strict_overflow_p)
14213 return tree_expr_nonzero_warnv_p (op0,
14214 strict_overflow_p);
14218 tree inner_type = TREE_TYPE (op0);
14219 tree outer_type = type;
14221 return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
14222 && tree_expr_nonzero_warnv_p (op0,
14223 strict_overflow_p));
14227 case NON_LVALUE_EXPR:
14228 return tree_expr_nonzero_warnv_p (op0,
14229 strict_overflow_p);
14238 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
14239 For floating point we further ensure that T is not denormal.
14240 Similar logic is present in nonzero_address in rtlanal.h.
14242 If the return value is based on the assumption that signed overflow
14243 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14244 change *STRICT_OVERFLOW_P. */
14247 tree_binary_nonzero_warnv_p (enum tree_code code,
14250 tree op1, bool *strict_overflow_p)
14252 bool sub_strict_overflow_p;
14255 case POINTER_PLUS_EXPR:
14257 if (TYPE_OVERFLOW_UNDEFINED (type))
14259 /* With the presence of negative values it is hard
14260 to say something. */
14261 sub_strict_overflow_p = false;
14262 if (!tree_expr_nonnegative_warnv_p (op0,
14263 &sub_strict_overflow_p)
14264 || !tree_expr_nonnegative_warnv_p (op1,
14265 &sub_strict_overflow_p))
14267 /* One of operands must be positive and the other non-negative. */
14268 /* We don't set *STRICT_OVERFLOW_P here: even if this value
14269 overflows, on a twos-complement machine the sum of two
14270 nonnegative numbers can never be zero. */
14271 return (tree_expr_nonzero_warnv_p (op0,
14273 || tree_expr_nonzero_warnv_p (op1,
14274 strict_overflow_p));
14279 if (TYPE_OVERFLOW_UNDEFINED (type))
14281 if (tree_expr_nonzero_warnv_p (op0,
14283 && tree_expr_nonzero_warnv_p (op1,
14284 strict_overflow_p))
14286 *strict_overflow_p = true;
14293 sub_strict_overflow_p = false;
14294 if (tree_expr_nonzero_warnv_p (op0,
14295 &sub_strict_overflow_p)
14296 && tree_expr_nonzero_warnv_p (op1,
14297 &sub_strict_overflow_p))
14299 if (sub_strict_overflow_p)
14300 *strict_overflow_p = true;
14305 sub_strict_overflow_p = false;
14306 if (tree_expr_nonzero_warnv_p (op0,
14307 &sub_strict_overflow_p))
14309 if (sub_strict_overflow_p)
14310 *strict_overflow_p = true;
14312 /* When both operands are nonzero, then MAX must be too. */
14313 if (tree_expr_nonzero_warnv_p (op1,
14314 strict_overflow_p))
14317 /* MAX where operand 0 is positive is positive. */
14318 return tree_expr_nonnegative_warnv_p (op0,
14319 strict_overflow_p);
14321 /* MAX where operand 1 is positive is positive. */
14322 else if (tree_expr_nonzero_warnv_p (op1,
14323 &sub_strict_overflow_p)
14324 && tree_expr_nonnegative_warnv_p (op1,
14325 &sub_strict_overflow_p))
14327 if (sub_strict_overflow_p)
14328 *strict_overflow_p = true;
14334 return (tree_expr_nonzero_warnv_p (op1,
14336 || tree_expr_nonzero_warnv_p (op0,
14337 strict_overflow_p));
14346 /* Return true when T is an address and is known to be nonzero.
14347 For floating point we further ensure that T is not denormal.
14348 Similar logic is present in nonzero_address in rtlanal.h.
14350 If the return value is based on the assumption that signed overflow
14351 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14352 change *STRICT_OVERFLOW_P. */
14355 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14357 bool sub_strict_overflow_p;
14358 switch (TREE_CODE (t))
14361 /* Query VRP to see if it has recorded any information about
14362 the range of this object. */
14363 return ssa_name_nonzero_p (t);
14366 return !integer_zerop (t);
14370 tree base = get_base_address (TREE_OPERAND (t, 0));
14375 /* Weak declarations may link to NULL. */
14376 if (VAR_OR_FUNCTION_DECL_P (base))
14377 return !DECL_WEAK (base);
14379 /* Constants are never weak. */
14380 if (CONSTANT_CLASS_P (base))
14387 sub_strict_overflow_p = false;
14388 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
14389 &sub_strict_overflow_p)
14390 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
14391 &sub_strict_overflow_p))
14393 if (sub_strict_overflow_p)
14394 *strict_overflow_p = true;
14405 /* Return true when T is an address and is known to be nonzero.
14406 For floating point we further ensure that T is not denormal.
14407 Similar logic is present in nonzero_address in rtlanal.h.
14409 If the return value is based on the assumption that signed overflow
14410 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
14411 change *STRICT_OVERFLOW_P. */
14414 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
14416 tree type = TREE_TYPE (t);
14417 enum tree_code code;
14419 /* Doing something useful for floating point would need more work. */
14420 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
14423 code = TREE_CODE (t);
14424 switch (TREE_CODE_CLASS (code))
14427 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14428 strict_overflow_p);
14430 case tcc_comparison:
14431 return tree_binary_nonzero_warnv_p (code, type,
14432 TREE_OPERAND (t, 0),
14433 TREE_OPERAND (t, 1),
14434 strict_overflow_p);
14436 case tcc_declaration:
14437 case tcc_reference:
14438 return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14446 case TRUTH_NOT_EXPR:
14447 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
14448 strict_overflow_p);
14450 case TRUTH_AND_EXPR:
14451 case TRUTH_OR_EXPR:
14452 case TRUTH_XOR_EXPR:
14453 return tree_binary_nonzero_warnv_p (code, type,
14454 TREE_OPERAND (t, 0),
14455 TREE_OPERAND (t, 1),
14456 strict_overflow_p);
14463 case WITH_SIZE_EXPR:
14467 return tree_single_nonzero_warnv_p (t, strict_overflow_p);
14469 case COMPOUND_EXPR:
14471 case GIMPLE_MODIFY_STMT:
14473 return tree_expr_nonzero_warnv_p (GENERIC_TREE_OPERAND (t, 1),
14474 strict_overflow_p);
14477 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
14478 strict_overflow_p);
14481 return alloca_call_p (t);
14489 /* Return true when T is an address and is known to be nonzero.
14490 Handle warnings about undefined signed overflow. */
14493 tree_expr_nonzero_p (tree t)
14495 bool ret, strict_overflow_p;
14497 strict_overflow_p = false;
14498 ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
14499 if (strict_overflow_p)
14500 fold_overflow_warning (("assuming signed overflow does not occur when "
14501 "determining that expression is always "
14503 WARN_STRICT_OVERFLOW_MISC);
14507 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
14508 attempt to fold the expression to a constant without modifying TYPE,
14511 If the expression could be simplified to a constant, then return
14512 the constant. If the expression would not be simplified to a
14513 constant, then return NULL_TREE. */
14516 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
14518 tree tem = fold_binary (code, type, op0, op1);
14519 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14522 /* Given the components of a unary expression CODE, TYPE and OP0,
14523 attempt to fold the expression to a constant without modifying
14526 If the expression could be simplified to a constant, then return
14527 the constant. If the expression would not be simplified to a
14528 constant, then return NULL_TREE. */
14531 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
14533 tree tem = fold_unary (code, type, op0);
14534 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
14537 /* If EXP represents referencing an element in a constant string
14538 (either via pointer arithmetic or array indexing), return the
14539 tree representing the value accessed, otherwise return NULL. */
14542 fold_read_from_constant_string (tree exp)
14544 if ((TREE_CODE (exp) == INDIRECT_REF
14545 || TREE_CODE (exp) == ARRAY_REF)
14546 && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
14548 tree exp1 = TREE_OPERAND (exp, 0);
14552 if (TREE_CODE (exp) == INDIRECT_REF)
14553 string = string_constant (exp1, &index);
14556 tree low_bound = array_ref_low_bound (exp);
14557 index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
14559 /* Optimize the special-case of a zero lower bound.
14561 We convert the low_bound to sizetype to avoid some problems
14562 with constant folding. (E.g. suppose the lower bound is 1,
14563 and its mode is QI. Without the conversion,l (ARRAY
14564 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
14565 +INDEX), which becomes (ARRAY+255+INDEX). Opps!) */
14566 if (! integer_zerop (low_bound))
14567 index = size_diffop (index, fold_convert (sizetype, low_bound));
14573 && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
14574 && TREE_CODE (string) == STRING_CST
14575 && TREE_CODE (index) == INTEGER_CST
14576 && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
14577 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
14579 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
14580 return build_int_cst_type (TREE_TYPE (exp),
14581 (TREE_STRING_POINTER (string)
14582 [TREE_INT_CST_LOW (index)]));
14587 /* Return the tree for neg (ARG0) when ARG0 is known to be either
14588 an integer constant, real, or fixed-point constant.
14590 TYPE is the type of the result. */
14593 fold_negate_const (tree arg0, tree type)
14595 tree t = NULL_TREE;
14597 switch (TREE_CODE (arg0))
14601 unsigned HOST_WIDE_INT low;
14602 HOST_WIDE_INT high;
14603 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14604 TREE_INT_CST_HIGH (arg0),
14606 t = force_fit_type_double (type, low, high, 1,
14607 (overflow | TREE_OVERFLOW (arg0))
14608 && !TYPE_UNSIGNED (type));
14613 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14618 FIXED_VALUE_TYPE f;
14619 bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
14620 &(TREE_FIXED_CST (arg0)), NULL,
14621 TYPE_SATURATING (type));
14622 t = build_fixed (type, f);
14623 /* Propagate overflow flags. */
14624 if (overflow_p | TREE_OVERFLOW (arg0))
14626 TREE_OVERFLOW (t) = 1;
14627 TREE_CONSTANT_OVERFLOW (t) = 1;
14629 else if (TREE_CONSTANT_OVERFLOW (arg0))
14630 TREE_CONSTANT_OVERFLOW (t) = 1;
14635 gcc_unreachable ();
14641 /* Return the tree for abs (ARG0) when ARG0 is known to be either
14642 an integer constant or real constant.
14644 TYPE is the type of the result. */
14647 fold_abs_const (tree arg0, tree type)
14649 tree t = NULL_TREE;
14651 switch (TREE_CODE (arg0))
14654 /* If the value is unsigned, then the absolute value is
14655 the same as the ordinary value. */
14656 if (TYPE_UNSIGNED (type))
14658 /* Similarly, if the value is non-negative. */
14659 else if (INT_CST_LT (integer_minus_one_node, arg0))
14661 /* If the value is negative, then the absolute value is
14665 unsigned HOST_WIDE_INT low;
14666 HOST_WIDE_INT high;
14667 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
14668 TREE_INT_CST_HIGH (arg0),
14670 t = force_fit_type_double (type, low, high, -1,
14671 overflow | TREE_OVERFLOW (arg0));
14676 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
14677 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
14683 gcc_unreachable ();
14689 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
14690 constant. TYPE is the type of the result. */
14693 fold_not_const (tree arg0, tree type)
14695 tree t = NULL_TREE;
14697 gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
14699 t = force_fit_type_double (type, ~TREE_INT_CST_LOW (arg0),
14700 ~TREE_INT_CST_HIGH (arg0), 0,
14701 TREE_OVERFLOW (arg0));
14706 /* Given CODE, a relational operator, the target type, TYPE and two
14707 constant operands OP0 and OP1, return the result of the
14708 relational operation. If the result is not a compile time
14709 constant, then return NULL_TREE. */
14712 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
14714 int result, invert;
14716 /* From here on, the only cases we handle are when the result is
14717 known to be a constant. */
14719 if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
14721 const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
14722 const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
14724 /* Handle the cases where either operand is a NaN. */
14725 if (real_isnan (c0) || real_isnan (c1))
14735 case UNORDERED_EXPR:
14749 if (flag_trapping_math)
14755 gcc_unreachable ();
14758 return constant_boolean_node (result, type);
14761 return constant_boolean_node (real_compare (code, c0, c1), type);
14764 if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
14766 const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
14767 const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
14768 return constant_boolean_node (fixed_compare (code, c0, c1), type);
14771 /* Handle equality/inequality of complex constants. */
14772 if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
14774 tree rcond = fold_relational_const (code, type,
14775 TREE_REALPART (op0),
14776 TREE_REALPART (op1));
14777 tree icond = fold_relational_const (code, type,
14778 TREE_IMAGPART (op0),
14779 TREE_IMAGPART (op1));
14780 if (code == EQ_EXPR)
14781 return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
14782 else if (code == NE_EXPR)
14783 return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
14788 /* From here on we only handle LT, LE, GT, GE, EQ and NE.
14790 To compute GT, swap the arguments and do LT.
14791 To compute GE, do LT and invert the result.
14792 To compute LE, swap the arguments, do LT and invert the result.
14793 To compute NE, do EQ and invert the result.
14795 Therefore, the code below must handle only EQ and LT. */
14797 if (code == LE_EXPR || code == GT_EXPR)
14802 code = swap_tree_comparison (code);
14805 /* Note that it is safe to invert for real values here because we
14806 have already handled the one case that it matters. */
14809 if (code == NE_EXPR || code == GE_EXPR)
14812 code = invert_tree_comparison (code, false);
14815 /* Compute a result for LT or EQ if args permit;
14816 Otherwise return T. */
14817 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
14819 if (code == EQ_EXPR)
14820 result = tree_int_cst_equal (op0, op1);
14821 else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
14822 result = INT_CST_LT_UNSIGNED (op0, op1);
14824 result = INT_CST_LT (op0, op1);
14831 return constant_boolean_node (result, type);
14834 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
14835 indicated TYPE. If no CLEANUP_POINT_EXPR is necessary, return EXPR
14839 fold_build_cleanup_point_expr (tree type, tree expr)
14841 /* If the expression does not have side effects then we don't have to wrap
14842 it with a cleanup point expression. */
14843 if (!TREE_SIDE_EFFECTS (expr))
14846 /* If the expression is a return, check to see if the expression inside the
14847 return has no side effects or the right hand side of the modify expression
14848 inside the return. If either don't have side effects set we don't need to
14849 wrap the expression in a cleanup point expression. Note we don't check the
14850 left hand side of the modify because it should always be a return decl. */
14851 if (TREE_CODE (expr) == RETURN_EXPR)
14853 tree op = TREE_OPERAND (expr, 0);
14854 if (!op || !TREE_SIDE_EFFECTS (op))
14856 op = TREE_OPERAND (op, 1);
14857 if (!TREE_SIDE_EFFECTS (op))
14861 return build1 (CLEANUP_POINT_EXPR, type, expr);
14864 /* Given a pointer value OP0 and a type TYPE, return a simplified version
14865 of an indirection through OP0, or NULL_TREE if no simplification is
14869 fold_indirect_ref_1 (tree type, tree op0)
14875 subtype = TREE_TYPE (sub);
14876 if (!POINTER_TYPE_P (subtype))
14879 if (TREE_CODE (sub) == ADDR_EXPR)
14881 tree op = TREE_OPERAND (sub, 0);
14882 tree optype = TREE_TYPE (op);
14883 /* *&CONST_DECL -> to the value of the const decl. */
14884 if (TREE_CODE (op) == CONST_DECL)
14885 return DECL_INITIAL (op);
14886 /* *&p => p; make sure to handle *&"str"[cst] here. */
14887 if (type == optype)
14889 tree fop = fold_read_from_constant_string (op);
14895 /* *(foo *)&fooarray => fooarray[0] */
14896 else if (TREE_CODE (optype) == ARRAY_TYPE
14897 && type == TREE_TYPE (optype))
14899 tree type_domain = TYPE_DOMAIN (optype);
14900 tree min_val = size_zero_node;
14901 if (type_domain && TYPE_MIN_VALUE (type_domain))
14902 min_val = TYPE_MIN_VALUE (type_domain);
14903 return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
14905 /* *(foo *)&complexfoo => __real__ complexfoo */
14906 else if (TREE_CODE (optype) == COMPLEX_TYPE
14907 && type == TREE_TYPE (optype))
14908 return fold_build1 (REALPART_EXPR, type, op);
14909 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
14910 else if (TREE_CODE (optype) == VECTOR_TYPE
14911 && type == TREE_TYPE (optype))
14913 tree part_width = TYPE_SIZE (type);
14914 tree index = bitsize_int (0);
14915 return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
14919 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
14920 if (TREE_CODE (sub) == POINTER_PLUS_EXPR
14921 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
14923 tree op00 = TREE_OPERAND (sub, 0);
14924 tree op01 = TREE_OPERAND (sub, 1);
14928 op00type = TREE_TYPE (op00);
14929 if (TREE_CODE (op00) == ADDR_EXPR
14930 && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
14931 && type == TREE_TYPE (TREE_TYPE (op00type)))
14933 tree size = TYPE_SIZE_UNIT (type);
14934 if (tree_int_cst_equal (size, op01))
14935 return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
14939 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
14940 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
14941 && type == TREE_TYPE (TREE_TYPE (subtype)))
14944 tree min_val = size_zero_node;
14945 sub = build_fold_indirect_ref (sub);
14946 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
14947 if (type_domain && TYPE_MIN_VALUE (type_domain))
14948 min_val = TYPE_MIN_VALUE (type_domain);
14949 return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
14955 /* Builds an expression for an indirection through T, simplifying some
14959 build_fold_indirect_ref (tree t)
14961 tree type = TREE_TYPE (TREE_TYPE (t));
14962 tree sub = fold_indirect_ref_1 (type, t);
14967 return build1 (INDIRECT_REF, type, t);
14970 /* Given an INDIRECT_REF T, return either T or a simplified version. */
14973 fold_indirect_ref (tree t)
14975 tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
14983 /* Strip non-trapping, non-side-effecting tree nodes from an expression
14984 whose result is ignored. The type of the returned tree need not be
14985 the same as the original expression. */
14988 fold_ignored_result (tree t)
14990 if (!TREE_SIDE_EFFECTS (t))
14991 return integer_zero_node;
14994 switch (TREE_CODE_CLASS (TREE_CODE (t)))
14997 t = TREE_OPERAND (t, 0);
15001 case tcc_comparison:
15002 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15003 t = TREE_OPERAND (t, 0);
15004 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15005 t = TREE_OPERAND (t, 1);
15010 case tcc_expression:
15011 switch (TREE_CODE (t))
15013 case COMPOUND_EXPR:
15014 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15016 t = TREE_OPERAND (t, 0);
15020 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15021 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15023 t = TREE_OPERAND (t, 0);
15036 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
15037 This can only be applied to objects of a sizetype. */
15040 round_up (tree value, int divisor)
15042 tree div = NULL_TREE;
15044 gcc_assert (divisor > 0);
15048 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
15049 have to do anything. Only do this when we are not given a const,
15050 because in that case, this check is more expensive than just
15052 if (TREE_CODE (value) != INTEGER_CST)
15054 div = build_int_cst (TREE_TYPE (value), divisor);
15056 if (multiple_of_p (TREE_TYPE (value), value, div))
15060 /* If divisor is a power of two, simplify this to bit manipulation. */
15061 if (divisor == (divisor & -divisor))
15063 if (TREE_CODE (value) == INTEGER_CST)
15065 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
15066 unsigned HOST_WIDE_INT high;
15069 if ((low & (divisor - 1)) == 0)
15072 overflow_p = TREE_OVERFLOW (value);
15073 high = TREE_INT_CST_HIGH (value);
15074 low &= ~(divisor - 1);
15083 return force_fit_type_double (TREE_TYPE (value), low, high,
15090 t = build_int_cst (TREE_TYPE (value), divisor - 1);
15091 value = size_binop (PLUS_EXPR, value, t);
15092 t = build_int_cst (TREE_TYPE (value), -divisor);
15093 value = size_binop (BIT_AND_EXPR, value, t);
15099 div = build_int_cst (TREE_TYPE (value), divisor);
15100 value = size_binop (CEIL_DIV_EXPR, value, div);
15101 value = size_binop (MULT_EXPR, value, div);
15107 /* Likewise, but round down. */
15110 round_down (tree value, int divisor)
15112 tree div = NULL_TREE;
15114 gcc_assert (divisor > 0);
15118 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
15119 have to do anything. Only do this when we are not given a const,
15120 because in that case, this check is more expensive than just
15122 if (TREE_CODE (value) != INTEGER_CST)
15124 div = build_int_cst (TREE_TYPE (value), divisor);
15126 if (multiple_of_p (TREE_TYPE (value), value, div))
15130 /* If divisor is a power of two, simplify this to bit manipulation. */
15131 if (divisor == (divisor & -divisor))
15135 t = build_int_cst (TREE_TYPE (value), -divisor);
15136 value = size_binop (BIT_AND_EXPR, value, t);
15141 div = build_int_cst (TREE_TYPE (value), divisor);
15142 value = size_binop (FLOOR_DIV_EXPR, value, div);
15143 value = size_binop (MULT_EXPR, value, div);
15149 /* Returns the pointer to the base of the object addressed by EXP and
15150 extracts the information about the offset of the access, storing it
15151 to PBITPOS and POFFSET. */
15154 split_address_to_core_and_offset (tree exp,
15155 HOST_WIDE_INT *pbitpos, tree *poffset)
15158 enum machine_mode mode;
15159 int unsignedp, volatilep;
15160 HOST_WIDE_INT bitsize;
15162 if (TREE_CODE (exp) == ADDR_EXPR)
15164 core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
15165 poffset, &mode, &unsignedp, &volatilep,
15167 core = fold_addr_expr (core);
15173 *poffset = NULL_TREE;
15179 /* Returns true if addresses of E1 and E2 differ by a constant, false
15180 otherwise. If they do, E1 - E2 is stored in *DIFF. */
15183 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
15186 HOST_WIDE_INT bitpos1, bitpos2;
15187 tree toffset1, toffset2, tdiff, type;
15189 core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
15190 core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
15192 if (bitpos1 % BITS_PER_UNIT != 0
15193 || bitpos2 % BITS_PER_UNIT != 0
15194 || !operand_equal_p (core1, core2, 0))
15197 if (toffset1 && toffset2)
15199 type = TREE_TYPE (toffset1);
15200 if (type != TREE_TYPE (toffset2))
15201 toffset2 = fold_convert (type, toffset2);
15203 tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
15204 if (!cst_and_fits_in_hwi (tdiff))
15207 *diff = int_cst_value (tdiff);
15209 else if (toffset1 || toffset2)
15211 /* If only one of the offsets is non-constant, the difference cannot
15218 *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
15222 /* Simplify the floating point expression EXP when the sign of the
15223 result is not significant. Return NULL_TREE if no simplification
15227 fold_strip_sign_ops (tree exp)
15231 switch (TREE_CODE (exp))
15235 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15236 return arg0 ? arg0 : TREE_OPERAND (exp, 0);
15240 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
15242 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
15243 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15244 if (arg0 != NULL_TREE || arg1 != NULL_TREE)
15245 return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
15246 arg0 ? arg0 : TREE_OPERAND (exp, 0),
15247 arg1 ? arg1 : TREE_OPERAND (exp, 1));
15250 case COMPOUND_EXPR:
15251 arg0 = TREE_OPERAND (exp, 0);
15252 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15254 return fold_build2 (COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
15258 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
15259 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
15261 return fold_build3 (COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
15262 arg0 ? arg0 : TREE_OPERAND (exp, 1),
15263 arg1 ? arg1 : TREE_OPERAND (exp, 2));
15268 const enum built_in_function fcode = builtin_mathfn_code (exp);
15271 CASE_FLT_FN (BUILT_IN_COPYSIGN):
15272 /* Strip copysign function call, return the 1st argument. */
15273 arg0 = CALL_EXPR_ARG (exp, 0);
15274 arg1 = CALL_EXPR_ARG (exp, 1);
15275 return omit_one_operand (TREE_TYPE (exp), arg0, arg1);
15278 /* Strip sign ops from the argument of "odd" math functions. */
15279 if (negate_mathfn_p (fcode))
15281 arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
15283 return build_call_expr (get_callee_fndecl (exp), 1, arg0);