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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23 /*@@ This file should be rewritten to use an arbitrary precision
24 @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
25 @@ Perhaps the routines could also be used for bc/dc, and made a lib.
26 @@ The routines that translate from the ap rep should
27 @@ warn if precision et. al. is lost.
28 @@ This would also make life easier when this technology is used
29 @@ for cross-compilers. */
31 /* The entry points in this file are fold, size_int_wide, size_binop
34 fold takes a tree as argument and returns a simplified tree.
36 size_binop takes a tree code for an arithmetic operation
37 and two operands that are trees, and produces a tree for the
38 result, assuming the type comes from `sizetype'.
40 size_int takes an integer value, and creates a tree constant
41 with type from `sizetype'.
43 force_fit_type takes a constant, an overflowable flag and prior
44 overflow indicators. It forces the value to fit the type and sets
45 TREE_OVERFLOW and TREE_CONSTANT_OVERFLOW as appropriate. */
49 #include "coretypes.h"
61 #include "langhooks.h"
64 /* Non-zero if we are folding constants inside an initializer; zero
66 int folding_initializer = 0;
68 /* The following constants represent a bit based encoding of GCC's
69 comparison operators. This encoding simplifies transformations
70 on relational comparison operators, such as AND and OR. */
71 enum comparison_code {
90 static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
91 static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
92 static bool negate_mathfn_p (enum built_in_function);
93 static bool negate_expr_p (tree);
94 static tree negate_expr (tree);
95 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
96 static tree associate_trees (tree, tree, enum tree_code, tree);
97 static tree const_binop (enum tree_code, tree, tree, int);
98 static enum comparison_code comparison_to_compcode (enum tree_code);
99 static enum tree_code compcode_to_comparison (enum comparison_code);
100 static tree combine_comparisons (enum tree_code, enum tree_code,
101 enum tree_code, tree, tree, tree);
102 static int truth_value_p (enum tree_code);
103 static int operand_equal_for_comparison_p (tree, tree, tree);
104 static int twoval_comparison_p (tree, tree *, tree *, int *);
105 static tree eval_subst (tree, tree, tree, tree, tree);
106 static tree pedantic_omit_one_operand (tree, tree, tree);
107 static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
108 static tree make_bit_field_ref (tree, tree, int, int, int);
109 static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
110 static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
111 enum machine_mode *, int *, int *,
113 static int all_ones_mask_p (tree, int);
114 static tree sign_bit_p (tree, tree);
115 static int simple_operand_p (tree);
116 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
117 static tree range_predecessor (tree);
118 static tree range_successor (tree);
119 static tree make_range (tree, int *, tree *, tree *, bool *);
120 static tree build_range_check (tree, tree, int, tree, tree);
121 static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
123 static tree fold_range_test (enum tree_code, tree, tree, tree);
124 static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
125 static tree unextend (tree, int, int, tree);
126 static tree fold_truthop (enum tree_code, tree, tree, tree);
127 static tree optimize_minmax_comparison (enum tree_code, tree, tree, tree);
128 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
129 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
130 static int multiple_of_p (tree, tree, tree);
131 static tree fold_binary_op_with_conditional_arg (enum tree_code, tree,
134 static bool fold_real_zero_addition_p (tree, tree, int);
135 static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
137 static tree fold_inf_compare (enum tree_code, tree, tree, tree);
138 static tree fold_div_compare (enum tree_code, tree, tree, tree);
139 static bool reorder_operands_p (tree, tree);
140 static tree fold_negate_const (tree, tree);
141 static tree fold_not_const (tree, tree);
142 static tree fold_relational_const (enum tree_code, tree, tree, tree);
143 static int native_encode_expr (tree, unsigned char *, int);
144 static tree native_interpret_expr (tree, unsigned char *, int);
147 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
148 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
149 and SUM1. Then this yields nonzero if overflow occurred during the
152 Overflow occurs if A and B have the same sign, but A and SUM differ in
153 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
155 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
157 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
158 We do that by representing the two-word integer in 4 words, with only
159 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
160 number. The value of the word is LOWPART + HIGHPART * BASE. */
163 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
164 #define HIGHPART(x) \
165 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
166 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
168 /* Unpack a two-word integer into 4 words.
169 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
170 WORDS points to the array of HOST_WIDE_INTs. */
173 encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
175 words[0] = LOWPART (low);
176 words[1] = HIGHPART (low);
177 words[2] = LOWPART (hi);
178 words[3] = HIGHPART (hi);
181 /* Pack an array of 4 words into a two-word integer.
182 WORDS points to the array of words.
183 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
186 decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
189 *low = words[0] + words[1] * BASE;
190 *hi = words[2] + words[3] * BASE;
193 /* T is an INT_CST node. OVERFLOWABLE indicates if we are interested
194 in overflow of the value, when >0 we are only interested in signed
195 overflow, for <0 we are interested in any overflow. OVERFLOWED
196 indicates whether overflow has already occurred. CONST_OVERFLOWED
197 indicates whether constant overflow has already occurred. We force
198 T's value to be within range of T's type (by setting to 0 or 1 all
199 the bits outside the type's range). We set TREE_OVERFLOWED if,
200 OVERFLOWED is nonzero,
201 or OVERFLOWABLE is >0 and signed overflow occurs
202 or OVERFLOWABLE is <0 and any overflow occurs
203 We set TREE_CONSTANT_OVERFLOWED if,
204 CONST_OVERFLOWED is nonzero
205 or we set TREE_OVERFLOWED.
206 We return either the original T, or a copy. */
209 force_fit_type (tree t, int overflowable,
210 bool overflowed, bool overflowed_const)
212 unsigned HOST_WIDE_INT low;
215 int sign_extended_type;
217 gcc_assert (TREE_CODE (t) == INTEGER_CST);
219 low = TREE_INT_CST_LOW (t);
220 high = TREE_INT_CST_HIGH (t);
222 if (POINTER_TYPE_P (TREE_TYPE (t))
223 || TREE_CODE (TREE_TYPE (t)) == OFFSET_TYPE)
226 prec = TYPE_PRECISION (TREE_TYPE (t));
227 /* Size types *are* sign extended. */
228 sign_extended_type = (!TYPE_UNSIGNED (TREE_TYPE (t))
229 || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
230 && TYPE_IS_SIZETYPE (TREE_TYPE (t))));
232 /* First clear all bits that are beyond the type's precision. */
234 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
236 else if (prec > HOST_BITS_PER_WIDE_INT)
237 high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
241 if (prec < HOST_BITS_PER_WIDE_INT)
242 low &= ~((HOST_WIDE_INT) (-1) << prec);
245 if (!sign_extended_type)
246 /* No sign extension */;
247 else if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
248 /* Correct width already. */;
249 else if (prec > HOST_BITS_PER_WIDE_INT)
251 /* Sign extend top half? */
252 if (high & ((unsigned HOST_WIDE_INT)1
253 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
254 high |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
256 else if (prec == HOST_BITS_PER_WIDE_INT)
258 if ((HOST_WIDE_INT)low < 0)
263 /* Sign extend bottom half? */
264 if (low & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
267 low |= (HOST_WIDE_INT)(-1) << prec;
271 /* If the value changed, return a new node. */
272 if (overflowed || overflowed_const
273 || low != TREE_INT_CST_LOW (t) || high != TREE_INT_CST_HIGH (t))
275 t = build_int_cst_wide (TREE_TYPE (t), low, high);
279 || (overflowable > 0 && sign_extended_type))
282 TREE_OVERFLOW (t) = 1;
283 TREE_CONSTANT_OVERFLOW (t) = 1;
285 else if (overflowed_const)
288 TREE_CONSTANT_OVERFLOW (t) = 1;
295 /* Add two doubleword integers with doubleword result.
296 Return nonzero if the operation overflows according to UNSIGNED_P.
297 Each argument is given as two `HOST_WIDE_INT' pieces.
298 One argument is L1 and H1; the other, L2 and H2.
299 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
302 add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
303 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
304 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
307 unsigned HOST_WIDE_INT l;
311 h = h1 + h2 + (l < l1);
317 return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1;
319 return OVERFLOW_SUM_SIGN (h1, h2, h);
322 /* Negate a doubleword integer with doubleword result.
323 Return nonzero if the operation overflows, assuming it's signed.
324 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
325 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
328 neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
329 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
335 return (*hv & h1) < 0;
345 /* Multiply two doubleword integers with doubleword result.
346 Return nonzero if the operation overflows according to UNSIGNED_P.
347 Each argument is given as two `HOST_WIDE_INT' pieces.
348 One argument is L1 and H1; the other, L2 and H2.
349 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
352 mul_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
353 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
354 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
357 HOST_WIDE_INT arg1[4];
358 HOST_WIDE_INT arg2[4];
359 HOST_WIDE_INT prod[4 * 2];
360 unsigned HOST_WIDE_INT carry;
362 unsigned HOST_WIDE_INT toplow, neglow;
363 HOST_WIDE_INT tophigh, neghigh;
365 encode (arg1, l1, h1);
366 encode (arg2, l2, h2);
368 memset (prod, 0, sizeof prod);
370 for (i = 0; i < 4; i++)
373 for (j = 0; j < 4; j++)
376 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
377 carry += arg1[i] * arg2[j];
378 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
380 prod[k] = LOWPART (carry);
381 carry = HIGHPART (carry);
386 decode (prod, lv, hv);
387 decode (prod + 4, &toplow, &tophigh);
389 /* Unsigned overflow is immediate. */
391 return (toplow | tophigh) != 0;
393 /* Check for signed overflow by calculating the signed representation of the
394 top half of the result; it should agree with the low half's sign bit. */
397 neg_double (l2, h2, &neglow, &neghigh);
398 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
402 neg_double (l1, h1, &neglow, &neghigh);
403 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
405 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
408 /* Shift the doubleword integer in L1, H1 left by COUNT places
409 keeping only PREC bits of result.
410 Shift right if COUNT is negative.
411 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
412 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
415 lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
416 HOST_WIDE_INT count, unsigned int prec,
417 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
419 unsigned HOST_WIDE_INT signmask;
423 rshift_double (l1, h1, -count, prec, lv, hv, arith);
427 if (SHIFT_COUNT_TRUNCATED)
430 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
432 /* Shifting by the host word size is undefined according to the
433 ANSI standard, so we must handle this as a special case. */
437 else if (count >= HOST_BITS_PER_WIDE_INT)
439 *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
444 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
445 | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
449 /* Sign extend all bits that are beyond the precision. */
451 signmask = -((prec > HOST_BITS_PER_WIDE_INT
452 ? ((unsigned HOST_WIDE_INT) *hv
453 >> (prec - HOST_BITS_PER_WIDE_INT - 1))
454 : (*lv >> (prec - 1))) & 1);
456 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
458 else if (prec >= HOST_BITS_PER_WIDE_INT)
460 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
461 *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
466 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
467 *lv |= signmask << prec;
471 /* Shift the doubleword integer in L1, H1 right by COUNT places
472 keeping only PREC bits of result. COUNT must be positive.
473 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
474 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
477 rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
478 HOST_WIDE_INT count, unsigned int prec,
479 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
482 unsigned HOST_WIDE_INT signmask;
485 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
488 if (SHIFT_COUNT_TRUNCATED)
491 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
493 /* Shifting by the host word size is undefined according to the
494 ANSI standard, so we must handle this as a special case. */
498 else if (count >= HOST_BITS_PER_WIDE_INT)
501 *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
505 *hv = (unsigned HOST_WIDE_INT) h1 >> count;
507 | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
510 /* Zero / sign extend all bits that are beyond the precision. */
512 if (count >= (HOST_WIDE_INT)prec)
517 else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
519 else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
521 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
522 *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
527 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
528 *lv |= signmask << (prec - count);
532 /* Rotate the doubleword integer in L1, H1 left by COUNT places
533 keeping only PREC bits of result.
534 Rotate right if COUNT is negative.
535 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
538 lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
539 HOST_WIDE_INT count, unsigned int prec,
540 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
542 unsigned HOST_WIDE_INT s1l, s2l;
543 HOST_WIDE_INT s1h, s2h;
549 lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
550 rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
555 /* Rotate the doubleword integer in L1, H1 left by COUNT places
556 keeping only PREC bits of result. COUNT must be positive.
557 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
560 rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
561 HOST_WIDE_INT count, unsigned int prec,
562 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
564 unsigned HOST_WIDE_INT s1l, s2l;
565 HOST_WIDE_INT s1h, s2h;
571 rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
572 lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
577 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
578 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
579 CODE is a tree code for a kind of division, one of
580 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
582 It controls how the quotient is rounded to an integer.
583 Return nonzero if the operation overflows.
584 UNS nonzero says do unsigned division. */
587 div_and_round_double (enum tree_code code, int uns,
588 unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
589 HOST_WIDE_INT hnum_orig,
590 unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
591 HOST_WIDE_INT hden_orig,
592 unsigned HOST_WIDE_INT *lquo,
593 HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
597 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
598 HOST_WIDE_INT den[4], quo[4];
600 unsigned HOST_WIDE_INT work;
601 unsigned HOST_WIDE_INT carry = 0;
602 unsigned HOST_WIDE_INT lnum = lnum_orig;
603 HOST_WIDE_INT hnum = hnum_orig;
604 unsigned HOST_WIDE_INT lden = lden_orig;
605 HOST_WIDE_INT hden = hden_orig;
608 if (hden == 0 && lden == 0)
609 overflow = 1, lden = 1;
611 /* Calculate quotient sign and convert operands to unsigned. */
617 /* (minimum integer) / (-1) is the only overflow case. */
618 if (neg_double (lnum, hnum, &lnum, &hnum)
619 && ((HOST_WIDE_INT) lden & hden) == -1)
625 neg_double (lden, hden, &lden, &hden);
629 if (hnum == 0 && hden == 0)
630 { /* single precision */
632 /* This unsigned division rounds toward zero. */
638 { /* trivial case: dividend < divisor */
639 /* hden != 0 already checked. */
646 memset (quo, 0, sizeof quo);
648 memset (num, 0, sizeof num); /* to zero 9th element */
649 memset (den, 0, sizeof den);
651 encode (num, lnum, hnum);
652 encode (den, lden, hden);
654 /* Special code for when the divisor < BASE. */
655 if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
657 /* hnum != 0 already checked. */
658 for (i = 4 - 1; i >= 0; i--)
660 work = num[i] + carry * BASE;
661 quo[i] = work / lden;
667 /* Full double precision division,
668 with thanks to Don Knuth's "Seminumerical Algorithms". */
669 int num_hi_sig, den_hi_sig;
670 unsigned HOST_WIDE_INT quo_est, scale;
672 /* Find the highest nonzero divisor digit. */
673 for (i = 4 - 1;; i--)
680 /* Insure that the first digit of the divisor is at least BASE/2.
681 This is required by the quotient digit estimation algorithm. */
683 scale = BASE / (den[den_hi_sig] + 1);
685 { /* scale divisor and dividend */
687 for (i = 0; i <= 4 - 1; i++)
689 work = (num[i] * scale) + carry;
690 num[i] = LOWPART (work);
691 carry = HIGHPART (work);
696 for (i = 0; i <= 4 - 1; i++)
698 work = (den[i] * scale) + carry;
699 den[i] = LOWPART (work);
700 carry = HIGHPART (work);
701 if (den[i] != 0) den_hi_sig = i;
708 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
710 /* Guess the next quotient digit, quo_est, by dividing the first
711 two remaining dividend digits by the high order quotient digit.
712 quo_est is never low and is at most 2 high. */
713 unsigned HOST_WIDE_INT tmp;
715 num_hi_sig = i + den_hi_sig + 1;
716 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
717 if (num[num_hi_sig] != den[den_hi_sig])
718 quo_est = work / den[den_hi_sig];
722 /* Refine quo_est so it's usually correct, and at most one high. */
723 tmp = work - quo_est * den[den_hi_sig];
725 && (den[den_hi_sig - 1] * quo_est
726 > (tmp * BASE + num[num_hi_sig - 2])))
729 /* Try QUO_EST as the quotient digit, by multiplying the
730 divisor by QUO_EST and subtracting from the remaining dividend.
731 Keep in mind that QUO_EST is the I - 1st digit. */
734 for (j = 0; j <= den_hi_sig; j++)
736 work = quo_est * den[j] + carry;
737 carry = HIGHPART (work);
738 work = num[i + j] - LOWPART (work);
739 num[i + j] = LOWPART (work);
740 carry += HIGHPART (work) != 0;
743 /* If quo_est was high by one, then num[i] went negative and
744 we need to correct things. */
745 if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
748 carry = 0; /* add divisor back in */
749 for (j = 0; j <= den_hi_sig; j++)
751 work = num[i + j] + den[j] + carry;
752 carry = HIGHPART (work);
753 num[i + j] = LOWPART (work);
756 num [num_hi_sig] += carry;
759 /* Store the quotient digit. */
764 decode (quo, lquo, hquo);
767 /* If result is negative, make it so. */
769 neg_double (*lquo, *hquo, lquo, hquo);
771 /* Compute trial remainder: rem = num - (quo * den) */
772 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
773 neg_double (*lrem, *hrem, lrem, hrem);
774 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
779 case TRUNC_MOD_EXPR: /* round toward zero */
780 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
784 case FLOOR_MOD_EXPR: /* round toward negative infinity */
785 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
788 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
796 case CEIL_MOD_EXPR: /* round toward positive infinity */
797 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
799 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
807 case ROUND_MOD_EXPR: /* round to closest integer */
809 unsigned HOST_WIDE_INT labs_rem = *lrem;
810 HOST_WIDE_INT habs_rem = *hrem;
811 unsigned HOST_WIDE_INT labs_den = lden, ltwice;
812 HOST_WIDE_INT habs_den = hden, htwice;
814 /* Get absolute values. */
816 neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
818 neg_double (lden, hden, &labs_den, &habs_den);
820 /* If (2 * abs (lrem) >= abs (lden)) */
821 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
822 labs_rem, habs_rem, <wice, &htwice);
824 if (((unsigned HOST_WIDE_INT) habs_den
825 < (unsigned HOST_WIDE_INT) htwice)
826 || (((unsigned HOST_WIDE_INT) habs_den
827 == (unsigned HOST_WIDE_INT) htwice)
828 && (labs_den < ltwice)))
832 add_double (*lquo, *hquo,
833 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
836 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
848 /* Compute true remainder: rem = num - (quo * den) */
849 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
850 neg_double (*lrem, *hrem, lrem, hrem);
851 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
855 /* If ARG2 divides ARG1 with zero remainder, carries out the division
856 of type CODE and returns the quotient.
857 Otherwise returns NULL_TREE. */
860 div_if_zero_remainder (enum tree_code code, tree arg1, tree arg2)
862 unsigned HOST_WIDE_INT int1l, int2l;
863 HOST_WIDE_INT int1h, int2h;
864 unsigned HOST_WIDE_INT quol, reml;
865 HOST_WIDE_INT quoh, remh;
866 tree type = TREE_TYPE (arg1);
867 int uns = TYPE_UNSIGNED (type);
869 int1l = TREE_INT_CST_LOW (arg1);
870 int1h = TREE_INT_CST_HIGH (arg1);
871 int2l = TREE_INT_CST_LOW (arg2);
872 int2h = TREE_INT_CST_HIGH (arg2);
874 div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
875 &quol, &quoh, &reml, &remh);
876 if (remh != 0 || reml != 0)
879 return build_int_cst_wide (type, quol, quoh);
882 /* This is non-zero if we should defer warnings about undefined
883 overflow. This facility exists because these warnings are a
884 special case. The code to estimate loop iterations does not want
885 to issue any warnings, since it works with expressions which do not
886 occur in user code. Various bits of cleanup code call fold(), but
887 only use the result if it has certain characteristics (e.g., is a
888 constant); that code only wants to issue a warning if the result is
891 static int fold_deferring_overflow_warnings;
893 /* If a warning about undefined overflow is deferred, this is the
894 warning. Note that this may cause us to turn two warnings into
895 one, but that is fine since it is sufficient to only give one
896 warning per expression. */
898 static const char* fold_deferred_overflow_warning;
900 /* If a warning about undefined overflow is deferred, this is the
901 level at which the warning should be emitted. */
903 static enum warn_strict_overflow_code fold_deferred_overflow_code;
905 /* Start deferring overflow warnings. We could use a stack here to
906 permit nested calls, but at present it is not necessary. */
909 fold_defer_overflow_warnings (void)
911 ++fold_deferring_overflow_warnings;
914 /* Stop deferring overflow warnings. If there is a pending warning,
915 and ISSUE is true, then issue the warning if appropriate. STMT is
916 the statement with which the warning should be associated (used for
917 location information); STMT may be NULL. CODE is the level of the
918 warning--a warn_strict_overflow_code value. This function will use
919 the smaller of CODE and the deferred code when deciding whether to
920 issue the warning. CODE may be zero to mean to always use the
924 fold_undefer_overflow_warnings (bool issue, tree stmt, int code)
929 gcc_assert (fold_deferring_overflow_warnings > 0);
930 --fold_deferring_overflow_warnings;
931 if (fold_deferring_overflow_warnings > 0)
933 if (fold_deferred_overflow_warning != NULL
935 && code < (int) fold_deferred_overflow_code)
936 fold_deferred_overflow_code = code;
940 warnmsg = fold_deferred_overflow_warning;
941 fold_deferred_overflow_warning = NULL;
943 if (!issue || warnmsg == NULL)
946 /* Use the smallest code level when deciding to issue the
948 if (code == 0 || code > (int) fold_deferred_overflow_code)
949 code = fold_deferred_overflow_code;
951 if (!issue_strict_overflow_warning (code))
954 if (stmt == NULL_TREE || !EXPR_HAS_LOCATION (stmt))
955 locus = input_location;
957 locus = EXPR_LOCATION (stmt);
958 warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
961 /* Stop deferring overflow warnings, ignoring any deferred
965 fold_undefer_and_ignore_overflow_warnings (void)
967 fold_undefer_overflow_warnings (false, NULL_TREE, 0);
970 /* Whether we are deferring overflow warnings. */
973 fold_deferring_overflow_warnings_p (void)
975 return fold_deferring_overflow_warnings > 0;
978 /* This is called when we fold something based on the fact that signed
979 overflow is undefined. */
982 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
984 gcc_assert (!flag_wrapv && !flag_trapv);
985 if (fold_deferring_overflow_warnings > 0)
987 if (fold_deferred_overflow_warning == NULL
988 || wc < fold_deferred_overflow_code)
990 fold_deferred_overflow_warning = gmsgid;
991 fold_deferred_overflow_code = wc;
994 else if (issue_strict_overflow_warning (wc))
995 warning (OPT_Wstrict_overflow, gmsgid);
998 /* Return true if the built-in mathematical function specified by CODE
999 is odd, i.e. -f(x) == f(-x). */
1002 negate_mathfn_p (enum built_in_function code)
1006 CASE_FLT_FN (BUILT_IN_ASIN):
1007 CASE_FLT_FN (BUILT_IN_ASINH):
1008 CASE_FLT_FN (BUILT_IN_ATAN):
1009 CASE_FLT_FN (BUILT_IN_ATANH):
1010 CASE_FLT_FN (BUILT_IN_CBRT):
1011 CASE_FLT_FN (BUILT_IN_SIN):
1012 CASE_FLT_FN (BUILT_IN_SINH):
1013 CASE_FLT_FN (BUILT_IN_TAN):
1014 CASE_FLT_FN (BUILT_IN_TANH):
1023 /* Check whether we may negate an integer constant T without causing
1027 may_negate_without_overflow_p (tree t)
1029 unsigned HOST_WIDE_INT val;
1033 gcc_assert (TREE_CODE (t) == INTEGER_CST);
1035 type = TREE_TYPE (t);
1036 if (TYPE_UNSIGNED (type))
1039 prec = TYPE_PRECISION (type);
1040 if (prec > HOST_BITS_PER_WIDE_INT)
1042 if (TREE_INT_CST_LOW (t) != 0)
1044 prec -= HOST_BITS_PER_WIDE_INT;
1045 val = TREE_INT_CST_HIGH (t);
1048 val = TREE_INT_CST_LOW (t);
1049 if (prec < HOST_BITS_PER_WIDE_INT)
1050 val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
1051 return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
1054 /* Determine whether an expression T can be cheaply negated using
1055 the function negate_expr without introducing undefined overflow. */
1058 negate_expr_p (tree t)
1065 type = TREE_TYPE (t);
1067 STRIP_SIGN_NOPS (t);
1068 switch (TREE_CODE (t))
1071 if (TYPE_OVERFLOW_WRAPS (type))
1074 /* Check that -CST will not overflow type. */
1075 return may_negate_without_overflow_p (t);
1077 return (INTEGRAL_TYPE_P (type)
1078 && TYPE_OVERFLOW_WRAPS (type));
1085 return negate_expr_p (TREE_REALPART (t))
1086 && negate_expr_p (TREE_IMAGPART (t));
1089 if (FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
1091 /* -(A + B) -> (-B) - A. */
1092 if (negate_expr_p (TREE_OPERAND (t, 1))
1093 && reorder_operands_p (TREE_OPERAND (t, 0),
1094 TREE_OPERAND (t, 1)))
1096 /* -(A + B) -> (-A) - B. */
1097 return negate_expr_p (TREE_OPERAND (t, 0));
1100 /* We can't turn -(A-B) into B-A when we honor signed zeros. */
1101 return (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1102 && reorder_operands_p (TREE_OPERAND (t, 0),
1103 TREE_OPERAND (t, 1));
1106 if (TYPE_UNSIGNED (TREE_TYPE (t)))
1112 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1113 return negate_expr_p (TREE_OPERAND (t, 1))
1114 || negate_expr_p (TREE_OPERAND (t, 0));
1117 case TRUNC_DIV_EXPR:
1118 case ROUND_DIV_EXPR:
1119 case FLOOR_DIV_EXPR:
1121 case EXACT_DIV_EXPR:
1122 /* In general we can't negate A / B, because if A is INT_MIN and
1123 B is 1, we may turn this into INT_MIN / -1 which is undefined
1124 and actually traps on some architectures. But if overflow is
1125 undefined, we can negate, because - (INT_MIN / 1) is an
1127 if (INTEGRAL_TYPE_P (TREE_TYPE (t))
1128 && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
1130 return negate_expr_p (TREE_OPERAND (t, 1))
1131 || negate_expr_p (TREE_OPERAND (t, 0));
1134 /* Negate -((double)float) as (double)(-float). */
1135 if (TREE_CODE (type) == REAL_TYPE)
1137 tree tem = strip_float_extensions (t);
1139 return negate_expr_p (tem);
1144 /* Negate -f(x) as f(-x). */
1145 if (negate_mathfn_p (builtin_mathfn_code (t)))
1146 return negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1)));
1150 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
1151 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1153 tree op1 = TREE_OPERAND (t, 1);
1154 if (TREE_INT_CST_HIGH (op1) == 0
1155 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1156 == TREE_INT_CST_LOW (op1))
1167 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
1168 simplification is possible.
1169 If negate_expr_p would return true for T, NULL_TREE will never be
1173 fold_negate_expr (tree t)
1175 tree type = TREE_TYPE (t);
1178 switch (TREE_CODE (t))
1180 /* Convert - (~A) to A + 1. */
1182 if (INTEGRAL_TYPE_P (type))
1183 return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
1184 build_int_cst (type, 1));
1188 tem = fold_negate_const (t, type);
1189 if (!TREE_OVERFLOW (tem)
1190 || !TYPE_OVERFLOW_TRAPS (type))
1195 tem = fold_negate_const (t, type);
1196 /* Two's complement FP formats, such as c4x, may overflow. */
1197 if (! TREE_OVERFLOW (tem) || ! flag_trapping_math)
1203 tree rpart = negate_expr (TREE_REALPART (t));
1204 tree ipart = negate_expr (TREE_IMAGPART (t));
1206 if ((TREE_CODE (rpart) == REAL_CST
1207 && TREE_CODE (ipart) == REAL_CST)
1208 || (TREE_CODE (rpart) == INTEGER_CST
1209 && TREE_CODE (ipart) == INTEGER_CST))
1210 return build_complex (type, rpart, ipart);
1215 return TREE_OPERAND (t, 0);
1218 if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1220 /* -(A + B) -> (-B) - A. */
1221 if (negate_expr_p (TREE_OPERAND (t, 1))
1222 && reorder_operands_p (TREE_OPERAND (t, 0),
1223 TREE_OPERAND (t, 1)))
1225 tem = negate_expr (TREE_OPERAND (t, 1));
1226 return fold_build2 (MINUS_EXPR, type,
1227 tem, TREE_OPERAND (t, 0));
1230 /* -(A + B) -> (-A) - B. */
1231 if (negate_expr_p (TREE_OPERAND (t, 0)))
1233 tem = negate_expr (TREE_OPERAND (t, 0));
1234 return fold_build2 (MINUS_EXPR, type,
1235 tem, TREE_OPERAND (t, 1));
1241 /* - (A - B) -> B - A */
1242 if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1243 && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
1244 return fold_build2 (MINUS_EXPR, type,
1245 TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
1249 if (TYPE_UNSIGNED (type))
1255 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
1257 tem = TREE_OPERAND (t, 1);
1258 if (negate_expr_p (tem))
1259 return fold_build2 (TREE_CODE (t), type,
1260 TREE_OPERAND (t, 0), negate_expr (tem));
1261 tem = TREE_OPERAND (t, 0);
1262 if (negate_expr_p (tem))
1263 return fold_build2 (TREE_CODE (t), type,
1264 negate_expr (tem), TREE_OPERAND (t, 1));
1268 case TRUNC_DIV_EXPR:
1269 case ROUND_DIV_EXPR:
1270 case FLOOR_DIV_EXPR:
1272 case EXACT_DIV_EXPR:
1273 /* In general we can't negate A / B, because if A is INT_MIN and
1274 B is 1, we may turn this into INT_MIN / -1 which is undefined
1275 and actually traps on some architectures. But if overflow is
1276 undefined, we can negate, because - (INT_MIN / 1) is an
1278 if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
1280 const char * const warnmsg = G_("assuming signed overflow does not "
1281 "occur when negating a division");
1282 tem = TREE_OPERAND (t, 1);
1283 if (negate_expr_p (tem))
1285 if (INTEGRAL_TYPE_P (type)
1286 && (TREE_CODE (tem) != INTEGER_CST
1287 || integer_onep (tem)))
1288 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1289 return fold_build2 (TREE_CODE (t), type,
1290 TREE_OPERAND (t, 0), negate_expr (tem));
1292 tem = TREE_OPERAND (t, 0);
1293 if (negate_expr_p (tem))
1295 if (INTEGRAL_TYPE_P (type)
1296 && (TREE_CODE (tem) != INTEGER_CST
1297 || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
1298 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
1299 return fold_build2 (TREE_CODE (t), type,
1300 negate_expr (tem), TREE_OPERAND (t, 1));
1306 /* Convert -((double)float) into (double)(-float). */
1307 if (TREE_CODE (type) == REAL_TYPE)
1309 tem = strip_float_extensions (t);
1310 if (tem != t && negate_expr_p (tem))
1311 return negate_expr (tem);
1316 /* Negate -f(x) as f(-x). */
1317 if (negate_mathfn_p (builtin_mathfn_code (t))
1318 && negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1))))
1320 tree fndecl, arg, arglist;
1322 fndecl = get_callee_fndecl (t);
1323 arg = negate_expr (TREE_VALUE (TREE_OPERAND (t, 1)));
1324 arglist = build_tree_list (NULL_TREE, arg);
1325 return build_function_call_expr (fndecl, arglist);
1330 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
1331 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1333 tree op1 = TREE_OPERAND (t, 1);
1334 if (TREE_INT_CST_HIGH (op1) == 0
1335 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1336 == TREE_INT_CST_LOW (op1))
1338 tree ntype = TYPE_UNSIGNED (type)
1339 ? lang_hooks.types.signed_type (type)
1340 : lang_hooks.types.unsigned_type (type);
1341 tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1342 temp = fold_build2 (RSHIFT_EXPR, ntype, temp, op1);
1343 return fold_convert (type, temp);
1355 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
1356 negated in a simpler way. Also allow for T to be NULL_TREE, in which case
1357 return NULL_TREE. */
1360 negate_expr (tree t)
1367 type = TREE_TYPE (t);
1368 STRIP_SIGN_NOPS (t);
1370 tem = fold_negate_expr (t);
1372 tem = build1 (NEGATE_EXPR, TREE_TYPE (t), t);
1373 return fold_convert (type, tem);
1376 /* Split a tree IN into a constant, literal and variable parts that could be
1377 combined with CODE to make IN. "constant" means an expression with
1378 TREE_CONSTANT but that isn't an actual constant. CODE must be a
1379 commutative arithmetic operation. Store the constant part into *CONP,
1380 the literal in *LITP and return the variable part. If a part isn't
1381 present, set it to null. If the tree does not decompose in this way,
1382 return the entire tree as the variable part and the other parts as null.
1384 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that
1385 case, we negate an operand that was subtracted. Except if it is a
1386 literal for which we use *MINUS_LITP instead.
1388 If NEGATE_P is true, we are negating all of IN, again except a literal
1389 for which we use *MINUS_LITP instead.
1391 If IN is itself a literal or constant, return it as appropriate.
1393 Note that we do not guarantee that any of the three values will be the
1394 same type as IN, but they will have the same signedness and mode. */
1397 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1398 tree *minus_litp, int negate_p)
1406 /* Strip any conversions that don't change the machine mode or signedness. */
1407 STRIP_SIGN_NOPS (in);
1409 if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
1411 else if (TREE_CODE (in) == code
1412 || (! FLOAT_TYPE_P (TREE_TYPE (in))
1413 /* We can associate addition and subtraction together (even
1414 though the C standard doesn't say so) for integers because
1415 the value is not affected. For reals, the value might be
1416 affected, so we can't. */
1417 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1418 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1420 tree op0 = TREE_OPERAND (in, 0);
1421 tree op1 = TREE_OPERAND (in, 1);
1422 int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1423 int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1425 /* First see if either of the operands is a literal, then a constant. */
1426 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
1427 *litp = op0, op0 = 0;
1428 else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
1429 *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1431 if (op0 != 0 && TREE_CONSTANT (op0))
1432 *conp = op0, op0 = 0;
1433 else if (op1 != 0 && TREE_CONSTANT (op1))
1434 *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1436 /* If we haven't dealt with either operand, this is not a case we can
1437 decompose. Otherwise, VAR is either of the ones remaining, if any. */
1438 if (op0 != 0 && op1 != 0)
1443 var = op1, neg_var_p = neg1_p;
1445 /* Now do any needed negations. */
1447 *minus_litp = *litp, *litp = 0;
1449 *conp = negate_expr (*conp);
1451 var = negate_expr (var);
1453 else if (TREE_CONSTANT (in))
1461 *minus_litp = *litp, *litp = 0;
1462 else if (*minus_litp)
1463 *litp = *minus_litp, *minus_litp = 0;
1464 *conp = negate_expr (*conp);
1465 var = negate_expr (var);
1471 /* Re-associate trees split by the above function. T1 and T2 are either
1472 expressions to associate or null. Return the new expression, if any. If
1473 we build an operation, do it in TYPE and with CODE. */
1476 associate_trees (tree t1, tree t2, enum tree_code code, tree type)
1483 /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1484 try to fold this since we will have infinite recursion. But do
1485 deal with any NEGATE_EXPRs. */
1486 if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1487 || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1489 if (code == PLUS_EXPR)
1491 if (TREE_CODE (t1) == NEGATE_EXPR)
1492 return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1493 fold_convert (type, TREE_OPERAND (t1, 0)));
1494 else if (TREE_CODE (t2) == NEGATE_EXPR)
1495 return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1496 fold_convert (type, TREE_OPERAND (t2, 0)));
1497 else if (integer_zerop (t2))
1498 return fold_convert (type, t1);
1500 else if (code == MINUS_EXPR)
1502 if (integer_zerop (t2))
1503 return fold_convert (type, t1);
1506 return build2 (code, type, fold_convert (type, t1),
1507 fold_convert (type, t2));
1510 return fold_build2 (code, type, fold_convert (type, t1),
1511 fold_convert (type, t2));
1514 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1515 to produce a new constant. Return NULL_TREE if we don't know how
1516 to evaluate CODE at compile-time.
1518 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1521 int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1523 unsigned HOST_WIDE_INT int1l, int2l;
1524 HOST_WIDE_INT int1h, int2h;
1525 unsigned HOST_WIDE_INT low;
1527 unsigned HOST_WIDE_INT garbagel;
1528 HOST_WIDE_INT garbageh;
1530 tree type = TREE_TYPE (arg1);
1531 int uns = TYPE_UNSIGNED (type);
1533 = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
1536 int1l = TREE_INT_CST_LOW (arg1);
1537 int1h = TREE_INT_CST_HIGH (arg1);
1538 int2l = TREE_INT_CST_LOW (arg2);
1539 int2h = TREE_INT_CST_HIGH (arg2);
1544 low = int1l | int2l, hi = int1h | int2h;
1548 low = int1l ^ int2l, hi = int1h ^ int2h;
1552 low = int1l & int2l, hi = int1h & int2h;
1558 /* It's unclear from the C standard whether shifts can overflow.
1559 The following code ignores overflow; perhaps a C standard
1560 interpretation ruling is needed. */
1561 lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1568 lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
1573 overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1577 neg_double (int2l, int2h, &low, &hi);
1578 add_double (int1l, int1h, low, hi, &low, &hi);
1579 overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
1583 overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1586 case TRUNC_DIV_EXPR:
1587 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1588 case EXACT_DIV_EXPR:
1589 /* This is a shortcut for a common special case. */
1590 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1591 && ! TREE_CONSTANT_OVERFLOW (arg1)
1592 && ! TREE_CONSTANT_OVERFLOW (arg2)
1593 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1595 if (code == CEIL_DIV_EXPR)
1598 low = int1l / int2l, hi = 0;
1602 /* ... fall through ... */
1604 case ROUND_DIV_EXPR:
1605 if (int2h == 0 && int2l == 0)
1607 if (int2h == 0 && int2l == 1)
1609 low = int1l, hi = int1h;
1612 if (int1l == int2l && int1h == int2h
1613 && ! (int1l == 0 && int1h == 0))
1618 overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1619 &low, &hi, &garbagel, &garbageh);
1622 case TRUNC_MOD_EXPR:
1623 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1624 /* This is a shortcut for a common special case. */
1625 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
1626 && ! TREE_CONSTANT_OVERFLOW (arg1)
1627 && ! TREE_CONSTANT_OVERFLOW (arg2)
1628 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
1630 if (code == CEIL_MOD_EXPR)
1632 low = int1l % int2l, hi = 0;
1636 /* ... fall through ... */
1638 case ROUND_MOD_EXPR:
1639 if (int2h == 0 && int2l == 0)
1641 overflow = div_and_round_double (code, uns,
1642 int1l, int1h, int2l, int2h,
1643 &garbagel, &garbageh, &low, &hi);
1649 low = (((unsigned HOST_WIDE_INT) int1h
1650 < (unsigned HOST_WIDE_INT) int2h)
1651 || (((unsigned HOST_WIDE_INT) int1h
1652 == (unsigned HOST_WIDE_INT) int2h)
1655 low = (int1h < int2h
1656 || (int1h == int2h && int1l < int2l));
1658 if (low == (code == MIN_EXPR))
1659 low = int1l, hi = int1h;
1661 low = int2l, hi = int2h;
1668 t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
1672 /* Propagate overflow flags ourselves. */
1673 if (((!uns || is_sizetype) && overflow)
1674 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1677 TREE_OVERFLOW (t) = 1;
1678 TREE_CONSTANT_OVERFLOW (t) = 1;
1680 else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1683 TREE_CONSTANT_OVERFLOW (t) = 1;
1687 t = force_fit_type (t, 1,
1688 ((!uns || is_sizetype) && overflow)
1689 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2),
1690 TREE_CONSTANT_OVERFLOW (arg1)
1691 | TREE_CONSTANT_OVERFLOW (arg2));
1696 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1697 constant. We assume ARG1 and ARG2 have the same data type, or at least
1698 are the same kind of constant and the same machine mode. Return zero if
1699 combining the constants is not allowed in the current operating mode.
1701 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1704 const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
1706 /* Sanity check for the recursive cases. */
1713 if (TREE_CODE (arg1) == INTEGER_CST)
1714 return int_const_binop (code, arg1, arg2, notrunc);
1716 if (TREE_CODE (arg1) == REAL_CST)
1718 enum machine_mode mode;
1721 REAL_VALUE_TYPE value;
1722 REAL_VALUE_TYPE result;
1726 /* The following codes are handled by real_arithmetic. */
1741 d1 = TREE_REAL_CST (arg1);
1742 d2 = TREE_REAL_CST (arg2);
1744 type = TREE_TYPE (arg1);
1745 mode = TYPE_MODE (type);
1747 /* Don't perform operation if we honor signaling NaNs and
1748 either operand is a NaN. */
1749 if (HONOR_SNANS (mode)
1750 && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1753 /* Don't perform operation if it would raise a division
1754 by zero exception. */
1755 if (code == RDIV_EXPR
1756 && REAL_VALUES_EQUAL (d2, dconst0)
1757 && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1760 /* If either operand is a NaN, just return it. Otherwise, set up
1761 for floating-point trap; we return an overflow. */
1762 if (REAL_VALUE_ISNAN (d1))
1764 else if (REAL_VALUE_ISNAN (d2))
1767 inexact = real_arithmetic (&value, code, &d1, &d2);
1768 real_convert (&result, mode, &value);
1770 /* Don't constant fold this floating point operation if
1771 the result has overflowed and flag_trapping_math. */
1772 if (flag_trapping_math
1773 && MODE_HAS_INFINITIES (mode)
1774 && REAL_VALUE_ISINF (result)
1775 && !REAL_VALUE_ISINF (d1)
1776 && !REAL_VALUE_ISINF (d2))
1779 /* Don't constant fold this floating point operation if the
1780 result may dependent upon the run-time rounding mode and
1781 flag_rounding_math is set, or if GCC's software emulation
1782 is unable to accurately represent the result. */
1783 if ((flag_rounding_math
1784 || (REAL_MODE_FORMAT_COMPOSITE_P (mode)
1785 && !flag_unsafe_math_optimizations))
1786 && (inexact || !real_identical (&result, &value)))
1789 t = build_real (type, result);
1791 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1792 TREE_CONSTANT_OVERFLOW (t)
1794 | TREE_CONSTANT_OVERFLOW (arg1)
1795 | TREE_CONSTANT_OVERFLOW (arg2);
1799 if (TREE_CODE (arg1) == COMPLEX_CST)
1801 tree type = TREE_TYPE (arg1);
1802 tree r1 = TREE_REALPART (arg1);
1803 tree i1 = TREE_IMAGPART (arg1);
1804 tree r2 = TREE_REALPART (arg2);
1805 tree i2 = TREE_IMAGPART (arg2);
1812 real = const_binop (code, r1, r2, notrunc);
1813 imag = const_binop (code, i1, i2, notrunc);
1817 real = const_binop (MINUS_EXPR,
1818 const_binop (MULT_EXPR, r1, r2, notrunc),
1819 const_binop (MULT_EXPR, i1, i2, notrunc),
1821 imag = const_binop (PLUS_EXPR,
1822 const_binop (MULT_EXPR, r1, i2, notrunc),
1823 const_binop (MULT_EXPR, i1, r2, notrunc),
1830 = const_binop (PLUS_EXPR,
1831 const_binop (MULT_EXPR, r2, r2, notrunc),
1832 const_binop (MULT_EXPR, i2, i2, notrunc),
1835 = const_binop (PLUS_EXPR,
1836 const_binop (MULT_EXPR, r1, r2, notrunc),
1837 const_binop (MULT_EXPR, i1, i2, notrunc),
1840 = const_binop (MINUS_EXPR,
1841 const_binop (MULT_EXPR, i1, r2, notrunc),
1842 const_binop (MULT_EXPR, r1, i2, notrunc),
1845 if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
1846 code = TRUNC_DIV_EXPR;
1848 real = const_binop (code, t1, magsquared, notrunc);
1849 imag = const_binop (code, t2, magsquared, notrunc);
1858 return build_complex (type, real, imag);
1864 /* Create a size type INT_CST node with NUMBER sign extended. KIND
1865 indicates which particular sizetype to create. */
1868 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1870 return build_int_cst (sizetype_tab[(int) kind], number);
1873 /* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE
1874 is a tree code. The type of the result is taken from the operands.
1875 Both must be the same type integer type and it must be a size type.
1876 If the operands are constant, so is the result. */
1879 size_binop (enum tree_code code, tree arg0, tree arg1)
1881 tree type = TREE_TYPE (arg0);
1883 if (arg0 == error_mark_node || arg1 == error_mark_node)
1884 return error_mark_node;
1886 gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1887 && type == TREE_TYPE (arg1));
1889 /* Handle the special case of two integer constants faster. */
1890 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1892 /* And some specific cases even faster than that. */
1893 if (code == PLUS_EXPR && integer_zerop (arg0))
1895 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1896 && integer_zerop (arg1))
1898 else if (code == MULT_EXPR && integer_onep (arg0))
1901 /* Handle general case of two integer constants. */
1902 return int_const_binop (code, arg0, arg1, 0);
1905 return fold_build2 (code, type, arg0, arg1);
1908 /* Given two values, either both of sizetype or both of bitsizetype,
1909 compute the difference between the two values. Return the value
1910 in signed type corresponding to the type of the operands. */
1913 size_diffop (tree arg0, tree arg1)
1915 tree type = TREE_TYPE (arg0);
1918 gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1919 && type == TREE_TYPE (arg1));
1921 /* If the type is already signed, just do the simple thing. */
1922 if (!TYPE_UNSIGNED (type))
1923 return size_binop (MINUS_EXPR, arg0, arg1);
1925 ctype = type == bitsizetype ? sbitsizetype : ssizetype;
1927 /* If either operand is not a constant, do the conversions to the signed
1928 type and subtract. The hardware will do the right thing with any
1929 overflow in the subtraction. */
1930 if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1931 return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
1932 fold_convert (ctype, arg1));
1934 /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1935 Otherwise, subtract the other way, convert to CTYPE (we know that can't
1936 overflow) and negate (which can't either). Special-case a result
1937 of zero while we're here. */
1938 if (tree_int_cst_equal (arg0, arg1))
1939 return build_int_cst (ctype, 0);
1940 else if (tree_int_cst_lt (arg1, arg0))
1941 return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
1943 return size_binop (MINUS_EXPR, build_int_cst (ctype, 0),
1944 fold_convert (ctype, size_binop (MINUS_EXPR,
1948 /* A subroutine of fold_convert_const handling conversions of an
1949 INTEGER_CST to another integer type. */
1952 fold_convert_const_int_from_int (tree type, tree arg1)
1956 /* Given an integer constant, make new constant with new type,
1957 appropriately sign-extended or truncated. */
1958 t = build_int_cst_wide (type, TREE_INT_CST_LOW (arg1),
1959 TREE_INT_CST_HIGH (arg1));
1961 t = force_fit_type (t,
1962 /* Don't set the overflow when
1963 converting a pointer */
1964 !POINTER_TYPE_P (TREE_TYPE (arg1)),
1965 (TREE_INT_CST_HIGH (arg1) < 0
1966 && (TYPE_UNSIGNED (type)
1967 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1968 | TREE_OVERFLOW (arg1),
1969 TREE_CONSTANT_OVERFLOW (arg1));
1974 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1975 to an integer type. */
1978 fold_convert_const_int_from_real (enum tree_code code, tree type, tree arg1)
1983 /* The following code implements the floating point to integer
1984 conversion rules required by the Java Language Specification,
1985 that IEEE NaNs are mapped to zero and values that overflow
1986 the target precision saturate, i.e. values greater than
1987 INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1988 are mapped to INT_MIN. These semantics are allowed by the
1989 C and C++ standards that simply state that the behavior of
1990 FP-to-integer conversion is unspecified upon overflow. */
1992 HOST_WIDE_INT high, low;
1994 REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
1998 case FIX_TRUNC_EXPR:
1999 real_trunc (&r, VOIDmode, &x);
2003 real_ceil (&r, VOIDmode, &x);
2006 case FIX_FLOOR_EXPR:
2007 real_floor (&r, VOIDmode, &x);
2010 case FIX_ROUND_EXPR:
2011 real_round (&r, VOIDmode, &x);
2018 /* If R is NaN, return zero and show we have an overflow. */
2019 if (REAL_VALUE_ISNAN (r))
2026 /* See if R is less than the lower bound or greater than the
2031 tree lt = TYPE_MIN_VALUE (type);
2032 REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
2033 if (REAL_VALUES_LESS (r, l))
2036 high = TREE_INT_CST_HIGH (lt);
2037 low = TREE_INT_CST_LOW (lt);
2043 tree ut = TYPE_MAX_VALUE (type);
2046 REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
2047 if (REAL_VALUES_LESS (u, r))
2050 high = TREE_INT_CST_HIGH (ut);
2051 low = TREE_INT_CST_LOW (ut);
2057 REAL_VALUE_TO_INT (&low, &high, r);
2059 t = build_int_cst_wide (type, low, high);
2061 t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg1),
2062 TREE_CONSTANT_OVERFLOW (arg1));
2066 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2067 to another floating point type. */
2070 fold_convert_const_real_from_real (tree type, tree arg1)
2072 REAL_VALUE_TYPE value;
2075 real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2076 t = build_real (type, value);
2078 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2079 TREE_CONSTANT_OVERFLOW (t)
2080 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
2084 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2085 type TYPE. If no simplification can be done return NULL_TREE. */
2088 fold_convert_const (enum tree_code code, tree type, tree arg1)
2090 if (TREE_TYPE (arg1) == type)
2093 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2095 if (TREE_CODE (arg1) == INTEGER_CST)
2096 return fold_convert_const_int_from_int (type, arg1);
2097 else if (TREE_CODE (arg1) == REAL_CST)
2098 return fold_convert_const_int_from_real (code, type, arg1);
2100 else if (TREE_CODE (type) == REAL_TYPE)
2102 if (TREE_CODE (arg1) == INTEGER_CST)
2103 return build_real_from_int_cst (type, arg1);
2104 if (TREE_CODE (arg1) == REAL_CST)
2105 return fold_convert_const_real_from_real (type, arg1);
2110 /* Construct a vector of zero elements of vector type TYPE. */
2113 build_zero_vector (tree type)
2118 elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2119 units = TYPE_VECTOR_SUBPARTS (type);
2122 for (i = 0; i < units; i++)
2123 list = tree_cons (NULL_TREE, elem, list);
2124 return build_vector (type, list);
2127 /* Convert expression ARG to type TYPE. Used by the middle-end for
2128 simple conversions in preference to calling the front-end's convert. */
2131 fold_convert (tree type, tree arg)
2133 tree orig = TREE_TYPE (arg);
2139 if (TREE_CODE (arg) == ERROR_MARK
2140 || TREE_CODE (type) == ERROR_MARK
2141 || TREE_CODE (orig) == ERROR_MARK)
2142 return error_mark_node;
2144 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)
2145 || lang_hooks.types_compatible_p (TYPE_MAIN_VARIANT (type),
2146 TYPE_MAIN_VARIANT (orig)))
2147 return fold_build1 (NOP_EXPR, type, arg);
2149 switch (TREE_CODE (type))
2151 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2152 case POINTER_TYPE: case REFERENCE_TYPE:
2154 if (TREE_CODE (arg) == INTEGER_CST)
2156 tem = fold_convert_const (NOP_EXPR, type, arg);
2157 if (tem != NULL_TREE)
2160 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2161 || TREE_CODE (orig) == OFFSET_TYPE)
2162 return fold_build1 (NOP_EXPR, type, arg);
2163 if (TREE_CODE (orig) == COMPLEX_TYPE)
2165 tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2166 return fold_convert (type, tem);
2168 gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2169 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2170 return fold_build1 (NOP_EXPR, type, arg);
2173 if (TREE_CODE (arg) == INTEGER_CST)
2175 tem = fold_convert_const (FLOAT_EXPR, type, arg);
2176 if (tem != NULL_TREE)
2179 else if (TREE_CODE (arg) == REAL_CST)
2181 tem = fold_convert_const (NOP_EXPR, type, arg);
2182 if (tem != NULL_TREE)
2186 switch (TREE_CODE (orig))
2189 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2190 case POINTER_TYPE: case REFERENCE_TYPE:
2191 return fold_build1 (FLOAT_EXPR, type, arg);
2194 return fold_build1 (NOP_EXPR, type, arg);
2197 tem = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2198 return fold_convert (type, tem);
2205 switch (TREE_CODE (orig))
2208 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2209 case POINTER_TYPE: case REFERENCE_TYPE:
2211 return build2 (COMPLEX_EXPR, type,
2212 fold_convert (TREE_TYPE (type), arg),
2213 fold_convert (TREE_TYPE (type), integer_zero_node));
2218 if (TREE_CODE (arg) == COMPLEX_EXPR)
2220 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
2221 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
2222 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2225 arg = save_expr (arg);
2226 rpart = fold_build1 (REALPART_EXPR, TREE_TYPE (orig), arg);
2227 ipart = fold_build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg);
2228 rpart = fold_convert (TREE_TYPE (type), rpart);
2229 ipart = fold_convert (TREE_TYPE (type), ipart);
2230 return fold_build2 (COMPLEX_EXPR, type, rpart, ipart);
2238 if (integer_zerop (arg))
2239 return build_zero_vector (type);
2240 gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2241 gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2242 || TREE_CODE (orig) == VECTOR_TYPE);
2243 return fold_build1 (VIEW_CONVERT_EXPR, type, arg);
2246 return fold_build1 (NOP_EXPR, type, fold_ignored_result (arg));
2253 /* Return false if expr can be assumed not to be an lvalue, true
2257 maybe_lvalue_p (tree x)
2259 /* We only need to wrap lvalue tree codes. */
2260 switch (TREE_CODE (x))
2271 case ALIGN_INDIRECT_REF:
2272 case MISALIGNED_INDIRECT_REF:
2274 case ARRAY_RANGE_REF:
2280 case PREINCREMENT_EXPR:
2281 case PREDECREMENT_EXPR:
2283 case TRY_CATCH_EXPR:
2284 case WITH_CLEANUP_EXPR:
2295 /* Assume the worst for front-end tree codes. */
2296 if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2304 /* Return an expr equal to X but certainly not valid as an lvalue. */
2309 /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2314 if (! maybe_lvalue_p (x))
2316 return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2319 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2320 Zero means allow extended lvalues. */
2322 int pedantic_lvalues;
2324 /* When pedantic, return an expr equal to X but certainly not valid as a
2325 pedantic lvalue. Otherwise, return X. */
2328 pedantic_non_lvalue (tree x)
2330 if (pedantic_lvalues)
2331 return non_lvalue (x);
2336 /* Given a tree comparison code, return the code that is the logical inverse
2337 of the given code. It is not safe to do this for floating-point
2338 comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2339 as well: if reversing the comparison is unsafe, return ERROR_MARK. */
2342 invert_tree_comparison (enum tree_code code, bool honor_nans)
2344 if (honor_nans && flag_trapping_math)
2354 return honor_nans ? UNLE_EXPR : LE_EXPR;
2356 return honor_nans ? UNLT_EXPR : LT_EXPR;
2358 return honor_nans ? UNGE_EXPR : GE_EXPR;
2360 return honor_nans ? UNGT_EXPR : GT_EXPR;
2374 return UNORDERED_EXPR;
2375 case UNORDERED_EXPR:
2376 return ORDERED_EXPR;
2382 /* Similar, but return the comparison that results if the operands are
2383 swapped. This is safe for floating-point. */
2386 swap_tree_comparison (enum tree_code code)
2393 case UNORDERED_EXPR:
2419 /* Convert a comparison tree code from an enum tree_code representation
2420 into a compcode bit-based encoding. This function is the inverse of
2421 compcode_to_comparison. */
2423 static enum comparison_code
2424 comparison_to_compcode (enum tree_code code)
2441 return COMPCODE_ORD;
2442 case UNORDERED_EXPR:
2443 return COMPCODE_UNORD;
2445 return COMPCODE_UNLT;
2447 return COMPCODE_UNEQ;
2449 return COMPCODE_UNLE;
2451 return COMPCODE_UNGT;
2453 return COMPCODE_LTGT;
2455 return COMPCODE_UNGE;
2461 /* Convert a compcode bit-based encoding of a comparison operator back
2462 to GCC's enum tree_code representation. This function is the
2463 inverse of comparison_to_compcode. */
2465 static enum tree_code
2466 compcode_to_comparison (enum comparison_code code)
2483 return ORDERED_EXPR;
2484 case COMPCODE_UNORD:
2485 return UNORDERED_EXPR;
2503 /* Return a tree for the comparison which is the combination of
2504 doing the AND or OR (depending on CODE) of the two operations LCODE
2505 and RCODE on the identical operands LL_ARG and LR_ARG. Take into account
2506 the possibility of trapping if the mode has NaNs, and return NULL_TREE
2507 if this makes the transformation invalid. */
2510 combine_comparisons (enum tree_code code, enum tree_code lcode,
2511 enum tree_code rcode, tree truth_type,
2512 tree ll_arg, tree lr_arg)
2514 bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2515 enum comparison_code lcompcode = comparison_to_compcode (lcode);
2516 enum comparison_code rcompcode = comparison_to_compcode (rcode);
2517 enum comparison_code compcode;
2521 case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2522 compcode = lcompcode & rcompcode;
2525 case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2526 compcode = lcompcode | rcompcode;
2535 /* Eliminate unordered comparisons, as well as LTGT and ORD
2536 which are not used unless the mode has NaNs. */
2537 compcode &= ~COMPCODE_UNORD;
2538 if (compcode == COMPCODE_LTGT)
2539 compcode = COMPCODE_NE;
2540 else if (compcode == COMPCODE_ORD)
2541 compcode = COMPCODE_TRUE;
2543 else if (flag_trapping_math)
2545 /* Check that the original operation and the optimized ones will trap
2546 under the same condition. */
2547 bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2548 && (lcompcode != COMPCODE_EQ)
2549 && (lcompcode != COMPCODE_ORD);
2550 bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2551 && (rcompcode != COMPCODE_EQ)
2552 && (rcompcode != COMPCODE_ORD);
2553 bool trap = (compcode & COMPCODE_UNORD) == 0
2554 && (compcode != COMPCODE_EQ)
2555 && (compcode != COMPCODE_ORD);
2557 /* In a short-circuited boolean expression the LHS might be
2558 such that the RHS, if evaluated, will never trap. For
2559 example, in ORD (x, y) && (x < y), we evaluate the RHS only
2560 if neither x nor y is NaN. (This is a mixed blessing: for
2561 example, the expression above will never trap, hence
2562 optimizing it to x < y would be invalid). */
2563 if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2564 || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2567 /* If the comparison was short-circuited, and only the RHS
2568 trapped, we may now generate a spurious trap. */
2570 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2573 /* If we changed the conditions that cause a trap, we lose. */
2574 if ((ltrap || rtrap) != trap)
2578 if (compcode == COMPCODE_TRUE)
2579 return constant_boolean_node (true, truth_type);
2580 else if (compcode == COMPCODE_FALSE)
2581 return constant_boolean_node (false, truth_type);
2583 return fold_build2 (compcode_to_comparison (compcode),
2584 truth_type, ll_arg, lr_arg);
2587 /* Return nonzero if CODE is a tree code that represents a truth value. */
2590 truth_value_p (enum tree_code code)
2592 return (TREE_CODE_CLASS (code) == tcc_comparison
2593 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2594 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2595 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2598 /* Return nonzero if two operands (typically of the same tree node)
2599 are necessarily equal. If either argument has side-effects this
2600 function returns zero. FLAGS modifies behavior as follows:
2602 If OEP_ONLY_CONST is set, only return nonzero for constants.
2603 This function tests whether the operands are indistinguishable;
2604 it does not test whether they are equal using C's == operation.
2605 The distinction is important for IEEE floating point, because
2606 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2607 (2) two NaNs may be indistinguishable, but NaN!=NaN.
2609 If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2610 even though it may hold multiple values during a function.
2611 This is because a GCC tree node guarantees that nothing else is
2612 executed between the evaluation of its "operands" (which may often
2613 be evaluated in arbitrary order). Hence if the operands themselves
2614 don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2615 same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST
2616 unset means assuming isochronic (or instantaneous) tree equivalence.
2617 Unless comparing arbitrary expression trees, such as from different
2618 statements, this flag can usually be left unset.
2620 If OEP_PURE_SAME is set, then pure functions with identical arguments
2621 are considered the same. It is used when the caller has other ways
2622 to ensure that global memory is unchanged in between. */
2625 operand_equal_p (tree arg0, tree arg1, unsigned int flags)
2627 /* If either is ERROR_MARK, they aren't equal. */
2628 if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
2631 /* If both types don't have the same signedness, then we can't consider
2632 them equal. We must check this before the STRIP_NOPS calls
2633 because they may change the signedness of the arguments. */
2634 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2637 /* If both types don't have the same precision, then it is not safe
2639 if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
2645 /* In case both args are comparisons but with different comparison
2646 code, try to swap the comparison operands of one arg to produce
2647 a match and compare that variant. */
2648 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2649 && COMPARISON_CLASS_P (arg0)
2650 && COMPARISON_CLASS_P (arg1))
2652 enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
2654 if (TREE_CODE (arg0) == swap_code)
2655 return operand_equal_p (TREE_OPERAND (arg0, 0),
2656 TREE_OPERAND (arg1, 1), flags)
2657 && operand_equal_p (TREE_OPERAND (arg0, 1),
2658 TREE_OPERAND (arg1, 0), flags);
2661 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2662 /* This is needed for conversions and for COMPONENT_REF.
2663 Might as well play it safe and always test this. */
2664 || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2665 || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2666 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2669 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2670 We don't care about side effects in that case because the SAVE_EXPR
2671 takes care of that for us. In all other cases, two expressions are
2672 equal if they have no side effects. If we have two identical
2673 expressions with side effects that should be treated the same due
2674 to the only side effects being identical SAVE_EXPR's, that will
2675 be detected in the recursive calls below. */
2676 if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2677 && (TREE_CODE (arg0) == SAVE_EXPR
2678 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2681 /* Next handle constant cases, those for which we can return 1 even
2682 if ONLY_CONST is set. */
2683 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2684 switch (TREE_CODE (arg0))
2687 return (! TREE_CONSTANT_OVERFLOW (arg0)
2688 && ! TREE_CONSTANT_OVERFLOW (arg1)
2689 && tree_int_cst_equal (arg0, arg1));
2692 return (! TREE_CONSTANT_OVERFLOW (arg0)
2693 && ! TREE_CONSTANT_OVERFLOW (arg1)
2694 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2695 TREE_REAL_CST (arg1)));
2701 if (TREE_CONSTANT_OVERFLOW (arg0)
2702 || TREE_CONSTANT_OVERFLOW (arg1))
2705 v1 = TREE_VECTOR_CST_ELTS (arg0);
2706 v2 = TREE_VECTOR_CST_ELTS (arg1);
2709 if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
2712 v1 = TREE_CHAIN (v1);
2713 v2 = TREE_CHAIN (v2);
2720 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2722 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2726 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2727 && ! memcmp (TREE_STRING_POINTER (arg0),
2728 TREE_STRING_POINTER (arg1),
2729 TREE_STRING_LENGTH (arg0)));
2732 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2738 if (flags & OEP_ONLY_CONST)
2741 /* Define macros to test an operand from arg0 and arg1 for equality and a
2742 variant that allows null and views null as being different from any
2743 non-null value. In the latter case, if either is null, the both
2744 must be; otherwise, do the normal comparison. */
2745 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N), \
2746 TREE_OPERAND (arg1, N), flags)
2748 #define OP_SAME_WITH_NULL(N) \
2749 ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
2750 ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2752 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2755 /* Two conversions are equal only if signedness and modes match. */
2756 switch (TREE_CODE (arg0))
2761 case FIX_TRUNC_EXPR:
2762 case FIX_FLOOR_EXPR:
2763 case FIX_ROUND_EXPR:
2764 if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2765 != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2775 case tcc_comparison:
2777 if (OP_SAME (0) && OP_SAME (1))
2780 /* For commutative ops, allow the other order. */
2781 return (commutative_tree_code (TREE_CODE (arg0))
2782 && operand_equal_p (TREE_OPERAND (arg0, 0),
2783 TREE_OPERAND (arg1, 1), flags)
2784 && operand_equal_p (TREE_OPERAND (arg0, 1),
2785 TREE_OPERAND (arg1, 0), flags));
2788 /* If either of the pointer (or reference) expressions we are
2789 dereferencing contain a side effect, these cannot be equal. */
2790 if (TREE_SIDE_EFFECTS (arg0)
2791 || TREE_SIDE_EFFECTS (arg1))
2794 switch (TREE_CODE (arg0))
2797 case ALIGN_INDIRECT_REF:
2798 case MISALIGNED_INDIRECT_REF:
2804 case ARRAY_RANGE_REF:
2805 /* Operands 2 and 3 may be null. */
2808 && OP_SAME_WITH_NULL (2)
2809 && OP_SAME_WITH_NULL (3));
2812 /* Handle operand 2 the same as for ARRAY_REF. Operand 0
2813 may be NULL when we're called to compare MEM_EXPRs. */
2814 return OP_SAME_WITH_NULL (0)
2816 && OP_SAME_WITH_NULL (2);
2819 return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
2825 case tcc_expression:
2826 switch (TREE_CODE (arg0))
2829 case TRUTH_NOT_EXPR:
2832 case TRUTH_ANDIF_EXPR:
2833 case TRUTH_ORIF_EXPR:
2834 return OP_SAME (0) && OP_SAME (1);
2836 case TRUTH_AND_EXPR:
2838 case TRUTH_XOR_EXPR:
2839 if (OP_SAME (0) && OP_SAME (1))
2842 /* Otherwise take into account this is a commutative operation. */
2843 return (operand_equal_p (TREE_OPERAND (arg0, 0),
2844 TREE_OPERAND (arg1, 1), flags)
2845 && operand_equal_p (TREE_OPERAND (arg0, 1),
2846 TREE_OPERAND (arg1, 0), flags));
2849 /* If the CALL_EXPRs call different functions, then they
2850 clearly can not be equal. */
2855 unsigned int cef = call_expr_flags (arg0);
2856 if (flags & OEP_PURE_SAME)
2857 cef &= ECF_CONST | ECF_PURE;
2864 /* Now see if all the arguments are the same. operand_equal_p
2865 does not handle TREE_LIST, so we walk the operands here
2866 feeding them to operand_equal_p. */
2867 arg0 = TREE_OPERAND (arg0, 1);
2868 arg1 = TREE_OPERAND (arg1, 1);
2869 while (arg0 && arg1)
2871 if (! operand_equal_p (TREE_VALUE (arg0), TREE_VALUE (arg1),
2875 arg0 = TREE_CHAIN (arg0);
2876 arg1 = TREE_CHAIN (arg1);
2879 /* If we get here and both argument lists are exhausted
2880 then the CALL_EXPRs are equal. */
2881 return ! (arg0 || arg1);
2887 case tcc_declaration:
2888 /* Consider __builtin_sqrt equal to sqrt. */
2889 return (TREE_CODE (arg0) == FUNCTION_DECL
2890 && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2891 && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2892 && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
2899 #undef OP_SAME_WITH_NULL
2902 /* Similar to operand_equal_p, but see if ARG0 might have been made by
2903 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
2905 When in doubt, return 0. */
2908 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
2910 int unsignedp1, unsignedpo;
2911 tree primarg0, primarg1, primother;
2912 unsigned int correct_width;
2914 if (operand_equal_p (arg0, arg1, 0))
2917 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
2918 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
2921 /* Discard any conversions that don't change the modes of ARG0 and ARG1
2922 and see if the inner values are the same. This removes any
2923 signedness comparison, which doesn't matter here. */
2924 primarg0 = arg0, primarg1 = arg1;
2925 STRIP_NOPS (primarg0);
2926 STRIP_NOPS (primarg1);
2927 if (operand_equal_p (primarg0, primarg1, 0))
2930 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
2931 actual comparison operand, ARG0.
2933 First throw away any conversions to wider types
2934 already present in the operands. */
2936 primarg1 = get_narrower (arg1, &unsignedp1);
2937 primother = get_narrower (other, &unsignedpo);
2939 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
2940 if (unsignedp1 == unsignedpo
2941 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
2942 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
2944 tree type = TREE_TYPE (arg0);
2946 /* Make sure shorter operand is extended the right way
2947 to match the longer operand. */
2948 primarg1 = fold_convert (lang_hooks.types.signed_or_unsigned_type
2949 (unsignedp1, TREE_TYPE (primarg1)), primarg1);
2951 if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
2958 /* See if ARG is an expression that is either a comparison or is performing
2959 arithmetic on comparisons. The comparisons must only be comparing
2960 two different values, which will be stored in *CVAL1 and *CVAL2; if
2961 they are nonzero it means that some operands have already been found.
2962 No variables may be used anywhere else in the expression except in the
2963 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
2964 the expression and save_expr needs to be called with CVAL1 and CVAL2.
2966 If this is true, return 1. Otherwise, return zero. */
2969 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
2971 enum tree_code code = TREE_CODE (arg);
2972 enum tree_code_class class = TREE_CODE_CLASS (code);
2974 /* We can handle some of the tcc_expression cases here. */
2975 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
2977 else if (class == tcc_expression
2978 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2979 || code == COMPOUND_EXPR))
2982 else if (class == tcc_expression && code == SAVE_EXPR
2983 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
2985 /* If we've already found a CVAL1 or CVAL2, this expression is
2986 two complex to handle. */
2987 if (*cval1 || *cval2)
2997 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3000 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3001 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3002 cval1, cval2, save_p));
3007 case tcc_expression:
3008 if (code == COND_EXPR)
3009 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3010 cval1, cval2, save_p)
3011 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3012 cval1, cval2, save_p)
3013 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3014 cval1, cval2, save_p));
3017 case tcc_comparison:
3018 /* First see if we can handle the first operand, then the second. For
3019 the second operand, we know *CVAL1 can't be zero. It must be that
3020 one side of the comparison is each of the values; test for the
3021 case where this isn't true by failing if the two operands
3024 if (operand_equal_p (TREE_OPERAND (arg, 0),
3025 TREE_OPERAND (arg, 1), 0))
3029 *cval1 = TREE_OPERAND (arg, 0);
3030 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3032 else if (*cval2 == 0)
3033 *cval2 = TREE_OPERAND (arg, 0);
3034 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3039 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3041 else if (*cval2 == 0)
3042 *cval2 = TREE_OPERAND (arg, 1);
3043 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3055 /* ARG is a tree that is known to contain just arithmetic operations and
3056 comparisons. Evaluate the operations in the tree substituting NEW0 for
3057 any occurrence of OLD0 as an operand of a comparison and likewise for
3061 eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
3063 tree type = TREE_TYPE (arg);
3064 enum tree_code code = TREE_CODE (arg);
3065 enum tree_code_class class = TREE_CODE_CLASS (code);
3067 /* We can handle some of the tcc_expression cases here. */
3068 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
3070 else if (class == tcc_expression
3071 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3077 return fold_build1 (code, type,
3078 eval_subst (TREE_OPERAND (arg, 0),
3079 old0, new0, old1, new1));
3082 return fold_build2 (code, type,
3083 eval_subst (TREE_OPERAND (arg, 0),
3084 old0, new0, old1, new1),
3085 eval_subst (TREE_OPERAND (arg, 1),
3086 old0, new0, old1, new1));
3088 case tcc_expression:
3092 return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
3095 return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
3098 return fold_build3 (code, type,
3099 eval_subst (TREE_OPERAND (arg, 0),
3100 old0, new0, old1, new1),
3101 eval_subst (TREE_OPERAND (arg, 1),
3102 old0, new0, old1, new1),
3103 eval_subst (TREE_OPERAND (arg, 2),
3104 old0, new0, old1, new1));
3108 /* Fall through - ??? */
3110 case tcc_comparison:
3112 tree arg0 = TREE_OPERAND (arg, 0);
3113 tree arg1 = TREE_OPERAND (arg, 1);
3115 /* We need to check both for exact equality and tree equality. The
3116 former will be true if the operand has a side-effect. In that
3117 case, we know the operand occurred exactly once. */
3119 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3121 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3124 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3126 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3129 return fold_build2 (code, type, arg0, arg1);
3137 /* Return a tree for the case when the result of an expression is RESULT
3138 converted to TYPE and OMITTED was previously an operand of the expression
3139 but is now not needed (e.g., we folded OMITTED * 0).
3141 If OMITTED has side effects, we must evaluate it. Otherwise, just do
3142 the conversion of RESULT to TYPE. */
3145 omit_one_operand (tree type, tree result, tree omitted)
3147 tree t = fold_convert (type, result);
3149 if (TREE_SIDE_EFFECTS (omitted))
3150 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3152 return non_lvalue (t);
3155 /* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
3158 pedantic_omit_one_operand (tree type, tree result, tree omitted)
3160 tree t = fold_convert (type, result);
3162 if (TREE_SIDE_EFFECTS (omitted))
3163 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
3165 return pedantic_non_lvalue (t);
3168 /* Return a tree for the case when the result of an expression is RESULT
3169 converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3170 of the expression but are now not needed.
3172 If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3173 If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3174 evaluated before OMITTED2. Otherwise, if neither has side effects,
3175 just do the conversion of RESULT to TYPE. */
3178 omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
3180 tree t = fold_convert (type, result);
3182 if (TREE_SIDE_EFFECTS (omitted2))
3183 t = build2 (COMPOUND_EXPR, type, omitted2, t);
3184 if (TREE_SIDE_EFFECTS (omitted1))
3185 t = build2 (COMPOUND_EXPR, type, omitted1, t);
3187 return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
3191 /* Return a simplified tree node for the truth-negation of ARG. This
3192 never alters ARG itself. We assume that ARG is an operation that
3193 returns a truth value (0 or 1).
3195 FIXME: one would think we would fold the result, but it causes
3196 problems with the dominator optimizer. */
3199 fold_truth_not_expr (tree arg)
3201 tree type = TREE_TYPE (arg);
3202 enum tree_code code = TREE_CODE (arg);
3204 /* If this is a comparison, we can simply invert it, except for
3205 floating-point non-equality comparisons, in which case we just
3206 enclose a TRUTH_NOT_EXPR around what we have. */
3208 if (TREE_CODE_CLASS (code) == tcc_comparison)
3210 tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3211 if (FLOAT_TYPE_P (op_type)
3212 && flag_trapping_math
3213 && code != ORDERED_EXPR && code != UNORDERED_EXPR
3214 && code != NE_EXPR && code != EQ_EXPR)
3218 code = invert_tree_comparison (code,
3219 HONOR_NANS (TYPE_MODE (op_type)));
3220 if (code == ERROR_MARK)
3223 return build2 (code, type,
3224 TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
3231 return constant_boolean_node (integer_zerop (arg), type);
3233 case TRUTH_AND_EXPR:
3234 return build2 (TRUTH_OR_EXPR, type,
3235 invert_truthvalue (TREE_OPERAND (arg, 0)),
3236 invert_truthvalue (TREE_OPERAND (arg, 1)));
3239 return build2 (TRUTH_AND_EXPR, type,
3240 invert_truthvalue (TREE_OPERAND (arg, 0)),
3241 invert_truthvalue (TREE_OPERAND (arg, 1)));
3243 case TRUTH_XOR_EXPR:
3244 /* Here we can invert either operand. We invert the first operand
3245 unless the second operand is a TRUTH_NOT_EXPR in which case our
3246 result is the XOR of the first operand with the inside of the
3247 negation of the second operand. */
3249 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3250 return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3251 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3253 return build2 (TRUTH_XOR_EXPR, type,
3254 invert_truthvalue (TREE_OPERAND (arg, 0)),
3255 TREE_OPERAND (arg, 1));
3257 case TRUTH_ANDIF_EXPR:
3258 return build2 (TRUTH_ORIF_EXPR, type,
3259 invert_truthvalue (TREE_OPERAND (arg, 0)),
3260 invert_truthvalue (TREE_OPERAND (arg, 1)));
3262 case TRUTH_ORIF_EXPR:
3263 return build2 (TRUTH_ANDIF_EXPR, type,
3264 invert_truthvalue (TREE_OPERAND (arg, 0)),
3265 invert_truthvalue (TREE_OPERAND (arg, 1)));
3267 case TRUTH_NOT_EXPR:
3268 return TREE_OPERAND (arg, 0);
3272 tree arg1 = TREE_OPERAND (arg, 1);
3273 tree arg2 = TREE_OPERAND (arg, 2);
3274 /* A COND_EXPR may have a throw as one operand, which
3275 then has void type. Just leave void operands
3277 return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
3278 VOID_TYPE_P (TREE_TYPE (arg1))
3279 ? arg1 : invert_truthvalue (arg1),
3280 VOID_TYPE_P (TREE_TYPE (arg2))
3281 ? arg2 : invert_truthvalue (arg2));
3285 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
3286 invert_truthvalue (TREE_OPERAND (arg, 1)));
3288 case NON_LVALUE_EXPR:
3289 return invert_truthvalue (TREE_OPERAND (arg, 0));
3292 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3293 return build1 (TRUTH_NOT_EXPR, type, arg);
3297 return build1 (TREE_CODE (arg), type,
3298 invert_truthvalue (TREE_OPERAND (arg, 0)));
3301 if (!integer_onep (TREE_OPERAND (arg, 1)))
3303 return build2 (EQ_EXPR, type, arg,
3304 build_int_cst (type, 0));
3307 return build1 (TRUTH_NOT_EXPR, type, arg);
3309 case CLEANUP_POINT_EXPR:
3310 return build1 (CLEANUP_POINT_EXPR, type,
3311 invert_truthvalue (TREE_OPERAND (arg, 0)));
3320 /* Return a simplified tree node for the truth-negation of ARG. This
3321 never alters ARG itself. We assume that ARG is an operation that
3322 returns a truth value (0 or 1).
3324 FIXME: one would think we would fold the result, but it causes
3325 problems with the dominator optimizer. */
3328 invert_truthvalue (tree arg)
3332 if (TREE_CODE (arg) == ERROR_MARK)
3335 tem = fold_truth_not_expr (arg);
3337 tem = build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3342 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3343 operands are another bit-wise operation with a common input. If so,
3344 distribute the bit operations to save an operation and possibly two if
3345 constants are involved. For example, convert
3346 (A | B) & (A | C) into A | (B & C)
3347 Further simplification will occur if B and C are constants.
3349 If this optimization cannot be done, 0 will be returned. */
3352 distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
3357 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3358 || TREE_CODE (arg0) == code
3359 || (TREE_CODE (arg0) != BIT_AND_EXPR
3360 && TREE_CODE (arg0) != BIT_IOR_EXPR))
3363 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3365 common = TREE_OPERAND (arg0, 0);
3366 left = TREE_OPERAND (arg0, 1);
3367 right = TREE_OPERAND (arg1, 1);
3369 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3371 common = TREE_OPERAND (arg0, 0);
3372 left = TREE_OPERAND (arg0, 1);
3373 right = TREE_OPERAND (arg1, 0);
3375 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3377 common = TREE_OPERAND (arg0, 1);
3378 left = TREE_OPERAND (arg0, 0);
3379 right = TREE_OPERAND (arg1, 1);
3381 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3383 common = TREE_OPERAND (arg0, 1);
3384 left = TREE_OPERAND (arg0, 0);
3385 right = TREE_OPERAND (arg1, 0);
3390 return fold_build2 (TREE_CODE (arg0), type, common,
3391 fold_build2 (code, type, left, right));
3394 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3395 with code CODE. This optimization is unsafe. */
3397 distribute_real_division (enum tree_code code, tree type, tree arg0, tree arg1)
3399 bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3400 bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3402 /* (A / C) +- (B / C) -> (A +- B) / C. */
3404 && operand_equal_p (TREE_OPERAND (arg0, 1),
3405 TREE_OPERAND (arg1, 1), 0))
3406 return fold_build2 (mul0 ? MULT_EXPR : RDIV_EXPR, type,
3407 fold_build2 (code, type,
3408 TREE_OPERAND (arg0, 0),
3409 TREE_OPERAND (arg1, 0)),
3410 TREE_OPERAND (arg0, 1));
3412 /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2). */
3413 if (operand_equal_p (TREE_OPERAND (arg0, 0),
3414 TREE_OPERAND (arg1, 0), 0)
3415 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3416 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3418 REAL_VALUE_TYPE r0, r1;
3419 r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3420 r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3422 real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3424 real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3425 real_arithmetic (&r0, code, &r0, &r1);
3426 return fold_build2 (MULT_EXPR, type,
3427 TREE_OPERAND (arg0, 0),
3428 build_real (type, r0));
3434 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3435 starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */
3438 make_bit_field_ref (tree inner, tree type, int bitsize, int bitpos,
3445 tree size = TYPE_SIZE (TREE_TYPE (inner));
3446 if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3447 || POINTER_TYPE_P (TREE_TYPE (inner)))
3448 && host_integerp (size, 0)
3449 && tree_low_cst (size, 0) == bitsize)
3450 return fold_convert (type, inner);
3453 result = build3 (BIT_FIELD_REF, type, inner,
3454 size_int (bitsize), bitsize_int (bitpos));
3456 BIT_FIELD_REF_UNSIGNED (result) = unsignedp;
3461 /* Optimize a bit-field compare.
3463 There are two cases: First is a compare against a constant and the
3464 second is a comparison of two items where the fields are at the same
3465 bit position relative to the start of a chunk (byte, halfword, word)
3466 large enough to contain it. In these cases we can avoid the shift
3467 implicit in bitfield extractions.
3469 For constants, we emit a compare of the shifted constant with the
3470 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3471 compared. For two fields at the same position, we do the ANDs with the
3472 similar mask and compare the result of the ANDs.
3474 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3475 COMPARE_TYPE is the type of the comparison, and LHS and RHS
3476 are the left and right operands of the comparison, respectively.
3478 If the optimization described above can be done, we return the resulting
3479 tree. Otherwise we return zero. */
3482 optimize_bit_field_compare (enum tree_code code, tree compare_type,
3485 HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3486 tree type = TREE_TYPE (lhs);
3487 tree signed_type, unsigned_type;
3488 int const_p = TREE_CODE (rhs) == INTEGER_CST;
3489 enum machine_mode lmode, rmode, nmode;
3490 int lunsignedp, runsignedp;
3491 int lvolatilep = 0, rvolatilep = 0;
3492 tree linner, rinner = NULL_TREE;
3496 /* Get all the information about the extractions being done. If the bit size
3497 if the same as the size of the underlying object, we aren't doing an
3498 extraction at all and so can do nothing. We also don't want to
3499 do anything if the inner expression is a PLACEHOLDER_EXPR since we
3500 then will no longer be able to replace it. */
3501 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3502 &lunsignedp, &lvolatilep, false);
3503 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3504 || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
3509 /* If this is not a constant, we can only do something if bit positions,
3510 sizes, and signedness are the same. */
3511 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3512 &runsignedp, &rvolatilep, false);
3514 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3515 || lunsignedp != runsignedp || offset != 0
3516 || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
3520 /* See if we can find a mode to refer to this field. We should be able to,
3521 but fail if we can't. */
3522 nmode = get_best_mode (lbitsize, lbitpos,
3523 const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3524 : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3525 TYPE_ALIGN (TREE_TYPE (rinner))),
3526 word_mode, lvolatilep || rvolatilep);
3527 if (nmode == VOIDmode)
3530 /* Set signed and unsigned types of the precision of this mode for the
3532 signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3533 unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3535 /* Compute the bit position and size for the new reference and our offset
3536 within it. If the new reference is the same size as the original, we
3537 won't optimize anything, so return zero. */
3538 nbitsize = GET_MODE_BITSIZE (nmode);
3539 nbitpos = lbitpos & ~ (nbitsize - 1);
3541 if (nbitsize == lbitsize)
3544 if (BYTES_BIG_ENDIAN)
3545 lbitpos = nbitsize - lbitsize - lbitpos;
3547 /* Make the mask to be used against the extracted field. */
3548 mask = build_int_cst (unsigned_type, -1);
3549 mask = force_fit_type (mask, 0, false, false);
3550 mask = fold_convert (unsigned_type, mask);
3551 mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
3552 mask = const_binop (RSHIFT_EXPR, mask,
3553 size_int (nbitsize - lbitsize - lbitpos), 0);
3556 /* If not comparing with constant, just rework the comparison
3558 return build2 (code, compare_type,
3559 build2 (BIT_AND_EXPR, unsigned_type,
3560 make_bit_field_ref (linner, unsigned_type,
3561 nbitsize, nbitpos, 1),
3563 build2 (BIT_AND_EXPR, unsigned_type,
3564 make_bit_field_ref (rinner, unsigned_type,
3565 nbitsize, nbitpos, 1),
3568 /* Otherwise, we are handling the constant case. See if the constant is too
3569 big for the field. Warn and return a tree of for 0 (false) if so. We do
3570 this not only for its own sake, but to avoid having to test for this
3571 error case below. If we didn't, we might generate wrong code.
3573 For unsigned fields, the constant shifted right by the field length should
3574 be all zero. For signed fields, the high-order bits should agree with
3579 if (! integer_zerop (const_binop (RSHIFT_EXPR,
3580 fold_convert (unsigned_type, rhs),
3581 size_int (lbitsize), 0)))
3583 warning (0, "comparison is always %d due to width of bit-field",
3585 return constant_boolean_node (code == NE_EXPR, compare_type);
3590 tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs),
3591 size_int (lbitsize - 1), 0);
3592 if (! integer_zerop (tem) && ! integer_all_onesp (tem))
3594 warning (0, "comparison is always %d due to width of bit-field",
3596 return constant_boolean_node (code == NE_EXPR, compare_type);
3600 /* Single-bit compares should always be against zero. */
3601 if (lbitsize == 1 && ! integer_zerop (rhs))
3603 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3604 rhs = build_int_cst (type, 0);
3607 /* Make a new bitfield reference, shift the constant over the
3608 appropriate number of bits and mask it with the computed mask
3609 (in case this was a signed field). If we changed it, make a new one. */
3610 lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
3613 TREE_SIDE_EFFECTS (lhs) = 1;
3614 TREE_THIS_VOLATILE (lhs) = 1;
3617 rhs = const_binop (BIT_AND_EXPR,
3618 const_binop (LSHIFT_EXPR,
3619 fold_convert (unsigned_type, rhs),
3620 size_int (lbitpos), 0),
3623 return build2 (code, compare_type,
3624 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
3628 /* Subroutine for fold_truthop: decode a field reference.
3630 If EXP is a comparison reference, we return the innermost reference.
3632 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3633 set to the starting bit number.
3635 If the innermost field can be completely contained in a mode-sized
3636 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
3638 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3639 otherwise it is not changed.
3641 *PUNSIGNEDP is set to the signedness of the field.
3643 *PMASK is set to the mask used. This is either contained in a
3644 BIT_AND_EXPR or derived from the width of the field.
3646 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3648 Return 0 if this is not a component reference or is one that we can't
3649 do anything with. */
3652 decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3653 HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3654 int *punsignedp, int *pvolatilep,
3655 tree *pmask, tree *pand_mask)
3657 tree outer_type = 0;
3659 tree mask, inner, offset;
3661 unsigned int precision;
3663 /* All the optimizations using this function assume integer fields.
3664 There are problems with FP fields since the type_for_size call
3665 below can fail for, e.g., XFmode. */
3666 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3669 /* We are interested in the bare arrangement of bits, so strip everything
3670 that doesn't affect the machine mode. However, record the type of the
3671 outermost expression if it may matter below. */
3672 if (TREE_CODE (exp) == NOP_EXPR
3673 || TREE_CODE (exp) == CONVERT_EXPR
3674 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3675 outer_type = TREE_TYPE (exp);
3678 if (TREE_CODE (exp) == BIT_AND_EXPR)
3680 and_mask = TREE_OPERAND (exp, 1);
3681 exp = TREE_OPERAND (exp, 0);
3682 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3683 if (TREE_CODE (and_mask) != INTEGER_CST)
3687 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3688 punsignedp, pvolatilep, false);
3689 if ((inner == exp && and_mask == 0)
3690 || *pbitsize < 0 || offset != 0
3691 || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3694 /* If the number of bits in the reference is the same as the bitsize of
3695 the outer type, then the outer type gives the signedness. Otherwise
3696 (in case of a small bitfield) the signedness is unchanged. */
3697 if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3698 *punsignedp = TYPE_UNSIGNED (outer_type);
3700 /* Compute the mask to access the bitfield. */
3701 unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3702 precision = TYPE_PRECISION (unsigned_type);
3704 mask = build_int_cst (unsigned_type, -1);
3705 mask = force_fit_type (mask, 0, false, false);
3707 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3708 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3710 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
3712 mask = fold_build2 (BIT_AND_EXPR, unsigned_type,
3713 fold_convert (unsigned_type, and_mask), mask);
3716 *pand_mask = and_mask;
3720 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3724 all_ones_mask_p (tree mask, int size)
3726 tree type = TREE_TYPE (mask);
3727 unsigned int precision = TYPE_PRECISION (type);
3730 tmask = build_int_cst (lang_hooks.types.signed_type (type), -1);
3731 tmask = force_fit_type (tmask, 0, false, false);
3734 tree_int_cst_equal (mask,
3735 const_binop (RSHIFT_EXPR,
3736 const_binop (LSHIFT_EXPR, tmask,
3737 size_int (precision - size),
3739 size_int (precision - size), 0));
3742 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3743 represents the sign bit of EXP's type. If EXP represents a sign
3744 or zero extension, also test VAL against the unextended type.
3745 The return value is the (sub)expression whose sign bit is VAL,
3746 or NULL_TREE otherwise. */
3749 sign_bit_p (tree exp, tree val)
3751 unsigned HOST_WIDE_INT mask_lo, lo;
3752 HOST_WIDE_INT mask_hi, hi;
3756 /* Tree EXP must have an integral type. */
3757 t = TREE_TYPE (exp);
3758 if (! INTEGRAL_TYPE_P (t))
3761 /* Tree VAL must be an integer constant. */
3762 if (TREE_CODE (val) != INTEGER_CST
3763 || TREE_CONSTANT_OVERFLOW (val))
3766 width = TYPE_PRECISION (t);
3767 if (width > HOST_BITS_PER_WIDE_INT)
3769 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3772 mask_hi = ((unsigned HOST_WIDE_INT) -1
3773 >> (2 * HOST_BITS_PER_WIDE_INT - width));
3779 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3782 mask_lo = ((unsigned HOST_WIDE_INT) -1
3783 >> (HOST_BITS_PER_WIDE_INT - width));
3786 /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3787 treat VAL as if it were unsigned. */
3788 if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3789 && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3792 /* Handle extension from a narrower type. */
3793 if (TREE_CODE (exp) == NOP_EXPR
3794 && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3795 return sign_bit_p (TREE_OPERAND (exp, 0), val);
3800 /* Subroutine for fold_truthop: determine if an operand is simple enough
3801 to be evaluated unconditionally. */
3804 simple_operand_p (tree exp)
3806 /* Strip any conversions that don't change the machine mode. */
3809 return (CONSTANT_CLASS_P (exp)
3810 || TREE_CODE (exp) == SSA_NAME
3812 && ! TREE_ADDRESSABLE (exp)
3813 && ! TREE_THIS_VOLATILE (exp)
3814 && ! DECL_NONLOCAL (exp)
3815 /* Don't regard global variables as simple. They may be
3816 allocated in ways unknown to the compiler (shared memory,
3817 #pragma weak, etc). */
3818 && ! TREE_PUBLIC (exp)
3819 && ! DECL_EXTERNAL (exp)
3820 /* Loading a static variable is unduly expensive, but global
3821 registers aren't expensive. */
3822 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
3825 /* The following functions are subroutines to fold_range_test and allow it to
3826 try to change a logical combination of comparisons into a range test.
3829 X == 2 || X == 3 || X == 4 || X == 5
3833 (unsigned) (X - 2) <= 3
3835 We describe each set of comparisons as being either inside or outside
3836 a range, using a variable named like IN_P, and then describe the
3837 range with a lower and upper bound. If one of the bounds is omitted,
3838 it represents either the highest or lowest value of the type.
3840 In the comments below, we represent a range by two numbers in brackets
3841 preceded by a "+" to designate being inside that range, or a "-" to
3842 designate being outside that range, so the condition can be inverted by
3843 flipping the prefix. An omitted bound is represented by a "-". For
3844 example, "- [-, 10]" means being outside the range starting at the lowest
3845 possible value and ending at 10, in other words, being greater than 10.
3846 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
3849 We set up things so that the missing bounds are handled in a consistent
3850 manner so neither a missing bound nor "true" and "false" need to be
3851 handled using a special case. */
3853 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
3854 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
3855 and UPPER1_P are nonzero if the respective argument is an upper bound
3856 and zero for a lower. TYPE, if nonzero, is the type of the result; it
3857 must be specified for a comparison. ARG1 will be converted to ARG0's
3858 type if both are specified. */
3861 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
3862 tree arg1, int upper1_p)
3868 /* If neither arg represents infinity, do the normal operation.
3869 Else, if not a comparison, return infinity. Else handle the special
3870 comparison rules. Note that most of the cases below won't occur, but
3871 are handled for consistency. */
3873 if (arg0 != 0 && arg1 != 0)
3875 tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
3876 arg0, fold_convert (TREE_TYPE (arg0), arg1));
3878 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
3881 if (TREE_CODE_CLASS (code) != tcc_comparison)
3884 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
3885 for neither. In real maths, we cannot assume open ended ranges are
3886 the same. But, this is computer arithmetic, where numbers are finite.
3887 We can therefore make the transformation of any unbounded range with
3888 the value Z, Z being greater than any representable number. This permits
3889 us to treat unbounded ranges as equal. */
3890 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
3891 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
3895 result = sgn0 == sgn1;
3898 result = sgn0 != sgn1;
3901 result = sgn0 < sgn1;
3904 result = sgn0 <= sgn1;
3907 result = sgn0 > sgn1;
3910 result = sgn0 >= sgn1;
3916 return constant_boolean_node (result, type);
3919 /* Given EXP, a logical expression, set the range it is testing into
3920 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
3921 actually being tested. *PLOW and *PHIGH will be made of the same
3922 type as the returned expression. If EXP is not a comparison, we
3923 will most likely not be returning a useful value and range. Set
3924 *STRICT_OVERFLOW_P to true if the return value is only valid
3925 because signed overflow is undefined; otherwise, do not change
3926 *STRICT_OVERFLOW_P. */
3929 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
3930 bool *strict_overflow_p)
3932 enum tree_code code;
3933 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
3934 tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
3936 tree low, high, n_low, n_high;
3938 /* Start with simply saying "EXP != 0" and then look at the code of EXP
3939 and see if we can refine the range. Some of the cases below may not
3940 happen, but it doesn't seem worth worrying about this. We "continue"
3941 the outer loop when we've changed something; otherwise we "break"
3942 the switch, which will "break" the while. */
3945 low = high = build_int_cst (TREE_TYPE (exp), 0);
3949 code = TREE_CODE (exp);
3950 exp_type = TREE_TYPE (exp);
3952 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
3954 if (TREE_CODE_LENGTH (code) > 0)
3955 arg0 = TREE_OPERAND (exp, 0);
3956 if (TREE_CODE_CLASS (code) == tcc_comparison
3957 || TREE_CODE_CLASS (code) == tcc_unary
3958 || TREE_CODE_CLASS (code) == tcc_binary)
3959 arg0_type = TREE_TYPE (arg0);
3960 if (TREE_CODE_CLASS (code) == tcc_binary
3961 || TREE_CODE_CLASS (code) == tcc_comparison
3962 || (TREE_CODE_CLASS (code) == tcc_expression
3963 && TREE_CODE_LENGTH (code) > 1))
3964 arg1 = TREE_OPERAND (exp, 1);
3969 case TRUTH_NOT_EXPR:
3970 in_p = ! in_p, exp = arg0;
3973 case EQ_EXPR: case NE_EXPR:
3974 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
3975 /* We can only do something if the range is testing for zero
3976 and if the second operand is an integer constant. Note that
3977 saying something is "in" the range we make is done by
3978 complementing IN_P since it will set in the initial case of
3979 being not equal to zero; "out" is leaving it alone. */
3980 if (low == 0 || high == 0
3981 || ! integer_zerop (low) || ! integer_zerop (high)
3982 || TREE_CODE (arg1) != INTEGER_CST)
3987 case NE_EXPR: /* - [c, c] */
3990 case EQ_EXPR: /* + [c, c] */
3991 in_p = ! in_p, low = high = arg1;
3993 case GT_EXPR: /* - [-, c] */
3994 low = 0, high = arg1;
3996 case GE_EXPR: /* + [c, -] */
3997 in_p = ! in_p, low = arg1, high = 0;
3999 case LT_EXPR: /* - [c, -] */
4000 low = arg1, high = 0;
4002 case LE_EXPR: /* + [-, c] */
4003 in_p = ! in_p, low = 0, high = arg1;
4009 /* If this is an unsigned comparison, we also know that EXP is
4010 greater than or equal to zero. We base the range tests we make
4011 on that fact, so we record it here so we can parse existing
4012 range tests. We test arg0_type since often the return type
4013 of, e.g. EQ_EXPR, is boolean. */
4014 if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4016 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4018 build_int_cst (arg0_type, 0),
4022 in_p = n_in_p, low = n_low, high = n_high;
4024 /* If the high bound is missing, but we have a nonzero low
4025 bound, reverse the range so it goes from zero to the low bound
4027 if (high == 0 && low && ! integer_zerop (low))
4030 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4031 integer_one_node, 0);
4032 low = build_int_cst (arg0_type, 0);
4040 /* (-x) IN [a,b] -> x in [-b, -a] */
4041 n_low = range_binop (MINUS_EXPR, exp_type,
4042 build_int_cst (exp_type, 0),
4044 n_high = range_binop (MINUS_EXPR, exp_type,
4045 build_int_cst (exp_type, 0),
4047 low = n_low, high = n_high;
4053 exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
4054 build_int_cst (exp_type, 1));
4057 case PLUS_EXPR: case MINUS_EXPR:
4058 if (TREE_CODE (arg1) != INTEGER_CST)
4061 /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4062 move a constant to the other side. */
4063 if (!TYPE_UNSIGNED (arg0_type)
4064 && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4067 /* If EXP is signed, any overflow in the computation is undefined,
4068 so we don't worry about it so long as our computations on
4069 the bounds don't overflow. For unsigned, overflow is defined
4070 and this is exactly the right thing. */
4071 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4072 arg0_type, low, 0, arg1, 0);
4073 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4074 arg0_type, high, 1, arg1, 0);
4075 if ((n_low != 0 && TREE_OVERFLOW (n_low))
4076 || (n_high != 0 && TREE_OVERFLOW (n_high)))
4079 if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4080 *strict_overflow_p = true;
4082 /* Check for an unsigned range which has wrapped around the maximum
4083 value thus making n_high < n_low, and normalize it. */
4084 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4086 low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4087 integer_one_node, 0);
4088 high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4089 integer_one_node, 0);
4091 /* If the range is of the form +/- [ x+1, x ], we won't
4092 be able to normalize it. But then, it represents the
4093 whole range or the empty set, so make it
4095 if (tree_int_cst_equal (n_low, low)
4096 && tree_int_cst_equal (n_high, high))
4102 low = n_low, high = n_high;
4107 case NOP_EXPR: case NON_LVALUE_EXPR: case CONVERT_EXPR:
4108 if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4111 if (! INTEGRAL_TYPE_P (arg0_type)
4112 || (low != 0 && ! int_fits_type_p (low, arg0_type))
4113 || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4116 n_low = low, n_high = high;
4119 n_low = fold_convert (arg0_type, n_low);
4122 n_high = fold_convert (arg0_type, n_high);
4125 /* If we're converting arg0 from an unsigned type, to exp,
4126 a signed type, we will be doing the comparison as unsigned.
4127 The tests above have already verified that LOW and HIGH
4130 So we have to ensure that we will handle large unsigned
4131 values the same way that the current signed bounds treat
4134 if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4137 tree equiv_type = lang_hooks.types.type_for_mode
4138 (TYPE_MODE (arg0_type), 1);
4140 /* A range without an upper bound is, naturally, unbounded.
4141 Since convert would have cropped a very large value, use
4142 the max value for the destination type. */
4144 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4145 : TYPE_MAX_VALUE (arg0_type);
4147 if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4148 high_positive = fold_build2 (RSHIFT_EXPR, arg0_type,
4149 fold_convert (arg0_type,
4151 fold_convert (arg0_type,
4154 /* If the low bound is specified, "and" the range with the
4155 range for which the original unsigned value will be
4159 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4160 1, n_low, n_high, 1,
4161 fold_convert (arg0_type,
4166 in_p = (n_in_p == in_p);
4170 /* Otherwise, "or" the range with the range of the input
4171 that will be interpreted as negative. */
4172 if (! merge_ranges (&n_in_p, &n_low, &n_high,
4173 0, n_low, n_high, 1,
4174 fold_convert (arg0_type,
4179 in_p = (in_p != n_in_p);
4184 low = n_low, high = n_high;
4194 /* If EXP is a constant, we can evaluate whether this is true or false. */
4195 if (TREE_CODE (exp) == INTEGER_CST)
4197 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4199 && integer_onep (range_binop (LE_EXPR, integer_type_node,
4205 *pin_p = in_p, *plow = low, *phigh = high;
4209 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4210 type, TYPE, return an expression to test if EXP is in (or out of, depending
4211 on IN_P) the range. Return 0 if the test couldn't be created. */
4214 build_range_check (tree type, tree exp, int in_p, tree low, tree high)
4216 tree etype = TREE_TYPE (exp);
4219 #ifdef HAVE_canonicalize_funcptr_for_compare
4220 /* Disable this optimization for function pointer expressions
4221 on targets that require function pointer canonicalization. */
4222 if (HAVE_canonicalize_funcptr_for_compare
4223 && TREE_CODE (etype) == POINTER_TYPE
4224 && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4230 value = build_range_check (type, exp, 1, low, high);
4232 return invert_truthvalue (value);
4237 if (low == 0 && high == 0)
4238 return build_int_cst (type, 1);
4241 return fold_build2 (LE_EXPR, type, exp,
4242 fold_convert (etype, high));
4245 return fold_build2 (GE_EXPR, type, exp,
4246 fold_convert (etype, low));
4248 if (operand_equal_p (low, high, 0))
4249 return fold_build2 (EQ_EXPR, type, exp,
4250 fold_convert (etype, low));
4252 if (integer_zerop (low))
4254 if (! TYPE_UNSIGNED (etype))
4256 etype = lang_hooks.types.unsigned_type (etype);
4257 high = fold_convert (etype, high);
4258 exp = fold_convert (etype, exp);
4260 return build_range_check (type, exp, 1, 0, high);
4263 /* Optimize (c>=1) && (c<=127) into (signed char)c > 0. */
4264 if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4266 unsigned HOST_WIDE_INT lo;
4270 prec = TYPE_PRECISION (etype);
4271 if (prec <= HOST_BITS_PER_WIDE_INT)
4274 lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4278 hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4279 lo = (unsigned HOST_WIDE_INT) -1;
4282 if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4284 if (TYPE_UNSIGNED (etype))
4286 etype = lang_hooks.types.signed_type (etype);
4287 exp = fold_convert (etype, exp);
4289 return fold_build2 (GT_EXPR, type, exp,
4290 build_int_cst (etype, 0));
4294 /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4295 This requires wrap-around arithmetics for the type of the expression. */
4296 switch (TREE_CODE (etype))
4299 /* There is no requirement that LOW be within the range of ETYPE
4300 if the latter is a subtype. It must, however, be within the base
4301 type of ETYPE. So be sure we do the subtraction in that type. */
4302 if (TREE_TYPE (etype))
4303 etype = TREE_TYPE (etype);
4308 etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4309 TYPE_UNSIGNED (etype));
4316 /* If we don't have wrap-around arithmetics upfront, try to force it. */
4317 if (TREE_CODE (etype) == INTEGER_TYPE
4318 && !TYPE_OVERFLOW_WRAPS (etype))
4320 tree utype, minv, maxv;
4322 /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4323 for the type in question, as we rely on this here. */
4324 utype = lang_hooks.types.unsigned_type (etype);
4325 maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
4326 maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4327 integer_one_node, 1);
4328 minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
4330 if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4337 high = fold_convert (etype, high);
4338 low = fold_convert (etype, low);
4339 exp = fold_convert (etype, exp);
4341 value = const_binop (MINUS_EXPR, high, low, 0);
4343 if (value != 0 && !TREE_OVERFLOW (value))
4344 return build_range_check (type,
4345 fold_build2 (MINUS_EXPR, etype, exp, low),
4346 1, build_int_cst (etype, 0), value);
4351 /* Return the predecessor of VAL in its type, handling the infinite case. */
4354 range_predecessor (tree val)
4356 tree type = TREE_TYPE (val);
4358 if (INTEGRAL_TYPE_P (type)
4359 && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4362 return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4365 /* Return the successor of VAL in its type, handling the infinite case. */
4368 range_successor (tree val)
4370 tree type = TREE_TYPE (val);
4372 if (INTEGRAL_TYPE_P (type)
4373 && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4376 return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4379 /* Given two ranges, see if we can merge them into one. Return 1 if we
4380 can, 0 if we can't. Set the output range into the specified parameters. */
4383 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4384 tree high0, int in1_p, tree low1, tree high1)
4392 int lowequal = ((low0 == 0 && low1 == 0)
4393 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4394 low0, 0, low1, 0)));
4395 int highequal = ((high0 == 0 && high1 == 0)
4396 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4397 high0, 1, high1, 1)));
4399 /* Make range 0 be the range that starts first, or ends last if they
4400 start at the same value. Swap them if it isn't. */
4401 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4404 && integer_onep (range_binop (GT_EXPR, integer_type_node,
4405 high1, 1, high0, 1))))
4407 temp = in0_p, in0_p = in1_p, in1_p = temp;
4408 tem = low0, low0 = low1, low1 = tem;
4409 tem = high0, high0 = high1, high1 = tem;
4412 /* Now flag two cases, whether the ranges are disjoint or whether the
4413 second range is totally subsumed in the first. Note that the tests
4414 below are simplified by the ones above. */
4415 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4416 high0, 1, low1, 0));
4417 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4418 high1, 1, high0, 1));
4420 /* We now have four cases, depending on whether we are including or
4421 excluding the two ranges. */
4424 /* If they don't overlap, the result is false. If the second range
4425 is a subset it is the result. Otherwise, the range is from the start
4426 of the second to the end of the first. */
4428 in_p = 0, low = high = 0;
4430 in_p = 1, low = low1, high = high1;
4432 in_p = 1, low = low1, high = high0;
4435 else if (in0_p && ! in1_p)
4437 /* If they don't overlap, the result is the first range. If they are
4438 equal, the result is false. If the second range is a subset of the
4439 first, and the ranges begin at the same place, we go from just after
4440 the end of the second range to the end of the first. If the second
4441 range is not a subset of the first, or if it is a subset and both
4442 ranges end at the same place, the range starts at the start of the
4443 first range and ends just before the second range.
4444 Otherwise, we can't describe this as a single range. */
4446 in_p = 1, low = low0, high = high0;
4447 else if (lowequal && highequal)
4448 in_p = 0, low = high = 0;
4449 else if (subset && lowequal)
4451 low = range_successor (high1);
4456 /* We are in the weird situation where high0 > high1 but
4457 high1 has no successor. Punt. */
4461 else if (! subset || highequal)
4464 high = range_predecessor (low1);
4468 /* low0 < low1 but low1 has no predecessor. Punt. */
4476 else if (! in0_p && in1_p)
4478 /* If they don't overlap, the result is the second range. If the second
4479 is a subset of the first, the result is false. Otherwise,
4480 the range starts just after the first range and ends at the
4481 end of the second. */
4483 in_p = 1, low = low1, high = high1;
4484 else if (subset || highequal)
4485 in_p = 0, low = high = 0;
4488 low = range_successor (high0);
4493 /* high1 > high0 but high0 has no successor. Punt. */
4501 /* The case where we are excluding both ranges. Here the complex case
4502 is if they don't overlap. In that case, the only time we have a
4503 range is if they are adjacent. If the second is a subset of the
4504 first, the result is the first. Otherwise, the range to exclude
4505 starts at the beginning of the first range and ends at the end of the
4509 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4510 range_successor (high0),
4512 in_p = 0, low = low0, high = high1;
4515 /* Canonicalize - [min, x] into - [-, x]. */
4516 if (low0 && TREE_CODE (low0) == INTEGER_CST)
4517 switch (TREE_CODE (TREE_TYPE (low0)))
4520 if (TYPE_PRECISION (TREE_TYPE (low0))
4521 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4525 if (tree_int_cst_equal (low0,
4526 TYPE_MIN_VALUE (TREE_TYPE (low0))))
4530 if (TYPE_UNSIGNED (TREE_TYPE (low0))
4531 && integer_zerop (low0))
4538 /* Canonicalize - [x, max] into - [x, -]. */
4539 if (high1 && TREE_CODE (high1) == INTEGER_CST)
4540 switch (TREE_CODE (TREE_TYPE (high1)))
4543 if (TYPE_PRECISION (TREE_TYPE (high1))
4544 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4548 if (tree_int_cst_equal (high1,
4549 TYPE_MAX_VALUE (TREE_TYPE (high1))))
4553 if (TYPE_UNSIGNED (TREE_TYPE (high1))
4554 && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4556 integer_one_node, 1)))
4563 /* The ranges might be also adjacent between the maximum and
4564 minimum values of the given type. For
4565 - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4566 return + [x + 1, y - 1]. */
4567 if (low0 == 0 && high1 == 0)
4569 low = range_successor (high0);
4570 high = range_predecessor (low1);
4571 if (low == 0 || high == 0)
4581 in_p = 0, low = low0, high = high0;
4583 in_p = 0, low = low0, high = high1;
4586 *pin_p = in_p, *plow = low, *phigh = high;
4591 /* Subroutine of fold, looking inside expressions of the form
4592 A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4593 of the COND_EXPR. This function is being used also to optimize
4594 A op B ? C : A, by reversing the comparison first.
4596 Return a folded expression whose code is not a COND_EXPR
4597 anymore, or NULL_TREE if no folding opportunity is found. */
4600 fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
4602 enum tree_code comp_code = TREE_CODE (arg0);
4603 tree arg00 = TREE_OPERAND (arg0, 0);
4604 tree arg01 = TREE_OPERAND (arg0, 1);
4605 tree arg1_type = TREE_TYPE (arg1);
4611 /* If we have A op 0 ? A : -A, consider applying the following
4614 A == 0? A : -A same as -A
4615 A != 0? A : -A same as A
4616 A >= 0? A : -A same as abs (A)
4617 A > 0? A : -A same as abs (A)
4618 A <= 0? A : -A same as -abs (A)
4619 A < 0? A : -A same as -abs (A)
4621 None of these transformations work for modes with signed
4622 zeros. If A is +/-0, the first two transformations will
4623 change the sign of the result (from +0 to -0, or vice
4624 versa). The last four will fix the sign of the result,
4625 even though the original expressions could be positive or
4626 negative, depending on the sign of A.
4628 Note that all these transformations are correct if A is
4629 NaN, since the two alternatives (A and -A) are also NaNs. */
4630 if ((FLOAT_TYPE_P (TREE_TYPE (arg01))
4631 ? real_zerop (arg01)
4632 : integer_zerop (arg01))
4633 && ((TREE_CODE (arg2) == NEGATE_EXPR
4634 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4635 /* In the case that A is of the form X-Y, '-A' (arg2) may
4636 have already been folded to Y-X, check for that. */
4637 || (TREE_CODE (arg1) == MINUS_EXPR
4638 && TREE_CODE (arg2) == MINUS_EXPR
4639 && operand_equal_p (TREE_OPERAND (arg1, 0),
4640 TREE_OPERAND (arg2, 1), 0)
4641 && operand_equal_p (TREE_OPERAND (arg1, 1),
4642 TREE_OPERAND (arg2, 0), 0))))
4647 tem = fold_convert (arg1_type, arg1);
4648 return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
4651 return pedantic_non_lvalue (fold_convert (type, arg1));
4654 if (flag_trapping_math)
4659 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4660 arg1 = fold_convert (lang_hooks.types.signed_type
4661 (TREE_TYPE (arg1)), arg1);
4662 tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4663 return pedantic_non_lvalue (fold_convert (type, tem));
4666 if (flag_trapping_math)
4670 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4671 arg1 = fold_convert (lang_hooks.types.signed_type
4672 (TREE_TYPE (arg1)), arg1);
4673 tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1);
4674 return negate_expr (fold_convert (type, tem));
4676 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4680 /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise
4681 A == 0 ? A : 0 is always 0 unless A is -0. Note that
4682 both transformations are correct when A is NaN: A != 0
4683 is then true, and A == 0 is false. */
4685 if (integer_zerop (arg01) && integer_zerop (arg2))
4687 if (comp_code == NE_EXPR)
4688 return pedantic_non_lvalue (fold_convert (type, arg1));
4689 else if (comp_code == EQ_EXPR)
4690 return build_int_cst (type, 0);
4693 /* Try some transformations of A op B ? A : B.
4695 A == B? A : B same as B
4696 A != B? A : B same as A
4697 A >= B? A : B same as max (A, B)
4698 A > B? A : B same as max (B, A)
4699 A <= B? A : B same as min (A, B)
4700 A < B? A : B same as min (B, A)
4702 As above, these transformations don't work in the presence
4703 of signed zeros. For example, if A and B are zeros of
4704 opposite sign, the first two transformations will change
4705 the sign of the result. In the last four, the original
4706 expressions give different results for (A=+0, B=-0) and
4707 (A=-0, B=+0), but the transformed expressions do not.
4709 The first two transformations are correct if either A or B
4710 is a NaN. In the first transformation, the condition will
4711 be false, and B will indeed be chosen. In the case of the
4712 second transformation, the condition A != B will be true,
4713 and A will be chosen.
4715 The conversions to max() and min() are not correct if B is
4716 a number and A is not. The conditions in the original
4717 expressions will be false, so all four give B. The min()
4718 and max() versions would give a NaN instead. */
4719 if (operand_equal_for_comparison_p (arg01, arg2, arg00)
4720 /* Avoid these transformations if the COND_EXPR may be used
4721 as an lvalue in the C++ front-end. PR c++/19199. */
4723 || (strcmp (lang_hooks.name, "GNU C++") != 0
4724 && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4725 || ! maybe_lvalue_p (arg1)
4726 || ! maybe_lvalue_p (arg2)))
4728 tree comp_op0 = arg00;
4729 tree comp_op1 = arg01;
4730 tree comp_type = TREE_TYPE (comp_op0);
4732 /* Avoid adding NOP_EXPRs in case this is an lvalue. */
4733 if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4743 return pedantic_non_lvalue (fold_convert (type, arg2));
4745 return pedantic_non_lvalue (fold_convert (type, arg1));
4750 /* In C++ a ?: expression can be an lvalue, so put the
4751 operand which will be used if they are equal first
4752 so that we can convert this back to the
4753 corresponding COND_EXPR. */
4754 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4756 comp_op0 = fold_convert (comp_type, comp_op0);
4757 comp_op1 = fold_convert (comp_type, comp_op1);
4758 tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4759 ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1)
4760 : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0);
4761 return pedantic_non_lvalue (fold_convert (type, tem));
4768 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4770 comp_op0 = fold_convert (comp_type, comp_op0);
4771 comp_op1 = fold_convert (comp_type, comp_op1);
4772 tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4773 ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1)
4774 : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0);
4775 return pedantic_non_lvalue (fold_convert (type, tem));
4779 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4780 return pedantic_non_lvalue (fold_convert (type, arg2));
4783 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4784 return pedantic_non_lvalue (fold_convert (type, arg1));
4787 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4792 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4793 we might still be able to simplify this. For example,
4794 if C1 is one less or one more than C2, this might have started
4795 out as a MIN or MAX and been transformed by this function.
4796 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
4798 if (INTEGRAL_TYPE_P (type)
4799 && TREE_CODE (arg01) == INTEGER_CST
4800 && TREE_CODE (arg2) == INTEGER_CST)
4804 /* We can replace A with C1 in this case. */
4805 arg1 = fold_convert (type, arg01);
4806 return fold_build3 (COND_EXPR, type, arg0, arg1, arg2);
4809 /* If C1 is C2 + 1, this is min(A, C2). */
4810 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4812 && operand_equal_p (arg01,
4813 const_binop (PLUS_EXPR, arg2,
4814 integer_one_node, 0),
4816 return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4821 /* If C1 is C2 - 1, this is min(A, C2). */
4822 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4824 && operand_equal_p (arg01,
4825 const_binop (MINUS_EXPR, arg2,
4826 integer_one_node, 0),
4828 return pedantic_non_lvalue (fold_build2 (MIN_EXPR,
4833 /* If C1 is C2 - 1, this is max(A, C2). */
4834 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4836 && operand_equal_p (arg01,
4837 const_binop (MINUS_EXPR, arg2,
4838 integer_one_node, 0),
4840 return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4845 /* If C1 is C2 + 1, this is max(A, C2). */
4846 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4848 && operand_equal_p (arg01,
4849 const_binop (PLUS_EXPR, arg2,
4850 integer_one_node, 0),
4852 return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
4866 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4867 #define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
4870 /* EXP is some logical combination of boolean tests. See if we can
4871 merge it into some range test. Return the new tree if so. */
4874 fold_range_test (enum tree_code code, tree type, tree op0, tree op1)
4876 int or_op = (code == TRUTH_ORIF_EXPR
4877 || code == TRUTH_OR_EXPR);
4878 int in0_p, in1_p, in_p;
4879 tree low0, low1, low, high0, high1, high;
4880 bool strict_overflow_p = false;
4881 tree lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
4882 tree rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
4884 const char * const warnmsg = G_("assuming signed overflow does not occur "
4885 "when simplifying range test");
4887 /* If this is an OR operation, invert both sides; we will invert
4888 again at the end. */
4890 in0_p = ! in0_p, in1_p = ! in1_p;
4892 /* If both expressions are the same, if we can merge the ranges, and we
4893 can build the range test, return it or it inverted. If one of the
4894 ranges is always true or always false, consider it to be the same
4895 expression as the other. */
4896 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
4897 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4899 && 0 != (tem = (build_range_check (type,
4901 : rhs != 0 ? rhs : integer_zero_node,
4904 if (strict_overflow_p)
4905 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
4906 return or_op ? invert_truthvalue (tem) : tem;
4909 /* On machines where the branch cost is expensive, if this is a
4910 short-circuited branch and the underlying object on both sides
4911 is the same, make a non-short-circuit operation. */
4912 else if (LOGICAL_OP_NON_SHORT_CIRCUIT
4913 && lhs != 0 && rhs != 0
4914 && (code == TRUTH_ANDIF_EXPR
4915 || code == TRUTH_ORIF_EXPR)
4916 && operand_equal_p (lhs, rhs, 0))
4918 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
4919 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
4920 which cases we can't do this. */
4921 if (simple_operand_p (lhs))
4922 return build2 (code == TRUTH_ANDIF_EXPR
4923 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4926 else if (lang_hooks.decls.global_bindings_p () == 0
4927 && ! CONTAINS_PLACEHOLDER_P (lhs))
4929 tree common = save_expr (lhs);
4931 if (0 != (lhs = build_range_check (type, common,
4932 or_op ? ! in0_p : in0_p,
4934 && (0 != (rhs = build_range_check (type, common,
4935 or_op ? ! in1_p : in1_p,
4938 if (strict_overflow_p)
4939 fold_overflow_warning (warnmsg,
4940 WARN_STRICT_OVERFLOW_COMPARISON);
4941 return build2 (code == TRUTH_ANDIF_EXPR
4942 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4951 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
4952 bit value. Arrange things so the extra bits will be set to zero if and
4953 only if C is signed-extended to its full width. If MASK is nonzero,
4954 it is an INTEGER_CST that should be AND'ed with the extra bits. */
4957 unextend (tree c, int p, int unsignedp, tree mask)
4959 tree type = TREE_TYPE (c);
4960 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
4963 if (p == modesize || unsignedp)
4966 /* We work by getting just the sign bit into the low-order bit, then
4967 into the high-order bit, then sign-extend. We then XOR that value
4969 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
4970 temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
4972 /* We must use a signed type in order to get an arithmetic right shift.
4973 However, we must also avoid introducing accidental overflows, so that
4974 a subsequent call to integer_zerop will work. Hence we must
4975 do the type conversion here. At this point, the constant is either
4976 zero or one, and the conversion to a signed type can never overflow.
4977 We could get an overflow if this conversion is done anywhere else. */
4978 if (TYPE_UNSIGNED (type))
4979 temp = fold_convert (lang_hooks.types.signed_type (type), temp);
4981 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
4982 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
4984 temp = const_binop (BIT_AND_EXPR, temp,
4985 fold_convert (TREE_TYPE (c), mask), 0);
4986 /* If necessary, convert the type back to match the type of C. */
4987 if (TYPE_UNSIGNED (type))
4988 temp = fold_convert (type, temp);
4990 return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
4993 /* Find ways of folding logical expressions of LHS and RHS:
4994 Try to merge two comparisons to the same innermost item.
4995 Look for range tests like "ch >= '0' && ch <= '9'".
4996 Look for combinations of simple terms on machines with expensive branches
4997 and evaluate the RHS unconditionally.
4999 For example, if we have p->a == 2 && p->b == 4 and we can make an
5000 object large enough to span both A and B, we can do this with a comparison
5001 against the object ANDed with the a mask.
5003 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5004 operations to do this with one comparison.
5006 We check for both normal comparisons and the BIT_AND_EXPRs made this by
5007 function and the one above.
5009 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
5010 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5012 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5015 We return the simplified tree or 0 if no optimization is possible. */
5018 fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
5020 /* If this is the "or" of two comparisons, we can do something if
5021 the comparisons are NE_EXPR. If this is the "and", we can do something
5022 if the comparisons are EQ_EXPR. I.e.,
5023 (a->b == 2 && a->c == 4) can become (a->new == NEW).
5025 WANTED_CODE is this operation code. For single bit fields, we can
5026 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5027 comparison for one-bit fields. */
5029 enum tree_code wanted_code;
5030 enum tree_code lcode, rcode;
5031 tree ll_arg, lr_arg, rl_arg, rr_arg;
5032 tree ll_inner, lr_inner, rl_inner, rr_inner;
5033 HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5034 HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5035 HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5036 HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5037 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5038 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5039 enum machine_mode lnmode, rnmode;
5040 tree ll_mask, lr_mask, rl_mask, rr_mask;
5041 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5042 tree l_const, r_const;
5043 tree lntype, rntype, result;
5044 int first_bit, end_bit;
5046 tree orig_lhs = lhs, orig_rhs = rhs;
5047 enum tree_code orig_code = code;
5049 /* Start by getting the comparison codes. Fail if anything is volatile.
5050 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5051 it were surrounded with a NE_EXPR. */
5053 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5056 lcode = TREE_CODE (lhs);
5057 rcode = TREE_CODE (rhs);
5059 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5061 lhs = build2 (NE_EXPR, truth_type, lhs,
5062 build_int_cst (TREE_TYPE (lhs), 0));
5066 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5068 rhs = build2 (NE_EXPR, truth_type, rhs,
5069 build_int_cst (TREE_TYPE (rhs), 0));
5073 if (TREE_CODE_CLASS (lcode) != tcc_comparison
5074 || TREE_CODE_CLASS (rcode) != tcc_comparison)
5077 ll_arg = TREE_OPERAND (lhs, 0);
5078 lr_arg = TREE_OPERAND (lhs, 1);
5079 rl_arg = TREE_OPERAND (rhs, 0);
5080 rr_arg = TREE_OPERAND (rhs, 1);
5082 /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations. */
5083 if (simple_operand_p (ll_arg)
5084 && simple_operand_p (lr_arg))
5087 if (operand_equal_p (ll_arg, rl_arg, 0)
5088 && operand_equal_p (lr_arg, rr_arg, 0))
5090 result = combine_comparisons (code, lcode, rcode,
5091 truth_type, ll_arg, lr_arg);
5095 else if (operand_equal_p (ll_arg, rr_arg, 0)
5096 && operand_equal_p (lr_arg, rl_arg, 0))
5098 result = combine_comparisons (code, lcode,
5099 swap_tree_comparison (rcode),
5100 truth_type, ll_arg, lr_arg);
5106 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5107 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5109 /* If the RHS can be evaluated unconditionally and its operands are
5110 simple, it wins to evaluate the RHS unconditionally on machines
5111 with expensive branches. In this case, this isn't a comparison
5112 that can be merged. Avoid doing this if the RHS is a floating-point
5113 comparison since those can trap. */
5115 if (BRANCH_COST >= 2
5116 && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5117 && simple_operand_p (rl_arg)
5118 && simple_operand_p (rr_arg))
5120 /* Convert (a != 0) || (b != 0) into (a | b) != 0. */
5121 if (code == TRUTH_OR_EXPR
5122 && lcode == NE_EXPR && integer_zerop (lr_arg)
5123 && rcode == NE_EXPR && integer_zerop (rr_arg)
5124 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5125 return build2 (NE_EXPR, truth_type,
5126 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5128 build_int_cst (TREE_TYPE (ll_arg), 0));
5130 /* Convert (a == 0) && (b == 0) into (a | b) == 0. */
5131 if (code == TRUTH_AND_EXPR
5132 && lcode == EQ_EXPR && integer_zerop (lr_arg)
5133 && rcode == EQ_EXPR && integer_zerop (rr_arg)
5134 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
5135 return build2 (EQ_EXPR, truth_type,
5136 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5138 build_int_cst (TREE_TYPE (ll_arg), 0));
5140 if (LOGICAL_OP_NON_SHORT_CIRCUIT)
5142 if (code != orig_code || lhs != orig_lhs || rhs != orig_rhs)
5143 return build2 (code, truth_type, lhs, rhs);
5148 /* See if the comparisons can be merged. Then get all the parameters for
5151 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5152 || (rcode != EQ_EXPR && rcode != NE_EXPR))
5156 ll_inner = decode_field_reference (ll_arg,
5157 &ll_bitsize, &ll_bitpos, &ll_mode,
5158 &ll_unsignedp, &volatilep, &ll_mask,
5160 lr_inner = decode_field_reference (lr_arg,
5161 &lr_bitsize, &lr_bitpos, &lr_mode,
5162 &lr_unsignedp, &volatilep, &lr_mask,
5164 rl_inner = decode_field_reference (rl_arg,
5165 &rl_bitsize, &rl_bitpos, &rl_mode,
5166 &rl_unsignedp, &volatilep, &rl_mask,
5168 rr_inner = decode_field_reference (rr_arg,
5169 &rr_bitsize, &rr_bitpos, &rr_mode,
5170 &rr_unsignedp, &volatilep, &rr_mask,
5173 /* It must be true that the inner operation on the lhs of each
5174 comparison must be the same if we are to be able to do anything.
5175 Then see if we have constants. If not, the same must be true for
5177 if (volatilep || ll_inner == 0 || rl_inner == 0
5178 || ! operand_equal_p (ll_inner, rl_inner, 0))
5181 if (TREE_CODE (lr_arg) == INTEGER_CST
5182 && TREE_CODE (rr_arg) == INTEGER_CST)
5183 l_const = lr_arg, r_const = rr_arg;
5184 else if (lr_inner == 0 || rr_inner == 0
5185 || ! operand_equal_p (lr_inner, rr_inner, 0))
5188 l_const = r_const = 0;
5190 /* If either comparison code is not correct for our logical operation,
5191 fail. However, we can convert a one-bit comparison against zero into
5192 the opposite comparison against that bit being set in the field. */
5194 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5195 if (lcode != wanted_code)
5197 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5199 /* Make the left operand unsigned, since we are only interested
5200 in the value of one bit. Otherwise we are doing the wrong
5209 /* This is analogous to the code for l_const above. */
5210 if (rcode != wanted_code)
5212 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5221 /* After this point all optimizations will generate bit-field
5222 references, which we might not want. */
5223 if (! lang_hooks.can_use_bit_fields_p ())
5226 /* See if we can find a mode that contains both fields being compared on
5227 the left. If we can't, fail. Otherwise, update all constants and masks
5228 to be relative to a field of that size. */
5229 first_bit = MIN (ll_bitpos, rl_bitpos);
5230 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5231 lnmode = get_best_mode (end_bit - first_bit, first_bit,
5232 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5234 if (lnmode == VOIDmode)
5237 lnbitsize = GET_MODE_BITSIZE (lnmode);
5238 lnbitpos = first_bit & ~ (lnbitsize - 1);
5239 lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5240 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5242 if (BYTES_BIG_ENDIAN)
5244 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5245 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5248 ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5249 size_int (xll_bitpos), 0);
5250 rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5251 size_int (xrl_bitpos), 0);
5255 l_const = fold_convert (lntype, l_const);
5256 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5257 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
5258 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5259 fold_build1 (BIT_NOT_EXPR,
5263 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5265 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5270 r_const = fold_convert (lntype, r_const);
5271 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5272 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
5273 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5274 fold_build1 (BIT_NOT_EXPR,
5278 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5280 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5284 /* If the right sides are not constant, do the same for it. Also,
5285 disallow this optimization if a size or signedness mismatch occurs
5286 between the left and right sides. */
5289 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5290 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5291 /* Make sure the two fields on the right
5292 correspond to the left without being swapped. */
5293 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5296 first_bit = MIN (lr_bitpos, rr_bitpos);
5297 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5298 rnmode = get_best_mode (end_bit - first_bit, first_bit,
5299 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5301 if (rnmode == VOIDmode)
5304 rnbitsize = GET_MODE_BITSIZE (rnmode);
5305 rnbitpos = first_bit & ~ (rnbitsize - 1);
5306 rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5307 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5309 if (BYTES_BIG_ENDIAN)
5311 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5312 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5315 lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
5316 size_int (xlr_bitpos), 0);
5317 rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
5318 size_int (xrr_bitpos), 0);
5320 /* Make a mask that corresponds to both fields being compared.
5321 Do this for both items being compared. If the operands are the
5322 same size and the bits being compared are in the same position
5323 then we can do this by masking both and comparing the masked
5325 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5326 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
5327 if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5329 lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5330 ll_unsignedp || rl_unsignedp);
5331 if (! all_ones_mask_p (ll_mask, lnbitsize))
5332 lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5334 rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
5335 lr_unsignedp || rr_unsignedp);
5336 if (! all_ones_mask_p (lr_mask, rnbitsize))
5337 rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5339 return build2 (wanted_code, truth_type, lhs, rhs);
5342 /* There is still another way we can do something: If both pairs of
5343 fields being compared are adjacent, we may be able to make a wider
5344 field containing them both.
5346 Note that we still must mask the lhs/rhs expressions. Furthermore,
5347 the mask must be shifted to account for the shift done by
5348 make_bit_field_ref. */
5349 if ((ll_bitsize + ll_bitpos == rl_bitpos
5350 && lr_bitsize + lr_bitpos == rr_bitpos)
5351 || (ll_bitpos == rl_bitpos + rl_bitsize
5352 && lr_bitpos == rr_bitpos + rr_bitsize))
5356 lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
5357 MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5358 rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
5359 MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5361 ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5362 size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
5363 lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5364 size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
5366 /* Convert to the smaller type before masking out unwanted bits. */
5368 if (lntype != rntype)
5370 if (lnbitsize > rnbitsize)
5372 lhs = fold_convert (rntype, lhs);
5373 ll_mask = fold_convert (rntype, ll_mask);
5376 else if (lnbitsize < rnbitsize)
5378 rhs = fold_convert (lntype, rhs);
5379 lr_mask = fold_convert (lntype, lr_mask);
5384 if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5385 lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5387 if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5388 rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5390 return build2 (wanted_code, truth_type, lhs, rhs);
5396 /* Handle the case of comparisons with constants. If there is something in
5397 common between the masks, those bits of the constants must be the same.
5398 If not, the condition is always false. Test for this to avoid generating
5399 incorrect code below. */
5400 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
5401 if (! integer_zerop (result)
5402 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
5403 const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
5405 if (wanted_code == NE_EXPR)
5407 warning (0, "%<or%> of unmatched not-equal tests is always 1");
5408 return constant_boolean_node (true, truth_type);
5412 warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5413 return constant_boolean_node (false, truth_type);
5417 /* Construct the expression we will return. First get the component
5418 reference we will make. Unless the mask is all ones the width of
5419 that field, perform the mask operation. Then compare with the
5421 result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
5422 ll_unsignedp || rl_unsignedp);
5424 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
5425 if (! all_ones_mask_p (ll_mask, lnbitsize))
5426 result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
5428 return build2 (wanted_code, truth_type, result,
5429 const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
5432 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5436 optimize_minmax_comparison (enum tree_code code, tree type, tree op0, tree op1)
5439 enum tree_code op_code;
5440 tree comp_const = op1;
5442 int consts_equal, consts_lt;
5445 STRIP_SIGN_NOPS (arg0);
5447 op_code = TREE_CODE (arg0);
5448 minmax_const = TREE_OPERAND (arg0, 1);
5449 consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5450 consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5451 inner = TREE_OPERAND (arg0, 0);
5453 /* If something does not permit us to optimize, return the original tree. */
5454 if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5455 || TREE_CODE (comp_const) != INTEGER_CST
5456 || TREE_CONSTANT_OVERFLOW (comp_const)
5457 || TREE_CODE (minmax_const) != INTEGER_CST
5458 || TREE_CONSTANT_OVERFLOW (minmax_const))
5461 /* Now handle all the various comparison codes. We only handle EQ_EXPR
5462 and GT_EXPR, doing the rest with recursive calls using logical
5466 case NE_EXPR: case LT_EXPR: case LE_EXPR:
5468 tree tem = optimize_minmax_comparison (invert_tree_comparison (code, false),
5471 return invert_truthvalue (tem);
5477 fold_build2 (TRUTH_ORIF_EXPR, type,
5478 optimize_minmax_comparison
5479 (EQ_EXPR, type, arg0, comp_const),
5480 optimize_minmax_comparison
5481 (GT_EXPR, type, arg0, comp_const));
5484 if (op_code == MAX_EXPR && consts_equal)
5485 /* MAX (X, 0) == 0 -> X <= 0 */
5486 return fold_build2 (LE_EXPR, type, inner, comp_const);
5488 else if (op_code == MAX_EXPR && consts_lt)
5489 /* MAX (X, 0) == 5 -> X == 5 */
5490 return fold_build2 (EQ_EXPR, type, inner, comp_const);
5492 else if (op_code == MAX_EXPR)
5493 /* MAX (X, 0) == -1 -> false */
5494 return omit_one_operand (type, integer_zero_node, inner);
5496 else if (consts_equal)
5497 /* MIN (X, 0) == 0 -> X >= 0 */
5498 return fold_build2 (GE_EXPR, type, inner, comp_const);
5501 /* MIN (X, 0) == 5 -> false */
5502 return omit_one_operand (type, integer_zero_node, inner);
5505 /* MIN (X, 0) == -1 -> X == -1 */
5506 return fold_build2 (EQ_EXPR, type, inner, comp_const);
5509 if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5510 /* MAX (X, 0) > 0 -> X > 0
5511 MAX (X, 0) > 5 -> X > 5 */
5512 return fold_build2 (GT_EXPR, type, inner, comp_const);
5514 else if (op_code == MAX_EXPR)
5515 /* MAX (X, 0) > -1 -> true */
5516 return omit_one_operand (type, integer_one_node, inner);
5518 else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5519 /* MIN (X, 0) > 0 -> false
5520 MIN (X, 0) > 5 -> false */
5521 return omit_one_operand (type, integer_zero_node, inner);
5524 /* MIN (X, 0) > -1 -> X > -1 */
5525 return fold_build2 (GT_EXPR, type, inner, comp_const);
5532 /* T is an integer expression that is being multiplied, divided, or taken a
5533 modulus (CODE says which and what kind of divide or modulus) by a
5534 constant C. See if we can eliminate that operation by folding it with
5535 other operations already in T. WIDE_TYPE, if non-null, is a type that
5536 should be used for the computation if wider than our type.
5538 For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5539 (X * 2) + (Y * 4). We must, however, be assured that either the original
5540 expression would not overflow or that overflow is undefined for the type
5541 in the language in question.
5543 We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5544 the machine has a multiply-accumulate insn or that this is part of an
5545 addressing calculation.
5547 If we return a non-null expression, it is an equivalent form of the
5548 original computation, but need not be in the original type.
5550 We set *STRICT_OVERFLOW_P to true if the return values depends on
5551 signed overflow being undefined. Otherwise we do not change
5552 *STRICT_OVERFLOW_P. */
5555 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5556 bool *strict_overflow_p)
5558 /* To avoid exponential search depth, refuse to allow recursion past
5559 three levels. Beyond that (1) it's highly unlikely that we'll find
5560 something interesting and (2) we've probably processed it before
5561 when we built the inner expression. */
5570 ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5577 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5578 bool *strict_overflow_p)
5580 tree type = TREE_TYPE (t);
5581 enum tree_code tcode = TREE_CODE (t);
5582 tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5583 > GET_MODE_SIZE (TYPE_MODE (type)))
5584 ? wide_type : type);
5586 int same_p = tcode == code;
5587 tree op0 = NULL_TREE, op1 = NULL_TREE;
5588 bool sub_strict_overflow_p;
5590 /* Don't deal with constants of zero here; they confuse the code below. */
5591 if (integer_zerop (c))
5594 if (TREE_CODE_CLASS (tcode) == tcc_unary)
5595 op0 = TREE_OPERAND (t, 0);
5597 if (TREE_CODE_CLASS (tcode) == tcc_binary)
5598 op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5600 /* Note that we need not handle conditional operations here since fold
5601 already handles those cases. So just do arithmetic here. */
5605 /* For a constant, we can always simplify if we are a multiply
5606 or (for divide and modulus) if it is a multiple of our constant. */
5607 if (code == MULT_EXPR
5608 || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
5609 return const_binop (code, fold_convert (ctype, t),
5610 fold_convert (ctype, c), 0);
5613 case CONVERT_EXPR: case NON_LVALUE_EXPR: case NOP_EXPR:
5614 /* If op0 is an expression ... */
5615 if ((COMPARISON_CLASS_P (op0)
5616 || UNARY_CLASS_P (op0)
5617 || BINARY_CLASS_P (op0)
5618 || EXPRESSION_CLASS_P (op0))
5619 /* ... and is unsigned, and its type is smaller than ctype,
5620 then we cannot pass through as widening. */
5621 && ((TYPE_UNSIGNED (TREE_TYPE (op0))
5622 && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5623 && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5624 && (GET_MODE_SIZE (TYPE_MODE (ctype))
5625 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
5626 /* ... or this is a truncation (t is narrower than op0),
5627 then we cannot pass through this narrowing. */
5628 || (GET_MODE_SIZE (TYPE_MODE (type))
5629 < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5630 /* ... or signedness changes for division or modulus,
5631 then we cannot pass through this conversion. */
5632 || (code != MULT_EXPR
5633 && (TYPE_UNSIGNED (ctype)
5634 != TYPE_UNSIGNED (TREE_TYPE (op0))))))
5637 /* Pass the constant down and see if we can make a simplification. If
5638 we can, replace this expression with the inner simplification for
5639 possible later conversion to our or some other type. */
5640 if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5641 && TREE_CODE (t2) == INTEGER_CST
5642 && ! TREE_CONSTANT_OVERFLOW (t2)
5643 && (0 != (t1 = extract_muldiv (op0, t2, code,
5645 ? ctype : NULL_TREE,
5646 strict_overflow_p))))
5651 /* If widening the type changes it from signed to unsigned, then we
5652 must avoid building ABS_EXPR itself as unsigned. */
5653 if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5655 tree cstype = (*lang_hooks.types.signed_type) (ctype);
5656 if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5659 t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5660 return fold_convert (ctype, t1);
5666 if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5668 return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5671 case MIN_EXPR: case MAX_EXPR:
5672 /* If widening the type changes the signedness, then we can't perform
5673 this optimization as that changes the result. */
5674 if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5677 /* MIN (a, b) / 5 -> MIN (a / 5, b / 5) */
5678 sub_strict_overflow_p = false;
5679 if ((t1 = extract_muldiv (op0, c, code, wide_type,
5680 &sub_strict_overflow_p)) != 0
5681 && (t2 = extract_muldiv (op1, c, code, wide_type,
5682 &sub_strict_overflow_p)) != 0)
5684 if (tree_int_cst_sgn (c) < 0)
5685 tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5686 if (sub_strict_overflow_p)
5687 *strict_overflow_p = true;
5688 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5689 fold_convert (ctype, t2));
5693 case LSHIFT_EXPR: case RSHIFT_EXPR:
5694 /* If the second operand is constant, this is a multiplication
5695 or floor division, by a power of two, so we can treat it that
5696 way unless the multiplier or divisor overflows. Signed
5697 left-shift overflow is implementation-defined rather than
5698 undefined in C90, so do not convert signed left shift into
5700 if (TREE_CODE (op1) == INTEGER_CST
5701 && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5702 /* const_binop may not detect overflow correctly,
5703 so check for it explicitly here. */
5704 && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5705 && TREE_INT_CST_HIGH (op1) == 0
5706 && 0 != (t1 = fold_convert (ctype,
5707 const_binop (LSHIFT_EXPR,
5710 && ! TREE_OVERFLOW (t1))
5711 return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5712 ? MULT_EXPR : FLOOR_DIV_EXPR,
5713 ctype, fold_convert (ctype, op0), t1),
5714 c, code, wide_type, strict_overflow_p);
5717 case PLUS_EXPR: case MINUS_EXPR:
5718 /* See if we can eliminate the operation on both sides. If we can, we
5719 can return a new PLUS or MINUS. If we can't, the only remaining
5720 cases where we can do anything are if the second operand is a
5722 sub_strict_overflow_p = false;
5723 t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5724 t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5725 if (t1 != 0 && t2 != 0
5726 && (code == MULT_EXPR
5727 /* If not multiplication, we can only do this if both operands
5728 are divisible by c. */
5729 || (multiple_of_p (ctype, op0, c)
5730 && multiple_of_p (ctype, op1, c))))
5732 if (sub_strict_overflow_p)
5733 *strict_overflow_p = true;
5734 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5735 fold_convert (ctype, t2));
5738 /* If this was a subtraction, negate OP1 and set it to be an addition.
5739 This simplifies the logic below. */
5740 if (tcode == MINUS_EXPR)
5741 tcode = PLUS_EXPR, op1 = negate_expr (op1);
5743 if (TREE_CODE (op1) != INTEGER_CST)
5746 /* If either OP1 or C are negative, this optimization is not safe for
5747 some of the division and remainder types while for others we need
5748 to change the code. */
5749 if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5751 if (code == CEIL_DIV_EXPR)
5752 code = FLOOR_DIV_EXPR;
5753 else if (code == FLOOR_DIV_EXPR)
5754 code = CEIL_DIV_EXPR;
5755 else if (code != MULT_EXPR
5756 && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5760 /* If it's a multiply or a division/modulus operation of a multiple
5761 of our constant, do the operation and verify it doesn't overflow. */
5762 if (code == MULT_EXPR
5763 || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5765 op1 = const_binop (code, fold_convert (ctype, op1),
5766 fold_convert (ctype, c), 0);
5767 /* We allow the constant to overflow with wrapping semantics. */
5769 || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5775 /* If we have an unsigned type is not a sizetype, we cannot widen
5776 the operation since it will change the result if the original
5777 computation overflowed. */
5778 if (TYPE_UNSIGNED (ctype)
5779 && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5783 /* If we were able to eliminate our operation from the first side,
5784 apply our operation to the second side and reform the PLUS. */
5785 if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5786 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5788 /* The last case is if we are a multiply. In that case, we can
5789 apply the distributive law to commute the multiply and addition
5790 if the multiplication of the constants doesn't overflow. */
5791 if (code == MULT_EXPR)
5792 return fold_build2 (tcode, ctype,
5793 fold_build2 (code, ctype,
5794 fold_convert (ctype, op0),
5795 fold_convert (ctype, c)),
5801 /* We have a special case here if we are doing something like
5802 (C * 8) % 4 since we know that's zero. */
5803 if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5804 || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5805 && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5806 && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5807 return omit_one_operand (type, integer_zero_node, op0);
5809 /* ... fall through ... */
5811 case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR:
5812 case ROUND_DIV_EXPR: case EXACT_DIV_EXPR:
5813 /* If we can extract our operation from the LHS, do so and return a
5814 new operation. Likewise for the RHS from a MULT_EXPR. Otherwise,
5815 do something only if the second operand is a constant. */
5817 && (t1 = extract_muldiv (op0, c, code, wide_type,
5818 strict_overflow_p)) != 0)
5819 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5820 fold_convert (ctype, op1));
5821 else if (tcode == MULT_EXPR && code == MULT_EXPR
5822 && (t1 = extract_muldiv (op1, c, code, wide_type,
5823 strict_overflow_p)) != 0)
5824 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5825 fold_convert (ctype, t1));
5826 else if (TREE_CODE (op1) != INTEGER_CST)
5829 /* If these are the same operation types, we can associate them
5830 assuming no overflow. */
5832 && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5833 fold_convert (ctype, c), 0))
5834 && ! TREE_OVERFLOW (t1))
5835 return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);
5837 /* If these operations "cancel" each other, we have the main
5838 optimizations of this pass, which occur when either constant is a
5839 multiple of the other, in which case we replace this with either an
5840 operation or CODE or TCODE.
5842 If we have an unsigned type that is not a sizetype, we cannot do
5843 this since it will change the result if the original computation
5845 if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5846 || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5847 && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5848 || (tcode == MULT_EXPR
5849 && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5850 && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
5852 if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5854 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5855 *strict_overflow_p = true;
5856 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5857 fold_convert (ctype,
5858 const_binop (TRUNC_DIV_EXPR,
5861 else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
5863 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5864 *strict_overflow_p = true;
5865 return fold_build2 (code, ctype, fold_convert (ctype, op0),
5866 fold_convert (ctype,
5867 const_binop (TRUNC_DIV_EXPR,
5880 /* Return a node which has the indicated constant VALUE (either 0 or
5881 1), and is of the indicated TYPE. */
5884 constant_boolean_node (int value, tree type)
5886 if (type == integer_type_node)
5887 return value ? integer_one_node : integer_zero_node;
5888 else if (type == boolean_type_node)
5889 return value ? boolean_true_node : boolean_false_node;
5891 return build_int_cst (type, value);
5895 /* Return true if expr looks like an ARRAY_REF and set base and
5896 offset to the appropriate trees. If there is no offset,
5897 offset is set to NULL_TREE. Base will be canonicalized to
5898 something you can get the element type from using
5899 TREE_TYPE (TREE_TYPE (base)). Offset will be the offset
5900 in bytes to the base. */
5903 extract_array_ref (tree expr, tree *base, tree *offset)
5905 /* One canonical form is a PLUS_EXPR with the first
5906 argument being an ADDR_EXPR with a possible NOP_EXPR
5908 if (TREE_CODE (expr) == PLUS_EXPR)
5910 tree op0 = TREE_OPERAND (expr, 0);
5911 tree inner_base, dummy1;
5912 /* Strip NOP_EXPRs here because the C frontends and/or
5913 folders present us (int *)&x.a + 4B possibly. */
5915 if (extract_array_ref (op0, &inner_base, &dummy1))
5918 if (dummy1 == NULL_TREE)
5919 *offset = TREE_OPERAND (expr, 1);
5921 *offset = fold_build2 (PLUS_EXPR, TREE_TYPE (expr),
5922 dummy1, TREE_OPERAND (expr, 1));
5926 /* Other canonical form is an ADDR_EXPR of an ARRAY_REF,
5927 which we transform into an ADDR_EXPR with appropriate
5928 offset. For other arguments to the ADDR_EXPR we assume
5929 zero offset and as such do not care about the ADDR_EXPR
5930 type and strip possible nops from it. */
5931 else if (TREE_CODE (expr) == ADDR_EXPR)
5933 tree op0 = TREE_OPERAND (expr, 0);
5934 if (TREE_CODE (op0) == ARRAY_REF)
5936 tree idx = TREE_OPERAND (op0, 1);
5937 *base = TREE_OPERAND (op0, 0);
5938 *offset = fold_build2 (MULT_EXPR, TREE_TYPE (idx), idx,
5939 array_ref_element_size (op0));
5943 /* Handle array-to-pointer decay as &a. */
5944 if (TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
5945 *base = TREE_OPERAND (expr, 0);
5948 *offset = NULL_TREE;
5952 /* The next canonical form is a VAR_DECL with POINTER_TYPE. */
5953 else if (SSA_VAR_P (expr)
5954 && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
5957 *offset = NULL_TREE;
5965 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
5966 Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here
5967 CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
5968 expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the
5969 COND is the first argument to CODE; otherwise (as in the example
5970 given here), it is the second argument. TYPE is the type of the
5971 original expression. Return NULL_TREE if no simplification is
5975 fold_binary_op_with_conditional_arg (enum tree_code code,
5976 tree type, tree op0, tree op1,
5977 tree cond, tree arg, int cond_first_p)
5979 tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
5980 tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
5981 tree test, true_value, false_value;
5982 tree lhs = NULL_TREE;
5983 tree rhs = NULL_TREE;
5985 /* This transformation is only worthwhile if we don't have to wrap
5986 arg in a SAVE_EXPR, and the operation can be simplified on at least
5987 one of the branches once its pushed inside the COND_EXPR. */
5988 if (!TREE_CONSTANT (arg))
5991 if (TREE_CODE (cond) == COND_EXPR)
5993 test = TREE_OPERAND (cond, 0);
5994 true_value = TREE_OPERAND (cond, 1);
5995 false_value = TREE_OPERAND (cond, 2);
5996 /* If this operand throws an expression, then it does not make
5997 sense to try to perform a logical or arithmetic operation
5999 if (VOID_TYPE_P (TREE_TYPE (true_value)))
6001 if (VOID_TYPE_P (TREE_TYPE (false_value)))
6006 tree testtype = TREE_TYPE (cond);
6008 true_value = constant_boolean_node (true, testtype);
6009 false_value = constant_boolean_node (false, testtype);
6012 arg = fold_convert (arg_type, arg);
6015 true_value = fold_convert (cond_type, true_value);
6017 lhs = fold_build2 (code, type, true_value, arg);
6019 lhs = fold_build2 (code, type, arg, true_value);
6023 false_value = fold_convert (cond_type, false_value);
6025 rhs = fold_build2 (code, type, false_value, arg);
6027 rhs = fold_build2 (code, type, arg, false_value);
6030 test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
6031 return fold_convert (type, test);
6035 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6037 If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6038 TYPE, X + ADDEND is the same as X. If NEGATE, return true if X -
6039 ADDEND is the same as X.
6041 X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6042 and finite. The problematic cases are when X is zero, and its mode
6043 has signed zeros. In the case of rounding towards -infinity,
6044 X - 0 is not the same as X because 0 - 0 is -0. In other rounding
6045 modes, X + 0 is not the same as X because -0 + 0 is 0. */
6048 fold_real_zero_addition_p (tree type, tree addend, int negate)
6050 if (!real_zerop (addend))
6053 /* Don't allow the fold with -fsignaling-nans. */
6054 if (HONOR_SNANS (TYPE_MODE (type)))
6057 /* Allow the fold if zeros aren't signed, or their sign isn't important. */
6058 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6061 /* Treat x + -0 as x - 0 and x - -0 as x + 0. */
6062 if (TREE_CODE (addend) == REAL_CST
6063 && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6066 /* The mode has signed zeros, and we have to honor their sign.
6067 In this situation, there is only one case we can return true for.
6068 X - 0 is the same as X unless rounding towards -infinity is
6070 return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6073 /* Subroutine of fold() that checks comparisons of built-in math
6074 functions against real constants.
6076 FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6077 operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR. TYPE
6078 is the type of the result and ARG0 and ARG1 are the operands of the
6079 comparison. ARG1 must be a TREE_REAL_CST.
6081 The function returns the constant folded tree if a simplification
6082 can be made, and NULL_TREE otherwise. */
6085 fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
6086 tree type, tree arg0, tree arg1)
6090 if (BUILTIN_SQRT_P (fcode))
6092 tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
6093 enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6095 c = TREE_REAL_CST (arg1);
6096 if (REAL_VALUE_NEGATIVE (c))
6098 /* sqrt(x) < y is always false, if y is negative. */
6099 if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6100 return omit_one_operand (type, integer_zero_node, arg);
6102 /* sqrt(x) > y is always true, if y is negative and we
6103 don't care about NaNs, i.e. negative values of x. */
6104 if (code == NE_EXPR || !HONOR_NANS (mode))
6105 return omit_one_operand (type, integer_one_node, arg);
6107 /* sqrt(x) > y is the same as x >= 0, if y is negative. */
6108 return fold_build2 (GE_EXPR, type, arg,
6109 build_real (TREE_TYPE (arg), dconst0));
6111 else if (code == GT_EXPR || code == GE_EXPR)
6115 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6116 real_convert (&c2, mode, &c2);
6118 if (REAL_VALUE_ISINF (c2))
6120 /* sqrt(x) > y is x == +Inf, when y is very large. */
6121 if (HONOR_INFINITIES (mode))
6122 return fold_build2 (EQ_EXPR, type, arg,
6123 build_real (TREE_TYPE (arg), c2));
6125 /* sqrt(x) > y is always false, when y is very large
6126 and we don't care about infinities. */
6127 return omit_one_operand (type, integer_zero_node, arg);
6130 /* sqrt(x) > c is the same as x > c*c. */
6131 return fold_build2 (code, type, arg,
6132 build_real (TREE_TYPE (arg), c2));
6134 else if (code == LT_EXPR || code == LE_EXPR)
6138 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6139 real_convert (&c2, mode, &c2);
6141 if (REAL_VALUE_ISINF (c2))
6143 /* sqrt(x) < y is always true, when y is a very large
6144 value and we don't care about NaNs or Infinities. */
6145 if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6146 return omit_one_operand (type, integer_one_node, arg);
6148 /* sqrt(x) < y is x != +Inf when y is very large and we
6149 don't care about NaNs. */
6150 if (! HONOR_NANS (mode))
6151 return fold_build2 (NE_EXPR, type, arg,
6152 build_real (TREE_TYPE (arg), c2));
6154 /* sqrt(x) < y is x >= 0 when y is very large and we
6155 don't care about Infinities. */
6156 if (! HONOR_INFINITIES (mode))
6157 return fold_build2 (GE_EXPR, type, arg,
6158 build_real (TREE_TYPE (arg), dconst0));
6160 /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */
6161 if (lang_hooks.decls.global_bindings_p () != 0
6162 || CONTAINS_PLACEHOLDER_P (arg))
6165 arg = save_expr (arg);
6166 return fold_build2 (TRUTH_ANDIF_EXPR, type,
6167 fold_build2 (GE_EXPR, type, arg,
6168 build_real (TREE_TYPE (arg),
6170 fold_build2 (NE_EXPR, type, arg,
6171 build_real (TREE_TYPE (arg),
6175 /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */
6176 if (! HONOR_NANS (mode))
6177 return fold_build2 (code, type, arg,
6178 build_real (TREE_TYPE (arg), c2));
6180 /* sqrt(x) < c is the same as x >= 0 && x < c*c. */
6181 if (lang_hooks.decls.global_bindings_p () == 0
6182 && ! CONTAINS_PLACEHOLDER_P (arg))
6184 arg = save_expr (arg);
6185 return fold_build2 (TRUTH_ANDIF_EXPR, type,
6186 fold_build2 (GE_EXPR, type, arg,
6187 build_real (TREE_TYPE (arg),
6189 fold_build2 (code, type, arg,
6190 build_real (TREE_TYPE (arg),
6199 /* Subroutine of fold() that optimizes comparisons against Infinities,
6200 either +Inf or -Inf.
6202 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6203 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6204 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6206 The function returns the constant folded tree if a simplification
6207 can be made, and NULL_TREE otherwise. */
6210 fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6212 enum machine_mode mode;
6213 REAL_VALUE_TYPE max;
6217 mode = TYPE_MODE (TREE_TYPE (arg0));
6219 /* For negative infinity swap the sense of the comparison. */
6220 neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6222 code = swap_tree_comparison (code);
6227 /* x > +Inf is always false, if with ignore sNANs. */
6228 if (HONOR_SNANS (mode))
6230 return omit_one_operand (type, integer_zero_node, arg0);
6233 /* x <= +Inf is always true, if we don't case about NaNs. */
6234 if (! HONOR_NANS (mode))
6235 return omit_one_operand (type, integer_one_node, arg0);
6237 /* x <= +Inf is the same as x == x, i.e. isfinite(x). */
6238 if (lang_hooks.decls.global_bindings_p () == 0
6239 && ! CONTAINS_PLACEHOLDER_P (arg0))
6241 arg0 = save_expr (arg0);
6242 return fold_build2 (EQ_EXPR, type, arg0, arg0);
6248 /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX. */
6249 real_maxval (&max, neg, mode);
6250 return fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6251 arg0, build_real (TREE_TYPE (arg0), max));
6254 /* x < +Inf is always equal to x <= DBL_MAX. */
6255 real_maxval (&max, neg, mode);
6256 return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6257 arg0, build_real (TREE_TYPE (arg0), max));
6260 /* x != +Inf is always equal to !(x > DBL_MAX). */
6261 real_maxval (&max, neg, mode);
6262 if (! HONOR_NANS (mode))
6263 return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
6264 arg0, build_real (TREE_TYPE (arg0), max));
6266 /* The transformation below creates non-gimple code and thus is
6267 not appropriate if we are in gimple form. */
6271 temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
6272 arg0, build_real (TREE_TYPE (arg0), max));
6273 return fold_build1 (TRUTH_NOT_EXPR, type, temp);
6282 /* Subroutine of fold() that optimizes comparisons of a division by
6283 a nonzero integer constant against an integer constant, i.e.
6286 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6287 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6288 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6290 The function returns the constant folded tree if a simplification
6291 can be made, and NULL_TREE otherwise. */
6294 fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6296 tree prod, tmp, hi, lo;
6297 tree arg00 = TREE_OPERAND (arg0, 0);
6298 tree arg01 = TREE_OPERAND (arg0, 1);
6299 unsigned HOST_WIDE_INT lpart;
6300 HOST_WIDE_INT hpart;
6301 bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6305 /* We have to do this the hard way to detect unsigned overflow.
6306 prod = int_const_binop (MULT_EXPR, arg01, arg1, 0); */
6307 overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6308 TREE_INT_CST_HIGH (arg01),
6309 TREE_INT_CST_LOW (arg1),
6310 TREE_INT_CST_HIGH (arg1),
6311 &lpart, &hpart, unsigned_p);
6312 prod = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
6313 prod = force_fit_type (prod, -1, overflow, false);
6314 neg_overflow = false;
6318 tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
6321 /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0). */
6322 overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6323 TREE_INT_CST_HIGH (prod),
6324 TREE_INT_CST_LOW (tmp),
6325 TREE_INT_CST_HIGH (tmp),
6326 &lpart, &hpart, unsigned_p);
6327 hi = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
6328 hi = force_fit_type (hi, -1, overflow | TREE_OVERFLOW (prod),
6329 TREE_CONSTANT_OVERFLOW (prod));
6331 else if (tree_int_cst_sgn (arg01) >= 0)
6333 tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
6334 switch (tree_int_cst_sgn (arg1))
6337 neg_overflow = true;
6338 lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6343 lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6348 hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6358 /* A negative divisor reverses the relational operators. */
6359 code = swap_tree_comparison (code);
6361 tmp = int_const_binop (PLUS_EXPR, arg01, integer_one_node, 0);
6362 switch (tree_int_cst_sgn (arg1))
6365 hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
6370 hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6375 neg_overflow = true;
6376 lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
6388 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6389 return omit_one_operand (type, integer_zero_node, arg00);
6390 if (TREE_OVERFLOW (hi))
6391 return fold_build2 (GE_EXPR, type, arg00, lo);
6392 if (TREE_OVERFLOW (lo))
6393 return fold_build2 (LE_EXPR, type, arg00, hi);
6394 return build_range_check (type, arg00, 1, lo, hi);
6397 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6398 return omit_one_operand (type, integer_one_node, arg00);
6399 if (TREE_OVERFLOW (hi))
6400 return fold_build2 (LT_EXPR, type, arg00, lo);
6401 if (TREE_OVERFLOW (lo))
6402 return fold_build2 (GT_EXPR, type, arg00, hi);
6403 return build_range_check (type, arg00, 0, lo, hi);
6406 if (TREE_OVERFLOW (lo))
6408 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6409 return omit_one_operand (type, tmp, arg00);
6411 return fold_build2 (LT_EXPR, type, arg00, lo);
6414 if (TREE_OVERFLOW (hi))
6416 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6417 return omit_one_operand (type, tmp, arg00);
6419 return fold_build2 (LE_EXPR, type, arg00, hi);
6422 if (TREE_OVERFLOW (hi))
6424 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6425 return omit_one_operand (type, tmp, arg00);
6427 return fold_build2 (GT_EXPR, type, arg00, hi);
6430 if (TREE_OVERFLOW (lo))
6432 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6433 return omit_one_operand (type, tmp, arg00);
6435 return fold_build2 (GE_EXPR, type, arg00, lo);
6445 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6446 equality/inequality test, then return a simplified form of the test
6447 using a sign testing. Otherwise return NULL. TYPE is the desired
6451 fold_single_bit_test_into_sign_test (enum tree_code code, tree arg0, tree arg1,
6454 /* If this is testing a single bit, we can optimize the test. */
6455 if ((code == NE_EXPR || code == EQ_EXPR)
6456 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6457 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6459 /* If we have (A & C) != 0 where C is the sign bit of A, convert
6460 this into A < 0. Similarly for (A & C) == 0 into A >= 0. */
6461 tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6463 if (arg00 != NULL_TREE
6464 /* This is only a win if casting to a signed type is cheap,
6465 i.e. when arg00's type is not a partial mode. */
6466 && TYPE_PRECISION (TREE_TYPE (arg00))
6467 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6469 tree stype = lang_hooks.types.signed_type (TREE_TYPE (arg00));
6470 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6471 result_type, fold_convert (stype, arg00),
6472 build_int_cst (stype, 0));
6479 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6480 equality/inequality test, then return a simplified form of
6481 the test using shifts and logical operations. Otherwise return
6482 NULL. TYPE is the desired result type. */
6485 fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
6488 /* If this is testing a single bit, we can optimize the test. */
6489 if ((code == NE_EXPR || code == EQ_EXPR)
6490 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6491 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6493 tree inner = TREE_OPERAND (arg0, 0);
6494 tree type = TREE_TYPE (arg0);
6495 int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6496 enum machine_mode operand_mode = TYPE_MODE (type);
6498 tree signed_type, unsigned_type, intermediate_type;
6501 /* First, see if we can fold the single bit test into a sign-bit
6503 tem = fold_single_bit_test_into_sign_test (code, arg0, arg1,
6508 /* Otherwise we have (A & C) != 0 where C is a single bit,
6509 convert that into ((A >> C2) & 1). Where C2 = log2(C).
6510 Similarly for (A & C) == 0. */
6512 /* If INNER is a right shift of a constant and it plus BITNUM does
6513 not overflow, adjust BITNUM and INNER. */
6514 if (TREE_CODE (inner) == RSHIFT_EXPR
6515 && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6516 && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6517 && bitnum < TYPE_PRECISION (type)
6518 && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6519 bitnum - TYPE_PRECISION (type)))
6521 bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6522 inner = TREE_OPERAND (inner, 0);
6525 /* If we are going to be able to omit the AND below, we must do our
6526 operations as unsigned. If we must use the AND, we have a choice.
6527 Normally unsigned is faster, but for some machines signed is. */
6528 #ifdef LOAD_EXTEND_OP
6529 ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
6530 && !flag_syntax_only) ? 0 : 1;
6535 signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6536 unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6537 intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6538 inner = fold_convert (intermediate_type, inner);
6541 inner = build2 (RSHIFT_EXPR, intermediate_type,
6542 inner, size_int (bitnum));
6544 if (code == EQ_EXPR)
6545 inner = fold_build2 (BIT_XOR_EXPR, intermediate_type,
6546 inner, integer_one_node);
6548 /* Put the AND last so it can combine with more things. */
6549 inner = build2 (BIT_AND_EXPR, intermediate_type,
6550 inner, integer_one_node);
6552 /* Make sure to return the proper type. */
6553 inner = fold_convert (result_type, inner);
6560 /* Check whether we are allowed to reorder operands arg0 and arg1,
6561 such that the evaluation of arg1 occurs before arg0. */
6564 reorder_operands_p (tree arg0, tree arg1)
6566 if (! flag_evaluation_order)
6568 if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6570 return ! TREE_SIDE_EFFECTS (arg0)
6571 && ! TREE_SIDE_EFFECTS (arg1);
6574 /* Test whether it is preferable two swap two operands, ARG0 and
6575 ARG1, for example because ARG0 is an integer constant and ARG1
6576 isn't. If REORDER is true, only recommend swapping if we can
6577 evaluate the operands in reverse order. */
6580 tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
6582 STRIP_SIGN_NOPS (arg0);
6583 STRIP_SIGN_NOPS (arg1);
6585 if (TREE_CODE (arg1) == INTEGER_CST)
6587 if (TREE_CODE (arg0) == INTEGER_CST)
6590 if (TREE_CODE (arg1) == REAL_CST)
6592 if (TREE_CODE (arg0) == REAL_CST)
6595 if (TREE_CODE (arg1) == COMPLEX_CST)
6597 if (TREE_CODE (arg0) == COMPLEX_CST)
6600 if (TREE_CONSTANT (arg1))
6602 if (TREE_CONSTANT (arg0))
6608 if (reorder && flag_evaluation_order
6609 && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6617 /* It is preferable to swap two SSA_NAME to ensure a canonical form
6618 for commutative and comparison operators. Ensuring a canonical
6619 form allows the optimizers to find additional redundancies without
6620 having to explicitly check for both orderings. */
6621 if (TREE_CODE (arg0) == SSA_NAME
6622 && TREE_CODE (arg1) == SSA_NAME
6623 && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6629 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6630 ARG0 is extended to a wider type. */
6633 fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
6635 tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6637 tree shorter_type, outer_type;
6641 if (arg0_unw == arg0)
6643 shorter_type = TREE_TYPE (arg0_unw);
6645 #ifdef HAVE_canonicalize_funcptr_for_compare
6646 /* Disable this optimization if we're casting a function pointer
6647 type on targets that require function pointer canonicalization. */
6648 if (HAVE_canonicalize_funcptr_for_compare
6649 && TREE_CODE (shorter_type) == POINTER_TYPE
6650 && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6654 if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6657 arg1_unw = get_unwidened (arg1, shorter_type);
6659 /* If possible, express the comparison in the shorter mode. */
6660 if ((code == EQ_EXPR || code == NE_EXPR
6661 || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6662 && (TREE_TYPE (arg1_unw) == shorter_type
6663 || (TREE_CODE (arg1_unw) == INTEGER_CST
6664 && (TREE_CODE (shorter_type) == INTEGER_TYPE
6665 || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6666 && int_fits_type_p (arg1_unw, shorter_type))))
6667 return fold_build2 (code, type, arg0_unw,
6668 fold_convert (shorter_type, arg1_unw));
6670 if (TREE_CODE (arg1_unw) != INTEGER_CST
6671 || TREE_CODE (shorter_type) != INTEGER_TYPE
6672 || !int_fits_type_p (arg1_unw, shorter_type))
6675 /* If we are comparing with the integer that does not fit into the range
6676 of the shorter type, the result is known. */
6677 outer_type = TREE_TYPE (arg1_unw);
6678 min = lower_bound_in_type (outer_type, shorter_type);
6679 max = upper_bound_in_type (outer_type, shorter_type);
6681 above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6683 below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6690 return omit_one_operand (type, integer_zero_node, arg0);
6695 return omit_one_operand (type, integer_one_node, arg0);
6701 return omit_one_operand (type, integer_one_node, arg0);
6703 return omit_one_operand (type, integer_zero_node, arg0);
6708 return omit_one_operand (type, integer_zero_node, arg0);
6710 return omit_one_operand (type, integer_one_node, arg0);
6719 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6720 ARG0 just the signedness is changed. */
6723 fold_sign_changed_comparison (enum tree_code code, tree type,
6724 tree arg0, tree arg1)
6726 tree arg0_inner, tmp;
6727 tree inner_type, outer_type;
6729 if (TREE_CODE (arg0) != NOP_EXPR
6730 && TREE_CODE (arg0) != CONVERT_EXPR)
6733 outer_type = TREE_TYPE (arg0);
6734 arg0_inner = TREE_OPERAND (arg0, 0);
6735 inner_type = TREE_TYPE (arg0_inner);
6737 #ifdef HAVE_canonicalize_funcptr_for_compare
6738 /* Disable this optimization if we're casting a function pointer
6739 type on targets that require function pointer canonicalization. */
6740 if (HAVE_canonicalize_funcptr_for_compare
6741 && TREE_CODE (inner_type) == POINTER_TYPE
6742 && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6746 if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6749 if (TREE_CODE (arg1) != INTEGER_CST
6750 && !((TREE_CODE (arg1) == NOP_EXPR
6751 || TREE_CODE (arg1) == CONVERT_EXPR)
6752 && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6755 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6760 if (TREE_CODE (arg1) == INTEGER_CST)
6762 tmp = build_int_cst_wide (inner_type,
6763 TREE_INT_CST_LOW (arg1),
6764 TREE_INT_CST_HIGH (arg1));
6765 arg1 = force_fit_type (tmp, 0,
6766 TREE_OVERFLOW (arg1),
6767 TREE_CONSTANT_OVERFLOW (arg1));
6770 arg1 = fold_convert (inner_type, arg1);
6772 return fold_build2 (code, type, arg0_inner, arg1);
6775 /* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6776 step of the array. Reconstructs s and delta in the case of s * delta
6777 being an integer constant (and thus already folded).
6778 ADDR is the address. MULT is the multiplicative expression.
6779 If the function succeeds, the new address expression is returned. Otherwise
6780 NULL_TREE is returned. */
6783 try_move_mult_to_index (enum tree_code code, tree addr, tree op1)
6785 tree s, delta, step;
6786 tree ref = TREE_OPERAND (addr, 0), pref;
6790 /* Canonicalize op1 into a possibly non-constant delta
6791 and an INTEGER_CST s. */
6792 if (TREE_CODE (op1) == MULT_EXPR)
6794 tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6799 if (TREE_CODE (arg0) == INTEGER_CST)
6804 else if (TREE_CODE (arg1) == INTEGER_CST)
6812 else if (TREE_CODE (op1) == INTEGER_CST)
6819 /* Simulate we are delta * 1. */
6821 s = integer_one_node;
6824 for (;; ref = TREE_OPERAND (ref, 0))
6826 if (TREE_CODE (ref) == ARRAY_REF)
6828 itype = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6832 step = array_ref_element_size (ref);
6833 if (TREE_CODE (step) != INTEGER_CST)
6838 if (! tree_int_cst_equal (step, s))
6843 /* Try if delta is a multiple of step. */
6844 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, delta, step);
6853 if (!handled_component_p (ref))
6857 /* We found the suitable array reference. So copy everything up to it,
6858 and replace the index. */
6860 pref = TREE_OPERAND (addr, 0);
6861 ret = copy_node (pref);
6866 pref = TREE_OPERAND (pref, 0);
6867 TREE_OPERAND (pos, 0) = copy_node (pref);
6868 pos = TREE_OPERAND (pos, 0);
6871 TREE_OPERAND (pos, 1) = fold_build2 (code, itype,
6872 fold_convert (itype,
6873 TREE_OPERAND (pos, 1)),
6874 fold_convert (itype, delta));
6876 return fold_build1 (ADDR_EXPR, TREE_TYPE (addr), ret);
6880 /* Fold A < X && A + 1 > Y to A < X && A >= Y. Normally A + 1 > Y
6881 means A >= Y && A != MAX, but in this case we know that
6882 A < X <= MAX. INEQ is A + 1 > Y, BOUND is A < X. */
6885 fold_to_nonsharp_ineq_using_bound (tree ineq, tree bound)
6887 tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
6889 if (TREE_CODE (bound) == LT_EXPR)
6890 a = TREE_OPERAND (bound, 0);
6891 else if (TREE_CODE (bound) == GT_EXPR)
6892 a = TREE_OPERAND (bound, 1);
6896 typea = TREE_TYPE (a);
6897 if (!INTEGRAL_TYPE_P (typea)
6898 && !POINTER_TYPE_P (typea))
6901 if (TREE_CODE (ineq) == LT_EXPR)
6903 a1 = TREE_OPERAND (ineq, 1);
6904 y = TREE_OPERAND (ineq, 0);
6906 else if (TREE_CODE (ineq) == GT_EXPR)
6908 a1 = TREE_OPERAND (ineq, 0);
6909 y = TREE_OPERAND (ineq, 1);
6914 if (TREE_TYPE (a1) != typea)
6917 diff = fold_build2 (MINUS_EXPR, typea, a1, a);
6918 if (!integer_onep (diff))
6921 return fold_build2 (GE_EXPR, type, a, y);
6924 /* Fold a sum or difference of at least one multiplication.
6925 Returns the folded tree or NULL if no simplification could be made. */
6928 fold_plusminus_mult_expr (enum tree_code code, tree type, tree arg0, tree arg1)
6930 tree arg00, arg01, arg10, arg11;
6931 tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
6933 /* (A * C) +- (B * C) -> (A+-B) * C.
6934 (A * C) +- A -> A * (C+-1).
6935 We are most concerned about the case where C is a constant,
6936 but other combinations show up during loop reduction. Since
6937 it is not difficult, try all four possibilities. */
6939 if (TREE_CODE (arg0) == MULT_EXPR)
6941 arg00 = TREE_OPERAND (arg0, 0);
6942 arg01 = TREE_OPERAND (arg0, 1);
6947 arg01 = build_one_cst (type);
6949 if (TREE_CODE (arg1) == MULT_EXPR)
6951 arg10 = TREE_OPERAND (arg1, 0);
6952 arg11 = TREE_OPERAND (arg1, 1);
6957 arg11 = build_one_cst (type);
6961 if (operand_equal_p (arg01, arg11, 0))
6962 same = arg01, alt0 = arg00, alt1 = arg10;
6963 else if (operand_equal_p (arg00, arg10, 0))
6964 same = arg00, alt0 = arg01, alt1 = arg11;
6965 else if (operand_equal_p (arg00, arg11, 0))
6966 same = arg00, alt0 = arg01, alt1 = arg10;
6967 else if (operand_equal_p (arg01, arg10, 0))
6968 same = arg01, alt0 = arg00, alt1 = arg11;
6970 /* No identical multiplicands; see if we can find a common
6971 power-of-two factor in non-power-of-two multiplies. This
6972 can help in multi-dimensional array access. */
6973 else if (host_integerp (arg01, 0)
6974 && host_integerp (arg11, 0))
6976 HOST_WIDE_INT int01, int11, tmp;
6979 int01 = TREE_INT_CST_LOW (arg01);
6980 int11 = TREE_INT_CST_LOW (arg11);
6982 /* Move min of absolute values to int11. */
6983 if ((int01 >= 0 ? int01 : -int01)
6984 < (int11 >= 0 ? int11 : -int11))
6986 tmp = int01, int01 = int11, int11 = tmp;
6987 alt0 = arg00, arg00 = arg10, arg10 = alt0;
6994 if (exact_log2 (int11) > 0 && int01 % int11 == 0)
6996 alt0 = fold_build2 (MULT_EXPR, TREE_TYPE (arg00), arg00,
6997 build_int_cst (TREE_TYPE (arg00),
7002 maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7007 return fold_build2 (MULT_EXPR, type,
7008 fold_build2 (code, type,
7009 fold_convert (type, alt0),
7010 fold_convert (type, alt1)),
7011 fold_convert (type, same));
7016 /* Subroutine of native_encode_expr. Encode the INTEGER_CST
7017 specified by EXPR into the buffer PTR of length LEN bytes.
7018 Return the number of bytes placed in the buffer, or zero
7022 native_encode_int (tree expr, unsigned char *ptr, int len)
7024 tree type = TREE_TYPE (expr);
7025 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7026 int byte, offset, word, words;
7027 unsigned char value;
7029 if (total_bytes > len)
7031 words = total_bytes / UNITS_PER_WORD;
7033 for (byte = 0; byte < total_bytes; byte++)
7035 int bitpos = byte * BITS_PER_UNIT;
7036 if (bitpos < HOST_BITS_PER_WIDE_INT)
7037 value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7039 value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7040 >> (bitpos - HOST_BITS_PER_WIDE_INT));
7042 if (total_bytes > UNITS_PER_WORD)
7044 word = byte / UNITS_PER_WORD;
7045 if (WORDS_BIG_ENDIAN)
7046 word = (words - 1) - word;
7047 offset = word * UNITS_PER_WORD;
7048 if (BYTES_BIG_ENDIAN)
7049 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7051 offset += byte % UNITS_PER_WORD;
7054 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7055 ptr[offset] = value;
7061 /* Subroutine of native_encode_expr. Encode the REAL_CST
7062 specified by EXPR into the buffer PTR of length LEN bytes.
7063 Return the number of bytes placed in the buffer, or zero
7067 native_encode_real (tree expr, unsigned char *ptr, int len)
7069 tree type = TREE_TYPE (expr);
7070 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7071 int byte, offset, word, words, bitpos;
7072 unsigned char value;
7074 /* There are always 32 bits in each long, no matter the size of
7075 the hosts long. We handle floating point representations with
7079 if (total_bytes > len)
7081 words = 32 / UNITS_PER_WORD;
7083 real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7085 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7086 bitpos += BITS_PER_UNIT)
7088 byte = (bitpos / BITS_PER_UNIT) & 3;
7089 value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7091 if (UNITS_PER_WORD < 4)
7093 word = byte / UNITS_PER_WORD;
7094 if (WORDS_BIG_ENDIAN)
7095 word = (words - 1) - word;
7096 offset = word * UNITS_PER_WORD;
7097 if (BYTES_BIG_ENDIAN)
7098 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7100 offset += byte % UNITS_PER_WORD;
7103 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7104 ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7109 /* Subroutine of native_encode_expr. Encode the COMPLEX_CST
7110 specified by EXPR into the buffer PTR of length LEN bytes.
7111 Return the number of bytes placed in the buffer, or zero
7115 native_encode_complex (tree expr, unsigned char *ptr, int len)
7120 part = TREE_REALPART (expr);
7121 rsize = native_encode_expr (part, ptr, len);
7124 part = TREE_IMAGPART (expr);
7125 isize = native_encode_expr (part, ptr+rsize, len-rsize);
7128 return rsize + isize;
7132 /* Subroutine of native_encode_expr. Encode the VECTOR_CST
7133 specified by EXPR into the buffer PTR of length LEN bytes.
7134 Return the number of bytes placed in the buffer, or zero
7138 native_encode_vector (tree expr, unsigned char *ptr, int len)
7140 int i, size, offset, count;
7141 tree itype, elem, elements;
7144 elements = TREE_VECTOR_CST_ELTS (expr);
7145 count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7146 itype = TREE_TYPE (TREE_TYPE (expr));
7147 size = GET_MODE_SIZE (TYPE_MODE (itype));
7148 for (i = 0; i < count; i++)
7152 elem = TREE_VALUE (elements);
7153 elements = TREE_CHAIN (elements);
7160 if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7165 if (offset + size > len)
7167 memset (ptr+offset, 0, size);
7175 /* Subroutine of fold_view_convert_expr. Encode the INTEGER_CST,
7176 REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7177 buffer PTR of length LEN bytes. Return the number of bytes
7178 placed in the buffer, or zero upon failure. */
7181 native_encode_expr (tree expr, unsigned char *ptr, int len)
7183 switch (TREE_CODE (expr))
7186 return native_encode_int (expr, ptr, len);
7189 return native_encode_real (expr, ptr, len);
7192 return native_encode_complex (expr, ptr, len);
7195 return native_encode_vector (expr, ptr, len);
7203 /* Subroutine of native_interpret_expr. Interpret the contents of
7204 the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7205 If the buffer cannot be interpreted, return NULL_TREE. */
7208 native_interpret_int (tree type, unsigned char *ptr, int len)
7210 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7211 int byte, offset, word, words;
7212 unsigned char value;
7213 unsigned int HOST_WIDE_INT lo = 0;
7214 HOST_WIDE_INT hi = 0;
7216 if (total_bytes > len)
7218 if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7220 words = total_bytes / UNITS_PER_WORD;
7222 for (byte = 0; byte < total_bytes; byte++)
7224 int bitpos = byte * BITS_PER_UNIT;
7225 if (total_bytes > UNITS_PER_WORD)
7227 word = byte / UNITS_PER_WORD;
7228 if (WORDS_BIG_ENDIAN)
7229 word = (words - 1) - word;
7230 offset = word * UNITS_PER_WORD;
7231 if (BYTES_BIG_ENDIAN)
7232 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7234 offset += byte % UNITS_PER_WORD;
7237 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7238 value = ptr[offset];
7240 if (bitpos < HOST_BITS_PER_WIDE_INT)
7241 lo |= (unsigned HOST_WIDE_INT) value << bitpos;
7243 hi |= (unsigned HOST_WIDE_INT) value
7244 << (bitpos - HOST_BITS_PER_WIDE_INT);
7247 return force_fit_type (build_int_cst_wide (type, lo, hi),
7252 /* Subroutine of native_interpret_expr. Interpret the contents of
7253 the buffer PTR of length LEN as a REAL_CST of type TYPE.
7254 If the buffer cannot be interpreted, return NULL_TREE. */
7257 native_interpret_real (tree type, unsigned char *ptr, int len)
7259 enum machine_mode mode = TYPE_MODE (type);
7260 int total_bytes = GET_MODE_SIZE (mode);
7261 int byte, offset, word, words, bitpos;
7262 unsigned char value;
7263 /* There are always 32 bits in each long, no matter the size of
7264 the hosts long. We handle floating point representations with
7269 total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7270 if (total_bytes > len || total_bytes > 24)
7272 words = 32 / UNITS_PER_WORD;
7274 memset (tmp, 0, sizeof (tmp));
7275 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7276 bitpos += BITS_PER_UNIT)
7278 byte = (bitpos / BITS_PER_UNIT) & 3;
7279 if (UNITS_PER_WORD < 4)
7281 word = byte / UNITS_PER_WORD;
7282 if (WORDS_BIG_ENDIAN)
7283 word = (words - 1) - word;
7284 offset = word * UNITS_PER_WORD;
7285 if (BYTES_BIG_ENDIAN)
7286 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7288 offset += byte % UNITS_PER_WORD;
7291 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7292 value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7294 tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7297 real_from_target (&r, tmp, mode);
7298 return build_real (type, r);
7302 /* Subroutine of native_interpret_expr. Interpret the contents of
7303 the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7304 If the buffer cannot be interpreted, return NULL_TREE. */
7307 native_interpret_complex (tree type, unsigned char *ptr, int len)
7309 tree etype, rpart, ipart;
7312 etype = TREE_TYPE (type);
7313 size = GET_MODE_SIZE (TYPE_MODE (etype));
7316 rpart = native_interpret_expr (etype, ptr, size);
7319 ipart = native_interpret_expr (etype, ptr+size, size);
7322 return build_complex (type, rpart, ipart);
7326 /* Subroutine of native_interpret_expr. Interpret the contents of
7327 the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7328 If the buffer cannot be interpreted, return NULL_TREE. */
7331 native_interpret_vector (tree type, unsigned char *ptr, int len)
7333 tree etype, elem, elements;
7336 etype = TREE_TYPE (type);
7337 size = GET_MODE_SIZE (TYPE_MODE (etype));
7338 count = TYPE_VECTOR_SUBPARTS (type);
7339 if (size * count > len)
7342 elements = NULL_TREE;
7343 for (i = count - 1; i >= 0; i--)
7345 elem = native_interpret_expr (etype, ptr+(i*size), size);
7348 elements = tree_cons (NULL_TREE, elem, elements);
7350 return build_vector (type, elements);
7354 /* Subroutine of fold_view_convert_expr. Interpret the contents of
7355 the buffer PTR of length LEN as a constant of type TYPE. For
7356 INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7357 we return a REAL_CST, etc... If the buffer cannot be interpreted,
7358 return NULL_TREE. */
7361 native_interpret_expr (tree type, unsigned char *ptr, int len)
7363 switch (TREE_CODE (type))
7368 return native_interpret_int (type, ptr, len);
7371 return native_interpret_real (type, ptr, len);
7374 return native_interpret_complex (type, ptr, len);
7377 return native_interpret_vector (type, ptr, len);
7385 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7386 TYPE at compile-time. If we're unable to perform the conversion
7387 return NULL_TREE. */
7390 fold_view_convert_expr (tree type, tree expr)
7392 /* We support up to 512-bit values (for V8DFmode). */
7393 unsigned char buffer[64];
7396 /* Check that the host and target are sane. */
7397 if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7400 len = native_encode_expr (expr, buffer, sizeof (buffer));
7404 return native_interpret_expr (type, buffer, len);
7408 /* Fold a unary expression of code CODE and type TYPE with operand
7409 OP0. Return the folded expression if folding is successful.
7410 Otherwise, return NULL_TREE. */
7413 fold_unary (enum tree_code code, tree type, tree op0)
7417 enum tree_code_class kind = TREE_CODE_CLASS (code);
7419 gcc_assert (IS_EXPR_CODE_CLASS (kind)
7420 && TREE_CODE_LENGTH (code) == 1);
7425 if (code == NOP_EXPR || code == CONVERT_EXPR
7426 || code == FLOAT_EXPR || code == ABS_EXPR)
7428 /* Don't use STRIP_NOPS, because signedness of argument type
7430 STRIP_SIGN_NOPS (arg0);
7434 /* Strip any conversions that don't change the mode. This
7435 is safe for every expression, except for a comparison
7436 expression because its signedness is derived from its
7439 Note that this is done as an internal manipulation within
7440 the constant folder, in order to find the simplest
7441 representation of the arguments so that their form can be
7442 studied. In any cases, the appropriate type conversions
7443 should be put back in the tree that will get out of the
7449 if (TREE_CODE_CLASS (code) == tcc_unary)
7451 if (TREE_CODE (arg0) == COMPOUND_EXPR)
7452 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7453 fold_build1 (code, type, TREE_OPERAND (arg0, 1)));
7454 else if (TREE_CODE (arg0) == COND_EXPR)
7456 tree arg01 = TREE_OPERAND (arg0, 1);
7457 tree arg02 = TREE_OPERAND (arg0, 2);
7458 if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7459 arg01 = fold_build1 (code, type, arg01);
7460 if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7461 arg02 = fold_build1 (code, type, arg02);
7462 tem = fold_build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
7465 /* If this was a conversion, and all we did was to move into
7466 inside the COND_EXPR, bring it back out. But leave it if
7467 it is a conversion from integer to integer and the
7468 result precision is no wider than a word since such a
7469 conversion is cheap and may be optimized away by combine,
7470 while it couldn't if it were outside the COND_EXPR. Then return
7471 so we don't get into an infinite recursion loop taking the
7472 conversion out and then back in. */
7474 if ((code == NOP_EXPR || code == CONVERT_EXPR
7475 || code == NON_LVALUE_EXPR)
7476 && TREE_CODE (tem) == COND_EXPR
7477 && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7478 && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7479 && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7480 && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7481 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7482 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7483 && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7485 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7486 && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7487 || flag_syntax_only))
7488 tem = build1 (code, type,
7490 TREE_TYPE (TREE_OPERAND
7491 (TREE_OPERAND (tem, 1), 0)),
7492 TREE_OPERAND (tem, 0),
7493 TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7494 TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
7497 else if (COMPARISON_CLASS_P (arg0))
7499 if (TREE_CODE (type) == BOOLEAN_TYPE)
7501 arg0 = copy_node (arg0);
7502 TREE_TYPE (arg0) = type;
7505 else if (TREE_CODE (type) != INTEGER_TYPE)
7506 return fold_build3 (COND_EXPR, type, arg0,
7507 fold_build1 (code, type,
7509 fold_build1 (code, type,
7510 integer_zero_node));
7519 case FIX_TRUNC_EXPR:
7521 case FIX_FLOOR_EXPR:
7522 case FIX_ROUND_EXPR:
7523 if (TREE_TYPE (op0) == type)
7526 /* If we have (type) (a CMP b) and type is an integral type, return
7527 new expression involving the new type. */
7528 if (COMPARISON_CLASS_P (op0) && INTEGRAL_TYPE_P (type))
7529 return fold_build2 (TREE_CODE (op0), type, TREE_OPERAND (op0, 0),
7530 TREE_OPERAND (op0, 1));
7532 /* Handle cases of two conversions in a row. */
7533 if (TREE_CODE (op0) == NOP_EXPR
7534 || TREE_CODE (op0) == CONVERT_EXPR)
7536 tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7537 tree inter_type = TREE_TYPE (op0);
7538 int inside_int = INTEGRAL_TYPE_P (inside_type);
7539 int inside_ptr = POINTER_TYPE_P (inside_type);
7540 int inside_float = FLOAT_TYPE_P (inside_type);
7541 int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7542 unsigned int inside_prec = TYPE_PRECISION (inside_type);
7543 int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7544 int inter_int = INTEGRAL_TYPE_P (inter_type);
7545 int inter_ptr = POINTER_TYPE_P (inter_type);
7546 int inter_float = FLOAT_TYPE_P (inter_type);
7547 int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7548 unsigned int inter_prec = TYPE_PRECISION (inter_type);
7549 int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7550 int final_int = INTEGRAL_TYPE_P (type);
7551 int final_ptr = POINTER_TYPE_P (type);
7552 int final_float = FLOAT_TYPE_P (type);
7553 int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7554 unsigned int final_prec = TYPE_PRECISION (type);
7555 int final_unsignedp = TYPE_UNSIGNED (type);
7557 /* In addition to the cases of two conversions in a row
7558 handled below, if we are converting something to its own
7559 type via an object of identical or wider precision, neither
7560 conversion is needed. */
7561 if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7562 && (((inter_int || inter_ptr) && final_int)
7563 || (inter_float && final_float))
7564 && inter_prec >= final_prec)
7565 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7567 /* Likewise, if the intermediate and final types are either both
7568 float or both integer, we don't need the middle conversion if
7569 it is wider than the final type and doesn't change the signedness
7570 (for integers). Avoid this if the final type is a pointer
7571 since then we sometimes need the inner conversion. Likewise if
7572 the outer has a precision not equal to the size of its mode. */
7573 if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
7574 || (inter_float && inside_float)
7575 || (inter_vec && inside_vec))
7576 && inter_prec >= inside_prec
7577 && (inter_float || inter_vec
7578 || inter_unsignedp == inside_unsignedp)
7579 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7580 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7582 && (! final_vec || inter_prec == inside_prec))
7583 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7585 /* If we have a sign-extension of a zero-extended value, we can
7586 replace that by a single zero-extension. */
7587 if (inside_int && inter_int && final_int
7588 && inside_prec < inter_prec && inter_prec < final_prec
7589 && inside_unsignedp && !inter_unsignedp)
7590 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7592 /* Two conversions in a row are not needed unless:
7593 - some conversion is floating-point (overstrict for now), or
7594 - some conversion is a vector (overstrict for now), or
7595 - the intermediate type is narrower than both initial and
7597 - the intermediate type and innermost type differ in signedness,
7598 and the outermost type is wider than the intermediate, or
7599 - the initial type is a pointer type and the precisions of the
7600 intermediate and final types differ, or
7601 - the final type is a pointer type and the precisions of the
7602 initial and intermediate types differ.
7603 - the final type is a pointer type and the initial type not
7604 - the initial type is a pointer to an array and the final type
7606 /* Java pointer type conversions generate checks in some
7607 cases, so we explicitly disallow this optimization. */
7608 if (! inside_float && ! inter_float && ! final_float
7609 && ! inside_vec && ! inter_vec && ! final_vec
7610 && (inter_prec >= inside_prec || inter_prec >= final_prec)
7611 && ! (inside_int && inter_int
7612 && inter_unsignedp != inside_unsignedp
7613 && inter_prec < final_prec)
7614 && ((inter_unsignedp && inter_prec > inside_prec)
7615 == (final_unsignedp && final_prec > inter_prec))
7616 && ! (inside_ptr && inter_prec != final_prec)
7617 && ! (final_ptr && inside_prec != inter_prec)
7618 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7619 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7620 && final_ptr == inside_ptr
7622 && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
7623 && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE)
7624 && ! ((strcmp (lang_hooks.name, "GNU Java") == 0)
7626 return fold_build1 (code, type, TREE_OPERAND (op0, 0));
7629 /* Handle (T *)&A.B.C for A being of type T and B and C
7630 living at offset zero. This occurs frequently in
7631 C++ upcasting and then accessing the base. */
7632 if (TREE_CODE (op0) == ADDR_EXPR
7633 && POINTER_TYPE_P (type)
7634 && handled_component_p (TREE_OPERAND (op0, 0)))
7636 HOST_WIDE_INT bitsize, bitpos;
7638 enum machine_mode mode;
7639 int unsignedp, volatilep;
7640 tree base = TREE_OPERAND (op0, 0);
7641 base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7642 &mode, &unsignedp, &volatilep, false);
7643 /* If the reference was to a (constant) zero offset, we can use
7644 the address of the base if it has the same base type
7645 as the result type. */
7646 if (! offset && bitpos == 0
7647 && TYPE_MAIN_VARIANT (TREE_TYPE (type))
7648 == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7649 return fold_convert (type, build_fold_addr_expr (base));
7652 if (TREE_CODE (op0) == MODIFY_EXPR
7653 && TREE_CONSTANT (TREE_OPERAND (op0, 1))
7654 /* Detect assigning a bitfield. */
7655 && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
7656 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
7658 /* Don't leave an assignment inside a conversion
7659 unless assigning a bitfield. */
7660 tem = fold_build1 (code, type, TREE_OPERAND (op0, 1));
7661 /* First do the assignment, then return converted constant. */
7662 tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7663 TREE_NO_WARNING (tem) = 1;
7664 TREE_USED (tem) = 1;
7668 /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7669 constants (if x has signed type, the sign bit cannot be set
7670 in c). This folds extension into the BIT_AND_EXPR. */
7671 if (INTEGRAL_TYPE_P (type)
7672 && TREE_CODE (type) != BOOLEAN_TYPE
7673 && TREE_CODE (op0) == BIT_AND_EXPR
7674 && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7677 tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
7680 if (TYPE_UNSIGNED (TREE_TYPE (and))
7681 || (TYPE_PRECISION (type)
7682 <= TYPE_PRECISION (TREE_TYPE (and))))
7684 else if (TYPE_PRECISION (TREE_TYPE (and1))
7685 <= HOST_BITS_PER_WIDE_INT
7686 && host_integerp (and1, 1))
7688 unsigned HOST_WIDE_INT cst;
7690 cst = tree_low_cst (and1, 1);
7691 cst &= (HOST_WIDE_INT) -1
7692 << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7693 change = (cst == 0);
7694 #ifdef LOAD_EXTEND_OP
7696 && !flag_syntax_only
7697 && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7700 tree uns = lang_hooks.types.unsigned_type (TREE_TYPE (and0));
7701 and0 = fold_convert (uns, and0);
7702 and1 = fold_convert (uns, and1);
7708 tem = build_int_cst_wide (type, TREE_INT_CST_LOW (and1),
7709 TREE_INT_CST_HIGH (and1));
7710 tem = force_fit_type (tem, 0, TREE_OVERFLOW (and1),
7711 TREE_CONSTANT_OVERFLOW (and1));
7712 return fold_build2 (BIT_AND_EXPR, type,
7713 fold_convert (type, and0), tem);
7717 /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
7718 T2 being pointers to types of the same size. */
7719 if (POINTER_TYPE_P (type)
7720 && BINARY_CLASS_P (arg0)
7721 && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
7722 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
7724 tree arg00 = TREE_OPERAND (arg0, 0);
7726 tree t1 = TREE_TYPE (arg00);
7727 tree tt0 = TREE_TYPE (t0);
7728 tree tt1 = TREE_TYPE (t1);
7729 tree s0 = TYPE_SIZE (tt0);
7730 tree s1 = TYPE_SIZE (tt1);
7732 if (s0 && s1 && operand_equal_p (s0, s1, OEP_ONLY_CONST))
7733 return build2 (TREE_CODE (arg0), t0, fold_convert (t0, arg00),
7734 TREE_OPERAND (arg0, 1));
7737 /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
7738 of the same precision, and X is a integer type not narrower than
7739 types T1 or T2, i.e. the cast (T2)X isn't an extension. */
7740 if (INTEGRAL_TYPE_P (type)
7741 && TREE_CODE (op0) == BIT_NOT_EXPR
7742 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7743 && (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
7744 || TREE_CODE (TREE_OPERAND (op0, 0)) == CONVERT_EXPR)
7745 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
7747 tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
7748 if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7749 && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
7750 return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
7753 tem = fold_convert_const (code, type, op0);
7754 return tem ? tem : NULL_TREE;
7756 case VIEW_CONVERT_EXPR:
7757 if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
7758 return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
7759 return fold_view_convert_expr (type, op0);
7762 tem = fold_negate_expr (arg0);
7764 return fold_convert (type, tem);
7768 if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
7769 return fold_abs_const (arg0, type);
7770 else if (TREE_CODE (arg0) == NEGATE_EXPR)
7771 return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
7772 /* Convert fabs((double)float) into (double)fabsf(float). */
7773 else if (TREE_CODE (arg0) == NOP_EXPR
7774 && TREE_CODE (type) == REAL_TYPE)
7776 tree targ0 = strip_float_extensions (arg0);
7778 return fold_convert (type, fold_build1 (ABS_EXPR,
7782 /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on. */
7783 else if (TREE_CODE (arg0) == ABS_EXPR)
7785 else if (tree_expr_nonnegative_p (arg0))
7788 /* Strip sign ops from argument. */
7789 if (TREE_CODE (type) == REAL_TYPE)
7791 tem = fold_strip_sign_ops (arg0);
7793 return fold_build1 (ABS_EXPR, type, fold_convert (type, tem));
7798 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7799 return fold_convert (type, arg0);
7800 if (TREE_CODE (arg0) == COMPLEX_EXPR)
7802 tree itype = TREE_TYPE (type);
7803 tree rpart = fold_convert (itype, TREE_OPERAND (arg0, 0));
7804 tree ipart = fold_convert (itype, TREE_OPERAND (arg0, 1));
7805 return fold_build2 (COMPLEX_EXPR, type, rpart, negate_expr (ipart));
7807 if (TREE_CODE (arg0) == COMPLEX_CST)
7809 tree itype = TREE_TYPE (type);
7810 tree rpart = fold_convert (itype, TREE_REALPART (arg0));
7811 tree ipart = fold_convert (itype, TREE_IMAGPART (arg0));
7812 return build_complex (type, rpart, negate_expr (ipart));
7814 if (TREE_CODE (arg0) == CONJ_EXPR)
7815 return fold_convert (type, TREE_OPERAND (arg0, 0));
7819 if (TREE_CODE (arg0) == INTEGER_CST)
7820 return fold_not_const (arg0, type);
7821 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
7822 return TREE_OPERAND (arg0, 0);
7823 /* Convert ~ (-A) to A - 1. */
7824 else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
7825 return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
7826 build_int_cst (type, 1));
7827 /* Convert ~ (A - 1) or ~ (A + -1) to -A. */
7828 else if (INTEGRAL_TYPE_P (type)
7829 && ((TREE_CODE (arg0) == MINUS_EXPR
7830 && integer_onep (TREE_OPERAND (arg0, 1)))
7831 || (TREE_CODE (arg0) == PLUS_EXPR
7832 && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
7833 return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
7834 /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. */
7835 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7836 && (tem = fold_unary (BIT_NOT_EXPR, type,
7838 TREE_OPERAND (arg0, 0)))))
7839 return fold_build2 (BIT_XOR_EXPR, type, tem,
7840 fold_convert (type, TREE_OPERAND (arg0, 1)));
7841 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
7842 && (tem = fold_unary (BIT_NOT_EXPR, type,
7844 TREE_OPERAND (arg0, 1)))))
7845 return fold_build2 (BIT_XOR_EXPR, type,
7846 fold_convert (type, TREE_OPERAND (arg0, 0)), tem);
7850 case TRUTH_NOT_EXPR:
7851 /* The argument to invert_truthvalue must have Boolean type. */
7852 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7853 arg0 = fold_convert (boolean_type_node, arg0);
7855 /* Note that the operand of this must be an int
7856 and its values must be 0 or 1.
7857 ("true" is a fixed value perhaps depending on the language,
7858 but we don't handle values other than 1 correctly yet.) */
7859 tem = fold_truth_not_expr (arg0);
7862 return fold_convert (type, tem);
7865 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7866 return fold_convert (type, arg0);
7867 if (TREE_CODE (arg0) == COMPLEX_EXPR)
7868 return omit_one_operand (type, TREE_OPERAND (arg0, 0),
7869 TREE_OPERAND (arg0, 1));
7870 if (TREE_CODE (arg0) == COMPLEX_CST)
7871 return fold_convert (type, TREE_REALPART (arg0));
7872 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7874 tree itype = TREE_TYPE (TREE_TYPE (arg0));
7875 tem = fold_build2 (TREE_CODE (arg0), itype,
7876 fold_build1 (REALPART_EXPR, itype,
7877 TREE_OPERAND (arg0, 0)),
7878 fold_build1 (REALPART_EXPR, itype,
7879 TREE_OPERAND (arg0, 1)));
7880 return fold_convert (type, tem);
7882 if (TREE_CODE (arg0) == CONJ_EXPR)
7884 tree itype = TREE_TYPE (TREE_TYPE (arg0));
7885 tem = fold_build1 (REALPART_EXPR, itype, TREE_OPERAND (arg0, 0));
7886 return fold_convert (type, tem);
7891 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
7892 return fold_convert (type, integer_zero_node);
7893 if (TREE_CODE (arg0) == COMPLEX_EXPR)
7894 return omit_one_operand (type, TREE_OPERAND (arg0, 1),
7895 TREE_OPERAND (arg0, 0));
7896 if (TREE_CODE (arg0) == COMPLEX_CST)
7897 return fold_convert (type, TREE_IMAGPART (arg0));
7898 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7900 tree itype = TREE_TYPE (TREE_TYPE (arg0));
7901 tem = fold_build2 (TREE_CODE (arg0), itype,
7902 fold_build1 (IMAGPART_EXPR, itype,
7903 TREE_OPERAND (arg0, 0)),
7904 fold_build1 (IMAGPART_EXPR, itype,
7905 TREE_OPERAND (arg0, 1)));
7906 return fold_convert (type, tem);
7908 if (TREE_CODE (arg0) == CONJ_EXPR)
7910 tree itype = TREE_TYPE (TREE_TYPE (arg0));
7911 tem = fold_build1 (IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
7912 return fold_convert (type, negate_expr (tem));
7918 } /* switch (code) */
7921 /* Fold a binary expression of code CODE and type TYPE with operands
7922 OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
7923 Return the folded expression if folding is successful. Otherwise,
7924 return NULL_TREE. */
7927 fold_minmax (enum tree_code code, tree type, tree op0, tree op1)
7929 enum tree_code compl_code;
7931 if (code == MIN_EXPR)
7932 compl_code = MAX_EXPR;
7933 else if (code == MAX_EXPR)
7934 compl_code = MIN_EXPR;
7938 /* MIN (MAX (a, b), b) == b. */
7939 if (TREE_CODE (op0) == compl_code
7940 && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
7941 return omit_one_operand (type, op1, TREE_OPERAND (op0, 0));
7943 /* MIN (MAX (b, a), b) == b. */
7944 if (TREE_CODE (op0) == compl_code
7945 && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
7946 && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
7947 return omit_one_operand (type, op1, TREE_OPERAND (op0, 1));
7949 /* MIN (a, MAX (a, b)) == a. */
7950 if (TREE_CODE (op1) == compl_code
7951 && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
7952 && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
7953 return omit_one_operand (type, op0, TREE_OPERAND (op1, 1));
7955 /* MIN (a, MAX (b, a)) == a. */
7956 if (TREE_CODE (op1) == compl_code
7957 && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
7958 && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
7959 return omit_one_operand (type, op0, TREE_OPERAND (op1, 0));
7964 /* Subroutine of fold_binary. This routine performs all of the
7965 transformations that are common to the equality/inequality
7966 operators (EQ_EXPR and NE_EXPR) and the ordering operators
7967 (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR). Callers other than
7968 fold_binary should call fold_binary. Fold a comparison with
7969 tree code CODE and type TYPE with operands OP0 and OP1. Return
7970 the folded comparison or NULL_TREE. */
7973 fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
7975 tree arg0, arg1, tem;
7980 STRIP_SIGN_NOPS (arg0);
7981 STRIP_SIGN_NOPS (arg1);
7983 tem = fold_relational_const (code, type, arg0, arg1);
7984 if (tem != NULL_TREE)
7987 /* If one arg is a real or integer constant, put it last. */
7988 if (tree_swap_operands_p (arg0, arg1, true))
7989 return fold_build2 (swap_tree_comparison (code), type, op1, op0);
7991 /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1. */
7992 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
7993 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7994 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
7995 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
7996 && (TREE_CODE (arg1) == INTEGER_CST
7997 && !TREE_OVERFLOW (arg1)))
7999 tree const1 = TREE_OPERAND (arg0, 1);
8001 tree variable = TREE_OPERAND (arg0, 0);
8004 lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8006 lhs = fold_build2 (lhs_add ? PLUS_EXPR : MINUS_EXPR,
8007 TREE_TYPE (arg1), const2, const1);
8008 if (TREE_CODE (lhs) == TREE_CODE (arg1)
8009 && (TREE_CODE (lhs) != INTEGER_CST
8010 || !TREE_OVERFLOW (lhs)))
8012 fold_overflow_warning (("assuming signed overflow does not occur "
8013 "when changing X +- C1 cmp C2 to "
8015 WARN_STRICT_OVERFLOW_COMPARISON);
8016 return fold_build2 (code, type, variable, lhs);
8020 /* If this is a comparison of two exprs that look like an ARRAY_REF of the
8021 same object, then we can fold this to a comparison of the two offsets in
8022 signed size type. This is possible because pointer arithmetic is
8023 restricted to retain within an object and overflow on pointer differences
8024 is undefined as of 6.5.6/8 and /9 with respect to the signed ptrdiff_t.
8026 We check flag_wrapv directly because pointers types are unsigned,
8027 and therefore TYPE_OVERFLOW_WRAPS returns true for them. That is
8028 normally what we want to avoid certain odd overflow cases, but
8030 if (POINTER_TYPE_P (TREE_TYPE (arg0))
8032 && !TYPE_OVERFLOW_TRAPS (TREE_TYPE (arg0)))
8034 tree base0, offset0, base1, offset1;
8036 if (extract_array_ref (arg0, &base0, &offset0)
8037 && extract_array_ref (arg1, &base1, &offset1)
8038 && operand_equal_p (base0, base1, 0))
8040 tree signed_size_type_node;
8041 signed_size_type_node = signed_type_for (size_type_node);
8043 /* By converting to signed size type we cover middle-end pointer
8044 arithmetic which operates on unsigned pointer types of size
8045 type size and ARRAY_REF offsets which are properly sign or
8046 zero extended from their type in case it is narrower than
8048 if (offset0 == NULL_TREE)
8049 offset0 = build_int_cst (signed_size_type_node, 0);
8051 offset0 = fold_convert (signed_size_type_node, offset0);
8052 if (offset1 == NULL_TREE)
8053 offset1 = build_int_cst (signed_size_type_node, 0);
8055 offset1 = fold_convert (signed_size_type_node, offset1);
8057 return fold_build2 (code, type, offset0, offset1);
8061 if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8063 tree targ0 = strip_float_extensions (arg0);
8064 tree targ1 = strip_float_extensions (arg1);
8065 tree newtype = TREE_TYPE (targ0);
8067 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8068 newtype = TREE_TYPE (targ1);
8070 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
8071 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8072 return fold_build2 (code, type, fold_convert (newtype, targ0),
8073 fold_convert (newtype, targ1));
8075 /* (-a) CMP (-b) -> b CMP a */
8076 if (TREE_CODE (arg0) == NEGATE_EXPR
8077 && TREE_CODE (arg1) == NEGATE_EXPR)
8078 return fold_build2 (code, type, TREE_OPERAND (arg1, 0),
8079 TREE_OPERAND (arg0, 0));
8081 if (TREE_CODE (arg1) == REAL_CST)
8083 REAL_VALUE_TYPE cst;
8084 cst = TREE_REAL_CST (arg1);
8086 /* (-a) CMP CST -> a swap(CMP) (-CST) */
8087 if (TREE_CODE (arg0) == NEGATE_EXPR)
8088 return fold_build2 (swap_tree_comparison (code), type,
8089 TREE_OPERAND (arg0, 0),
8090 build_real (TREE_TYPE (arg1),
8091 REAL_VALUE_NEGATE (cst)));
8093 /* IEEE doesn't distinguish +0 and -0 in comparisons. */
8094 /* a CMP (-0) -> a CMP 0 */
8095 if (REAL_VALUE_MINUS_ZERO (cst))
8096 return fold_build2 (code, type, arg0,
8097 build_real (TREE_TYPE (arg1), dconst0));
8099 /* x != NaN is always true, other ops are always false. */
8100 if (REAL_VALUE_ISNAN (cst)
8101 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8103 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
8104 return omit_one_operand (type, tem, arg0);
8107 /* Fold comparisons against infinity. */
8108 if (REAL_VALUE_ISINF (cst))
8110 tem = fold_inf_compare (code, type, arg0, arg1);
8111 if (tem != NULL_TREE)
8116 /* If this is a comparison of a real constant with a PLUS_EXPR
8117 or a MINUS_EXPR of a real constant, we can convert it into a
8118 comparison with a revised real constant as long as no overflow
8119 occurs when unsafe_math_optimizations are enabled. */
8120 if (flag_unsafe_math_optimizations
8121 && TREE_CODE (arg1) == REAL_CST
8122 && (TREE_CODE (arg0) == PLUS_EXPR
8123 || TREE_CODE (arg0) == MINUS_EXPR)
8124 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8125 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8126 ? MINUS_EXPR : PLUS_EXPR,
8127 arg1, TREE_OPERAND (arg0, 1), 0))
8128 && ! TREE_CONSTANT_OVERFLOW (tem))
8129 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
8131 /* Likewise, we can simplify a comparison of a real constant with
8132 a MINUS_EXPR whose first operand is also a real constant, i.e.
8133 (c1 - x) < c2 becomes x > c1-c2. */
8134 if (flag_unsafe_math_optimizations
8135 && TREE_CODE (arg1) == REAL_CST
8136 && TREE_CODE (arg0) == MINUS_EXPR
8137 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8138 && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8140 && ! TREE_CONSTANT_OVERFLOW (tem))
8141 return fold_build2 (swap_tree_comparison (code), type,
8142 TREE_OPERAND (arg0, 1), tem);
8144 /* Fold comparisons against built-in math functions. */
8145 if (TREE_CODE (arg1) == REAL_CST
8146 && flag_unsafe_math_optimizations
8147 && ! flag_errno_math)
8149 enum built_in_function fcode = builtin_mathfn_code (arg0);
8151 if (fcode != END_BUILTINS)
8153 tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8154 if (tem != NULL_TREE)
8160 /* Convert foo++ == CONST into ++foo == CONST + INCR. */
8161 if (TREE_CONSTANT (arg1)
8162 && (TREE_CODE (arg0) == POSTINCREMENT_EXPR
8163 || TREE_CODE (arg0) == POSTDECREMENT_EXPR)
8164 /* This optimization is invalid for ordered comparisons
8165 if CONST+INCR overflows or if foo+incr might overflow.
8166 This optimization is invalid for floating point due to rounding.
8167 For pointer types we assume overflow doesn't happen. */
8168 && (POINTER_TYPE_P (TREE_TYPE (arg0))
8169 || (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8170 && (code == EQ_EXPR || code == NE_EXPR))))
8172 tree varop, newconst;
8174 if (TREE_CODE (arg0) == POSTINCREMENT_EXPR)
8176 newconst = fold_build2 (PLUS_EXPR, TREE_TYPE (arg0),
8177 arg1, TREE_OPERAND (arg0, 1));
8178 varop = build2 (PREINCREMENT_EXPR, TREE_TYPE (arg0),
8179 TREE_OPERAND (arg0, 0),
8180 TREE_OPERAND (arg0, 1));
8184 newconst = fold_build2 (MINUS_EXPR, TREE_TYPE (arg0),
8185 arg1, TREE_OPERAND (arg0, 1));
8186 varop = build2 (PREDECREMENT_EXPR, TREE_TYPE (arg0),
8187 TREE_OPERAND (arg0, 0),
8188 TREE_OPERAND (arg0, 1));
8192 /* If VAROP is a reference to a bitfield, we must mask
8193 the constant by the width of the field. */
8194 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
8195 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))
8196 && host_integerp (DECL_SIZE (TREE_OPERAND
8197 (TREE_OPERAND (varop, 0), 1)), 1))
8199 tree fielddecl = TREE_OPERAND (TREE_OPERAND (varop, 0), 1);
8200 HOST_WIDE_INT size = tree_low_cst (DECL_SIZE (fielddecl), 1);
8201 tree folded_compare, shift;
8203 /* First check whether the comparison would come out
8204 always the same. If we don't do that we would
8205 change the meaning with the masking. */
8206 folded_compare = fold_build2 (code, type,
8207 TREE_OPERAND (varop, 0), arg1);
8208 if (TREE_CODE (folded_compare) == INTEGER_CST)
8209 return omit_one_operand (type, folded_compare, varop);
8211 shift = build_int_cst (NULL_TREE,
8212 TYPE_PRECISION (TREE_TYPE (varop)) - size);
8213 shift = fold_convert (TREE_TYPE (varop), shift);
8214 newconst = fold_build2 (LSHIFT_EXPR, TREE_TYPE (varop),
8216 newconst = fold_build2 (RSHIFT_EXPR, TREE_TYPE (varop),
8220 return fold_build2 (code, type, varop, newconst);
8223 if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
8224 && (TREE_CODE (arg0) == NOP_EXPR
8225 || TREE_CODE (arg0) == CONVERT_EXPR))
8227 /* If we are widening one operand of an integer comparison,
8228 see if the other operand is similarly being widened. Perhaps we
8229 can do the comparison in the narrower type. */
8230 tem = fold_widened_comparison (code, type, arg0, arg1);
8234 /* Or if we are changing signedness. */
8235 tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8240 /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8241 constant, we can simplify it. */
8242 if (TREE_CODE (arg1) == INTEGER_CST
8243 && (TREE_CODE (arg0) == MIN_EXPR
8244 || TREE_CODE (arg0) == MAX_EXPR)
8245 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8247 tem = optimize_minmax_comparison (code, type, op0, op1);
8252 /* Simplify comparison of something with itself. (For IEEE
8253 floating-point, we can only do some of these simplifications.) */
8254 if (operand_equal_p (arg0, arg1, 0))
8259 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8260 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8261 return constant_boolean_node (1, type);
8266 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8267 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8268 return constant_boolean_node (1, type);
8269 return fold_build2 (EQ_EXPR, type, arg0, arg1);
8272 /* For NE, we can only do this simplification if integer
8273 or we don't honor IEEE floating point NaNs. */
8274 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8275 && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8277 /* ... fall through ... */
8280 return constant_boolean_node (0, type);
8286 /* If we are comparing an expression that just has comparisons
8287 of two integer values, arithmetic expressions of those comparisons,
8288 and constants, we can simplify it. There are only three cases
8289 to check: the two values can either be equal, the first can be
8290 greater, or the second can be greater. Fold the expression for
8291 those three values. Since each value must be 0 or 1, we have
8292 eight possibilities, each of which corresponds to the constant 0
8293 or 1 or one of the six possible comparisons.
8295 This handles common cases like (a > b) == 0 but also handles
8296 expressions like ((x > y) - (y > x)) > 0, which supposedly
8297 occur in macroized code. */
8299 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8301 tree cval1 = 0, cval2 = 0;
8304 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
8305 /* Don't handle degenerate cases here; they should already
8306 have been handled anyway. */
8307 && cval1 != 0 && cval2 != 0
8308 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8309 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
8310 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
8311 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8312 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
8313 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8314 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8316 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8317 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8319 /* We can't just pass T to eval_subst in case cval1 or cval2
8320 was the same as ARG1. */
8323 = fold_build2 (code, type,
8324 eval_subst (arg0, cval1, maxval,
8328 = fold_build2 (code, type,
8329 eval_subst (arg0, cval1, maxval,
8333 = fold_build2 (code, type,
8334 eval_subst (arg0, cval1, minval,
8338 /* All three of these results should be 0 or 1. Confirm they are.
8339 Then use those values to select the proper code to use. */
8341 if (TREE_CODE (high_result) == INTEGER_CST
8342 && TREE_CODE (equal_result) == INTEGER_CST
8343 && TREE_CODE (low_result) == INTEGER_CST)
8345 /* Make a 3-bit mask with the high-order bit being the
8346 value for `>', the next for '=', and the low for '<'. */
8347 switch ((integer_onep (high_result) * 4)
8348 + (integer_onep (equal_result) * 2)
8349 + integer_onep (low_result))
8353 return omit_one_operand (type, integer_zero_node, arg0);
8374 return omit_one_operand (type, integer_one_node, arg0);
8378 return save_expr (build2 (code, type, cval1, cval2));
8379 return fold_build2 (code, type, cval1, cval2);
8384 /* Fold a comparison of the address of COMPONENT_REFs with the same
8385 type and component to a comparison of the address of the base
8386 object. In short, &x->a OP &y->a to x OP y and
8387 &x->a OP &y.a to x OP &y */
8388 if (TREE_CODE (arg0) == ADDR_EXPR
8389 && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF
8390 && TREE_CODE (arg1) == ADDR_EXPR
8391 && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF)
8393 tree cref0 = TREE_OPERAND (arg0, 0);
8394 tree cref1 = TREE_OPERAND (arg1, 0);
8395 if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1))
8397 tree op0 = TREE_OPERAND (cref0, 0);
8398 tree op1 = TREE_OPERAND (cref1, 0);
8399 return fold_build2 (code, type,
8400 build_fold_addr_expr (op0),
8401 build_fold_addr_expr (op1));
8405 /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8406 into a single range test. */
8407 if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
8408 || TREE_CODE (arg0) == EXACT_DIV_EXPR)
8409 && TREE_CODE (arg1) == INTEGER_CST
8410 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8411 && !integer_zerop (TREE_OPERAND (arg0, 1))
8412 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8413 && !TREE_OVERFLOW (arg1))
8415 tem = fold_div_compare (code, type, arg0, arg1);
8416 if (tem != NULL_TREE)
8424 /* Subroutine of fold_binary. Optimize complex multiplications of the
8425 form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2). The
8426 argument EXPR represents the expression "z" of type TYPE. */
8429 fold_mult_zconjz (tree type, tree expr)
8431 tree itype = TREE_TYPE (type);
8432 tree rpart, ipart, tem;
8434 if (TREE_CODE (expr) == COMPLEX_EXPR)
8436 rpart = TREE_OPERAND (expr, 0);
8437 ipart = TREE_OPERAND (expr, 1);
8439 else if (TREE_CODE (expr) == COMPLEX_CST)
8441 rpart = TREE_REALPART (expr);
8442 ipart = TREE_IMAGPART (expr);
8446 expr = save_expr (expr);
8447 rpart = fold_build1 (REALPART_EXPR, itype, expr);
8448 ipart = fold_build1 (IMAGPART_EXPR, itype, expr);
8451 rpart = save_expr (rpart);
8452 ipart = save_expr (ipart);
8453 tem = fold_build2 (PLUS_EXPR, itype,
8454 fold_build2 (MULT_EXPR, itype, rpart, rpart),
8455 fold_build2 (MULT_EXPR, itype, ipart, ipart));
8456 return fold_build2 (COMPLEX_EXPR, type, tem,
8457 fold_convert (itype, integer_zero_node));
8461 /* Fold a binary expression of code CODE and type TYPE with operands
8462 OP0 and OP1. Return the folded expression if folding is
8463 successful. Otherwise, return NULL_TREE. */
8466 fold_binary (enum tree_code code, tree type, tree op0, tree op1)
8468 enum tree_code_class kind = TREE_CODE_CLASS (code);
8469 tree arg0, arg1, tem;
8470 tree t1 = NULL_TREE;
8471 bool strict_overflow_p;
8473 gcc_assert (IS_EXPR_CODE_CLASS (kind)
8474 && TREE_CODE_LENGTH (code) == 2
8476 && op1 != NULL_TREE);
8481 /* Strip any conversions that don't change the mode. This is
8482 safe for every expression, except for a comparison expression
8483 because its signedness is derived from its operands. So, in
8484 the latter case, only strip conversions that don't change the
8487 Note that this is done as an internal manipulation within the
8488 constant folder, in order to find the simplest representation
8489 of the arguments so that their form can be studied. In any
8490 cases, the appropriate type conversions should be put back in
8491 the tree that will get out of the constant folder. */
8493 if (kind == tcc_comparison)
8495 STRIP_SIGN_NOPS (arg0);
8496 STRIP_SIGN_NOPS (arg1);
8504 /* Note that TREE_CONSTANT isn't enough: static var addresses are
8505 constant but we can't do arithmetic on them. */
8506 if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
8507 || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
8508 || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
8509 || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
8511 if (kind == tcc_binary)
8512 tem = const_binop (code, arg0, arg1, 0);
8513 else if (kind == tcc_comparison)
8514 tem = fold_relational_const (code, type, arg0, arg1);
8518 if (tem != NULL_TREE)
8520 if (TREE_TYPE (tem) != type)
8521 tem = fold_convert (type, tem);
8526 /* If this is a commutative operation, and ARG0 is a constant, move it
8527 to ARG1 to reduce the number of tests below. */
8528 if (commutative_tree_code (code)
8529 && tree_swap_operands_p (arg0, arg1, true))
8530 return fold_build2 (code, type, op1, op0);
8532 /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
8534 First check for cases where an arithmetic operation is applied to a
8535 compound, conditional, or comparison operation. Push the arithmetic
8536 operation inside the compound or conditional to see if any folding
8537 can then be done. Convert comparison to conditional for this purpose.
8538 The also optimizes non-constant cases that used to be done in
8541 Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
8542 one of the operands is a comparison and the other is a comparison, a
8543 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
8544 code below would make the expression more complex. Change it to a
8545 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
8546 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
8548 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
8549 || code == EQ_EXPR || code == NE_EXPR)
8550 && ((truth_value_p (TREE_CODE (arg0))
8551 && (truth_value_p (TREE_CODE (arg1))
8552 || (TREE_CODE (arg1) == BIT_AND_EXPR
8553 && integer_onep (TREE_OPERAND (arg1, 1)))))
8554 || (truth_value_p (TREE_CODE (arg1))
8555 && (truth_value_p (TREE_CODE (arg0))
8556 || (TREE_CODE (arg0) == BIT_AND_EXPR
8557 && integer_onep (TREE_OPERAND (arg0, 1)))))))
8559 tem = fold_build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
8560 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
8563 fold_convert (boolean_type_node, arg0),
8564 fold_convert (boolean_type_node, arg1));
8566 if (code == EQ_EXPR)
8567 tem = invert_truthvalue (tem);
8569 return fold_convert (type, tem);
8572 if (TREE_CODE_CLASS (code) == tcc_binary
8573 || TREE_CODE_CLASS (code) == tcc_comparison)
8575 if (TREE_CODE (arg0) == COMPOUND_EXPR)
8576 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
8577 fold_build2 (code, type,
8578 TREE_OPERAND (arg0, 1), op1));
8579 if (TREE_CODE (arg1) == COMPOUND_EXPR
8580 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
8581 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
8582 fold_build2 (code, type,
8583 op0, TREE_OPERAND (arg1, 1)));
8585 if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
8587 tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
8589 /*cond_first_p=*/1);
8590 if (tem != NULL_TREE)
8594 if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
8596 tem = fold_binary_op_with_conditional_arg (code, type, op0, op1,
8598 /*cond_first_p=*/0);
8599 if (tem != NULL_TREE)
8607 /* A + (-B) -> A - B */
8608 if (TREE_CODE (arg1) == NEGATE_EXPR)
8609 return fold_build2 (MINUS_EXPR, type,
8610 fold_convert (type, arg0),
8611 fold_convert (type, TREE_OPERAND (arg1, 0)));
8612 /* (-A) + B -> B - A */
8613 if (TREE_CODE (arg0) == NEGATE_EXPR
8614 && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
8615 return fold_build2 (MINUS_EXPR, type,
8616 fold_convert (type, arg1),
8617 fold_convert (type, TREE_OPERAND (arg0, 0)));
8618 /* Convert ~A + 1 to -A. */
8619 if (INTEGRAL_TYPE_P (type)
8620 && TREE_CODE (arg0) == BIT_NOT_EXPR
8621 && integer_onep (arg1))
8622 return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
8624 /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
8626 if ((TREE_CODE (arg0) == MULT_EXPR
8627 || TREE_CODE (arg1) == MULT_EXPR)
8628 && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
8630 tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
8635 if (! FLOAT_TYPE_P (type))
8637 if (integer_zerop (arg1))
8638 return non_lvalue (fold_convert (type, arg0));
8640 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
8641 with a constant, and the two constants have no bits in common,
8642 we should treat this as a BIT_IOR_EXPR since this may produce more
8644 if (TREE_CODE (arg0) == BIT_AND_EXPR
8645 && TREE_CODE (arg1) == BIT_AND_EXPR
8646 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8647 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
8648 && integer_zerop (const_binop (BIT_AND_EXPR,
8649 TREE_OPERAND (arg0, 1),
8650 TREE_OPERAND (arg1, 1), 0)))
8652 code = BIT_IOR_EXPR;
8656 /* Reassociate (plus (plus (mult) (foo)) (mult)) as
8657 (plus (plus (mult) (mult)) (foo)) so that we can
8658 take advantage of the factoring cases below. */
8659 if (((TREE_CODE (arg0) == PLUS_EXPR
8660 || TREE_CODE (arg0) == MINUS_EXPR)
8661 && TREE_CODE (arg1) == MULT_EXPR)
8662 || ((TREE_CODE (arg1) == PLUS_EXPR
8663 || TREE_CODE (arg1) == MINUS_EXPR)
8664 && TREE_CODE (arg0) == MULT_EXPR))
8666 tree parg0, parg1, parg, marg;
8667 enum tree_code pcode;
8669 if (TREE_CODE (arg1) == MULT_EXPR)
8670 parg = arg0, marg = arg1;
8672 parg = arg1, marg = arg0;
8673 pcode = TREE_CODE (parg);
8674 parg0 = TREE_OPERAND (parg, 0);
8675 parg1 = TREE_OPERAND (parg, 1);
8679 if (TREE_CODE (parg0) == MULT_EXPR
8680 && TREE_CODE (parg1) != MULT_EXPR)
8681 return fold_build2 (pcode, type,
8682 fold_build2 (PLUS_EXPR, type,
8683 fold_convert (type, parg0),
8684 fold_convert (type, marg)),
8685 fold_convert (type, parg1));
8686 if (TREE_CODE (parg0) != MULT_EXPR
8687 && TREE_CODE (parg1) == MULT_EXPR)
8688 return fold_build2 (PLUS_EXPR, type,
8689 fold_convert (type, parg0),
8690 fold_build2 (pcode, type,
8691 fold_convert (type, marg),
8696 /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
8697 of the array. Loop optimizer sometimes produce this type of
8699 if (TREE_CODE (arg0) == ADDR_EXPR)
8701 tem = try_move_mult_to_index (PLUS_EXPR, arg0, arg1);
8703 return fold_convert (type, tem);
8705 else if (TREE_CODE (arg1) == ADDR_EXPR)
8707 tem = try_move_mult_to_index (PLUS_EXPR, arg1, arg0);
8709 return fold_convert (type, tem);
8714 /* See if ARG1 is zero and X + ARG1 reduces to X. */
8715 if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
8716 return non_lvalue (fold_convert (type, arg0));
8718 /* Likewise if the operands are reversed. */
8719 if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
8720 return non_lvalue (fold_convert (type, arg1));
8722 /* Convert X + -C into X - C. */
8723 if (TREE_CODE (arg1) == REAL_CST
8724 && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
8726 tem = fold_negate_const (arg1, type);
8727 if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
8728 return fold_build2 (MINUS_EXPR, type,
8729 fold_convert (type, arg0),
8730 fold_convert (type, tem));
8733 if (flag_unsafe_math_optimizations
8734 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
8735 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
8736 && (tem = distribute_real_division (code, type, arg0, arg1)))
8739 /* Convert x+x into x*2.0. */
8740 if (operand_equal_p (arg0, arg1, 0)
8741 && SCALAR_FLOAT_TYPE_P (type))
8742 return fold_build2 (MULT_EXPR, type, arg0,
8743 build_real (type, dconst2));
8745 /* Convert a + (b*c + d*e) into (a + b*c) + d*e. */
8746 if (flag_unsafe_math_optimizations
8747 && TREE_CODE (arg1) == PLUS_EXPR
8748 && TREE_CODE (arg0) != MULT_EXPR)
8750 tree tree10 = TREE_OPERAND (arg1, 0);
8751 tree tree11 = TREE_OPERAND (arg1, 1);
8752 if (TREE_CODE (tree11) == MULT_EXPR
8753 && TREE_CODE (tree10) == MULT_EXPR)
8756 tree0 = fold_build2 (PLUS_EXPR, type, arg0, tree10);
8757 return fold_build2 (PLUS_EXPR, type, tree0, tree11);
8760 /* Convert (b*c + d*e) + a into b*c + (d*e +a). */
8761 if (flag_unsafe_math_optimizations
8762 && TREE_CODE (arg0) == PLUS_EXPR
8763 && TREE_CODE (arg1) != MULT_EXPR)
8765 tree tree00 = TREE_OPERAND (arg0, 0);
8766 tree tree01 = TREE_OPERAND (arg0, 1);
8767 if (TREE_CODE (tree01) == MULT_EXPR
8768 && TREE_CODE (tree00) == MULT_EXPR)
8771 tree0 = fold_build2 (PLUS_EXPR, type, tree01, arg1);
8772 return fold_build2 (PLUS_EXPR, type, tree00, tree0);
8778 /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
8779 is a rotate of A by C1 bits. */
8780 /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
8781 is a rotate of A by B bits. */
8783 enum tree_code code0, code1;
8784 code0 = TREE_CODE (arg0);
8785 code1 = TREE_CODE (arg1);
8786 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
8787 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
8788 && operand_equal_p (TREE_OPERAND (arg0, 0),
8789 TREE_OPERAND (arg1, 0), 0)
8790 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
8792 tree tree01, tree11;
8793 enum tree_code code01, code11;
8795 tree01 = TREE_OPERAND (arg0, 1);
8796 tree11 = TREE_OPERAND (arg1, 1);
8797 STRIP_NOPS (tree01);
8798 STRIP_NOPS (tree11);
8799 code01 = TREE_CODE (tree01);
8800 code11 = TREE_CODE (tree11);
8801 if (code01 == INTEGER_CST
8802 && code11 == INTEGER_CST
8803 && TREE_INT_CST_HIGH (tree01) == 0
8804 && TREE_INT_CST_HIGH (tree11) == 0
8805 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
8806 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
8807 return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
8808 code0 == LSHIFT_EXPR ? tree01 : tree11);
8809 else if (code11 == MINUS_EXPR)
8811 tree tree110, tree111;
8812 tree110 = TREE_OPERAND (tree11, 0);
8813 tree111 = TREE_OPERAND (tree11, 1);
8814 STRIP_NOPS (tree110);
8815 STRIP_NOPS (tree111);
8816 if (TREE_CODE (tree110) == INTEGER_CST
8817 && 0 == compare_tree_int (tree110,
8819 (TREE_TYPE (TREE_OPERAND
8821 && operand_equal_p (tree01, tree111, 0))
8822 return build2 ((code0 == LSHIFT_EXPR
8825 type, TREE_OPERAND (arg0, 0), tree01);
8827 else if (code01 == MINUS_EXPR)
8829 tree tree010, tree011;
8830 tree010 = TREE_OPERAND (tree01, 0);
8831 tree011 = TREE_OPERAND (tree01, 1);
8832 STRIP_NOPS (tree010);
8833 STRIP_NOPS (tree011);
8834 if (TREE_CODE (tree010) == INTEGER_CST
8835 && 0 == compare_tree_int (tree010,
8837 (TREE_TYPE (TREE_OPERAND
8839 && operand_equal_p (tree11, tree011, 0))
8840 return build2 ((code0 != LSHIFT_EXPR
8843 type, TREE_OPERAND (arg0, 0), tree11);
8849 /* In most languages, can't associate operations on floats through
8850 parentheses. Rather than remember where the parentheses were, we
8851 don't associate floats at all, unless the user has specified
8852 -funsafe-math-optimizations. */
8854 if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
8856 tree var0, con0, lit0, minus_lit0;
8857 tree var1, con1, lit1, minus_lit1;
8860 /* Split both trees into variables, constants, and literals. Then
8861 associate each group together, the constants with literals,
8862 then the result with variables. This increases the chances of
8863 literals being recombined later and of generating relocatable
8864 expressions for the sum of a constant and literal. */
8865 var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
8866 var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
8867 code == MINUS_EXPR);
8869 /* With undefined overflow we can only associate constants
8870 with one variable. */
8871 if ((POINTER_TYPE_P (type)
8872 || (INTEGRAL_TYPE_P (type)
8873 && !(TYPE_UNSIGNED (type) || flag_wrapv)))
8879 if (TREE_CODE (tmp0) == NEGATE_EXPR)
8880 tmp0 = TREE_OPERAND (tmp0, 0);
8881 if (TREE_CODE (tmp1) == NEGATE_EXPR)
8882 tmp1 = TREE_OPERAND (tmp1, 0);
8883 /* The only case we can still associate with two variables
8884 is if they are the same, modulo negation. */
8885 if (!operand_equal_p (tmp0, tmp1, 0))
8889 /* Only do something if we found more than two objects. Otherwise,
8890 nothing has changed and we risk infinite recursion. */
8892 && (2 < ((var0 != 0) + (var1 != 0)
8893 + (con0 != 0) + (con1 != 0)
8894 + (lit0 != 0) + (lit1 != 0)
8895 + (minus_lit0 != 0) + (minus_lit1 != 0))))
8897 /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
8898 if (code == MINUS_EXPR)
8901 var0 = associate_trees (var0, var1, code, type);
8902 con0 = associate_trees (con0, con1, code, type);
8903 lit0 = associate_trees (lit0, lit1, code, type);
8904 minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
8906 /* Preserve the MINUS_EXPR if the negative part of the literal is
8907 greater than the positive part. Otherwise, the multiplicative
8908 folding code (i.e extract_muldiv) may be fooled in case
8909 unsigned constants are subtracted, like in the following
8910 example: ((X*2 + 4) - 8U)/2. */
8911 if (minus_lit0 && lit0)
8913 if (TREE_CODE (lit0) == INTEGER_CST
8914 && TREE_CODE (minus_lit0) == INTEGER_CST
8915 && tree_int_cst_lt (lit0, minus_lit0))
8917 minus_lit0 = associate_trees (minus_lit0, lit0,
8923 lit0 = associate_trees (lit0, minus_lit0,
8931 return fold_convert (type,
8932 associate_trees (var0, minus_lit0,
8936 con0 = associate_trees (con0, minus_lit0,
8938 return fold_convert (type,
8939 associate_trees (var0, con0,
8944 con0 = associate_trees (con0, lit0, code, type);
8945 return fold_convert (type, associate_trees (var0, con0,
8953 /* A - (-B) -> A + B */
8954 if (TREE_CODE (arg1) == NEGATE_EXPR)
8955 return fold_build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
8956 /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */
8957 if (TREE_CODE (arg0) == NEGATE_EXPR
8958 && (FLOAT_TYPE_P (type)
8959 || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))
8960 && negate_expr_p (arg1)
8961 && reorder_operands_p (arg0, arg1))
8962 return fold_build2 (MINUS_EXPR, type, negate_expr (arg1),
8963 TREE_OPERAND (arg0, 0));
8964 /* Convert -A - 1 to ~A. */
8965 if (INTEGRAL_TYPE_P (type)
8966 && TREE_CODE (arg0) == NEGATE_EXPR
8967 && integer_onep (arg1))
8968 return fold_build1 (BIT_NOT_EXPR, type,
8969 fold_convert (type, TREE_OPERAND (arg0, 0)));
8971 /* Convert -1 - A to ~A. */
8972 if (INTEGRAL_TYPE_P (type)
8973 && integer_all_onesp (arg0))
8974 return fold_build1 (BIT_NOT_EXPR, type, arg1);
8976 if (! FLOAT_TYPE_P (type))
8978 if (integer_zerop (arg0))
8979 return negate_expr (fold_convert (type, arg1));
8980 if (integer_zerop (arg1))
8981 return non_lvalue (fold_convert (type, arg0));
8983 /* Fold A - (A & B) into ~B & A. */
8984 if (!TREE_SIDE_EFFECTS (arg0)
8985 && TREE_CODE (arg1) == BIT_AND_EXPR)
8987 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
8988 return fold_build2 (BIT_AND_EXPR, type,
8989 fold_build1 (BIT_NOT_EXPR, type,
8990 TREE_OPERAND (arg1, 0)),
8992 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8993 return fold_build2 (BIT_AND_EXPR, type,
8994 fold_build1 (BIT_NOT_EXPR, type,
8995 TREE_OPERAND (arg1, 1)),
8999 /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
9000 any power of 2 minus 1. */
9001 if (TREE_CODE (arg0) == BIT_AND_EXPR
9002 && TREE_CODE (arg1) == BIT_AND_EXPR
9003 && operand_equal_p (TREE_OPERAND (arg0, 0),
9004 TREE_OPERAND (arg1, 0), 0))
9006 tree mask0 = TREE_OPERAND (arg0, 1);
9007 tree mask1 = TREE_OPERAND (arg1, 1);
9008 tree tem = fold_build1 (BIT_NOT_EXPR, type, mask0);
9010 if (operand_equal_p (tem, mask1, 0))
9012 tem = fold_build2 (BIT_XOR_EXPR, type,
9013 TREE_OPERAND (arg0, 0), mask1);
9014 return fold_build2 (MINUS_EXPR, type, tem, mask1);
9019 /* See if ARG1 is zero and X - ARG1 reduces to X. */
9020 else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
9021 return non_lvalue (fold_convert (type, arg0));
9023 /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether
9024 ARG0 is zero and X + ARG0 reduces to X, since that would mean
9025 (-ARG1 + ARG0) reduces to -ARG1. */
9026 else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
9027 return negate_expr (fold_convert (type, arg1));
9029 /* Fold &x - &x. This can happen from &x.foo - &x.
9030 This is unsafe for certain floats even in non-IEEE formats.
9031 In IEEE, it is unsafe because it does wrong for NaNs.
9032 Also note that operand_equal_p is always false if an operand
9035 if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
9036 && operand_equal_p (arg0, arg1, 0))
9037 return fold_convert (type, integer_zero_node);
9039 /* A - B -> A + (-B) if B is easily negatable. */
9040 if (negate_expr_p (arg1)
9041 && ((FLOAT_TYPE_P (type)
9042 /* Avoid this transformation if B is a positive REAL_CST. */
9043 && (TREE_CODE (arg1) != REAL_CST
9044 || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
9045 || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
9046 return fold_build2 (PLUS_EXPR, type,
9047 fold_convert (type, arg0),
9048 fold_convert (type, negate_expr (arg1)));
9050 /* Try folding difference of addresses. */
9054 if ((TREE_CODE (arg0) == ADDR_EXPR
9055 || TREE_CODE (arg1) == ADDR_EXPR)
9056 && ptr_difference_const (arg0, arg1, &diff))
9057 return build_int_cst_type (type, diff);
9060 /* Fold &a[i] - &a[j] to i-j. */
9061 if (TREE_CODE (arg0) == ADDR_EXPR
9062 && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
9063 && TREE_CODE (arg1) == ADDR_EXPR
9064 && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
9066 tree aref0 = TREE_OPERAND (arg0, 0);
9067 tree aref1 = TREE_OPERAND (arg1, 0);
9068 if (operand_equal_p (TREE_OPERAND (aref0, 0),
9069 TREE_OPERAND (aref1, 0), 0))
9071 tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
9072 tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
9073 tree esz = array_ref_element_size (aref0);
9074 tree diff = build2 (MINUS_EXPR, type, op0, op1);
9075 return fold_build2 (MULT_EXPR, type, diff,
9076 fold_convert (type, esz));
9081 /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
9082 of the array. Loop optimizer sometimes produce this type of
9084 if (TREE_CODE (arg0) == ADDR_EXPR)
9086 tem = try_move_mult_to_index (MINUS_EXPR, arg0, arg1);
9088 return fold_convert (type, tem);
9091 if (flag_unsafe_math_optimizations
9092 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
9093 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
9094 && (tem = distribute_real_division (code, type, arg0, arg1)))
9097 /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
9099 if ((TREE_CODE (arg0) == MULT_EXPR
9100 || TREE_CODE (arg1) == MULT_EXPR)
9101 && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
9103 tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
9111 /* (-A) * (-B) -> A * B */
9112 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9113 return fold_build2 (MULT_EXPR, type,
9114 fold_convert (type, TREE_OPERAND (arg0, 0)),
9115 fold_convert (type, negate_expr (arg1)));
9116 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9117 return fold_build2 (MULT_EXPR, type,
9118 fold_convert (type, negate_expr (arg0)),
9119 fold_convert (type, TREE_OPERAND (arg1, 0)));
9121 if (! FLOAT_TYPE_P (type))
9123 if (integer_zerop (arg1))
9124 return omit_one_operand (type, arg1, arg0);
9125 if (integer_onep (arg1))
9126 return non_lvalue (fold_convert (type, arg0));
9127 /* Transform x * -1 into -x. */
9128 if (integer_all_onesp (arg1))
9129 return fold_convert (type, negate_expr (arg0));
9131 /* (a * (1 << b)) is (a << b) */
9132 if (TREE_CODE (arg1) == LSHIFT_EXPR
9133 && integer_onep (TREE_OPERAND (arg1, 0)))
9134 return fold_build2 (LSHIFT_EXPR, type, arg0,
9135 TREE_OPERAND (arg1, 1));
9136 if (TREE_CODE (arg0) == LSHIFT_EXPR
9137 && integer_onep (TREE_OPERAND (arg0, 0)))
9138 return fold_build2 (LSHIFT_EXPR, type, arg1,
9139 TREE_OPERAND (arg0, 1));
9141 strict_overflow_p = false;
9142 if (TREE_CODE (arg1) == INTEGER_CST
9143 && 0 != (tem = extract_muldiv (op0,
9144 fold_convert (type, arg1),
9146 &strict_overflow_p)))
9148 if (strict_overflow_p)
9149 fold_overflow_warning (("assuming signed overflow does not "
9150 "occur when simplifying "
9152 WARN_STRICT_OVERFLOW_MISC);
9153 return fold_convert (type, tem);
9156 /* Optimize z * conj(z) for integer complex numbers. */
9157 if (TREE_CODE (arg0) == CONJ_EXPR
9158 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9159 return fold_mult_zconjz (type, arg1);
9160 if (TREE_CODE (arg1) == CONJ_EXPR
9161 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9162 return fold_mult_zconjz (type, arg0);
9166 /* Maybe fold x * 0 to 0. The expressions aren't the same
9167 when x is NaN, since x * 0 is also NaN. Nor are they the
9168 same in modes with signed zeros, since multiplying a
9169 negative value by 0 gives -0, not +0. */
9170 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9171 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
9172 && real_zerop (arg1))
9173 return omit_one_operand (type, arg1, arg0);
9174 /* In IEEE floating point, x*1 is not equivalent to x for snans. */
9175 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9176 && real_onep (arg1))
9177 return non_lvalue (fold_convert (type, arg0));
9179 /* Transform x * -1.0 into -x. */
9180 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9181 && real_minus_onep (arg1))
9182 return fold_convert (type, negate_expr (arg0));
9184 /* Convert (C1/X)*C2 into (C1*C2)/X. */
9185 if (flag_unsafe_math_optimizations
9186 && TREE_CODE (arg0) == RDIV_EXPR
9187 && TREE_CODE (arg1) == REAL_CST
9188 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
9190 tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
9193 return fold_build2 (RDIV_EXPR, type, tem,
9194 TREE_OPERAND (arg0, 1));
9197 /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y. */
9198 if (operand_equal_p (arg0, arg1, 0))
9200 tree tem = fold_strip_sign_ops (arg0);
9201 if (tem != NULL_TREE)
9203 tem = fold_convert (type, tem);
9204 return fold_build2 (MULT_EXPR, type, tem, tem);
9208 /* Optimize z * conj(z) for floating point complex numbers.
9209 Guarded by flag_unsafe_math_optimizations as non-finite
9210 imaginary components don't produce scalar results. */
9211 if (flag_unsafe_math_optimizations
9212 && TREE_CODE (arg0) == CONJ_EXPR
9213 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9214 return fold_mult_zconjz (type, arg1);
9215 if (flag_unsafe_math_optimizations
9216 && TREE_CODE (arg1) == CONJ_EXPR
9217 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9218 return fold_mult_zconjz (type, arg0);
9220 if (flag_unsafe_math_optimizations)
9222 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
9223 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
9225 /* Optimizations of root(...)*root(...). */
9226 if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
9228 tree rootfn, arg, arglist;
9229 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9230 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
9232 /* Optimize sqrt(x)*sqrt(x) as x. */
9233 if (BUILTIN_SQRT_P (fcode0)
9234 && operand_equal_p (arg00, arg10, 0)
9235 && ! HONOR_SNANS (TYPE_MODE (type)))
9238 /* Optimize root(x)*root(y) as root(x*y). */
9239 rootfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9240 arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9241 arglist = build_tree_list (NULL_TREE, arg);
9242 return build_function_call_expr (rootfn, arglist);
9245 /* Optimize expN(x)*expN(y) as expN(x+y). */
9246 if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
9248 tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9249 tree arg = fold_build2 (PLUS_EXPR, type,
9250 TREE_VALUE (TREE_OPERAND (arg0, 1)),
9251 TREE_VALUE (TREE_OPERAND (arg1, 1)));
9252 tree arglist = build_tree_list (NULL_TREE, arg);
9253 return build_function_call_expr (expfn, arglist);
9256 /* Optimizations of pow(...)*pow(...). */
9257 if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
9258 || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
9259 || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
9261 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9262 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
9264 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
9265 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
9268 /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y). */
9269 if (operand_equal_p (arg01, arg11, 0))
9271 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9272 tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
9273 tree arglist = tree_cons (NULL_TREE, arg,
9274 build_tree_list (NULL_TREE,
9276 return build_function_call_expr (powfn, arglist);
9279 /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z). */
9280 if (operand_equal_p (arg00, arg10, 0))
9282 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9283 tree arg = fold_build2 (PLUS_EXPR, type, arg01, arg11);
9284 tree arglist = tree_cons (NULL_TREE, arg00,
9285 build_tree_list (NULL_TREE,
9287 return build_function_call_expr (powfn, arglist);
9291 /* Optimize tan(x)*cos(x) as sin(x). */
9292 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
9293 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
9294 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
9295 || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
9296 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
9297 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
9298 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
9299 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
9301 tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
9303 if (sinfn != NULL_TREE)
9304 return build_function_call_expr (sinfn,
9305 TREE_OPERAND (arg0, 1));
9308 /* Optimize x*pow(x,c) as pow(x,c+1). */
9309 if (fcode1 == BUILT_IN_POW
9310 || fcode1 == BUILT_IN_POWF
9311 || fcode1 == BUILT_IN_POWL)
9313 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
9314 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
9316 if (TREE_CODE (arg11) == REAL_CST
9317 && ! TREE_CONSTANT_OVERFLOW (arg11)
9318 && operand_equal_p (arg0, arg10, 0))
9320 tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
9324 c = TREE_REAL_CST (arg11);
9325 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9326 arg = build_real (type, c);
9327 arglist = build_tree_list (NULL_TREE, arg);
9328 arglist = tree_cons (NULL_TREE, arg0, arglist);
9329 return build_function_call_expr (powfn, arglist);
9333 /* Optimize pow(x,c)*x as pow(x,c+1). */
9334 if (fcode0 == BUILT_IN_POW
9335 || fcode0 == BUILT_IN_POWF
9336 || fcode0 == BUILT_IN_POWL)
9338 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9339 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
9341 if (TREE_CODE (arg01) == REAL_CST
9342 && ! TREE_CONSTANT_OVERFLOW (arg01)
9343 && operand_equal_p (arg1, arg00, 0))
9345 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9349 c = TREE_REAL_CST (arg01);
9350 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
9351 arg = build_real (type, c);
9352 arglist = build_tree_list (NULL_TREE, arg);
9353 arglist = tree_cons (NULL_TREE, arg1, arglist);
9354 return build_function_call_expr (powfn, arglist);
9358 /* Optimize x*x as pow(x,2.0), which is expanded as x*x. */
9360 && operand_equal_p (arg0, arg1, 0))
9362 tree powfn = mathfn_built_in (type, BUILT_IN_POW);
9366 tree arg = build_real (type, dconst2);
9367 tree arglist = build_tree_list (NULL_TREE, arg);
9368 arglist = tree_cons (NULL_TREE, arg0, arglist);
9369 return build_function_call_expr (powfn, arglist);
9378 if (integer_all_onesp (arg1))
9379 return omit_one_operand (type, arg1, arg0);
9380 if (integer_zerop (arg1))
9381 return non_lvalue (fold_convert (type, arg0));
9382 if (operand_equal_p (arg0, arg1, 0))
9383 return non_lvalue (fold_convert (type, arg0));
9386 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9387 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9389 t1 = build_int_cst (type, -1);
9390 t1 = force_fit_type (t1, 0, false, false);
9391 return omit_one_operand (type, t1, arg1);
9395 if (TREE_CODE (arg1) == BIT_NOT_EXPR
9396 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9398 t1 = build_int_cst (type, -1);
9399 t1 = force_fit_type (t1, 0, false, false);
9400 return omit_one_operand (type, t1, arg0);
9403 /* Canonicalize (X & C1) | C2. */
9404 if (TREE_CODE (arg0) == BIT_AND_EXPR
9405 && TREE_CODE (arg1) == INTEGER_CST
9406 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9408 unsigned HOST_WIDE_INT hi1, lo1, hi2, lo2, mlo, mhi;
9409 int width = TYPE_PRECISION (type);
9410 hi1 = TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1));
9411 lo1 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
9412 hi2 = TREE_INT_CST_HIGH (arg1);
9413 lo2 = TREE_INT_CST_LOW (arg1);
9415 /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2). */
9416 if ((hi1 & hi2) == hi1 && (lo1 & lo2) == lo1)
9417 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
9419 if (width > HOST_BITS_PER_WIDE_INT)
9421 mhi = (unsigned HOST_WIDE_INT) -1
9422 >> (2 * HOST_BITS_PER_WIDE_INT - width);
9428 mlo = (unsigned HOST_WIDE_INT) -1
9429 >> (HOST_BITS_PER_WIDE_INT - width);
9432 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
9433 if ((~(hi1 | hi2) & mhi) == 0 && (~(lo1 | lo2) & mlo) == 0)
9434 return fold_build2 (BIT_IOR_EXPR, type,
9435 TREE_OPERAND (arg0, 0), arg1);
9437 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2. */
9440 if ((hi1 & ~hi2) != hi1 || (lo1 & ~lo2) != lo1)
9441 return fold_build2 (BIT_IOR_EXPR, type,
9442 fold_build2 (BIT_AND_EXPR, type,
9443 TREE_OPERAND (arg0, 0),
9444 build_int_cst_wide (type,
9450 /* (X & Y) | Y is (X, Y). */
9451 if (TREE_CODE (arg0) == BIT_AND_EXPR
9452 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9453 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
9454 /* (X & Y) | X is (Y, X). */
9455 if (TREE_CODE (arg0) == BIT_AND_EXPR
9456 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9457 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
9458 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
9459 /* X | (X & Y) is (Y, X). */
9460 if (TREE_CODE (arg1) == BIT_AND_EXPR
9461 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
9462 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
9463 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
9464 /* X | (Y & X) is (Y, X). */
9465 if (TREE_CODE (arg1) == BIT_AND_EXPR
9466 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
9467 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9468 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
9470 t1 = distribute_bit_expr (code, type, arg0, arg1);
9471 if (t1 != NULL_TREE)
9474 /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
9476 This results in more efficient code for machines without a NAND
9477 instruction. Combine will canonicalize to the first form
9478 which will allow use of NAND instructions provided by the
9479 backend if they exist. */
9480 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9481 && TREE_CODE (arg1) == BIT_NOT_EXPR)
9483 return fold_build1 (BIT_NOT_EXPR, type,
9484 build2 (BIT_AND_EXPR, type,
9485 TREE_OPERAND (arg0, 0),
9486 TREE_OPERAND (arg1, 0)));
9489 /* See if this can be simplified into a rotate first. If that
9490 is unsuccessful continue in the association code. */
9494 if (integer_zerop (arg1))
9495 return non_lvalue (fold_convert (type, arg0));
9496 if (integer_all_onesp (arg1))
9497 return fold_build1 (BIT_NOT_EXPR, type, arg0);
9498 if (operand_equal_p (arg0, arg1, 0))
9499 return omit_one_operand (type, integer_zero_node, arg0);
9502 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9503 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9505 t1 = build_int_cst (type, -1);
9506 t1 = force_fit_type (t1, 0, false, false);
9507 return omit_one_operand (type, t1, arg1);
9511 if (TREE_CODE (arg1) == BIT_NOT_EXPR
9512 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9514 t1 = build_int_cst (type, -1);
9515 t1 = force_fit_type (t1, 0, false, false);
9516 return omit_one_operand (type, t1, arg0);
9519 /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
9520 with a constant, and the two constants have no bits in common,
9521 we should treat this as a BIT_IOR_EXPR since this may produce more
9523 if (TREE_CODE (arg0) == BIT_AND_EXPR
9524 && TREE_CODE (arg1) == BIT_AND_EXPR
9525 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9526 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9527 && integer_zerop (const_binop (BIT_AND_EXPR,
9528 TREE_OPERAND (arg0, 1),
9529 TREE_OPERAND (arg1, 1), 0)))
9531 code = BIT_IOR_EXPR;
9535 /* (X | Y) ^ X -> Y & ~ X*/
9536 if (TREE_CODE (arg0) == BIT_IOR_EXPR
9537 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9539 tree t2 = TREE_OPERAND (arg0, 1);
9540 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
9542 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
9543 fold_convert (type, t1));
9547 /* (Y | X) ^ X -> Y & ~ X*/
9548 if (TREE_CODE (arg0) == BIT_IOR_EXPR
9549 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9551 tree t2 = TREE_OPERAND (arg0, 0);
9552 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1),
9554 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
9555 fold_convert (type, t1));
9559 /* X ^ (X | Y) -> Y & ~ X*/
9560 if (TREE_CODE (arg1) == BIT_IOR_EXPR
9561 && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
9563 tree t2 = TREE_OPERAND (arg1, 1);
9564 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
9566 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
9567 fold_convert (type, t1));
9571 /* X ^ (Y | X) -> Y & ~ X*/
9572 if (TREE_CODE (arg1) == BIT_IOR_EXPR
9573 && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
9575 tree t2 = TREE_OPERAND (arg1, 0);
9576 t1 = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg0),
9578 t1 = fold_build2 (BIT_AND_EXPR, type, fold_convert (type, t2),
9579 fold_convert (type, t1));
9583 /* Convert ~X ^ ~Y to X ^ Y. */
9584 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9585 && TREE_CODE (arg1) == BIT_NOT_EXPR)
9586 return fold_build2 (code, type,
9587 fold_convert (type, TREE_OPERAND (arg0, 0)),
9588 fold_convert (type, TREE_OPERAND (arg1, 0)));
9590 /* Fold (X & 1) ^ 1 as (X & 1) == 0. */
9591 if (TREE_CODE (arg0) == BIT_AND_EXPR
9592 && integer_onep (TREE_OPERAND (arg0, 1))
9593 && integer_onep (arg1))
9594 return fold_build2 (EQ_EXPR, type, arg0,
9595 build_int_cst (TREE_TYPE (arg0), 0));
9597 /* Fold (X & Y) ^ Y as ~X & Y. */
9598 if (TREE_CODE (arg0) == BIT_AND_EXPR
9599 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9601 tem = fold_convert (type, TREE_OPERAND (arg0, 0));
9602 return fold_build2 (BIT_AND_EXPR, type,
9603 fold_build1 (BIT_NOT_EXPR, type, tem),
9604 fold_convert (type, arg1));
9606 /* Fold (X & Y) ^ X as ~Y & X. */
9607 if (TREE_CODE (arg0) == BIT_AND_EXPR
9608 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9609 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
9611 tem = fold_convert (type, TREE_OPERAND (arg0, 1));
9612 return fold_build2 (BIT_AND_EXPR, type,
9613 fold_build1 (BIT_NOT_EXPR, type, tem),
9614 fold_convert (type, arg1));
9616 /* Fold X ^ (X & Y) as X & ~Y. */
9617 if (TREE_CODE (arg1) == BIT_AND_EXPR
9618 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9620 tem = fold_convert (type, TREE_OPERAND (arg1, 1));
9621 return fold_build2 (BIT_AND_EXPR, type,
9622 fold_convert (type, arg0),
9623 fold_build1 (BIT_NOT_EXPR, type, tem));
9625 /* Fold X ^ (Y & X) as ~Y & X. */
9626 if (TREE_CODE (arg1) == BIT_AND_EXPR
9627 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
9628 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9630 tem = fold_convert (type, TREE_OPERAND (arg1, 0));
9631 return fold_build2 (BIT_AND_EXPR, type,
9632 fold_build1 (BIT_NOT_EXPR, type, tem),
9633 fold_convert (type, arg0));
9636 /* See if this can be simplified into a rotate first. If that
9637 is unsuccessful continue in the association code. */
9641 if (integer_all_onesp (arg1))
9642 return non_lvalue (fold_convert (type, arg0));
9643 if (integer_zerop (arg1))
9644 return omit_one_operand (type, arg1, arg0);
9645 if (operand_equal_p (arg0, arg1, 0))
9646 return non_lvalue (fold_convert (type, arg0));
9648 /* ~X & X is always zero. */
9649 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9650 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
9651 return omit_one_operand (type, integer_zero_node, arg1);
9653 /* X & ~X is always zero. */
9654 if (TREE_CODE (arg1) == BIT_NOT_EXPR
9655 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9656 return omit_one_operand (type, integer_zero_node, arg0);
9658 /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2). */
9659 if (TREE_CODE (arg0) == BIT_IOR_EXPR
9660 && TREE_CODE (arg1) == INTEGER_CST
9661 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9662 return fold_build2 (BIT_IOR_EXPR, type,
9663 fold_build2 (BIT_AND_EXPR, type,
9664 TREE_OPERAND (arg0, 0), arg1),
9665 fold_build2 (BIT_AND_EXPR, type,
9666 TREE_OPERAND (arg0, 1), arg1));
9668 /* (X | Y) & Y is (X, Y). */
9669 if (TREE_CODE (arg0) == BIT_IOR_EXPR
9670 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9671 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 0));
9672 /* (X | Y) & X is (Y, X). */
9673 if (TREE_CODE (arg0) == BIT_IOR_EXPR
9674 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9675 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
9676 return omit_one_operand (type, arg1, TREE_OPERAND (arg0, 1));
9677 /* X & (X | Y) is (Y, X). */
9678 if (TREE_CODE (arg1) == BIT_IOR_EXPR
9679 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
9680 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
9681 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 1));
9682 /* X & (Y | X) is (Y, X). */
9683 if (TREE_CODE (arg1) == BIT_IOR_EXPR
9684 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
9685 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9686 return omit_one_operand (type, arg0, TREE_OPERAND (arg1, 0));
9688 /* Fold (X ^ 1) & 1 as (X & 1) == 0. */
9689 if (TREE_CODE (arg0) == BIT_XOR_EXPR
9690 && integer_onep (TREE_OPERAND (arg0, 1))
9691 && integer_onep (arg1))
9693 tem = TREE_OPERAND (arg0, 0);
9694 return fold_build2 (EQ_EXPR, type,
9695 fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
9696 build_int_cst (TREE_TYPE (tem), 1)),
9697 build_int_cst (TREE_TYPE (tem), 0));
9699 /* Fold ~X & 1 as (X & 1) == 0. */
9700 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9701 && integer_onep (arg1))
9703 tem = TREE_OPERAND (arg0, 0);
9704 return fold_build2 (EQ_EXPR, type,
9705 fold_build2 (BIT_AND_EXPR, TREE_TYPE (tem), tem,
9706 build_int_cst (TREE_TYPE (tem), 1)),
9707 build_int_cst (TREE_TYPE (tem), 0));
9710 /* Fold (X ^ Y) & Y as ~X & Y. */
9711 if (TREE_CODE (arg0) == BIT_XOR_EXPR
9712 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
9714 tem = fold_convert (type, TREE_OPERAND (arg0, 0));
9715 return fold_build2 (BIT_AND_EXPR, type,
9716 fold_build1 (BIT_NOT_EXPR, type, tem),
9717 fold_convert (type, arg1));
9719 /* Fold (X ^ Y) & X as ~Y & X. */
9720 if (TREE_CODE (arg0) == BIT_XOR_EXPR
9721 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
9722 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
9724 tem = fold_convert (type, TREE_OPERAND (arg0, 1));
9725 return fold_build2 (BIT_AND_EXPR, type,
9726 fold_build1 (BIT_NOT_EXPR, type, tem),
9727 fold_convert (type, arg1));
9729 /* Fold X & (X ^ Y) as X & ~Y. */
9730 if (TREE_CODE (arg1) == BIT_XOR_EXPR
9731 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
9733 tem = fold_convert (type, TREE_OPERAND (arg1, 1));
9734 return fold_build2 (BIT_AND_EXPR, type,
9735 fold_convert (type, arg0),
9736 fold_build1 (BIT_NOT_EXPR, type, tem));
9738 /* Fold X & (Y ^ X) as ~Y & X. */
9739 if (TREE_CODE (arg1) == BIT_XOR_EXPR
9740 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
9741 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9743 tem = fold_convert (type, TREE_OPERAND (arg1, 0));
9744 return fold_build2 (BIT_AND_EXPR, type,
9745 fold_build1 (BIT_NOT_EXPR, type, tem),
9746 fold_convert (type, arg0));
9749 t1 = distribute_bit_expr (code, type, arg0, arg1);
9750 if (t1 != NULL_TREE)
9752 /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */
9753 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
9754 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
9757 = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
9759 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
9760 && (~TREE_INT_CST_LOW (arg1)
9761 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
9762 return fold_convert (type, TREE_OPERAND (arg0, 0));
9765 /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
9767 This results in more efficient code for machines without a NOR
9768 instruction. Combine will canonicalize to the first form
9769 which will allow use of NOR instructions provided by the
9770 backend if they exist. */
9771 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9772 && TREE_CODE (arg1) == BIT_NOT_EXPR)
9774 return fold_build1 (BIT_NOT_EXPR, type,
9775 build2 (BIT_IOR_EXPR, type,
9776 TREE_OPERAND (arg0, 0),
9777 TREE_OPERAND (arg1, 0)));
9783 /* Don't touch a floating-point divide by zero unless the mode
9784 of the constant can represent infinity. */
9785 if (TREE_CODE (arg1) == REAL_CST
9786 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
9787 && real_zerop (arg1))
9790 /* Optimize A / A to 1.0 if we don't care about
9791 NaNs or Infinities. Skip the transformation
9792 for non-real operands. */
9793 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
9794 && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
9795 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
9796 && operand_equal_p (arg0, arg1, 0))
9798 tree r = build_real (TREE_TYPE (arg0), dconst1);
9800 return omit_two_operands (type, r, arg0, arg1);
9803 /* The complex version of the above A / A optimization. */
9804 if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
9805 && operand_equal_p (arg0, arg1, 0))
9807 tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
9808 if (! HONOR_NANS (TYPE_MODE (elem_type))
9809 && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
9811 tree r = build_real (elem_type, dconst1);
9812 /* omit_two_operands will call fold_convert for us. */
9813 return omit_two_operands (type, r, arg0, arg1);
9817 /* (-A) / (-B) -> A / B */
9818 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
9819 return fold_build2 (RDIV_EXPR, type,
9820 TREE_OPERAND (arg0, 0),
9821 negate_expr (arg1));
9822 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
9823 return fold_build2 (RDIV_EXPR, type,
9825 TREE_OPERAND (arg1, 0));
9827 /* In IEEE floating point, x/1 is not equivalent to x for snans. */
9828 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9829 && real_onep (arg1))
9830 return non_lvalue (fold_convert (type, arg0));
9832 /* In IEEE floating point, x/-1 is not equivalent to -x for snans. */
9833 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9834 && real_minus_onep (arg1))
9835 return non_lvalue (fold_convert (type, negate_expr (arg0)));
9837 /* If ARG1 is a constant, we can convert this to a multiply by the
9838 reciprocal. This does not have the same rounding properties,
9839 so only do this if -funsafe-math-optimizations. We can actually
9840 always safely do it if ARG1 is a power of two, but it's hard to
9841 tell if it is or not in a portable manner. */
9842 if (TREE_CODE (arg1) == REAL_CST)
9844 if (flag_unsafe_math_optimizations
9845 && 0 != (tem = const_binop (code, build_real (type, dconst1),
9847 return fold_build2 (MULT_EXPR, type, arg0, tem);
9848 /* Find the reciprocal if optimizing and the result is exact. */
9852 r = TREE_REAL_CST (arg1);
9853 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
9855 tem = build_real (type, r);
9856 return fold_build2 (MULT_EXPR, type,
9857 fold_convert (type, arg0), tem);
9861 /* Convert A/B/C to A/(B*C). */
9862 if (flag_unsafe_math_optimizations
9863 && TREE_CODE (arg0) == RDIV_EXPR)
9864 return fold_build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
9865 fold_build2 (MULT_EXPR, type,
9866 TREE_OPERAND (arg0, 1), arg1));
9868 /* Convert A/(B/C) to (A/B)*C. */
9869 if (flag_unsafe_math_optimizations
9870 && TREE_CODE (arg1) == RDIV_EXPR)
9871 return fold_build2 (MULT_EXPR, type,
9872 fold_build2 (RDIV_EXPR, type, arg0,
9873 TREE_OPERAND (arg1, 0)),
9874 TREE_OPERAND (arg1, 1));
9876 /* Convert C1/(X*C2) into (C1/C2)/X. */
9877 if (flag_unsafe_math_optimizations
9878 && TREE_CODE (arg1) == MULT_EXPR
9879 && TREE_CODE (arg0) == REAL_CST
9880 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
9882 tree tem = const_binop (RDIV_EXPR, arg0,
9883 TREE_OPERAND (arg1, 1), 0);
9885 return fold_build2 (RDIV_EXPR, type, tem,
9886 TREE_OPERAND (arg1, 0));
9889 if (flag_unsafe_math_optimizations)
9891 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
9892 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
9894 /* Optimize sin(x)/cos(x) as tan(x). */
9895 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
9896 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
9897 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
9898 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
9899 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
9901 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
9903 if (tanfn != NULL_TREE)
9904 return build_function_call_expr (tanfn,
9905 TREE_OPERAND (arg0, 1));
9908 /* Optimize cos(x)/sin(x) as 1.0/tan(x). */
9909 if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
9910 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
9911 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
9912 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
9913 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
9915 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
9917 if (tanfn != NULL_TREE)
9919 tree tmp = TREE_OPERAND (arg0, 1);
9920 tmp = build_function_call_expr (tanfn, tmp);
9921 return fold_build2 (RDIV_EXPR, type,
9922 build_real (type, dconst1), tmp);
9926 /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
9927 NaNs or Infinities. */
9928 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
9929 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
9930 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
9932 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9933 tree arg01 = TREE_VALUE (TREE_OPERAND (arg1, 1));
9935 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
9936 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
9937 && operand_equal_p (arg00, arg01, 0))
9939 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
9941 if (cosfn != NULL_TREE)
9942 return build_function_call_expr (cosfn,
9943 TREE_OPERAND (arg0, 1));
9947 /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
9948 NaNs or Infinities. */
9949 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
9950 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
9951 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
9953 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9954 tree arg01 = TREE_VALUE (TREE_OPERAND (arg1, 1));
9956 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
9957 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
9958 && operand_equal_p (arg00, arg01, 0))
9960 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
9962 if (cosfn != NULL_TREE)
9964 tree tmp = TREE_OPERAND (arg0, 1);
9965 tmp = build_function_call_expr (cosfn, tmp);
9966 return fold_build2 (RDIV_EXPR, type,
9967 build_real (type, dconst1),
9973 /* Optimize pow(x,c)/x as pow(x,c-1). */
9974 if (fcode0 == BUILT_IN_POW
9975 || fcode0 == BUILT_IN_POWF
9976 || fcode0 == BUILT_IN_POWL)
9978 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
9979 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
9980 if (TREE_CODE (arg01) == REAL_CST
9981 && ! TREE_CONSTANT_OVERFLOW (arg01)
9982 && operand_equal_p (arg1, arg00, 0))
9984 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
9988 c = TREE_REAL_CST (arg01);
9989 real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
9990 arg = build_real (type, c);
9991 arglist = build_tree_list (NULL_TREE, arg);
9992 arglist = tree_cons (NULL_TREE, arg1, arglist);
9993 return build_function_call_expr (powfn, arglist);
9997 /* Optimize x/expN(y) into x*expN(-y). */
9998 if (BUILTIN_EXPONENT_P (fcode1))
10000 tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
10001 tree arg = negate_expr (TREE_VALUE (TREE_OPERAND (arg1, 1)));
10002 tree arglist = build_tree_list (NULL_TREE,
10003 fold_convert (type, arg));
10004 arg1 = build_function_call_expr (expfn, arglist);
10005 return fold_build2 (MULT_EXPR, type, arg0, arg1);
10008 /* Optimize x/pow(y,z) into x*pow(y,-z). */
10009 if (fcode1 == BUILT_IN_POW
10010 || fcode1 == BUILT_IN_POWF
10011 || fcode1 == BUILT_IN_POWL)
10013 tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
10014 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
10015 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1, 1)));
10016 tree neg11 = fold_convert (type, negate_expr (arg11));
10017 tree arglist = tree_cons(NULL_TREE, arg10,
10018 build_tree_list (NULL_TREE, neg11));
10019 arg1 = build_function_call_expr (powfn, arglist);
10020 return fold_build2 (MULT_EXPR, type, arg0, arg1);
10025 case TRUNC_DIV_EXPR:
10026 case FLOOR_DIV_EXPR:
10027 /* Simplify A / (B << N) where A and B are positive and B is
10028 a power of 2, to A >> (N + log2(B)). */
10029 strict_overflow_p = false;
10030 if (TREE_CODE (arg1) == LSHIFT_EXPR
10031 && (TYPE_UNSIGNED (type)
10032 || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10034 tree sval = TREE_OPERAND (arg1, 0);
10035 if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
10037 tree sh_cnt = TREE_OPERAND (arg1, 1);
10038 unsigned long pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
10040 if (strict_overflow_p)
10041 fold_overflow_warning (("assuming signed overflow does not "
10042 "occur when simplifying A / (B << N)"),
10043 WARN_STRICT_OVERFLOW_MISC);
10045 sh_cnt = fold_build2 (PLUS_EXPR, TREE_TYPE (sh_cnt),
10046 sh_cnt, build_int_cst (NULL_TREE, pow2));
10047 return fold_build2 (RSHIFT_EXPR, type,
10048 fold_convert (type, arg0), sh_cnt);
10053 case ROUND_DIV_EXPR:
10054 case CEIL_DIV_EXPR:
10055 case EXACT_DIV_EXPR:
10056 if (integer_onep (arg1))
10057 return non_lvalue (fold_convert (type, arg0));
10058 if (integer_zerop (arg1))
10060 /* X / -1 is -X. */
10061 if (!TYPE_UNSIGNED (type)
10062 && TREE_CODE (arg1) == INTEGER_CST
10063 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10064 && TREE_INT_CST_HIGH (arg1) == -1)
10065 return fold_convert (type, negate_expr (arg0));
10067 /* Convert -A / -B to A / B when the type is signed and overflow is
10069 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10070 && TREE_CODE (arg0) == NEGATE_EXPR
10071 && negate_expr_p (arg1))
10073 if (INTEGRAL_TYPE_P (type))
10074 fold_overflow_warning (("assuming signed overflow does not occur "
10075 "when distributing negation across "
10077 WARN_STRICT_OVERFLOW_MISC);
10078 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10079 negate_expr (arg1));
10081 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
10082 && TREE_CODE (arg1) == NEGATE_EXPR
10083 && negate_expr_p (arg0))
10085 if (INTEGRAL_TYPE_P (type))
10086 fold_overflow_warning (("assuming signed overflow does not occur "
10087 "when distributing negation across "
10089 WARN_STRICT_OVERFLOW_MISC);
10090 return fold_build2 (code, type, negate_expr (arg0),
10091 TREE_OPERAND (arg1, 0));
10094 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
10095 operation, EXACT_DIV_EXPR.
10097 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
10098 At one time others generated faster code, it's not clear if they do
10099 after the last round to changes to the DIV code in expmed.c. */
10100 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
10101 && multiple_of_p (type, arg0, arg1))
10102 return fold_build2 (EXACT_DIV_EXPR, type, arg0, arg1);
10104 strict_overflow_p = false;
10105 if (TREE_CODE (arg1) == INTEGER_CST
10106 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10107 &strict_overflow_p)))
10109 if (strict_overflow_p)
10110 fold_overflow_warning (("assuming signed overflow does not occur "
10111 "when simplifying division"),
10112 WARN_STRICT_OVERFLOW_MISC);
10113 return fold_convert (type, tem);
10118 case CEIL_MOD_EXPR:
10119 case FLOOR_MOD_EXPR:
10120 case ROUND_MOD_EXPR:
10121 case TRUNC_MOD_EXPR:
10122 /* X % 1 is always zero, but be sure to preserve any side
10124 if (integer_onep (arg1))
10125 return omit_one_operand (type, integer_zero_node, arg0);
10127 /* X % 0, return X % 0 unchanged so that we can get the
10128 proper warnings and errors. */
10129 if (integer_zerop (arg1))
10132 /* 0 % X is always zero, but be sure to preserve any side
10133 effects in X. Place this after checking for X == 0. */
10134 if (integer_zerop (arg0))
10135 return omit_one_operand (type, integer_zero_node, arg1);
10137 /* X % -1 is zero. */
10138 if (!TYPE_UNSIGNED (type)
10139 && TREE_CODE (arg1) == INTEGER_CST
10140 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
10141 && TREE_INT_CST_HIGH (arg1) == -1)
10142 return omit_one_operand (type, integer_zero_node, arg0);
10144 /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
10145 i.e. "X % C" into "X & (C - 1)", if X and C are positive. */
10146 strict_overflow_p = false;
10147 if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
10148 && (TYPE_UNSIGNED (type)
10149 || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
10152 /* Also optimize A % (C << N) where C is a power of 2,
10153 to A & ((C << N) - 1). */
10154 if (TREE_CODE (arg1) == LSHIFT_EXPR)
10155 c = TREE_OPERAND (arg1, 0);
10157 if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
10159 tree mask = fold_build2 (MINUS_EXPR, TREE_TYPE (arg1),
10160 arg1, integer_one_node);
10161 if (strict_overflow_p)
10162 fold_overflow_warning (("assuming signed overflow does not "
10163 "occur when simplifying "
10164 "X % (power of two)"),
10165 WARN_STRICT_OVERFLOW_MISC);
10166 return fold_build2 (BIT_AND_EXPR, type,
10167 fold_convert (type, arg0),
10168 fold_convert (type, mask));
10172 /* X % -C is the same as X % C. */
10173 if (code == TRUNC_MOD_EXPR
10174 && !TYPE_UNSIGNED (type)
10175 && TREE_CODE (arg1) == INTEGER_CST
10176 && !TREE_CONSTANT_OVERFLOW (arg1)
10177 && TREE_INT_CST_HIGH (arg1) < 0
10178 && !TYPE_OVERFLOW_TRAPS (type)
10179 /* Avoid this transformation if C is INT_MIN, i.e. C == -C. */
10180 && !sign_bit_p (arg1, arg1))
10181 return fold_build2 (code, type, fold_convert (type, arg0),
10182 fold_convert (type, negate_expr (arg1)));
10184 /* X % -Y is the same as X % Y. */
10185 if (code == TRUNC_MOD_EXPR
10186 && !TYPE_UNSIGNED (type)
10187 && TREE_CODE (arg1) == NEGATE_EXPR
10188 && !TYPE_OVERFLOW_TRAPS (type))
10189 return fold_build2 (code, type, fold_convert (type, arg0),
10190 fold_convert (type, TREE_OPERAND (arg1, 0)));
10192 if (TREE_CODE (arg1) == INTEGER_CST
10193 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10194 &strict_overflow_p)))
10196 if (strict_overflow_p)
10197 fold_overflow_warning (("assuming signed overflow does not occur "
10198 "when simplifying modulos"),
10199 WARN_STRICT_OVERFLOW_MISC);
10200 return fold_convert (type, tem);
10207 if (integer_all_onesp (arg0))
10208 return omit_one_operand (type, arg0, arg1);
10212 /* Optimize -1 >> x for arithmetic right shifts. */
10213 if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
10214 return omit_one_operand (type, arg0, arg1);
10215 /* ... fall through ... */
10219 if (integer_zerop (arg1))
10220 return non_lvalue (fold_convert (type, arg0));
10221 if (integer_zerop (arg0))
10222 return omit_one_operand (type, arg0, arg1);
10224 /* Since negative shift count is not well-defined,
10225 don't try to compute it in the compiler. */
10226 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
10229 /* Turn (a OP c1) OP c2 into a OP (c1+c2). */
10230 if (TREE_CODE (op0) == code && host_integerp (arg1, false)
10231 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10232 && host_integerp (TREE_OPERAND (arg0, 1), false)
10233 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10235 HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
10236 + TREE_INT_CST_LOW (arg1));
10238 /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
10239 being well defined. */
10240 if (low >= TYPE_PRECISION (type))
10242 if (code == LROTATE_EXPR || code == RROTATE_EXPR)
10243 low = low % TYPE_PRECISION (type);
10244 else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
10245 return build_int_cst (type, 0);
10247 low = TYPE_PRECISION (type) - 1;
10250 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10251 build_int_cst (type, low));
10254 /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
10255 into x & ((unsigned)-1 >> c) for unsigned types. */
10256 if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
10257 || (TYPE_UNSIGNED (type)
10258 && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
10259 && host_integerp (arg1, false)
10260 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
10261 && host_integerp (TREE_OPERAND (arg0, 1), false)
10262 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
10264 HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
10265 HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
10271 arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
10273 lshift = build_int_cst (type, -1);
10274 lshift = int_const_binop (code, lshift, arg1, 0);
10276 return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
10280 /* Rewrite an LROTATE_EXPR by a constant into an
10281 RROTATE_EXPR by a new constant. */
10282 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
10284 tree tem = build_int_cst (NULL_TREE,
10285 GET_MODE_BITSIZE (TYPE_MODE (type)));
10286 tem = fold_convert (TREE_TYPE (arg1), tem);
10287 tem = const_binop (MINUS_EXPR, tem, arg1, 0);
10288 return fold_build2 (RROTATE_EXPR, type, arg0, tem);
10291 /* If we have a rotate of a bit operation with the rotate count and
10292 the second operand of the bit operation both constant,
10293 permute the two operations. */
10294 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10295 && (TREE_CODE (arg0) == BIT_AND_EXPR
10296 || TREE_CODE (arg0) == BIT_IOR_EXPR
10297 || TREE_CODE (arg0) == BIT_XOR_EXPR)
10298 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10299 return fold_build2 (TREE_CODE (arg0), type,
10300 fold_build2 (code, type,
10301 TREE_OPERAND (arg0, 0), arg1),
10302 fold_build2 (code, type,
10303 TREE_OPERAND (arg0, 1), arg1));
10305 /* Two consecutive rotates adding up to the width of the mode can
10307 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
10308 && TREE_CODE (arg0) == RROTATE_EXPR
10309 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10310 && TREE_INT_CST_HIGH (arg1) == 0
10311 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
10312 && ((TREE_INT_CST_LOW (arg1)
10313 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
10314 == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
10315 return TREE_OPERAND (arg0, 0);
10320 if (operand_equal_p (arg0, arg1, 0))
10321 return omit_one_operand (type, arg0, arg1);
10322 if (INTEGRAL_TYPE_P (type)
10323 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
10324 return omit_one_operand (type, arg1, arg0);
10325 tem = fold_minmax (MIN_EXPR, type, arg0, arg1);
10331 if (operand_equal_p (arg0, arg1, 0))
10332 return omit_one_operand (type, arg0, arg1);
10333 if (INTEGRAL_TYPE_P (type)
10334 && TYPE_MAX_VALUE (type)
10335 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
10336 return omit_one_operand (type, arg1, arg0);
10337 tem = fold_minmax (MAX_EXPR, type, arg0, arg1);
10342 case TRUTH_ANDIF_EXPR:
10343 /* Note that the operands of this must be ints
10344 and their values must be 0 or 1.
10345 ("true" is a fixed value perhaps depending on the language.) */
10346 /* If first arg is constant zero, return it. */
10347 if (integer_zerop (arg0))
10348 return fold_convert (type, arg0);
10349 case TRUTH_AND_EXPR:
10350 /* If either arg is constant true, drop it. */
10351 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10352 return non_lvalue (fold_convert (type, arg1));
10353 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
10354 /* Preserve sequence points. */
10355 && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
10356 return non_lvalue (fold_convert (type, arg0));
10357 /* If second arg is constant zero, result is zero, but first arg
10358 must be evaluated. */
10359 if (integer_zerop (arg1))
10360 return omit_one_operand (type, arg1, arg0);
10361 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
10362 case will be handled here. */
10363 if (integer_zerop (arg0))
10364 return omit_one_operand (type, arg0, arg1);
10366 /* !X && X is always false. */
10367 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10368 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10369 return omit_one_operand (type, integer_zero_node, arg1);
10370 /* X && !X is always false. */
10371 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10372 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10373 return omit_one_operand (type, integer_zero_node, arg0);
10375 /* A < X && A + 1 > Y ==> A < X && A >= Y. Normally A + 1 > Y
10376 means A >= Y && A != MAX, but in this case we know that
10379 if (!TREE_SIDE_EFFECTS (arg0)
10380 && !TREE_SIDE_EFFECTS (arg1))
10382 tem = fold_to_nonsharp_ineq_using_bound (arg0, arg1);
10383 if (tem && !operand_equal_p (tem, arg0, 0))
10384 return fold_build2 (code, type, tem, arg1);
10386 tem = fold_to_nonsharp_ineq_using_bound (arg1, arg0);
10387 if (tem && !operand_equal_p (tem, arg1, 0))
10388 return fold_build2 (code, type, arg0, tem);
10392 /* We only do these simplifications if we are optimizing. */
10396 /* Check for things like (A || B) && (A || C). We can convert this
10397 to A || (B && C). Note that either operator can be any of the four
10398 truth and/or operations and the transformation will still be
10399 valid. Also note that we only care about order for the
10400 ANDIF and ORIF operators. If B contains side effects, this
10401 might change the truth-value of A. */
10402 if (TREE_CODE (arg0) == TREE_CODE (arg1)
10403 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
10404 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
10405 || TREE_CODE (arg0) == TRUTH_AND_EXPR
10406 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
10407 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
10409 tree a00 = TREE_OPERAND (arg0, 0);
10410 tree a01 = TREE_OPERAND (arg0, 1);
10411 tree a10 = TREE_OPERAND (arg1, 0);
10412 tree a11 = TREE_OPERAND (arg1, 1);
10413 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
10414 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
10415 && (code == TRUTH_AND_EXPR
10416 || code == TRUTH_OR_EXPR));
10418 if (operand_equal_p (a00, a10, 0))
10419 return fold_build2 (TREE_CODE (arg0), type, a00,
10420 fold_build2 (code, type, a01, a11));
10421 else if (commutative && operand_equal_p (a00, a11, 0))
10422 return fold_build2 (TREE_CODE (arg0), type, a00,
10423 fold_build2 (code, type, a01, a10));
10424 else if (commutative && operand_equal_p (a01, a10, 0))
10425 return fold_build2 (TREE_CODE (arg0), type, a01,
10426 fold_build2 (code, type, a00, a11));
10428 /* This case if tricky because we must either have commutative
10429 operators or else A10 must not have side-effects. */
10431 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
10432 && operand_equal_p (a01, a11, 0))
10433 return fold_build2 (TREE_CODE (arg0), type,
10434 fold_build2 (code, type, a00, a10),
10438 /* See if we can build a range comparison. */
10439 if (0 != (tem = fold_range_test (code, type, op0, op1)))
10442 /* Check for the possibility of merging component references. If our
10443 lhs is another similar operation, try to merge its rhs with our
10444 rhs. Then try to merge our lhs and rhs. */
10445 if (TREE_CODE (arg0) == code
10446 && 0 != (tem = fold_truthop (code, type,
10447 TREE_OPERAND (arg0, 1), arg1)))
10448 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
10450 if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
10455 case TRUTH_ORIF_EXPR:
10456 /* Note that the operands of this must be ints
10457 and their values must be 0 or true.
10458 ("true" is a fixed value perhaps depending on the language.) */
10459 /* If first arg is constant true, return it. */
10460 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10461 return fold_convert (type, arg0);
10462 case TRUTH_OR_EXPR:
10463 /* If either arg is constant zero, drop it. */
10464 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
10465 return non_lvalue (fold_convert (type, arg1));
10466 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
10467 /* Preserve sequence points. */
10468 && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
10469 return non_lvalue (fold_convert (type, arg0));
10470 /* If second arg is constant true, result is true, but we must
10471 evaluate first arg. */
10472 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
10473 return omit_one_operand (type, arg1, arg0);
10474 /* Likewise for first arg, but note this only occurs here for
10476 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
10477 return omit_one_operand (type, arg0, arg1);
10479 /* !X || X is always true. */
10480 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10481 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10482 return omit_one_operand (type, integer_one_node, arg1);
10483 /* X || !X is always true. */
10484 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10485 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10486 return omit_one_operand (type, integer_one_node, arg0);
10490 case TRUTH_XOR_EXPR:
10491 /* If the second arg is constant zero, drop it. */
10492 if (integer_zerop (arg1))
10493 return non_lvalue (fold_convert (type, arg0));
10494 /* If the second arg is constant true, this is a logical inversion. */
10495 if (integer_onep (arg1))
10497 /* Only call invert_truthvalue if operand is a truth value. */
10498 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
10499 tem = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
10501 tem = invert_truthvalue (arg0);
10502 return non_lvalue (fold_convert (type, tem));
10504 /* Identical arguments cancel to zero. */
10505 if (operand_equal_p (arg0, arg1, 0))
10506 return omit_one_operand (type, integer_zero_node, arg0);
10508 /* !X ^ X is always true. */
10509 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
10510 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10511 return omit_one_operand (type, integer_one_node, arg1);
10513 /* X ^ !X is always true. */
10514 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
10515 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10516 return omit_one_operand (type, integer_one_node, arg0);
10522 tem = fold_comparison (code, type, op0, op1);
10523 if (tem != NULL_TREE)
10526 /* bool_var != 0 becomes bool_var. */
10527 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
10528 && code == NE_EXPR)
10529 return non_lvalue (fold_convert (type, arg0));
10531 /* bool_var == 1 becomes bool_var. */
10532 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
10533 && code == EQ_EXPR)
10534 return non_lvalue (fold_convert (type, arg0));
10536 /* bool_var != 1 becomes !bool_var. */
10537 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
10538 && code == NE_EXPR)
10539 return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
10541 /* bool_var == 0 becomes !bool_var. */
10542 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
10543 && code == EQ_EXPR)
10544 return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
10546 /* ~a != C becomes a != ~C where C is a constant. Likewise for ==. */
10547 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10548 && TREE_CODE (arg1) == INTEGER_CST)
10550 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
10551 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10552 fold_build1 (BIT_NOT_EXPR, cmp_type,
10553 fold_convert (cmp_type, arg1)));
10556 /* If this is an equality comparison of the address of a non-weak
10557 object against zero, then we know the result. */
10558 if (TREE_CODE (arg0) == ADDR_EXPR
10559 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
10560 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
10561 && integer_zerop (arg1))
10562 return constant_boolean_node (code != EQ_EXPR, type);
10564 /* If this is an equality comparison of the address of two non-weak,
10565 unaliased symbols neither of which are extern (since we do not
10566 have access to attributes for externs), then we know the result. */
10567 if (TREE_CODE (arg0) == ADDR_EXPR
10568 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
10569 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
10570 && ! lookup_attribute ("alias",
10571 DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
10572 && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
10573 && TREE_CODE (arg1) == ADDR_EXPR
10574 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
10575 && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
10576 && ! lookup_attribute ("alias",
10577 DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
10578 && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
10580 /* We know that we're looking at the address of two
10581 non-weak, unaliased, static _DECL nodes.
10583 It is both wasteful and incorrect to call operand_equal_p
10584 to compare the two ADDR_EXPR nodes. It is wasteful in that
10585 all we need to do is test pointer equality for the arguments
10586 to the two ADDR_EXPR nodes. It is incorrect to use
10587 operand_equal_p as that function is NOT equivalent to a
10588 C equality test. It can in fact return false for two
10589 objects which would test as equal using the C equality
10591 bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
10592 return constant_boolean_node (equal
10593 ? code == EQ_EXPR : code != EQ_EXPR,
10597 /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
10598 a MINUS_EXPR of a constant, we can convert it into a comparison with
10599 a revised constant as long as no overflow occurs. */
10600 if (TREE_CODE (arg1) == INTEGER_CST
10601 && (TREE_CODE (arg0) == PLUS_EXPR
10602 || TREE_CODE (arg0) == MINUS_EXPR)
10603 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10604 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
10605 ? MINUS_EXPR : PLUS_EXPR,
10606 fold_convert (TREE_TYPE (arg0), arg1),
10607 TREE_OPERAND (arg0, 1), 0))
10608 && ! TREE_CONSTANT_OVERFLOW (tem))
10609 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
10611 /* Similarly for a NEGATE_EXPR. */
10612 if (TREE_CODE (arg0) == NEGATE_EXPR
10613 && TREE_CODE (arg1) == INTEGER_CST
10614 && 0 != (tem = negate_expr (arg1))
10615 && TREE_CODE (tem) == INTEGER_CST
10616 && ! TREE_CONSTANT_OVERFLOW (tem))
10617 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), tem);
10619 /* If we have X - Y == 0, we can convert that to X == Y and similarly
10620 for !=. Don't do this for ordered comparisons due to overflow. */
10621 if (TREE_CODE (arg0) == MINUS_EXPR
10622 && integer_zerop (arg1))
10623 return fold_build2 (code, type,
10624 TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
10626 /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */
10627 if (TREE_CODE (arg0) == ABS_EXPR
10628 && (integer_zerop (arg1) || real_zerop (arg1)))
10629 return fold_build2 (code, type, TREE_OPERAND (arg0, 0), arg1);
10631 /* If this is an EQ or NE comparison with zero and ARG0 is
10632 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
10633 two operations, but the latter can be done in one less insn
10634 on machines that have only two-operand insns or on which a
10635 constant cannot be the first operand. */
10636 if (TREE_CODE (arg0) == BIT_AND_EXPR
10637 && integer_zerop (arg1))
10639 tree arg00 = TREE_OPERAND (arg0, 0);
10640 tree arg01 = TREE_OPERAND (arg0, 1);
10641 if (TREE_CODE (arg00) == LSHIFT_EXPR
10642 && integer_onep (TREE_OPERAND (arg00, 0)))
10644 fold_build2 (code, type,
10645 build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10646 build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
10647 arg01, TREE_OPERAND (arg00, 1)),
10648 fold_convert (TREE_TYPE (arg0),
10649 integer_one_node)),
10651 else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
10652 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
10654 fold_build2 (code, type,
10655 build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10656 build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
10657 arg00, TREE_OPERAND (arg01, 1)),
10658 fold_convert (TREE_TYPE (arg0),
10659 integer_one_node)),
10663 /* If this is an NE or EQ comparison of zero against the result of a
10664 signed MOD operation whose second operand is a power of 2, make
10665 the MOD operation unsigned since it is simpler and equivalent. */
10666 if (integer_zerop (arg1)
10667 && !TYPE_UNSIGNED (TREE_TYPE (arg0))
10668 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
10669 || TREE_CODE (arg0) == CEIL_MOD_EXPR
10670 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
10671 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
10672 && integer_pow2p (TREE_OPERAND (arg0, 1)))
10674 tree newtype = lang_hooks.types.unsigned_type (TREE_TYPE (arg0));
10675 tree newmod = fold_build2 (TREE_CODE (arg0), newtype,
10676 fold_convert (newtype,
10677 TREE_OPERAND (arg0, 0)),
10678 fold_convert (newtype,
10679 TREE_OPERAND (arg0, 1)));
10681 return fold_build2 (code, type, newmod,
10682 fold_convert (newtype, arg1));
10685 /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
10686 C1 is a valid shift constant, and C2 is a power of two, i.e.
10688 if (TREE_CODE (arg0) == BIT_AND_EXPR
10689 && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
10690 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
10692 && integer_pow2p (TREE_OPERAND (arg0, 1))
10693 && integer_zerop (arg1))
10695 tree itype = TREE_TYPE (arg0);
10696 unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
10697 tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
10699 /* Check for a valid shift count. */
10700 if (TREE_INT_CST_HIGH (arg001) == 0
10701 && TREE_INT_CST_LOW (arg001) < prec)
10703 tree arg01 = TREE_OPERAND (arg0, 1);
10704 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
10705 unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
10706 /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
10707 can be rewritten as (X & (C2 << C1)) != 0. */
10708 if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
10710 tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001);
10711 tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem);
10712 return fold_build2 (code, type, tem, arg1);
10714 /* Otherwise, for signed (arithmetic) shifts,
10715 ((X >> C1) & C2) != 0 is rewritten as X < 0, and
10716 ((X >> C1) & C2) == 0 is rewritten as X >= 0. */
10717 else if (!TYPE_UNSIGNED (itype))
10718 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
10719 arg000, build_int_cst (itype, 0));
10720 /* Otherwise, of unsigned (logical) shifts,
10721 ((X >> C1) & C2) != 0 is rewritten as (X,false), and
10722 ((X >> C1) & C2) == 0 is rewritten as (X,true). */
10724 return omit_one_operand (type,
10725 code == EQ_EXPR ? integer_one_node
10726 : integer_zero_node,
10731 /* If this is an NE comparison of zero with an AND of one, remove the
10732 comparison since the AND will give the correct value. */
10733 if (code == NE_EXPR
10734 && integer_zerop (arg1)
10735 && TREE_CODE (arg0) == BIT_AND_EXPR
10736 && integer_onep (TREE_OPERAND (arg0, 1)))
10737 return fold_convert (type, arg0);
10739 /* If we have (A & C) == C where C is a power of 2, convert this into
10740 (A & C) != 0. Similarly for NE_EXPR. */
10741 if (TREE_CODE (arg0) == BIT_AND_EXPR
10742 && integer_pow2p (TREE_OPERAND (arg0, 1))
10743 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10744 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
10745 arg0, fold_convert (TREE_TYPE (arg0),
10746 integer_zero_node));
10748 /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
10749 bit, then fold the expression into A < 0 or A >= 0. */
10750 tem = fold_single_bit_test_into_sign_test (code, arg0, arg1, type);
10754 /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
10755 Similarly for NE_EXPR. */
10756 if (TREE_CODE (arg0) == BIT_AND_EXPR
10757 && TREE_CODE (arg1) == INTEGER_CST
10758 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10760 tree notc = fold_build1 (BIT_NOT_EXPR,
10761 TREE_TYPE (TREE_OPERAND (arg0, 1)),
10762 TREE_OPERAND (arg0, 1));
10763 tree dandnotc = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10765 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
10766 if (integer_nonzerop (dandnotc))
10767 return omit_one_operand (type, rslt, arg0);
10770 /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
10771 Similarly for NE_EXPR. */
10772 if (TREE_CODE (arg0) == BIT_IOR_EXPR
10773 && TREE_CODE (arg1) == INTEGER_CST
10774 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10776 tree notd = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
10777 tree candnotd = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10778 TREE_OPERAND (arg0, 1), notd);
10779 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
10780 if (integer_nonzerop (candnotd))
10781 return omit_one_operand (type, rslt, arg0);
10784 /* If this is a comparison of a field, we may be able to simplify it. */
10785 if (((TREE_CODE (arg0) == COMPONENT_REF
10786 && lang_hooks.can_use_bit_fields_p ())
10787 || TREE_CODE (arg0) == BIT_FIELD_REF)
10788 /* Handle the constant case even without -O
10789 to make sure the warnings are given. */
10790 && (optimize || TREE_CODE (arg1) == INTEGER_CST))
10792 t1 = optimize_bit_field_compare (code, type, arg0, arg1);
10797 /* Optimize comparisons of strlen vs zero to a compare of the
10798 first character of the string vs zero. To wit,
10799 strlen(ptr) == 0 => *ptr == 0
10800 strlen(ptr) != 0 => *ptr != 0
10801 Other cases should reduce to one of these two (or a constant)
10802 due to the return value of strlen being unsigned. */
10803 if (TREE_CODE (arg0) == CALL_EXPR
10804 && integer_zerop (arg1))
10806 tree fndecl = get_callee_fndecl (arg0);
10810 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
10811 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
10812 && (arglist = TREE_OPERAND (arg0, 1))
10813 && TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
10814 && ! TREE_CHAIN (arglist))
10816 tree iref = build_fold_indirect_ref (TREE_VALUE (arglist));
10817 return fold_build2 (code, type, iref,
10818 build_int_cst (TREE_TYPE (iref), 0));
10822 /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
10823 of X. Similarly fold (X >> C) == 0 into X >= 0. */
10824 if (TREE_CODE (arg0) == RSHIFT_EXPR
10825 && integer_zerop (arg1)
10826 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10828 tree arg00 = TREE_OPERAND (arg0, 0);
10829 tree arg01 = TREE_OPERAND (arg0, 1);
10830 tree itype = TREE_TYPE (arg00);
10831 if (TREE_INT_CST_HIGH (arg01) == 0
10832 && TREE_INT_CST_LOW (arg01)
10833 == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
10835 if (TYPE_UNSIGNED (itype))
10837 itype = lang_hooks.types.signed_type (itype);
10838 arg00 = fold_convert (itype, arg00);
10840 return fold_build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
10841 type, arg00, build_int_cst (itype, 0));
10845 /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y. */
10846 if (integer_zerop (arg1)
10847 && TREE_CODE (arg0) == BIT_XOR_EXPR)
10848 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10849 TREE_OPERAND (arg0, 1));
10851 /* (X ^ Y) == Y becomes X == 0. We know that Y has no side-effects. */
10852 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10853 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
10854 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10855 build_int_cst (TREE_TYPE (arg1), 0));
10856 /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */
10857 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10858 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10859 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
10860 return fold_build2 (code, type, TREE_OPERAND (arg0, 1),
10861 build_int_cst (TREE_TYPE (arg1), 0));
10863 /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */
10864 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10865 && TREE_CODE (arg1) == INTEGER_CST
10866 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10867 return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
10868 fold_build2 (BIT_XOR_EXPR, TREE_TYPE (arg1),
10869 TREE_OPERAND (arg0, 1), arg1));
10871 /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
10872 (X & C) == 0 when C is a single bit. */
10873 if (TREE_CODE (arg0) == BIT_AND_EXPR
10874 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
10875 && integer_zerop (arg1)
10876 && integer_pow2p (TREE_OPERAND (arg0, 1)))
10878 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
10879 TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
10880 TREE_OPERAND (arg0, 1));
10881 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
10885 /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
10886 constant C is a power of two, i.e. a single bit. */
10887 if (TREE_CODE (arg0) == BIT_XOR_EXPR
10888 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
10889 && integer_zerop (arg1)
10890 && integer_pow2p (TREE_OPERAND (arg0, 1))
10891 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
10892 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
10894 tree arg00 = TREE_OPERAND (arg0, 0);
10895 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
10896 arg00, build_int_cst (TREE_TYPE (arg00), 0));
10899 /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
10900 when is C is a power of two, i.e. a single bit. */
10901 if (TREE_CODE (arg0) == BIT_AND_EXPR
10902 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
10903 && integer_zerop (arg1)
10904 && integer_pow2p (TREE_OPERAND (arg0, 1))
10905 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
10906 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
10908 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
10909 tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg000),
10910 arg000, TREE_OPERAND (arg0, 1));
10911 return fold_build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
10912 tem, build_int_cst (TREE_TYPE (tem), 0));
10915 if (integer_zerop (arg1)
10916 && tree_expr_nonzero_p (arg0))
10918 tree res = constant_boolean_node (code==NE_EXPR, type);
10919 return omit_one_operand (type, res, arg0);
10927 tem = fold_comparison (code, type, op0, op1);
10928 if (tem != NULL_TREE)
10931 /* Transform comparisons of the form X +- C CMP X. */
10932 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
10933 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
10934 && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
10935 && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
10936 || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10937 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
10939 tree arg01 = TREE_OPERAND (arg0, 1);
10940 enum tree_code code0 = TREE_CODE (arg0);
10943 if (TREE_CODE (arg01) == REAL_CST)
10944 is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
10946 is_positive = tree_int_cst_sgn (arg01);
10948 /* (X - c) > X becomes false. */
10949 if (code == GT_EXPR
10950 && ((code0 == MINUS_EXPR && is_positive >= 0)
10951 || (code0 == PLUS_EXPR && is_positive <= 0)))
10953 if (TREE_CODE (arg01) == INTEGER_CST
10954 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
10955 fold_overflow_warning (("assuming signed overflow does not "
10956 "occur when assuming that (X - c) > X "
10957 "is always false"),
10958 WARN_STRICT_OVERFLOW_ALL);
10959 return constant_boolean_node (0, type);
10962 /* Likewise (X + c) < X becomes false. */
10963 if (code == LT_EXPR
10964 && ((code0 == PLUS_EXPR && is_positive >= 0)
10965 || (code0 == MINUS_EXPR && is_positive <= 0)))
10967 if (TREE_CODE (arg01) == INTEGER_CST
10968 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
10969 fold_overflow_warning (("assuming signed overflow does not "
10970 "occur when assuming that "
10971 "(X + c) < X is always false"),
10972 WARN_STRICT_OVERFLOW_ALL);
10973 return constant_boolean_node (0, type);
10976 /* Convert (X - c) <= X to true. */
10977 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
10979 && ((code0 == MINUS_EXPR && is_positive >= 0)
10980 || (code0 == PLUS_EXPR && is_positive <= 0)))
10982 if (TREE_CODE (arg01) == INTEGER_CST
10983 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
10984 fold_overflow_warning (("assuming signed overflow does not "
10985 "occur when assuming that "
10986 "(X - c) <= X is always true"),
10987 WARN_STRICT_OVERFLOW_ALL);
10988 return constant_boolean_node (1, type);
10991 /* Convert (X + c) >= X to true. */
10992 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
10994 && ((code0 == PLUS_EXPR && is_positive >= 0)
10995 || (code0 == MINUS_EXPR && is_positive <= 0)))
10997 if (TREE_CODE (arg01) == INTEGER_CST
10998 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
10999 fold_overflow_warning (("assuming signed overflow does not "
11000 "occur when assuming that "
11001 "(X + c) >= X is always true"),
11002 WARN_STRICT_OVERFLOW_ALL);
11003 return constant_boolean_node (1, type);
11006 if (TREE_CODE (arg01) == INTEGER_CST)
11008 /* Convert X + c > X and X - c < X to true for integers. */
11009 if (code == GT_EXPR
11010 && ((code0 == PLUS_EXPR && is_positive > 0)
11011 || (code0 == MINUS_EXPR && is_positive < 0)))
11013 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11014 fold_overflow_warning (("assuming signed overflow does "
11015 "not occur when assuming that "
11016 "(X + c) > X is always true"),
11017 WARN_STRICT_OVERFLOW_ALL);
11018 return constant_boolean_node (1, type);
11021 if (code == LT_EXPR
11022 && ((code0 == MINUS_EXPR && is_positive > 0)
11023 || (code0 == PLUS_EXPR && is_positive < 0)))
11025 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11026 fold_overflow_warning (("assuming signed overflow does "
11027 "not occur when assuming that "
11028 "(X - c) < X is always true"),
11029 WARN_STRICT_OVERFLOW_ALL);
11030 return constant_boolean_node (1, type);
11033 /* Convert X + c <= X and X - c >= X to false for integers. */
11034 if (code == LE_EXPR
11035 && ((code0 == PLUS_EXPR && is_positive > 0)
11036 || (code0 == MINUS_EXPR && is_positive < 0)))
11038 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11039 fold_overflow_warning (("assuming signed overflow does "
11040 "not occur when assuming that "
11041 "(X + c) <= X is always false"),
11042 WARN_STRICT_OVERFLOW_ALL);
11043 return constant_boolean_node (0, type);
11046 if (code == GE_EXPR
11047 && ((code0 == MINUS_EXPR && is_positive > 0)
11048 || (code0 == PLUS_EXPR && is_positive < 0)))
11050 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
11051 fold_overflow_warning (("assuming signed overflow does "
11052 "not occur when assuming that "
11053 "(X - c) >= X is always true"),
11054 WARN_STRICT_OVERFLOW_ALL);
11055 return constant_boolean_node (0, type);
11060 /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
11061 This transformation affects the cases which are handled in later
11062 optimizations involving comparisons with non-negative constants. */
11063 if (TREE_CODE (arg1) == INTEGER_CST
11064 && TREE_CODE (arg0) != INTEGER_CST
11065 && tree_int_cst_sgn (arg1) > 0)
11067 if (code == GE_EXPR)
11069 arg1 = const_binop (MINUS_EXPR, arg1,
11070 build_int_cst (TREE_TYPE (arg1), 1), 0);
11071 return fold_build2 (GT_EXPR, type, arg0,
11072 fold_convert (TREE_TYPE (arg0), arg1));
11074 if (code == LT_EXPR)
11076 arg1 = const_binop (MINUS_EXPR, arg1,
11077 build_int_cst (TREE_TYPE (arg1), 1), 0);
11078 return fold_build2 (LE_EXPR, type, arg0,
11079 fold_convert (TREE_TYPE (arg0), arg1));
11083 /* Comparisons with the highest or lowest possible integer of
11084 the specified size will have known values. */
11086 int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg1)));
11088 if (TREE_CODE (arg1) == INTEGER_CST
11089 && ! TREE_CONSTANT_OVERFLOW (arg1)
11090 && width <= 2 * HOST_BITS_PER_WIDE_INT
11091 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
11092 || POINTER_TYPE_P (TREE_TYPE (arg1))))
11094 HOST_WIDE_INT signed_max_hi;
11095 unsigned HOST_WIDE_INT signed_max_lo;
11096 unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
11098 if (width <= HOST_BITS_PER_WIDE_INT)
11100 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11105 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
11107 max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11113 max_lo = signed_max_lo;
11114 min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11120 width -= HOST_BITS_PER_WIDE_INT;
11121 signed_max_lo = -1;
11122 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
11127 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
11129 max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
11134 max_hi = signed_max_hi;
11135 min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
11139 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
11140 && TREE_INT_CST_LOW (arg1) == max_lo)
11144 return omit_one_operand (type, integer_zero_node, arg0);
11147 return fold_build2 (EQ_EXPR, type, op0, op1);
11150 return omit_one_operand (type, integer_one_node, arg0);
11153 return fold_build2 (NE_EXPR, type, op0, op1);
11155 /* The GE_EXPR and LT_EXPR cases above are not normally
11156 reached because of previous transformations. */
11161 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11163 && TREE_INT_CST_LOW (arg1) == max_lo - 1)
11167 arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
11168 return fold_build2 (EQ_EXPR, type,
11169 fold_convert (TREE_TYPE (arg1), arg0),
11172 arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
11173 return fold_build2 (NE_EXPR, type,
11174 fold_convert (TREE_TYPE (arg1), arg0),
11179 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11181 && TREE_INT_CST_LOW (arg1) == min_lo)
11185 return omit_one_operand (type, integer_zero_node, arg0);
11188 return fold_build2 (EQ_EXPR, type, op0, op1);
11191 return omit_one_operand (type, integer_one_node, arg0);
11194 return fold_build2 (NE_EXPR, type, op0, op1);
11199 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
11201 && TREE_INT_CST_LOW (arg1) == min_lo + 1)
11205 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11206 return fold_build2 (NE_EXPR, type,
11207 fold_convert (TREE_TYPE (arg1), arg0),
11210 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
11211 return fold_build2 (EQ_EXPR, type,
11212 fold_convert (TREE_TYPE (arg1), arg0),
11218 else if (!in_gimple_form
11219 && TREE_INT_CST_HIGH (arg1) == signed_max_hi
11220 && TREE_INT_CST_LOW (arg1) == signed_max_lo
11221 && TYPE_UNSIGNED (TREE_TYPE (arg1))
11222 /* signed_type does not work on pointer types. */
11223 && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
11225 /* The following case also applies to X < signed_max+1
11226 and X >= signed_max+1 because previous transformations. */
11227 if (code == LE_EXPR || code == GT_EXPR)
11230 st = lang_hooks.types.signed_type (TREE_TYPE (arg1));
11231 return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
11232 type, fold_convert (st, arg0),
11233 build_int_cst (st, 0));
11239 /* If we are comparing an ABS_EXPR with a constant, we can
11240 convert all the cases into explicit comparisons, but they may
11241 well not be faster than doing the ABS and one comparison.
11242 But ABS (X) <= C is a range comparison, which becomes a subtraction
11243 and a comparison, and is probably faster. */
11244 if (code == LE_EXPR
11245 && TREE_CODE (arg1) == INTEGER_CST
11246 && TREE_CODE (arg0) == ABS_EXPR
11247 && ! TREE_SIDE_EFFECTS (arg0)
11248 && (0 != (tem = negate_expr (arg1)))
11249 && TREE_CODE (tem) == INTEGER_CST
11250 && ! TREE_CONSTANT_OVERFLOW (tem))
11251 return fold_build2 (TRUTH_ANDIF_EXPR, type,
11252 build2 (GE_EXPR, type,
11253 TREE_OPERAND (arg0, 0), tem),
11254 build2 (LE_EXPR, type,
11255 TREE_OPERAND (arg0, 0), arg1));
11257 /* Convert ABS_EXPR<x> >= 0 to true. */
11258 strict_overflow_p = false;
11259 if (code == GE_EXPR
11260 && (integer_zerop (arg1)
11261 || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11262 && real_zerop (arg1)))
11263 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
11265 if (strict_overflow_p)
11266 fold_overflow_warning (("assuming signed overflow does not occur "
11267 "when simplifying comparison of "
11268 "absolute value and zero"),
11269 WARN_STRICT_OVERFLOW_CONDITIONAL);
11270 return omit_one_operand (type, integer_one_node, arg0);
11273 /* Convert ABS_EXPR<x> < 0 to false. */
11274 strict_overflow_p = false;
11275 if (code == LT_EXPR
11276 && (integer_zerop (arg1) || real_zerop (arg1))
11277 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
11279 if (strict_overflow_p)
11280 fold_overflow_warning (("assuming signed overflow does not occur "
11281 "when simplifying comparison of "
11282 "absolute value and zero"),
11283 WARN_STRICT_OVERFLOW_CONDITIONAL);
11284 return omit_one_operand (type, integer_zero_node, arg0);
11287 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
11288 and similarly for >= into !=. */
11289 if ((code == LT_EXPR || code == GE_EXPR)
11290 && TYPE_UNSIGNED (TREE_TYPE (arg0))
11291 && TREE_CODE (arg1) == LSHIFT_EXPR
11292 && integer_onep (TREE_OPERAND (arg1, 0)))
11293 return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
11294 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
11295 TREE_OPERAND (arg1, 1)),
11296 build_int_cst (TREE_TYPE (arg0), 0));
11298 if ((code == LT_EXPR || code == GE_EXPR)
11299 && TYPE_UNSIGNED (TREE_TYPE (arg0))
11300 && (TREE_CODE (arg1) == NOP_EXPR
11301 || TREE_CODE (arg1) == CONVERT_EXPR)
11302 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
11303 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
11305 build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
11306 fold_convert (TREE_TYPE (arg0),
11307 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
11308 TREE_OPERAND (TREE_OPERAND (arg1, 0),
11310 build_int_cst (TREE_TYPE (arg0), 0));
11314 case UNORDERED_EXPR:
11322 if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
11324 t1 = fold_relational_const (code, type, arg0, arg1);
11325 if (t1 != NULL_TREE)
11329 /* If the first operand is NaN, the result is constant. */
11330 if (TREE_CODE (arg0) == REAL_CST
11331 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
11332 && (code != LTGT_EXPR || ! flag_trapping_math))
11334 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
11335 ? integer_zero_node
11336 : integer_one_node;
11337 return omit_one_operand (type, t1, arg1);
11340 /* If the second operand is NaN, the result is constant. */
11341 if (TREE_CODE (arg1) == REAL_CST
11342 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
11343 && (code != LTGT_EXPR || ! flag_trapping_math))
11345 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
11346 ? integer_zero_node
11347 : integer_one_node;
11348 return omit_one_operand (type, t1, arg0);
11351 /* Simplify unordered comparison of something with itself. */
11352 if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
11353 && operand_equal_p (arg0, arg1, 0))
11354 return constant_boolean_node (1, type);
11356 if (code == LTGT_EXPR
11357 && !flag_trapping_math
11358 && operand_equal_p (arg0, arg1, 0))
11359 return constant_boolean_node (0, type);
11361 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
11363 tree targ0 = strip_float_extensions (arg0);
11364 tree targ1 = strip_float_extensions (arg1);
11365 tree newtype = TREE_TYPE (targ0);
11367 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
11368 newtype = TREE_TYPE (targ1);
11370 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
11371 return fold_build2 (code, type, fold_convert (newtype, targ0),
11372 fold_convert (newtype, targ1));
11377 case COMPOUND_EXPR:
11378 /* When pedantic, a compound expression can be neither an lvalue
11379 nor an integer constant expression. */
11380 if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
11382 /* Don't let (0, 0) be null pointer constant. */
11383 tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
11384 : fold_convert (type, arg1);
11385 return pedantic_non_lvalue (tem);
11388 if ((TREE_CODE (arg0) == REAL_CST
11389 && TREE_CODE (arg1) == REAL_CST)
11390 || (TREE_CODE (arg0) == INTEGER_CST
11391 && TREE_CODE (arg1) == INTEGER_CST))
11392 return build_complex (type, arg0, arg1);
11396 /* An ASSERT_EXPR should never be passed to fold_binary. */
11397 gcc_unreachable ();
11401 } /* switch (code) */
11404 /* Callback for walk_tree, looking for LABEL_EXPR.
11405 Returns tree TP if it is LABEL_EXPR. Otherwise it returns NULL_TREE.
11406 Do not check the sub-tree of GOTO_EXPR. */
11409 contains_label_1 (tree *tp,
11410 int *walk_subtrees,
11411 void *data ATTRIBUTE_UNUSED)
11413 switch (TREE_CODE (*tp))
11418 *walk_subtrees = 0;
11425 /* Checks whether the sub-tree ST contains a label LABEL_EXPR which is
11426 accessible from outside the sub-tree. Returns NULL_TREE if no
11427 addressable label is found. */
11430 contains_label_p (tree st)
11432 return (walk_tree (&st, contains_label_1 , NULL, NULL) != NULL_TREE);
11435 /* Fold a ternary expression of code CODE and type TYPE with operands
11436 OP0, OP1, and OP2. Return the folded expression if folding is
11437 successful. Otherwise, return NULL_TREE. */
11440 fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
11443 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
11444 enum tree_code_class kind = TREE_CODE_CLASS (code);
11446 gcc_assert (IS_EXPR_CODE_CLASS (kind)
11447 && TREE_CODE_LENGTH (code) == 3);
11449 /* Strip any conversions that don't change the mode. This is safe
11450 for every expression, except for a comparison expression because
11451 its signedness is derived from its operands. So, in the latter
11452 case, only strip conversions that don't change the signedness.
11454 Note that this is done as an internal manipulation within the
11455 constant folder, in order to find the simplest representation of
11456 the arguments so that their form can be studied. In any cases,
11457 the appropriate type conversions should be put back in the tree
11458 that will get out of the constant folder. */
11473 case COMPONENT_REF:
11474 if (TREE_CODE (arg0) == CONSTRUCTOR
11475 && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
11477 unsigned HOST_WIDE_INT idx;
11479 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
11486 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
11487 so all simple results must be passed through pedantic_non_lvalue. */
11488 if (TREE_CODE (arg0) == INTEGER_CST)
11490 tree unused_op = integer_zerop (arg0) ? op1 : op2;
11491 tem = integer_zerop (arg0) ? op2 : op1;
11492 /* Only optimize constant conditions when the selected branch
11493 has the same type as the COND_EXPR. This avoids optimizing
11494 away "c ? x : throw", where the throw has a void type.
11495 Avoid throwing away that operand which contains label. */
11496 if ((!TREE_SIDE_EFFECTS (unused_op)
11497 || !contains_label_p (unused_op))
11498 && (! VOID_TYPE_P (TREE_TYPE (tem))
11499 || VOID_TYPE_P (type)))
11500 return pedantic_non_lvalue (tem);
11503 if (operand_equal_p (arg1, op2, 0))
11504 return pedantic_omit_one_operand (type, arg1, arg0);
11506 /* If we have A op B ? A : C, we may be able to convert this to a
11507 simpler expression, depending on the operation and the values
11508 of B and C. Signed zeros prevent all of these transformations,
11509 for reasons given above each one.
11511 Also try swapping the arguments and inverting the conditional. */
11512 if (COMPARISON_CLASS_P (arg0)
11513 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
11514 arg1, TREE_OPERAND (arg0, 1))
11515 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
11517 tem = fold_cond_expr_with_comparison (type, arg0, op1, op2);
11522 if (COMPARISON_CLASS_P (arg0)
11523 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
11525 TREE_OPERAND (arg0, 1))
11526 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
11528 tem = fold_truth_not_expr (arg0);
11529 if (tem && COMPARISON_CLASS_P (tem))
11531 tem = fold_cond_expr_with_comparison (type, tem, op2, op1);
11537 /* If the second operand is simpler than the third, swap them
11538 since that produces better jump optimization results. */
11539 if (truth_value_p (TREE_CODE (arg0))
11540 && tree_swap_operands_p (op1, op2, false))
11542 /* See if this can be inverted. If it can't, possibly because
11543 it was a floating-point inequality comparison, don't do
11545 tem = fold_truth_not_expr (arg0);
11547 return fold_build3 (code, type, tem, op2, op1);
11550 /* Convert A ? 1 : 0 to simply A. */
11551 if (integer_onep (op1)
11552 && integer_zerop (op2)
11553 /* If we try to convert OP0 to our type, the
11554 call to fold will try to move the conversion inside
11555 a COND, which will recurse. In that case, the COND_EXPR
11556 is probably the best choice, so leave it alone. */
11557 && type == TREE_TYPE (arg0))
11558 return pedantic_non_lvalue (arg0);
11560 /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR
11561 over COND_EXPR in cases such as floating point comparisons. */
11562 if (integer_zerop (op1)
11563 && integer_onep (op2)
11564 && truth_value_p (TREE_CODE (arg0)))
11565 return pedantic_non_lvalue (fold_convert (type,
11566 invert_truthvalue (arg0)));
11568 /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>). */
11569 if (TREE_CODE (arg0) == LT_EXPR
11570 && integer_zerop (TREE_OPERAND (arg0, 1))
11571 && integer_zerop (op2)
11572 && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
11574 /* sign_bit_p only checks ARG1 bits within A's precision.
11575 If <sign bit of A> has wider type than A, bits outside
11576 of A's precision in <sign bit of A> need to be checked.
11577 If they are all 0, this optimization needs to be done
11578 in unsigned A's type, if they are all 1 in signed A's type,
11579 otherwise this can't be done. */
11580 if (TYPE_PRECISION (TREE_TYPE (tem))
11581 < TYPE_PRECISION (TREE_TYPE (arg1))
11582 && TYPE_PRECISION (TREE_TYPE (tem))
11583 < TYPE_PRECISION (type))
11585 unsigned HOST_WIDE_INT mask_lo;
11586 HOST_WIDE_INT mask_hi;
11587 int inner_width, outer_width;
11590 inner_width = TYPE_PRECISION (TREE_TYPE (tem));
11591 outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
11592 if (outer_width > TYPE_PRECISION (type))
11593 outer_width = TYPE_PRECISION (type);
11595 if (outer_width > HOST_BITS_PER_WIDE_INT)
11597 mask_hi = ((unsigned HOST_WIDE_INT) -1
11598 >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
11604 mask_lo = ((unsigned HOST_WIDE_INT) -1
11605 >> (HOST_BITS_PER_WIDE_INT - outer_width));
11607 if (inner_width > HOST_BITS_PER_WIDE_INT)
11609 mask_hi &= ~((unsigned HOST_WIDE_INT) -1
11610 >> (HOST_BITS_PER_WIDE_INT - inner_width));
11614 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
11615 >> (HOST_BITS_PER_WIDE_INT - inner_width));
11617 if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
11618 && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
11620 tem_type = lang_hooks.types.signed_type (TREE_TYPE (tem));
11621 tem = fold_convert (tem_type, tem);
11623 else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
11624 && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
11626 tem_type = lang_hooks.types.unsigned_type (TREE_TYPE (tem));
11627 tem = fold_convert (tem_type, tem);
11634 return fold_convert (type,
11635 fold_build2 (BIT_AND_EXPR,
11636 TREE_TYPE (tem), tem,
11637 fold_convert (TREE_TYPE (tem),
11641 /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was
11642 already handled above. */
11643 if (TREE_CODE (arg0) == BIT_AND_EXPR
11644 && integer_onep (TREE_OPERAND (arg0, 1))
11645 && integer_zerop (op2)
11646 && integer_pow2p (arg1))
11648 tree tem = TREE_OPERAND (arg0, 0);
11650 if (TREE_CODE (tem) == RSHIFT_EXPR
11651 && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
11652 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
11653 TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
11654 return fold_build2 (BIT_AND_EXPR, type,
11655 TREE_OPERAND (tem, 0), arg1);
11658 /* A & N ? N : 0 is simply A & N if N is a power of two. This
11659 is probably obsolete because the first operand should be a
11660 truth value (that's why we have the two cases above), but let's
11661 leave it in until we can confirm this for all front-ends. */
11662 if (integer_zerop (op2)
11663 && TREE_CODE (arg0) == NE_EXPR
11664 && integer_zerop (TREE_OPERAND (arg0, 1))
11665 && integer_pow2p (arg1)
11666 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
11667 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
11668 arg1, OEP_ONLY_CONST))
11669 return pedantic_non_lvalue (fold_convert (type,
11670 TREE_OPERAND (arg0, 0)));
11672 /* Convert A ? B : 0 into A && B if A and B are truth values. */
11673 if (integer_zerop (op2)
11674 && truth_value_p (TREE_CODE (arg0))
11675 && truth_value_p (TREE_CODE (arg1)))
11676 return fold_build2 (TRUTH_ANDIF_EXPR, type,
11677 fold_convert (type, arg0),
11680 /* Convert A ? B : 1 into !A || B if A and B are truth values. */
11681 if (integer_onep (op2)
11682 && truth_value_p (TREE_CODE (arg0))
11683 && truth_value_p (TREE_CODE (arg1)))
11685 /* Only perform transformation if ARG0 is easily inverted. */
11686 tem = fold_truth_not_expr (arg0);
11688 return fold_build2 (TRUTH_ORIF_EXPR, type,
11689 fold_convert (type, tem),
11693 /* Convert A ? 0 : B into !A && B if A and B are truth values. */
11694 if (integer_zerop (arg1)
11695 && truth_value_p (TREE_CODE (arg0))
11696 && truth_value_p (TREE_CODE (op2)))
11698 /* Only perform transformation if ARG0 is easily inverted. */
11699 tem = fold_truth_not_expr (arg0);
11701 return fold_build2 (TRUTH_ANDIF_EXPR, type,
11702 fold_convert (type, tem),
11706 /* Convert A ? 1 : B into A || B if A and B are truth values. */
11707 if (integer_onep (arg1)
11708 && truth_value_p (TREE_CODE (arg0))
11709 && truth_value_p (TREE_CODE (op2)))
11710 return fold_build2 (TRUTH_ORIF_EXPR, type,
11711 fold_convert (type, arg0),
11717 /* Check for a built-in function. */
11718 if (TREE_CODE (op0) == ADDR_EXPR
11719 && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
11720 && DECL_BUILT_IN (TREE_OPERAND (op0, 0)))
11721 return fold_builtin (TREE_OPERAND (op0, 0), op1, false);
11724 case BIT_FIELD_REF:
11725 if (TREE_CODE (arg0) == VECTOR_CST
11726 && type == TREE_TYPE (TREE_TYPE (arg0))
11727 && host_integerp (arg1, 1)
11728 && host_integerp (op2, 1))
11730 unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
11731 unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
11734 && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
11735 && (idx % width) == 0
11736 && (idx = idx / width)
11737 < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
11739 tree elements = TREE_VECTOR_CST_ELTS (arg0);
11740 while (idx-- > 0 && elements)
11741 elements = TREE_CHAIN (elements);
11743 return TREE_VALUE (elements);
11745 return fold_convert (type, integer_zero_node);
11752 } /* switch (code) */
11755 /* Perform constant folding and related simplification of EXPR.
11756 The related simplifications include x*1 => x, x*0 => 0, etc.,
11757 and application of the associative law.
11758 NOP_EXPR conversions may be removed freely (as long as we
11759 are careful not to change the type of the overall expression).
11760 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
11761 but we can constant-fold them if they have constant operands. */
11763 #ifdef ENABLE_FOLD_CHECKING
11764 # define fold(x) fold_1 (x)
11765 static tree fold_1 (tree);
11771 const tree t = expr;
11772 enum tree_code code = TREE_CODE (t);
11773 enum tree_code_class kind = TREE_CODE_CLASS (code);
11776 /* Return right away if a constant. */
11777 if (kind == tcc_constant)
11780 if (IS_EXPR_CODE_CLASS (kind))
11782 tree type = TREE_TYPE (t);
11783 tree op0, op1, op2;
11785 switch (TREE_CODE_LENGTH (code))
11788 op0 = TREE_OPERAND (t, 0);
11789 tem = fold_unary (code, type, op0);
11790 return tem ? tem : expr;
11792 op0 = TREE_OPERAND (t, 0);
11793 op1 = TREE_OPERAND (t, 1);
11794 tem = fold_binary (code, type, op0, op1);
11795 return tem ? tem : expr;
11797 op0 = TREE_OPERAND (t, 0);
11798 op1 = TREE_OPERAND (t, 1);
11799 op2 = TREE_OPERAND (t, 2);
11800 tem = fold_ternary (code, type, op0, op1, op2);
11801 return tem ? tem : expr;
11810 return fold (DECL_INITIAL (t));
11814 } /* switch (code) */
11817 #ifdef ENABLE_FOLD_CHECKING
11820 static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
11821 static void fold_check_failed (tree, tree);
11822 void print_fold_checksum (tree);
11824 /* When --enable-checking=fold, compute a digest of expr before
11825 and after actual fold call to see if fold did not accidentally
11826 change original expr. */
11832 struct md5_ctx ctx;
11833 unsigned char checksum_before[16], checksum_after[16];
11836 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
11837 md5_init_ctx (&ctx);
11838 fold_checksum_tree (expr, &ctx, ht);
11839 md5_finish_ctx (&ctx, checksum_before);
11842 ret = fold_1 (expr);
11844 md5_init_ctx (&ctx);
11845 fold_checksum_tree (expr, &ctx, ht);
11846 md5_finish_ctx (&ctx, checksum_after);
11849 if (memcmp (checksum_before, checksum_after, 16))
11850 fold_check_failed (expr, ret);
11856 print_fold_checksum (tree expr)
11858 struct md5_ctx ctx;
11859 unsigned char checksum[16], cnt;
11862 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
11863 md5_init_ctx (&ctx);
11864 fold_checksum_tree (expr, &ctx, ht);
11865 md5_finish_ctx (&ctx, checksum);
11867 for (cnt = 0; cnt < 16; ++cnt)
11868 fprintf (stderr, "%02x", checksum[cnt]);
11869 putc ('\n', stderr);
11873 fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
11875 internal_error ("fold check: original tree changed by fold");
11879 fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
11882 enum tree_code code;
11883 struct tree_function_decl buf;
11888 gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
11889 <= sizeof (struct tree_function_decl))
11890 && sizeof (struct tree_type) <= sizeof (struct tree_function_decl));
11893 slot = htab_find_slot (ht, expr, INSERT);
11897 code = TREE_CODE (expr);
11898 if (TREE_CODE_CLASS (code) == tcc_declaration
11899 && DECL_ASSEMBLER_NAME_SET_P (expr))
11901 /* Allow DECL_ASSEMBLER_NAME to be modified. */
11902 memcpy ((char *) &buf, expr, tree_size (expr));
11903 expr = (tree) &buf;
11904 SET_DECL_ASSEMBLER_NAME (expr, NULL);
11906 else if (TREE_CODE_CLASS (code) == tcc_type
11907 && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
11908 || TYPE_CACHED_VALUES_P (expr)
11909 || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
11911 /* Allow these fields to be modified. */
11912 memcpy ((char *) &buf, expr, tree_size (expr));
11913 expr = (tree) &buf;
11914 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
11915 TYPE_POINTER_TO (expr) = NULL;
11916 TYPE_REFERENCE_TO (expr) = NULL;
11917 if (TYPE_CACHED_VALUES_P (expr))
11919 TYPE_CACHED_VALUES_P (expr) = 0;
11920 TYPE_CACHED_VALUES (expr) = NULL;
11923 md5_process_bytes (expr, tree_size (expr), ctx);
11924 fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
11925 if (TREE_CODE_CLASS (code) != tcc_type
11926 && TREE_CODE_CLASS (code) != tcc_declaration
11927 && code != TREE_LIST)
11928 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
11929 switch (TREE_CODE_CLASS (code))
11935 md5_process_bytes (TREE_STRING_POINTER (expr),
11936 TREE_STRING_LENGTH (expr), ctx);
11939 fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
11940 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
11943 fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
11949 case tcc_exceptional:
11953 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
11954 fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
11955 expr = TREE_CHAIN (expr);
11956 goto recursive_label;
11959 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
11960 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
11966 case tcc_expression:
11967 case tcc_reference:
11968 case tcc_comparison:
11971 case tcc_statement:
11972 len = TREE_CODE_LENGTH (code);
11973 for (i = 0; i < len; ++i)
11974 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
11976 case tcc_declaration:
11977 fold_checksum_tree (DECL_NAME (expr), ctx, ht);
11978 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
11979 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
11981 fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
11982 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
11983 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
11984 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
11985 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
11987 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
11988 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
11990 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
11992 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
11993 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
11994 fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
11998 if (TREE_CODE (expr) == ENUMERAL_TYPE)
11999 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
12000 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
12001 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
12002 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
12003 fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
12004 if (INTEGRAL_TYPE_P (expr)
12005 || SCALAR_FLOAT_TYPE_P (expr))
12007 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
12008 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
12010 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
12011 if (TREE_CODE (expr) == RECORD_TYPE
12012 || TREE_CODE (expr) == UNION_TYPE
12013 || TREE_CODE (expr) == QUAL_UNION_TYPE)
12014 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
12015 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
12024 /* Fold a unary tree expression with code CODE of type TYPE with an
12025 operand OP0. Return a folded expression if successful. Otherwise,
12026 return a tree expression with code CODE of type TYPE with an
12030 fold_build1_stat (enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
12033 #ifdef ENABLE_FOLD_CHECKING
12034 unsigned char checksum_before[16], checksum_after[16];
12035 struct md5_ctx ctx;
12038 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12039 md5_init_ctx (&ctx);
12040 fold_checksum_tree (op0, &ctx, ht);
12041 md5_finish_ctx (&ctx, checksum_before);
12045 tem = fold_unary (code, type, op0);
12047 tem = build1_stat (code, type, op0 PASS_MEM_STAT);
12049 #ifdef ENABLE_FOLD_CHECKING
12050 md5_init_ctx (&ctx);
12051 fold_checksum_tree (op0, &ctx, ht);
12052 md5_finish_ctx (&ctx, checksum_after);
12055 if (memcmp (checksum_before, checksum_after, 16))
12056 fold_check_failed (op0, tem);
12061 /* Fold a binary tree expression with code CODE of type TYPE with
12062 operands OP0 and OP1. Return a folded expression if successful.
12063 Otherwise, return a tree expression with code CODE of type TYPE
12064 with operands OP0 and OP1. */
12067 fold_build2_stat (enum tree_code code, tree type, tree op0, tree op1
12071 #ifdef ENABLE_FOLD_CHECKING
12072 unsigned char checksum_before_op0[16],
12073 checksum_before_op1[16],
12074 checksum_after_op0[16],
12075 checksum_after_op1[16];
12076 struct md5_ctx ctx;
12079 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12080 md5_init_ctx (&ctx);
12081 fold_checksum_tree (op0, &ctx, ht);
12082 md5_finish_ctx (&ctx, checksum_before_op0);
12085 md5_init_ctx (&ctx);
12086 fold_checksum_tree (op1, &ctx, ht);
12087 md5_finish_ctx (&ctx, checksum_before_op1);
12091 tem = fold_binary (code, type, op0, op1);
12093 tem = build2_stat (code, type, op0, op1 PASS_MEM_STAT);
12095 #ifdef ENABLE_FOLD_CHECKING
12096 md5_init_ctx (&ctx);
12097 fold_checksum_tree (op0, &ctx, ht);
12098 md5_finish_ctx (&ctx, checksum_after_op0);
12101 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12102 fold_check_failed (op0, tem);
12104 md5_init_ctx (&ctx);
12105 fold_checksum_tree (op1, &ctx, ht);
12106 md5_finish_ctx (&ctx, checksum_after_op1);
12109 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12110 fold_check_failed (op1, tem);
12115 /* Fold a ternary tree expression with code CODE of type TYPE with
12116 operands OP0, OP1, and OP2. Return a folded expression if
12117 successful. Otherwise, return a tree expression with code CODE of
12118 type TYPE with operands OP0, OP1, and OP2. */
12121 fold_build3_stat (enum tree_code code, tree type, tree op0, tree op1, tree op2
12125 #ifdef ENABLE_FOLD_CHECKING
12126 unsigned char checksum_before_op0[16],
12127 checksum_before_op1[16],
12128 checksum_before_op2[16],
12129 checksum_after_op0[16],
12130 checksum_after_op1[16],
12131 checksum_after_op2[16];
12132 struct md5_ctx ctx;
12135 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
12136 md5_init_ctx (&ctx);
12137 fold_checksum_tree (op0, &ctx, ht);
12138 md5_finish_ctx (&ctx, checksum_before_op0);
12141 md5_init_ctx (&ctx);
12142 fold_checksum_tree (op1, &ctx, ht);
12143 md5_finish_ctx (&ctx, checksum_before_op1);
12146 md5_init_ctx (&ctx);
12147 fold_checksum_tree (op2, &ctx, ht);
12148 md5_finish_ctx (&ctx, checksum_before_op2);
12152 tem = fold_ternary (code, type, op0, op1, op2);
12154 tem = build3_stat (code, type, op0, op1, op2 PASS_MEM_STAT);
12156 #ifdef ENABLE_FOLD_CHECKING
12157 md5_init_ctx (&ctx);
12158 fold_checksum_tree (op0, &ctx, ht);
12159 md5_finish_ctx (&ctx, checksum_after_op0);
12162 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
12163 fold_check_failed (op0, tem);
12165 md5_init_ctx (&ctx);
12166 fold_checksum_tree (op1, &ctx, ht);
12167 md5_finish_ctx (&ctx, checksum_after_op1);
12170 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
12171 fold_check_failed (op1, tem);
12173 md5_init_ctx (&ctx);
12174 fold_checksum_tree (op2, &ctx, ht);
12175 md5_finish_ctx (&ctx, checksum_after_op2);
12178 if (memcmp (checksum_before_op2, checksum_after_op2, 16))
12179 fold_check_failed (op2, tem);
12184 /* Perform constant folding and related simplification of initializer
12185 expression EXPR. These behave identically to "fold_buildN" but ignore
12186 potential run-time traps and exceptions that fold must preserve. */
12188 #define START_FOLD_INIT \
12189 int saved_signaling_nans = flag_signaling_nans;\
12190 int saved_trapping_math = flag_trapping_math;\
12191 int saved_rounding_math = flag_rounding_math;\
12192 int saved_trapv = flag_trapv;\
12193 int saved_folding_initializer = folding_initializer;\
12194 flag_signaling_nans = 0;\
12195 flag_trapping_math = 0;\
12196 flag_rounding_math = 0;\
12198 folding_initializer = 1;
12200 #define END_FOLD_INIT \
12201 flag_signaling_nans = saved_signaling_nans;\
12202 flag_trapping_math = saved_trapping_math;\
12203 flag_rounding_math = saved_rounding_math;\
12204 flag_trapv = saved_trapv;\
12205 folding_initializer = saved_folding_initializer;
12208 fold_build1_initializer (enum tree_code code, tree type, tree op)
12213 result = fold_build1 (code, type, op);
12220 fold_build2_initializer (enum tree_code code, tree type, tree op0, tree op1)
12225 result = fold_build2 (code, type, op0, op1);
12232 fold_build3_initializer (enum tree_code code, tree type, tree op0, tree op1,
12238 result = fold_build3 (code, type, op0, op1, op2);
12244 #undef START_FOLD_INIT
12245 #undef END_FOLD_INIT
12247 /* Determine if first argument is a multiple of second argument. Return 0 if
12248 it is not, or we cannot easily determined it to be.
12250 An example of the sort of thing we care about (at this point; this routine
12251 could surely be made more general, and expanded to do what the *_DIV_EXPR's
12252 fold cases do now) is discovering that
12254 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
12260 when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
12262 This code also handles discovering that
12264 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
12266 is a multiple of 8 so we don't have to worry about dealing with a
12267 possible remainder.
12269 Note that we *look* inside a SAVE_EXPR only to determine how it was
12270 calculated; it is not safe for fold to do much of anything else with the
12271 internals of a SAVE_EXPR, since it cannot know when it will be evaluated
12272 at run time. For example, the latter example above *cannot* be implemented
12273 as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
12274 evaluation time of the original SAVE_EXPR is not necessarily the same at
12275 the time the new expression is evaluated. The only optimization of this
12276 sort that would be valid is changing
12278 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
12282 SAVE_EXPR (I) * SAVE_EXPR (J)
12284 (where the same SAVE_EXPR (J) is used in the original and the
12285 transformed version). */
12288 multiple_of_p (tree type, tree top, tree bottom)
12290 if (operand_equal_p (top, bottom, 0))
12293 if (TREE_CODE (type) != INTEGER_TYPE)
12296 switch (TREE_CODE (top))
12299 /* Bitwise and provides a power of two multiple. If the mask is
12300 a multiple of BOTTOM then TOP is a multiple of BOTTOM. */
12301 if (!integer_pow2p (bottom))
12306 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
12307 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
12311 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
12312 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
12315 if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
12319 op1 = TREE_OPERAND (top, 1);
12320 /* const_binop may not detect overflow correctly,
12321 so check for it explicitly here. */
12322 if (TYPE_PRECISION (TREE_TYPE (size_one_node))
12323 > TREE_INT_CST_LOW (op1)
12324 && TREE_INT_CST_HIGH (op1) == 0
12325 && 0 != (t1 = fold_convert (type,
12326 const_binop (LSHIFT_EXPR,
12329 && ! TREE_OVERFLOW (t1))
12330 return multiple_of_p (type, t1, bottom);
12335 /* Can't handle conversions from non-integral or wider integral type. */
12336 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
12337 || (TYPE_PRECISION (type)
12338 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
12341 /* .. fall through ... */
12344 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
12347 if (TREE_CODE (bottom) != INTEGER_CST
12348 || (TYPE_UNSIGNED (type)
12349 && (tree_int_cst_sgn (top) < 0
12350 || tree_int_cst_sgn (bottom) < 0)))
12352 return integer_zerop (const_binop (TRUNC_MOD_EXPR,
12360 /* Return true if `t' is known to be non-negative. If the return
12361 value is based on the assumption that signed overflow is undefined,
12362 set *STRICT_OVERFLOW_P to true; otherwise, don't change
12363 *STRICT_OVERFLOW_P. */
12366 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
12368 if (t == error_mark_node)
12371 if (TYPE_UNSIGNED (TREE_TYPE (t)))
12374 switch (TREE_CODE (t))
12377 /* Query VRP to see if it has recorded any information about
12378 the range of this object. */
12379 return ssa_name_nonnegative_p (t);
12382 /* We can't return 1 if flag_wrapv is set because
12383 ABS_EXPR<INT_MIN> = INT_MIN. */
12384 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
12386 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
12388 *strict_overflow_p = true;
12394 return tree_int_cst_sgn (t) >= 0;
12397 return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
12400 if (FLOAT_TYPE_P (TREE_TYPE (t)))
12401 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12403 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12404 strict_overflow_p));
12406 /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
12407 both unsigned and at least 2 bits shorter than the result. */
12408 if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
12409 && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
12410 && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
12412 tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
12413 tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
12414 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
12415 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
12417 unsigned int prec = MAX (TYPE_PRECISION (inner1),
12418 TYPE_PRECISION (inner2)) + 1;
12419 return prec < TYPE_PRECISION (TREE_TYPE (t));
12425 if (FLOAT_TYPE_P (TREE_TYPE (t)))
12427 /* x * x for floating point x is always non-negative. */
12428 if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
12430 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12432 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12433 strict_overflow_p));
12436 /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
12437 both unsigned and their total bits is shorter than the result. */
12438 if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
12439 && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
12440 && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
12442 tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
12443 tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
12444 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
12445 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
12446 return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
12447 < TYPE_PRECISION (TREE_TYPE (t));
12453 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12455 || tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12456 strict_overflow_p));
12462 case TRUNC_DIV_EXPR:
12463 case CEIL_DIV_EXPR:
12464 case FLOOR_DIV_EXPR:
12465 case ROUND_DIV_EXPR:
12466 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12468 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12469 strict_overflow_p));
12471 case TRUNC_MOD_EXPR:
12472 case CEIL_MOD_EXPR:
12473 case FLOOR_MOD_EXPR:
12474 case ROUND_MOD_EXPR:
12476 case NON_LVALUE_EXPR:
12478 case FIX_TRUNC_EXPR:
12479 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12480 strict_overflow_p);
12482 case COMPOUND_EXPR:
12484 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12485 strict_overflow_p);
12488 return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
12489 strict_overflow_p);
12492 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12494 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
12495 strict_overflow_p));
12499 tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
12500 tree outer_type = TREE_TYPE (t);
12502 if (TREE_CODE (outer_type) == REAL_TYPE)
12504 if (TREE_CODE (inner_type) == REAL_TYPE)
12505 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12506 strict_overflow_p);
12507 if (TREE_CODE (inner_type) == INTEGER_TYPE)
12509 if (TYPE_UNSIGNED (inner_type))
12511 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12512 strict_overflow_p);
12515 else if (TREE_CODE (outer_type) == INTEGER_TYPE)
12517 if (TREE_CODE (inner_type) == REAL_TYPE)
12518 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t,0),
12519 strict_overflow_p);
12520 if (TREE_CODE (inner_type) == INTEGER_TYPE)
12521 return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
12522 && TYPE_UNSIGNED (inner_type);
12529 tree temp = TARGET_EXPR_SLOT (t);
12530 t = TARGET_EXPR_INITIAL (t);
12532 /* If the initializer is non-void, then it's a normal expression
12533 that will be assigned to the slot. */
12534 if (!VOID_TYPE_P (t))
12535 return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
12537 /* Otherwise, the initializer sets the slot in some way. One common
12538 way is an assignment statement at the end of the initializer. */
12541 if (TREE_CODE (t) == BIND_EXPR)
12542 t = expr_last (BIND_EXPR_BODY (t));
12543 else if (TREE_CODE (t) == TRY_FINALLY_EXPR
12544 || TREE_CODE (t) == TRY_CATCH_EXPR)
12545 t = expr_last (TREE_OPERAND (t, 0));
12546 else if (TREE_CODE (t) == STATEMENT_LIST)
12551 if (TREE_CODE (t) == MODIFY_EXPR
12552 && TREE_OPERAND (t, 0) == temp)
12553 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12554 strict_overflow_p);
12561 tree fndecl = get_callee_fndecl (t);
12562 tree arglist = TREE_OPERAND (t, 1);
12563 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
12564 switch (DECL_FUNCTION_CODE (fndecl))
12566 CASE_FLT_FN (BUILT_IN_ACOS):
12567 CASE_FLT_FN (BUILT_IN_ACOSH):
12568 CASE_FLT_FN (BUILT_IN_CABS):
12569 CASE_FLT_FN (BUILT_IN_COSH):
12570 CASE_FLT_FN (BUILT_IN_ERFC):
12571 CASE_FLT_FN (BUILT_IN_EXP):
12572 CASE_FLT_FN (BUILT_IN_EXP10):
12573 CASE_FLT_FN (BUILT_IN_EXP2):
12574 CASE_FLT_FN (BUILT_IN_FABS):
12575 CASE_FLT_FN (BUILT_IN_FDIM):
12576 CASE_FLT_FN (BUILT_IN_HYPOT):
12577 CASE_FLT_FN (BUILT_IN_POW10):
12578 CASE_INT_FN (BUILT_IN_FFS):
12579 CASE_INT_FN (BUILT_IN_PARITY):
12580 CASE_INT_FN (BUILT_IN_POPCOUNT):
12584 CASE_FLT_FN (BUILT_IN_SQRT):
12585 /* sqrt(-0.0) is -0.0. */
12586 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
12588 return tree_expr_nonnegative_warnv_p (TREE_VALUE (arglist),
12589 strict_overflow_p);
12591 CASE_FLT_FN (BUILT_IN_ASINH):
12592 CASE_FLT_FN (BUILT_IN_ATAN):
12593 CASE_FLT_FN (BUILT_IN_ATANH):
12594 CASE_FLT_FN (BUILT_IN_CBRT):
12595 CASE_FLT_FN (BUILT_IN_CEIL):
12596 CASE_FLT_FN (BUILT_IN_ERF):
12597 CASE_FLT_FN (BUILT_IN_EXPM1):
12598 CASE_FLT_FN (BUILT_IN_FLOOR):
12599 CASE_FLT_FN (BUILT_IN_FMOD):
12600 CASE_FLT_FN (BUILT_IN_FREXP):
12601 CASE_FLT_FN (BUILT_IN_LCEIL):
12602 CASE_FLT_FN (BUILT_IN_LDEXP):
12603 CASE_FLT_FN (BUILT_IN_LFLOOR):
12604 CASE_FLT_FN (BUILT_IN_LLCEIL):
12605 CASE_FLT_FN (BUILT_IN_LLFLOOR):
12606 CASE_FLT_FN (BUILT_IN_LLRINT):
12607 CASE_FLT_FN (BUILT_IN_LLROUND):
12608 CASE_FLT_FN (BUILT_IN_LRINT):
12609 CASE_FLT_FN (BUILT_IN_LROUND):
12610 CASE_FLT_FN (BUILT_IN_MODF):
12611 CASE_FLT_FN (BUILT_IN_NEARBYINT):
12612 CASE_FLT_FN (BUILT_IN_POW):
12613 CASE_FLT_FN (BUILT_IN_RINT):
12614 CASE_FLT_FN (BUILT_IN_ROUND):
12615 CASE_FLT_FN (BUILT_IN_SIGNBIT):
12616 CASE_FLT_FN (BUILT_IN_SINH):
12617 CASE_FLT_FN (BUILT_IN_TANH):
12618 CASE_FLT_FN (BUILT_IN_TRUNC):
12619 /* True if the 1st argument is nonnegative. */
12620 return tree_expr_nonnegative_warnv_p (TREE_VALUE (arglist),
12621 strict_overflow_p);
12623 CASE_FLT_FN (BUILT_IN_FMAX):
12624 /* True if the 1st OR 2nd arguments are nonnegative. */
12625 return (tree_expr_nonnegative_warnv_p (TREE_VALUE (arglist),
12627 || (tree_expr_nonnegative_warnv_p
12628 (TREE_VALUE (TREE_CHAIN (arglist)),
12629 strict_overflow_p)));
12631 CASE_FLT_FN (BUILT_IN_FMIN):
12632 /* True if the 1st AND 2nd arguments are nonnegative. */
12633 return (tree_expr_nonnegative_warnv_p (TREE_VALUE (arglist),
12635 && (tree_expr_nonnegative_warnv_p
12636 (TREE_VALUE (TREE_CHAIN (arglist)),
12637 strict_overflow_p)));
12639 CASE_FLT_FN (BUILT_IN_COPYSIGN):
12640 /* True if the 2nd argument is nonnegative. */
12641 return (tree_expr_nonnegative_warnv_p
12642 (TREE_VALUE (TREE_CHAIN (arglist)),
12643 strict_overflow_p));
12650 /* ... fall through ... */
12654 tree type = TREE_TYPE (t);
12655 if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
12656 && truth_value_p (TREE_CODE (t)))
12657 /* Truth values evaluate to 0 or 1, which is nonnegative unless we
12658 have a signed:1 type (where the value is -1 and 0). */
12663 /* We don't know sign of `t', so be conservative and return false. */
12667 /* Return true if `t' is known to be non-negative. Handle warnings
12668 about undefined signed overflow. */
12671 tree_expr_nonnegative_p (tree t)
12674 bool strict_overflow_p;
12676 strict_overflow_p = false;
12677 ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
12678 if (strict_overflow_p)
12679 fold_overflow_warning (("assuming signed overflow does not occur when "
12680 "determining that expression is always "
12682 WARN_STRICT_OVERFLOW_MISC);
12686 /* Return true when T is an address and is known to be nonzero.
12687 For floating point we further ensure that T is not denormal.
12688 Similar logic is present in nonzero_address in rtlanal.h.
12690 If the return value is based on the assumption that signed overflow
12691 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
12692 change *STRICT_OVERFLOW_P. */
12695 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
12697 tree type = TREE_TYPE (t);
12698 bool sub_strict_overflow_p;
12700 /* Doing something useful for floating point would need more work. */
12701 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
12704 switch (TREE_CODE (t))
12707 /* Query VRP to see if it has recorded any information about
12708 the range of this object. */
12709 return ssa_name_nonzero_p (t);
12712 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12713 strict_overflow_p);
12716 /* We used to test for !integer_zerop here. This does not work correctly
12717 if TREE_CONSTANT_OVERFLOW (t). */
12718 return (TREE_INT_CST_LOW (t) != 0
12719 || TREE_INT_CST_HIGH (t) != 0);
12722 if (TYPE_OVERFLOW_UNDEFINED (type))
12724 /* With the presence of negative values it is hard
12725 to say something. */
12726 sub_strict_overflow_p = false;
12727 if (!tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12728 &sub_strict_overflow_p)
12729 || !tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12730 &sub_strict_overflow_p))
12732 /* One of operands must be positive and the other non-negative. */
12733 /* We don't set *STRICT_OVERFLOW_P here: even if this value
12734 overflows, on a twos-complement machine the sum of two
12735 nonnegative numbers can never be zero. */
12736 return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12738 || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12739 strict_overflow_p));
12744 if (TYPE_OVERFLOW_UNDEFINED (type))
12746 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12748 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12749 strict_overflow_p))
12751 *strict_overflow_p = true;
12759 tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
12760 tree outer_type = TREE_TYPE (t);
12762 return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
12763 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12764 strict_overflow_p));
12770 tree base = get_base_address (TREE_OPERAND (t, 0));
12775 /* Weak declarations may link to NULL. */
12776 if (VAR_OR_FUNCTION_DECL_P (base))
12777 return !DECL_WEAK (base);
12779 /* Constants are never weak. */
12780 if (CONSTANT_CLASS_P (base))
12787 sub_strict_overflow_p = false;
12788 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12789 &sub_strict_overflow_p)
12790 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
12791 &sub_strict_overflow_p))
12793 if (sub_strict_overflow_p)
12794 *strict_overflow_p = true;
12800 sub_strict_overflow_p = false;
12801 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12802 &sub_strict_overflow_p)
12803 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12804 &sub_strict_overflow_p))
12806 if (sub_strict_overflow_p)
12807 *strict_overflow_p = true;
12812 sub_strict_overflow_p = false;
12813 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12814 &sub_strict_overflow_p))
12816 if (sub_strict_overflow_p)
12817 *strict_overflow_p = true;
12819 /* When both operands are nonzero, then MAX must be too. */
12820 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12821 strict_overflow_p))
12824 /* MAX where operand 0 is positive is positive. */
12825 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
12826 strict_overflow_p);
12828 /* MAX where operand 1 is positive is positive. */
12829 else if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12830 &sub_strict_overflow_p)
12831 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
12832 &sub_strict_overflow_p))
12834 if (sub_strict_overflow_p)
12835 *strict_overflow_p = true;
12840 case COMPOUND_EXPR:
12843 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12844 strict_overflow_p);
12847 case NON_LVALUE_EXPR:
12848 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12849 strict_overflow_p);
12852 return (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
12854 || tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
12855 strict_overflow_p));
12858 return alloca_call_p (t);
12866 /* Return true when T is an address and is known to be nonzero.
12867 Handle warnings about undefined signed overflow. */
12870 tree_expr_nonzero_p (tree t)
12872 bool ret, strict_overflow_p;
12874 strict_overflow_p = false;
12875 ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
12876 if (strict_overflow_p)
12877 fold_overflow_warning (("assuming signed overflow does not occur when "
12878 "determining that expression is always "
12880 WARN_STRICT_OVERFLOW_MISC);
12884 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
12885 attempt to fold the expression to a constant without modifying TYPE,
12888 If the expression could be simplified to a constant, then return
12889 the constant. If the expression would not be simplified to a
12890 constant, then return NULL_TREE. */
12893 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
12895 tree tem = fold_binary (code, type, op0, op1);
12896 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
12899 /* Given the components of a unary expression CODE, TYPE and OP0,
12900 attempt to fold the expression to a constant without modifying
12903 If the expression could be simplified to a constant, then return
12904 the constant. If the expression would not be simplified to a
12905 constant, then return NULL_TREE. */
12908 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
12910 tree tem = fold_unary (code, type, op0);
12911 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
12914 /* If EXP represents referencing an element in a constant string
12915 (either via pointer arithmetic or array indexing), return the
12916 tree representing the value accessed, otherwise return NULL. */
12919 fold_read_from_constant_string (tree exp)
12921 if ((TREE_CODE (exp) == INDIRECT_REF
12922 || TREE_CODE (exp) == ARRAY_REF)
12923 && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
12925 tree exp1 = TREE_OPERAND (exp, 0);
12929 if (TREE_CODE (exp) == INDIRECT_REF)
12930 string = string_constant (exp1, &index);
12933 tree low_bound = array_ref_low_bound (exp);
12934 index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
12936 /* Optimize the special-case of a zero lower bound.
12938 We convert the low_bound to sizetype to avoid some problems
12939 with constant folding. (E.g. suppose the lower bound is 1,
12940 and its mode is QI. Without the conversion,l (ARRAY
12941 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
12942 +INDEX), which becomes (ARRAY+255+INDEX). Opps!) */
12943 if (! integer_zerop (low_bound))
12944 index = size_diffop (index, fold_convert (sizetype, low_bound));
12950 && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
12951 && TREE_CODE (string) == STRING_CST
12952 && TREE_CODE (index) == INTEGER_CST
12953 && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
12954 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
12956 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
12957 return fold_convert (TREE_TYPE (exp),
12958 build_int_cst (NULL_TREE,
12959 (TREE_STRING_POINTER (string)
12960 [TREE_INT_CST_LOW (index)])));
12965 /* Return the tree for neg (ARG0) when ARG0 is known to be either
12966 an integer constant or real constant.
12968 TYPE is the type of the result. */
12971 fold_negate_const (tree arg0, tree type)
12973 tree t = NULL_TREE;
12975 switch (TREE_CODE (arg0))
12979 unsigned HOST_WIDE_INT low;
12980 HOST_WIDE_INT high;
12981 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
12982 TREE_INT_CST_HIGH (arg0),
12984 t = build_int_cst_wide (type, low, high);
12985 t = force_fit_type (t, 1,
12986 (overflow | TREE_OVERFLOW (arg0))
12987 && !TYPE_UNSIGNED (type),
12988 TREE_CONSTANT_OVERFLOW (arg0));
12993 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
12997 gcc_unreachable ();
13003 /* Return the tree for abs (ARG0) when ARG0 is known to be either
13004 an integer constant or real constant.
13006 TYPE is the type of the result. */
13009 fold_abs_const (tree arg0, tree type)
13011 tree t = NULL_TREE;
13013 switch (TREE_CODE (arg0))
13016 /* If the value is unsigned, then the absolute value is
13017 the same as the ordinary value. */
13018 if (TYPE_UNSIGNED (type))
13020 /* Similarly, if the value is non-negative. */
13021 else if (INT_CST_LT (integer_minus_one_node, arg0))
13023 /* If the value is negative, then the absolute value is
13027 unsigned HOST_WIDE_INT low;
13028 HOST_WIDE_INT high;
13029 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
13030 TREE_INT_CST_HIGH (arg0),
13032 t = build_int_cst_wide (type, low, high);
13033 t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg0),
13034 TREE_CONSTANT_OVERFLOW (arg0));
13039 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
13040 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
13046 gcc_unreachable ();
13052 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
13053 constant. TYPE is the type of the result. */
13056 fold_not_const (tree arg0, tree type)
13058 tree t = NULL_TREE;
13060 gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
13062 t = build_int_cst_wide (type,
13063 ~ TREE_INT_CST_LOW (arg0),
13064 ~ TREE_INT_CST_HIGH (arg0));
13065 t = force_fit_type (t, 0, TREE_OVERFLOW (arg0),
13066 TREE_CONSTANT_OVERFLOW (arg0));
13071 /* Given CODE, a relational operator, the target type, TYPE and two
13072 constant operands OP0 and OP1, return the result of the
13073 relational operation. If the result is not a compile time
13074 constant, then return NULL_TREE. */
13077 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
13079 int result, invert;
13081 /* From here on, the only cases we handle are when the result is
13082 known to be a constant. */
13084 if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
13086 const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
13087 const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
13089 /* Handle the cases where either operand is a NaN. */
13090 if (real_isnan (c0) || real_isnan (c1))
13100 case UNORDERED_EXPR:
13114 if (flag_trapping_math)
13120 gcc_unreachable ();
13123 return constant_boolean_node (result, type);
13126 return constant_boolean_node (real_compare (code, c0, c1), type);
13129 /* Handle equality/inequality of complex constants. */
13130 if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
13132 tree rcond = fold_relational_const (code, type,
13133 TREE_REALPART (op0),
13134 TREE_REALPART (op1));
13135 tree icond = fold_relational_const (code, type,
13136 TREE_IMAGPART (op0),
13137 TREE_IMAGPART (op1));
13138 if (code == EQ_EXPR)
13139 return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
13140 else if (code == NE_EXPR)
13141 return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
13146 /* From here on we only handle LT, LE, GT, GE, EQ and NE.
13148 To compute GT, swap the arguments and do LT.
13149 To compute GE, do LT and invert the result.
13150 To compute LE, swap the arguments, do LT and invert the result.
13151 To compute NE, do EQ and invert the result.
13153 Therefore, the code below must handle only EQ and LT. */
13155 if (code == LE_EXPR || code == GT_EXPR)
13160 code = swap_tree_comparison (code);
13163 /* Note that it is safe to invert for real values here because we
13164 have already handled the one case that it matters. */
13167 if (code == NE_EXPR || code == GE_EXPR)
13170 code = invert_tree_comparison (code, false);
13173 /* Compute a result for LT or EQ if args permit;
13174 Otherwise return T. */
13175 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
13177 if (code == EQ_EXPR)
13178 result = tree_int_cst_equal (op0, op1);
13179 else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
13180 result = INT_CST_LT_UNSIGNED (op0, op1);
13182 result = INT_CST_LT (op0, op1);
13189 return constant_boolean_node (result, type);
13192 /* Build an expression for the a clean point containing EXPR with type TYPE.
13193 Don't build a cleanup point expression for EXPR which don't have side
13197 fold_build_cleanup_point_expr (tree type, tree expr)
13199 /* If the expression does not have side effects then we don't have to wrap
13200 it with a cleanup point expression. */
13201 if (!TREE_SIDE_EFFECTS (expr))
13204 /* If the expression is a return, check to see if the expression inside the
13205 return has no side effects or the right hand side of the modify expression
13206 inside the return. If either don't have side effects set we don't need to
13207 wrap the expression in a cleanup point expression. Note we don't check the
13208 left hand side of the modify because it should always be a return decl. */
13209 if (TREE_CODE (expr) == RETURN_EXPR)
13211 tree op = TREE_OPERAND (expr, 0);
13212 if (!op || !TREE_SIDE_EFFECTS (op))
13214 op = TREE_OPERAND (op, 1);
13215 if (!TREE_SIDE_EFFECTS (op))
13219 return build1 (CLEANUP_POINT_EXPR, type, expr);
13222 /* Build an expression for the address of T. Folds away INDIRECT_REF to
13223 avoid confusing the gimplify process. */
13226 build_fold_addr_expr_with_type (tree t, tree ptrtype)
13228 /* The size of the object is not relevant when talking about its address. */
13229 if (TREE_CODE (t) == WITH_SIZE_EXPR)
13230 t = TREE_OPERAND (t, 0);
13232 /* Note: doesn't apply to ALIGN_INDIRECT_REF */
13233 if (TREE_CODE (t) == INDIRECT_REF
13234 || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
13236 t = TREE_OPERAND (t, 0);
13237 if (TREE_TYPE (t) != ptrtype)
13238 t = build1 (NOP_EXPR, ptrtype, t);
13244 while (handled_component_p (base))
13245 base = TREE_OPERAND (base, 0);
13247 TREE_ADDRESSABLE (base) = 1;
13249 t = build1 (ADDR_EXPR, ptrtype, t);
13256 build_fold_addr_expr (tree t)
13258 return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
13261 /* Given a pointer value OP0 and a type TYPE, return a simplified version
13262 of an indirection through OP0, or NULL_TREE if no simplification is
13266 fold_indirect_ref_1 (tree type, tree op0)
13272 subtype = TREE_TYPE (sub);
13273 if (!POINTER_TYPE_P (subtype))
13276 if (TREE_CODE (sub) == ADDR_EXPR)
13278 tree op = TREE_OPERAND (sub, 0);
13279 tree optype = TREE_TYPE (op);
13280 /* *&CONST_DECL -> to the value of the const decl. */
13281 if (TREE_CODE (op) == CONST_DECL)
13282 return DECL_INITIAL (op);
13283 /* *&p => p; make sure to handle *&"str"[cst] here. */
13284 if (type == optype)
13286 tree fop = fold_read_from_constant_string (op);
13292 /* *(foo *)&fooarray => fooarray[0] */
13293 else if (TREE_CODE (optype) == ARRAY_TYPE
13294 && type == TREE_TYPE (optype))
13296 tree type_domain = TYPE_DOMAIN (optype);
13297 tree min_val = size_zero_node;
13298 if (type_domain && TYPE_MIN_VALUE (type_domain))
13299 min_val = TYPE_MIN_VALUE (type_domain);
13300 return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
13302 /* *(foo *)&complexfoo => __real__ complexfoo */
13303 else if (TREE_CODE (optype) == COMPLEX_TYPE
13304 && type == TREE_TYPE (optype))
13305 return fold_build1 (REALPART_EXPR, type, op);
13308 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
13309 if (TREE_CODE (sub) == PLUS_EXPR
13310 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
13312 tree op00 = TREE_OPERAND (sub, 0);
13313 tree op01 = TREE_OPERAND (sub, 1);
13317 op00type = TREE_TYPE (op00);
13318 if (TREE_CODE (op00) == ADDR_EXPR
13319 && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
13320 && type == TREE_TYPE (TREE_TYPE (op00type)))
13322 tree size = TYPE_SIZE_UNIT (type);
13323 if (tree_int_cst_equal (size, op01))
13324 return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
13328 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
13329 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
13330 && type == TREE_TYPE (TREE_TYPE (subtype)))
13333 tree min_val = size_zero_node;
13334 sub = build_fold_indirect_ref (sub);
13335 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
13336 if (type_domain && TYPE_MIN_VALUE (type_domain))
13337 min_val = TYPE_MIN_VALUE (type_domain);
13338 return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
13344 /* Builds an expression for an indirection through T, simplifying some
13348 build_fold_indirect_ref (tree t)
13350 tree type = TREE_TYPE (TREE_TYPE (t));
13351 tree sub = fold_indirect_ref_1 (type, t);
13356 return build1 (INDIRECT_REF, type, t);
13359 /* Given an INDIRECT_REF T, return either T or a simplified version. */
13362 fold_indirect_ref (tree t)
13364 tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
13372 /* Strip non-trapping, non-side-effecting tree nodes from an expression
13373 whose result is ignored. The type of the returned tree need not be
13374 the same as the original expression. */
13377 fold_ignored_result (tree t)
13379 if (!TREE_SIDE_EFFECTS (t))
13380 return integer_zero_node;
13383 switch (TREE_CODE_CLASS (TREE_CODE (t)))
13386 t = TREE_OPERAND (t, 0);
13390 case tcc_comparison:
13391 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
13392 t = TREE_OPERAND (t, 0);
13393 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
13394 t = TREE_OPERAND (t, 1);
13399 case tcc_expression:
13400 switch (TREE_CODE (t))
13402 case COMPOUND_EXPR:
13403 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
13405 t = TREE_OPERAND (t, 0);
13409 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
13410 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
13412 t = TREE_OPERAND (t, 0);
13425 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
13426 This can only be applied to objects of a sizetype. */
13429 round_up (tree value, int divisor)
13431 tree div = NULL_TREE;
13433 gcc_assert (divisor > 0);
13437 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
13438 have to do anything. Only do this when we are not given a const,
13439 because in that case, this check is more expensive than just
13441 if (TREE_CODE (value) != INTEGER_CST)
13443 div = build_int_cst (TREE_TYPE (value), divisor);
13445 if (multiple_of_p (TREE_TYPE (value), value, div))
13449 /* If divisor is a power of two, simplify this to bit manipulation. */
13450 if (divisor == (divisor & -divisor))
13454 t = build_int_cst (TREE_TYPE (value), divisor - 1);
13455 value = size_binop (PLUS_EXPR, value, t);
13456 t = build_int_cst (TREE_TYPE (value), -divisor);
13457 value = size_binop (BIT_AND_EXPR, value, t);
13462 div = build_int_cst (TREE_TYPE (value), divisor);
13463 value = size_binop (CEIL_DIV_EXPR, value, div);
13464 value = size_binop (MULT_EXPR, value, div);
13470 /* Likewise, but round down. */
13473 round_down (tree value, int divisor)
13475 tree div = NULL_TREE;
13477 gcc_assert (divisor > 0);
13481 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
13482 have to do anything. Only do this when we are not given a const,
13483 because in that case, this check is more expensive than just
13485 if (TREE_CODE (value) != INTEGER_CST)
13487 div = build_int_cst (TREE_TYPE (value), divisor);
13489 if (multiple_of_p (TREE_TYPE (value), value, div))
13493 /* If divisor is a power of two, simplify this to bit manipulation. */
13494 if (divisor == (divisor & -divisor))
13498 t = build_int_cst (TREE_TYPE (value), -divisor);
13499 value = size_binop (BIT_AND_EXPR, value, t);
13504 div = build_int_cst (TREE_TYPE (value), divisor);
13505 value = size_binop (FLOOR_DIV_EXPR, value, div);
13506 value = size_binop (MULT_EXPR, value, div);
13512 /* Returns the pointer to the base of the object addressed by EXP and
13513 extracts the information about the offset of the access, storing it
13514 to PBITPOS and POFFSET. */
13517 split_address_to_core_and_offset (tree exp,
13518 HOST_WIDE_INT *pbitpos, tree *poffset)
13521 enum machine_mode mode;
13522 int unsignedp, volatilep;
13523 HOST_WIDE_INT bitsize;
13525 if (TREE_CODE (exp) == ADDR_EXPR)
13527 core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
13528 poffset, &mode, &unsignedp, &volatilep,
13530 core = build_fold_addr_expr (core);
13536 *poffset = NULL_TREE;
13542 /* Returns true if addresses of E1 and E2 differ by a constant, false
13543 otherwise. If they do, E1 - E2 is stored in *DIFF. */
13546 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
13549 HOST_WIDE_INT bitpos1, bitpos2;
13550 tree toffset1, toffset2, tdiff, type;
13552 core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
13553 core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
13555 if (bitpos1 % BITS_PER_UNIT != 0
13556 || bitpos2 % BITS_PER_UNIT != 0
13557 || !operand_equal_p (core1, core2, 0))
13560 if (toffset1 && toffset2)
13562 type = TREE_TYPE (toffset1);
13563 if (type != TREE_TYPE (toffset2))
13564 toffset2 = fold_convert (type, toffset2);
13566 tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
13567 if (!cst_and_fits_in_hwi (tdiff))
13570 *diff = int_cst_value (tdiff);
13572 else if (toffset1 || toffset2)
13574 /* If only one of the offsets is non-constant, the difference cannot
13581 *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
13585 /* Simplify the floating point expression EXP when the sign of the
13586 result is not significant. Return NULL_TREE if no simplification
13590 fold_strip_sign_ops (tree exp)
13594 switch (TREE_CODE (exp))
13598 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
13599 return arg0 ? arg0 : TREE_OPERAND (exp, 0);
13603 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
13605 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
13606 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
13607 if (arg0 != NULL_TREE || arg1 != NULL_TREE)
13608 return fold_build2 (TREE_CODE (exp), TREE_TYPE (exp),
13609 arg0 ? arg0 : TREE_OPERAND (exp, 0),
13610 arg1 ? arg1 : TREE_OPERAND (exp, 1));