1998-09-21 Ben Elliston <bje@cygnus.com>
[official-gcc.git] / gcc / fold-const.c
blob0d04e91160b0af91f467e8d9497641c302cfe7c3
1 /* Fold a constant sub-tree into a single node for C-compiler
2 Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /*@@ This file should be rewritten to use an arbitrary precision
22 @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
23 @@ Perhaps the routines could also be used for bc/dc, and made a lib.
24 @@ The routines that translate from the ap rep should
25 @@ warn if precision et. al. is lost.
26 @@ This would also make life easier when this technology is used
27 @@ for cross-compilers. */
30 /* The entry points in this file are fold, size_int_wide, size_binop
31 and force_fit_type.
33 fold takes a tree as argument and returns a simplified tree.
35 size_binop takes a tree code for an arithmetic operation
36 and two operands that are trees, and produces a tree for the
37 result, assuming the type comes from `sizetype'.
39 size_int takes an integer value, and creates a tree constant
40 with type from `sizetype'.
42 force_fit_type takes a constant and prior overflow indicator, and
43 forces the value to fit the type. It returns an overflow indicator. */
45 #include "config.h"
46 #include "system.h"
47 #include <setjmp.h>
48 #include "flags.h"
49 #include "tree.h"
50 #include "rtl.h"
51 #include "toplev.h"
53 /* Handle floating overflow for `const_binop'. */
54 static jmp_buf float_error;
56 static void encode PROTO((HOST_WIDE_INT *,
57 HOST_WIDE_INT, HOST_WIDE_INT));
58 static void decode PROTO((HOST_WIDE_INT *,
59 HOST_WIDE_INT *, HOST_WIDE_INT *));
60 int div_and_round_double PROTO((enum tree_code, int, HOST_WIDE_INT,
61 HOST_WIDE_INT, HOST_WIDE_INT,
62 HOST_WIDE_INT, HOST_WIDE_INT *,
63 HOST_WIDE_INT *, HOST_WIDE_INT *,
64 HOST_WIDE_INT *));
65 static int split_tree PROTO((tree, enum tree_code, tree *,
66 tree *, int *));
67 static tree int_const_binop PROTO((enum tree_code, tree, tree, int, int));
68 static tree const_binop PROTO((enum tree_code, tree, tree, int));
69 static tree fold_convert PROTO((tree, tree));
70 static enum tree_code invert_tree_comparison PROTO((enum tree_code));
71 static enum tree_code swap_tree_comparison PROTO((enum tree_code));
72 static int truth_value_p PROTO((enum tree_code));
73 static int operand_equal_for_comparison_p PROTO((tree, tree, tree));
74 static int twoval_comparison_p PROTO((tree, tree *, tree *, int *));
75 static tree eval_subst PROTO((tree, tree, tree, tree, tree));
76 static tree omit_one_operand PROTO((tree, tree, tree));
77 static tree pedantic_omit_one_operand PROTO((tree, tree, tree));
78 static tree distribute_bit_expr PROTO((enum tree_code, tree, tree, tree));
79 static tree make_bit_field_ref PROTO((tree, tree, int, int, int));
80 static tree optimize_bit_field_compare PROTO((enum tree_code, tree,
81 tree, tree));
82 static tree decode_field_reference PROTO((tree, int *, int *,
83 enum machine_mode *, int *,
84 int *, tree *, tree *));
85 static int all_ones_mask_p PROTO((tree, int));
86 static int simple_operand_p PROTO((tree));
87 static tree range_binop PROTO((enum tree_code, tree, tree, int,
88 tree, int));
89 static tree make_range PROTO((tree, int *, tree *, tree *));
90 static tree build_range_check PROTO((tree, tree, int, tree, tree));
91 static int merge_ranges PROTO((int *, tree *, tree *, int, tree, tree,
92 int, tree, tree));
93 static tree fold_range_test PROTO((tree));
94 static tree unextend PROTO((tree, int, int, tree));
95 static tree fold_truthop PROTO((enum tree_code, tree, tree, tree));
96 static tree strip_compound_expr PROTO((tree, tree));
97 static int multiple_of_p PROTO((tree, tree, tree));
98 static tree constant_boolean_node PROTO((int, tree));
100 #ifndef BRANCH_COST
101 #define BRANCH_COST 1
102 #endif
104 /* Suppose A1 + B1 = SUM1, using 2's complement arithmetic ignoring overflow.
105 Suppose A, B and SUM have the same respective signs as A1, B1, and SUM1.
106 Then this yields nonzero if overflow occurred during the addition.
107 Overflow occurs if A and B have the same sign, but A and SUM differ in sign.
108 Use `^' to test whether signs differ, and `< 0' to isolate the sign. */
109 #define overflow_sum_sign(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
111 /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
112 We do that by representing the two-word integer in 4 words, with only
113 HOST_BITS_PER_WIDE_INT/2 bits stored in each word, as a positive number. */
115 #define LOWPART(x) \
116 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT/2)) - 1))
117 #define HIGHPART(x) \
118 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT/2)
119 #define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT/2)
121 /* Unpack a two-word integer into 4 words.
122 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
123 WORDS points to the array of HOST_WIDE_INTs. */
125 static void
126 encode (words, low, hi)
127 HOST_WIDE_INT *words;
128 HOST_WIDE_INT low, hi;
130 words[0] = LOWPART (low);
131 words[1] = HIGHPART (low);
132 words[2] = LOWPART (hi);
133 words[3] = HIGHPART (hi);
136 /* Pack an array of 4 words into a two-word integer.
137 WORDS points to the array of words.
138 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
140 static void
141 decode (words, low, hi)
142 HOST_WIDE_INT *words;
143 HOST_WIDE_INT *low, *hi;
145 *low = words[0] | words[1] * BASE;
146 *hi = words[2] | words[3] * BASE;
149 /* Make the integer constant T valid for its type
150 by setting to 0 or 1 all the bits in the constant
151 that don't belong in the type.
152 Yield 1 if a signed overflow occurs, 0 otherwise.
153 If OVERFLOW is nonzero, a signed overflow has already occurred
154 in calculating T, so propagate it.
156 Make the real constant T valid for its type by calling CHECK_FLOAT_VALUE,
157 if it exists. */
160 force_fit_type (t, overflow)
161 tree t;
162 int overflow;
164 HOST_WIDE_INT low, high;
165 register int prec;
167 if (TREE_CODE (t) == REAL_CST)
169 #ifdef CHECK_FLOAT_VALUE
170 CHECK_FLOAT_VALUE (TYPE_MODE (TREE_TYPE (t)), TREE_REAL_CST (t),
171 overflow);
172 #endif
173 return overflow;
176 else if (TREE_CODE (t) != INTEGER_CST)
177 return overflow;
179 low = TREE_INT_CST_LOW (t);
180 high = TREE_INT_CST_HIGH (t);
182 if (POINTER_TYPE_P (TREE_TYPE (t)))
183 prec = POINTER_SIZE;
184 else
185 prec = TYPE_PRECISION (TREE_TYPE (t));
187 /* First clear all bits that are beyond the type's precision. */
189 if (prec == 2 * HOST_BITS_PER_WIDE_INT)
191 else if (prec > HOST_BITS_PER_WIDE_INT)
193 TREE_INT_CST_HIGH (t)
194 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
196 else
198 TREE_INT_CST_HIGH (t) = 0;
199 if (prec < HOST_BITS_PER_WIDE_INT)
200 TREE_INT_CST_LOW (t) &= ~((HOST_WIDE_INT) (-1) << prec);
203 /* Unsigned types do not suffer sign extension or overflow. */
204 if (TREE_UNSIGNED (TREE_TYPE (t)))
205 return overflow;
207 /* If the value's sign bit is set, extend the sign. */
208 if (prec != 2 * HOST_BITS_PER_WIDE_INT
209 && (prec > HOST_BITS_PER_WIDE_INT
210 ? (TREE_INT_CST_HIGH (t)
211 & ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
212 : TREE_INT_CST_LOW (t) & ((HOST_WIDE_INT) 1 << (prec - 1))))
214 /* Value is negative:
215 set to 1 all the bits that are outside this type's precision. */
216 if (prec > HOST_BITS_PER_WIDE_INT)
218 TREE_INT_CST_HIGH (t)
219 |= ((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
221 else
223 TREE_INT_CST_HIGH (t) = -1;
224 if (prec < HOST_BITS_PER_WIDE_INT)
225 TREE_INT_CST_LOW (t) |= ((HOST_WIDE_INT) (-1) << prec);
229 /* Yield nonzero if signed overflow occurred. */
230 return
231 ((overflow | (low ^ TREE_INT_CST_LOW (t)) | (high ^ TREE_INT_CST_HIGH (t)))
232 != 0);
235 /* Add two doubleword integers with doubleword result.
236 Each argument is given as two `HOST_WIDE_INT' pieces.
237 One argument is L1 and H1; the other, L2 and H2.
238 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
241 add_double (l1, h1, l2, h2, lv, hv)
242 HOST_WIDE_INT l1, h1, l2, h2;
243 HOST_WIDE_INT *lv, *hv;
245 HOST_WIDE_INT l, h;
247 l = l1 + l2;
248 h = h1 + h2 + ((unsigned HOST_WIDE_INT) l < l1);
250 *lv = l;
251 *hv = h;
252 return overflow_sum_sign (h1, h2, h);
255 /* Negate a doubleword integer with doubleword result.
256 Return nonzero if the operation overflows, assuming it's signed.
257 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
258 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
261 neg_double (l1, h1, lv, hv)
262 HOST_WIDE_INT l1, h1;
263 HOST_WIDE_INT *lv, *hv;
265 if (l1 == 0)
267 *lv = 0;
268 *hv = - h1;
269 return (*hv & h1) < 0;
271 else
273 *lv = - l1;
274 *hv = ~ h1;
275 return 0;
279 /* Multiply two doubleword integers with doubleword result.
280 Return nonzero if the operation overflows, assuming it's signed.
281 Each argument is given as two `HOST_WIDE_INT' pieces.
282 One argument is L1 and H1; the other, L2 and H2.
283 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
286 mul_double (l1, h1, l2, h2, lv, hv)
287 HOST_WIDE_INT l1, h1, l2, h2;
288 HOST_WIDE_INT *lv, *hv;
290 HOST_WIDE_INT arg1[4];
291 HOST_WIDE_INT arg2[4];
292 HOST_WIDE_INT prod[4 * 2];
293 register unsigned HOST_WIDE_INT carry;
294 register int i, j, k;
295 HOST_WIDE_INT toplow, tophigh, neglow, neghigh;
297 encode (arg1, l1, h1);
298 encode (arg2, l2, h2);
300 bzero ((char *) prod, sizeof prod);
302 for (i = 0; i < 4; i++)
304 carry = 0;
305 for (j = 0; j < 4; j++)
307 k = i + j;
308 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
309 carry += arg1[i] * arg2[j];
310 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
311 carry += prod[k];
312 prod[k] = LOWPART (carry);
313 carry = HIGHPART (carry);
315 prod[i + 4] = carry;
318 decode (prod, lv, hv); /* This ignores prod[4] through prod[4*2-1] */
320 /* Check for overflow by calculating the top half of the answer in full;
321 it should agree with the low half's sign bit. */
322 decode (prod+4, &toplow, &tophigh);
323 if (h1 < 0)
325 neg_double (l2, h2, &neglow, &neghigh);
326 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
328 if (h2 < 0)
330 neg_double (l1, h1, &neglow, &neghigh);
331 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
333 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
336 /* Shift the doubleword integer in L1, H1 left by COUNT places
337 keeping only PREC bits of result.
338 Shift right if COUNT is negative.
339 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
340 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
342 void
343 lshift_double (l1, h1, count, prec, lv, hv, arith)
344 HOST_WIDE_INT l1, h1, count;
345 int prec;
346 HOST_WIDE_INT *lv, *hv;
347 int arith;
349 if (count < 0)
351 rshift_double (l1, h1, - count, prec, lv, hv, arith);
352 return;
355 #ifdef SHIFT_COUNT_TRUNCATED
356 if (SHIFT_COUNT_TRUNCATED)
357 count %= prec;
358 #endif
360 if (count >= HOST_BITS_PER_WIDE_INT)
362 *hv = (unsigned HOST_WIDE_INT) l1 << (count - HOST_BITS_PER_WIDE_INT);
363 *lv = 0;
365 else
367 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
368 | ((unsigned HOST_WIDE_INT) l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
369 *lv = (unsigned HOST_WIDE_INT) l1 << count;
373 /* Shift the doubleword integer in L1, H1 right by COUNT places
374 keeping only PREC bits of result. COUNT must be positive.
375 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
376 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
378 void
379 rshift_double (l1, h1, count, prec, lv, hv, arith)
380 HOST_WIDE_INT l1, h1, count;
381 int prec;
382 HOST_WIDE_INT *lv, *hv;
383 int arith;
385 unsigned HOST_WIDE_INT signmask;
386 signmask = (arith
387 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
388 : 0);
390 #ifdef SHIFT_COUNT_TRUNCATED
391 if (SHIFT_COUNT_TRUNCATED)
392 count %= prec;
393 #endif
395 if (count >= HOST_BITS_PER_WIDE_INT)
397 *hv = signmask;
398 *lv = ((signmask << (2 * HOST_BITS_PER_WIDE_INT - count - 1) << 1)
399 | ((unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT)));
401 else
403 *lv = (((unsigned HOST_WIDE_INT) l1 >> count)
404 | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
405 *hv = ((signmask << (HOST_BITS_PER_WIDE_INT - count))
406 | ((unsigned HOST_WIDE_INT) h1 >> count));
410 /* Rotate the doubleword integer in L1, H1 left by COUNT places
411 keeping only PREC bits of result.
412 Rotate right if COUNT is negative.
413 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
415 void
416 lrotate_double (l1, h1, count, prec, lv, hv)
417 HOST_WIDE_INT l1, h1, count;
418 int prec;
419 HOST_WIDE_INT *lv, *hv;
421 HOST_WIDE_INT s1l, s1h, s2l, s2h;
423 count %= prec;
424 if (count < 0)
425 count += prec;
427 lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
428 rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
429 *lv = s1l | s2l;
430 *hv = s1h | s2h;
433 /* Rotate the doubleword integer in L1, H1 left by COUNT places
434 keeping only PREC bits of result. COUNT must be positive.
435 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
437 void
438 rrotate_double (l1, h1, count, prec, lv, hv)
439 HOST_WIDE_INT l1, h1, count;
440 int prec;
441 HOST_WIDE_INT *lv, *hv;
443 HOST_WIDE_INT s1l, s1h, s2l, s2h;
445 count %= prec;
446 if (count < 0)
447 count += prec;
449 rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
450 lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
451 *lv = s1l | s2l;
452 *hv = s1h | s2h;
455 /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
456 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
457 CODE is a tree code for a kind of division, one of
458 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
459 or EXACT_DIV_EXPR
460 It controls how the quotient is rounded to a integer.
461 Return nonzero if the operation overflows.
462 UNS nonzero says do unsigned division. */
465 div_and_round_double (code, uns,
466 lnum_orig, hnum_orig, lden_orig, hden_orig,
467 lquo, hquo, lrem, hrem)
468 enum tree_code code;
469 int uns;
470 HOST_WIDE_INT lnum_orig, hnum_orig; /* num == numerator == dividend */
471 HOST_WIDE_INT lden_orig, hden_orig; /* den == denominator == divisor */
472 HOST_WIDE_INT *lquo, *hquo, *lrem, *hrem;
474 int quo_neg = 0;
475 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
476 HOST_WIDE_INT den[4], quo[4];
477 register int i, j;
478 unsigned HOST_WIDE_INT work;
479 register unsigned HOST_WIDE_INT carry = 0;
480 HOST_WIDE_INT lnum = lnum_orig;
481 HOST_WIDE_INT hnum = hnum_orig;
482 HOST_WIDE_INT lden = lden_orig;
483 HOST_WIDE_INT hden = hden_orig;
484 int overflow = 0;
486 if ((hden == 0) && (lden == 0))
487 overflow = 1, lden = 1;
489 /* calculate quotient sign and convert operands to unsigned. */
490 if (!uns)
492 if (hnum < 0)
494 quo_neg = ~ quo_neg;
495 /* (minimum integer) / (-1) is the only overflow case. */
496 if (neg_double (lnum, hnum, &lnum, &hnum) && (lden & hden) == -1)
497 overflow = 1;
499 if (hden < 0)
501 quo_neg = ~ quo_neg;
502 neg_double (lden, hden, &lden, &hden);
506 if (hnum == 0 && hden == 0)
507 { /* single precision */
508 *hquo = *hrem = 0;
509 /* This unsigned division rounds toward zero. */
510 *lquo = lnum / (unsigned HOST_WIDE_INT) lden;
511 goto finish_up;
514 if (hnum == 0)
515 { /* trivial case: dividend < divisor */
516 /* hden != 0 already checked. */
517 *hquo = *lquo = 0;
518 *hrem = hnum;
519 *lrem = lnum;
520 goto finish_up;
523 bzero ((char *) quo, sizeof quo);
525 bzero ((char *) num, sizeof num); /* to zero 9th element */
526 bzero ((char *) den, sizeof den);
528 encode (num, lnum, hnum);
529 encode (den, lden, hden);
531 /* Special code for when the divisor < BASE. */
532 if (hden == 0 && lden < BASE)
534 /* hnum != 0 already checked. */
535 for (i = 4 - 1; i >= 0; i--)
537 work = num[i] + carry * BASE;
538 quo[i] = work / (unsigned HOST_WIDE_INT) lden;
539 carry = work % (unsigned HOST_WIDE_INT) lden;
542 else
544 /* Full double precision division,
545 with thanks to Don Knuth's "Seminumerical Algorithms". */
546 int num_hi_sig, den_hi_sig;
547 unsigned HOST_WIDE_INT quo_est, scale;
549 /* Find the highest non-zero divisor digit. */
550 for (i = 4 - 1; ; i--)
551 if (den[i] != 0) {
552 den_hi_sig = i;
553 break;
556 /* Insure that the first digit of the divisor is at least BASE/2.
557 This is required by the quotient digit estimation algorithm. */
559 scale = BASE / (den[den_hi_sig] + 1);
560 if (scale > 1) { /* scale divisor and dividend */
561 carry = 0;
562 for (i = 0; i <= 4 - 1; i++) {
563 work = (num[i] * scale) + carry;
564 num[i] = LOWPART (work);
565 carry = HIGHPART (work);
566 } num[4] = carry;
567 carry = 0;
568 for (i = 0; i <= 4 - 1; i++) {
569 work = (den[i] * scale) + carry;
570 den[i] = LOWPART (work);
571 carry = HIGHPART (work);
572 if (den[i] != 0) den_hi_sig = i;
576 num_hi_sig = 4;
578 /* Main loop */
579 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--) {
580 /* guess the next quotient digit, quo_est, by dividing the first
581 two remaining dividend digits by the high order quotient digit.
582 quo_est is never low and is at most 2 high. */
583 unsigned HOST_WIDE_INT tmp;
585 num_hi_sig = i + den_hi_sig + 1;
586 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
587 if (num[num_hi_sig] != den[den_hi_sig])
588 quo_est = work / den[den_hi_sig];
589 else
590 quo_est = BASE - 1;
592 /* refine quo_est so it's usually correct, and at most one high. */
593 tmp = work - quo_est * den[den_hi_sig];
594 if (tmp < BASE
595 && den[den_hi_sig - 1] * quo_est > (tmp * BASE + num[num_hi_sig - 2]))
596 quo_est--;
598 /* Try QUO_EST as the quotient digit, by multiplying the
599 divisor by QUO_EST and subtracting from the remaining dividend.
600 Keep in mind that QUO_EST is the I - 1st digit. */
602 carry = 0;
603 for (j = 0; j <= den_hi_sig; j++)
605 work = quo_est * den[j] + carry;
606 carry = HIGHPART (work);
607 work = num[i + j] - LOWPART (work);
608 num[i + j] = LOWPART (work);
609 carry += HIGHPART (work) != 0;
612 /* if quo_est was high by one, then num[i] went negative and
613 we need to correct things. */
615 if (num[num_hi_sig] < carry)
617 quo_est--;
618 carry = 0; /* add divisor back in */
619 for (j = 0; j <= den_hi_sig; j++)
621 work = num[i + j] + den[j] + carry;
622 carry = HIGHPART (work);
623 num[i + j] = LOWPART (work);
625 num [num_hi_sig] += carry;
628 /* store the quotient digit. */
629 quo[i] = quo_est;
633 decode (quo, lquo, hquo);
635 finish_up:
636 /* if result is negative, make it so. */
637 if (quo_neg)
638 neg_double (*lquo, *hquo, lquo, hquo);
640 /* compute trial remainder: rem = num - (quo * den) */
641 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
642 neg_double (*lrem, *hrem, lrem, hrem);
643 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
645 switch (code)
647 case TRUNC_DIV_EXPR:
648 case TRUNC_MOD_EXPR: /* round toward zero */
649 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
650 return overflow;
652 case FLOOR_DIV_EXPR:
653 case FLOOR_MOD_EXPR: /* round toward negative infinity */
654 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
656 /* quo = quo - 1; */
657 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
658 lquo, hquo);
660 else return overflow;
661 break;
663 case CEIL_DIV_EXPR:
664 case CEIL_MOD_EXPR: /* round toward positive infinity */
665 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
667 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
668 lquo, hquo);
670 else return overflow;
671 break;
673 case ROUND_DIV_EXPR:
674 case ROUND_MOD_EXPR: /* round to closest integer */
676 HOST_WIDE_INT labs_rem = *lrem, habs_rem = *hrem;
677 HOST_WIDE_INT labs_den = lden, habs_den = hden, ltwice, htwice;
679 /* get absolute values */
680 if (*hrem < 0) neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
681 if (hden < 0) neg_double (lden, hden, &labs_den, &habs_den);
683 /* if (2 * abs (lrem) >= abs (lden)) */
684 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
685 labs_rem, habs_rem, &ltwice, &htwice);
686 if (((unsigned HOST_WIDE_INT) habs_den
687 < (unsigned HOST_WIDE_INT) htwice)
688 || (((unsigned HOST_WIDE_INT) habs_den
689 == (unsigned HOST_WIDE_INT) htwice)
690 && ((HOST_WIDE_INT unsigned) labs_den
691 < (unsigned HOST_WIDE_INT) ltwice)))
693 if (*hquo < 0)
694 /* quo = quo - 1; */
695 add_double (*lquo, *hquo,
696 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
697 else
698 /* quo = quo + 1; */
699 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
700 lquo, hquo);
702 else return overflow;
704 break;
706 default:
707 abort ();
710 /* compute true remainder: rem = num - (quo * den) */
711 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
712 neg_double (*lrem, *hrem, lrem, hrem);
713 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
714 return overflow;
717 #ifndef REAL_ARITHMETIC
718 /* Effectively truncate a real value to represent the nearest possible value
719 in a narrower mode. The result is actually represented in the same data
720 type as the argument, but its value is usually different.
722 A trap may occur during the FP operations and it is the responsibility
723 of the calling function to have a handler established. */
725 REAL_VALUE_TYPE
726 real_value_truncate (mode, arg)
727 enum machine_mode mode;
728 REAL_VALUE_TYPE arg;
730 return REAL_VALUE_TRUNCATE (mode, arg);
733 #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
735 /* Check for infinity in an IEEE double precision number. */
738 target_isinf (x)
739 REAL_VALUE_TYPE x;
741 /* The IEEE 64-bit double format. */
742 union {
743 REAL_VALUE_TYPE d;
744 struct {
745 unsigned sign : 1;
746 unsigned exponent : 11;
747 unsigned mantissa1 : 20;
748 unsigned mantissa2;
749 } little_endian;
750 struct {
751 unsigned mantissa2;
752 unsigned mantissa1 : 20;
753 unsigned exponent : 11;
754 unsigned sign : 1;
755 } big_endian;
756 } u;
758 u.d = dconstm1;
759 if (u.big_endian.sign == 1)
761 u.d = x;
762 return (u.big_endian.exponent == 2047
763 && u.big_endian.mantissa1 == 0
764 && u.big_endian.mantissa2 == 0);
766 else
768 u.d = x;
769 return (u.little_endian.exponent == 2047
770 && u.little_endian.mantissa1 == 0
771 && u.little_endian.mantissa2 == 0);
775 /* Check whether an IEEE double precision number is a NaN. */
778 target_isnan (x)
779 REAL_VALUE_TYPE x;
781 /* The IEEE 64-bit double format. */
782 union {
783 REAL_VALUE_TYPE d;
784 struct {
785 unsigned sign : 1;
786 unsigned exponent : 11;
787 unsigned mantissa1 : 20;
788 unsigned mantissa2;
789 } little_endian;
790 struct {
791 unsigned mantissa2;
792 unsigned mantissa1 : 20;
793 unsigned exponent : 11;
794 unsigned sign : 1;
795 } big_endian;
796 } u;
798 u.d = dconstm1;
799 if (u.big_endian.sign == 1)
801 u.d = x;
802 return (u.big_endian.exponent == 2047
803 && (u.big_endian.mantissa1 != 0
804 || u.big_endian.mantissa2 != 0));
806 else
808 u.d = x;
809 return (u.little_endian.exponent == 2047
810 && (u.little_endian.mantissa1 != 0
811 || u.little_endian.mantissa2 != 0));
815 /* Check for a negative IEEE double precision number. */
818 target_negative (x)
819 REAL_VALUE_TYPE x;
821 /* The IEEE 64-bit double format. */
822 union {
823 REAL_VALUE_TYPE d;
824 struct {
825 unsigned sign : 1;
826 unsigned exponent : 11;
827 unsigned mantissa1 : 20;
828 unsigned mantissa2;
829 } little_endian;
830 struct {
831 unsigned mantissa2;
832 unsigned mantissa1 : 20;
833 unsigned exponent : 11;
834 unsigned sign : 1;
835 } big_endian;
836 } u;
838 u.d = dconstm1;
839 if (u.big_endian.sign == 1)
841 u.d = x;
842 return u.big_endian.sign;
844 else
846 u.d = x;
847 return u.little_endian.sign;
850 #else /* Target not IEEE */
852 /* Let's assume other float formats don't have infinity.
853 (This can be overridden by redefining REAL_VALUE_ISINF.) */
855 target_isinf (x)
856 REAL_VALUE_TYPE x;
858 return 0;
861 /* Let's assume other float formats don't have NaNs.
862 (This can be overridden by redefining REAL_VALUE_ISNAN.) */
864 target_isnan (x)
865 REAL_VALUE_TYPE x;
867 return 0;
870 /* Let's assume other float formats don't have minus zero.
871 (This can be overridden by redefining REAL_VALUE_NEGATIVE.) */
873 target_negative (x)
874 REAL_VALUE_TYPE x;
876 return x < 0;
878 #endif /* Target not IEEE */
880 /* Try to change R into its exact multiplicative inverse in machine mode
881 MODE. Return nonzero function value if successful. */
884 exact_real_inverse (mode, r)
885 enum machine_mode mode;
886 REAL_VALUE_TYPE *r;
888 union
890 double d;
891 unsigned short i[4];
892 }x, t, y;
893 int i;
895 /* Usually disable if bounds checks are not reliable. */
896 if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT) && !flag_pretend_float)
897 return 0;
899 /* Set array index to the less significant bits in the unions, depending
900 on the endian-ness of the host doubles.
901 Disable if insufficient information on the data structure. */
902 #if HOST_FLOAT_FORMAT == UNKNOWN_FLOAT_FORMAT
903 return 0;
904 #else
905 #if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
906 #define K 2
907 #else
908 #if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
909 #define K 2
910 #else
911 #define K (2 * HOST_FLOAT_WORDS_BIG_ENDIAN)
912 #endif
913 #endif
914 #endif
916 if (setjmp (float_error))
918 /* Don't do the optimization if there was an arithmetic error. */
919 fail:
920 set_float_handler (NULL_PTR);
921 return 0;
923 set_float_handler (float_error);
925 /* Domain check the argument. */
926 x.d = *r;
927 if (x.d == 0.0)
928 goto fail;
930 #ifdef REAL_INFINITY
931 if (REAL_VALUE_ISINF (x.d) || REAL_VALUE_ISNAN (x.d))
932 goto fail;
933 #endif
935 /* Compute the reciprocal and check for numerical exactness.
936 It is unnecessary to check all the significand bits to determine
937 whether X is a power of 2. If X is not, then it is impossible for
938 the bottom half significand of both X and 1/X to be all zero bits.
939 Hence we ignore the data structure of the top half and examine only
940 the low order bits of the two significands. */
941 t.d = 1.0 / x.d;
942 if (x.i[K] != 0 || x.i[K + 1] != 0 || t.i[K] != 0 || t.i[K + 1] != 0)
943 goto fail;
945 /* Truncate to the required mode and range-check the result. */
946 y.d = REAL_VALUE_TRUNCATE (mode, t.d);
947 #ifdef CHECK_FLOAT_VALUE
948 i = 0;
949 if (CHECK_FLOAT_VALUE (mode, y.d, i))
950 goto fail;
951 #endif
953 /* Fail if truncation changed the value. */
954 if (y.d != t.d || y.d == 0.0)
955 goto fail;
957 #ifdef REAL_INFINITY
958 if (REAL_VALUE_ISINF (y.d) || REAL_VALUE_ISNAN (y.d))
959 goto fail;
960 #endif
962 /* Output the reciprocal and return success flag. */
963 set_float_handler (NULL_PTR);
964 *r = y.d;
965 return 1;
967 #endif /* no REAL_ARITHMETIC */
969 /* Split a tree IN into a constant and a variable part
970 that could be combined with CODE to make IN.
971 CODE must be a commutative arithmetic operation.
972 Store the constant part into *CONP and the variable in &VARP.
973 Return 1 if this was done; zero means the tree IN did not decompose
974 this way.
976 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.
977 Therefore, we must tell the caller whether the variable part
978 was subtracted. We do this by storing 1 or -1 into *VARSIGNP.
979 The value stored is the coefficient for the variable term.
980 The constant term we return should always be added;
981 we negate it if necessary. */
983 static int
984 split_tree (in, code, varp, conp, varsignp)
985 tree in;
986 enum tree_code code;
987 tree *varp, *conp;
988 int *varsignp;
990 register tree outtype = TREE_TYPE (in);
991 *varp = 0;
992 *conp = 0;
994 /* Strip any conversions that don't change the machine mode. */
995 while ((TREE_CODE (in) == NOP_EXPR
996 || TREE_CODE (in) == CONVERT_EXPR)
997 && (TYPE_MODE (TREE_TYPE (in))
998 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (in, 0)))))
999 in = TREE_OPERAND (in, 0);
1001 if (TREE_CODE (in) == code
1002 || (! FLOAT_TYPE_P (TREE_TYPE (in))
1003 /* We can associate addition and subtraction together
1004 (even though the C standard doesn't say so)
1005 for integers because the value is not affected.
1006 For reals, the value might be affected, so we can't. */
1007 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1008 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1010 enum tree_code code = TREE_CODE (TREE_OPERAND (in, 0));
1011 if (code == INTEGER_CST)
1013 *conp = TREE_OPERAND (in, 0);
1014 *varp = TREE_OPERAND (in, 1);
1015 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1016 && TREE_TYPE (*varp) != outtype)
1017 *varp = convert (outtype, *varp);
1018 *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1019 return 1;
1021 if (TREE_CONSTANT (TREE_OPERAND (in, 1)))
1023 *conp = TREE_OPERAND (in, 1);
1024 *varp = TREE_OPERAND (in, 0);
1025 *varsignp = 1;
1026 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1027 && TREE_TYPE (*varp) != outtype)
1028 *varp = convert (outtype, *varp);
1029 if (TREE_CODE (in) == MINUS_EXPR)
1031 /* If operation is subtraction and constant is second,
1032 must negate it to get an additive constant.
1033 And this cannot be done unless it is a manifest constant.
1034 It could also be the address of a static variable.
1035 We cannot negate that, so give up. */
1036 if (TREE_CODE (*conp) == INTEGER_CST)
1037 /* Subtracting from integer_zero_node loses for long long. */
1038 *conp = fold (build1 (NEGATE_EXPR, TREE_TYPE (*conp), *conp));
1039 else
1040 return 0;
1042 return 1;
1044 if (TREE_CONSTANT (TREE_OPERAND (in, 0)))
1046 *conp = TREE_OPERAND (in, 0);
1047 *varp = TREE_OPERAND (in, 1);
1048 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1049 && TREE_TYPE (*varp) != outtype)
1050 *varp = convert (outtype, *varp);
1051 *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1052 return 1;
1055 return 0;
1058 /* Combine two integer constants ARG1 and ARG2 under operation CODE
1059 to produce a new constant.
1061 If NOTRUNC is nonzero, do not truncate the result to fit the data type.
1062 If FORSIZE is nonzero, compute overflow for unsigned types. */
1064 static tree
1065 int_const_binop (code, arg1, arg2, notrunc, forsize)
1066 enum tree_code code;
1067 register tree arg1, arg2;
1068 int notrunc, forsize;
1070 HOST_WIDE_INT int1l, int1h, int2l, int2h;
1071 HOST_WIDE_INT low, hi;
1072 HOST_WIDE_INT garbagel, garbageh;
1073 register tree t;
1074 int uns = TREE_UNSIGNED (TREE_TYPE (arg1));
1075 int overflow = 0;
1076 int no_overflow = 0;
1078 int1l = TREE_INT_CST_LOW (arg1);
1079 int1h = TREE_INT_CST_HIGH (arg1);
1080 int2l = TREE_INT_CST_LOW (arg2);
1081 int2h = TREE_INT_CST_HIGH (arg2);
1083 switch (code)
1085 case BIT_IOR_EXPR:
1086 low = int1l | int2l, hi = int1h | int2h;
1087 break;
1089 case BIT_XOR_EXPR:
1090 low = int1l ^ int2l, hi = int1h ^ int2h;
1091 break;
1093 case BIT_AND_EXPR:
1094 low = int1l & int2l, hi = int1h & int2h;
1095 break;
1097 case BIT_ANDTC_EXPR:
1098 low = int1l & ~int2l, hi = int1h & ~int2h;
1099 break;
1101 case RSHIFT_EXPR:
1102 int2l = - int2l;
1103 case LSHIFT_EXPR:
1104 /* It's unclear from the C standard whether shifts can overflow.
1105 The following code ignores overflow; perhaps a C standard
1106 interpretation ruling is needed. */
1107 lshift_double (int1l, int1h, int2l,
1108 TYPE_PRECISION (TREE_TYPE (arg1)),
1109 &low, &hi,
1110 !uns);
1111 no_overflow = 1;
1112 break;
1114 case RROTATE_EXPR:
1115 int2l = - int2l;
1116 case LROTATE_EXPR:
1117 lrotate_double (int1l, int1h, int2l,
1118 TYPE_PRECISION (TREE_TYPE (arg1)),
1119 &low, &hi);
1120 break;
1122 case PLUS_EXPR:
1123 overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1124 break;
1126 case MINUS_EXPR:
1127 neg_double (int2l, int2h, &low, &hi);
1128 add_double (int1l, int1h, low, hi, &low, &hi);
1129 overflow = overflow_sum_sign (hi, int2h, int1h);
1130 break;
1132 case MULT_EXPR:
1133 overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1134 break;
1136 case TRUNC_DIV_EXPR:
1137 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1138 case EXACT_DIV_EXPR:
1139 /* This is a shortcut for a common special case. */
1140 if (int2h == 0 && int2l > 0
1141 && ! TREE_CONSTANT_OVERFLOW (arg1)
1142 && ! TREE_CONSTANT_OVERFLOW (arg2)
1143 && int1h == 0 && int1l >= 0)
1145 if (code == CEIL_DIV_EXPR)
1146 int1l += int2l - 1;
1147 low = int1l / int2l, hi = 0;
1148 break;
1151 /* ... fall through ... */
1153 case ROUND_DIV_EXPR:
1154 if (int2h == 0 && int2l == 1)
1156 low = int1l, hi = int1h;
1157 break;
1159 if (int1l == int2l && int1h == int2h
1160 && ! (int1l == 0 && int1h == 0))
1162 low = 1, hi = 0;
1163 break;
1165 overflow = div_and_round_double (code, uns,
1166 int1l, int1h, int2l, int2h,
1167 &low, &hi, &garbagel, &garbageh);
1168 break;
1170 case TRUNC_MOD_EXPR:
1171 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1172 /* This is a shortcut for a common special case. */
1173 if (int2h == 0 && int2l > 0
1174 && ! TREE_CONSTANT_OVERFLOW (arg1)
1175 && ! TREE_CONSTANT_OVERFLOW (arg2)
1176 && int1h == 0 && int1l >= 0)
1178 if (code == CEIL_MOD_EXPR)
1179 int1l += int2l - 1;
1180 low = int1l % int2l, hi = 0;
1181 break;
1184 /* ... fall through ... */
1186 case ROUND_MOD_EXPR:
1187 overflow = div_and_round_double (code, uns,
1188 int1l, int1h, int2l, int2h,
1189 &garbagel, &garbageh, &low, &hi);
1190 break;
1192 case MIN_EXPR:
1193 case MAX_EXPR:
1194 if (uns)
1196 low = (((unsigned HOST_WIDE_INT) int1h
1197 < (unsigned HOST_WIDE_INT) int2h)
1198 || (((unsigned HOST_WIDE_INT) int1h
1199 == (unsigned HOST_WIDE_INT) int2h)
1200 && ((unsigned HOST_WIDE_INT) int1l
1201 < (unsigned HOST_WIDE_INT) int2l)));
1203 else
1205 low = ((int1h < int2h)
1206 || ((int1h == int2h)
1207 && ((unsigned HOST_WIDE_INT) int1l
1208 < (unsigned HOST_WIDE_INT) int2l)));
1210 if (low == (code == MIN_EXPR))
1211 low = int1l, hi = int1h;
1212 else
1213 low = int2l, hi = int2h;
1214 break;
1216 default:
1217 abort ();
1220 if (TREE_TYPE (arg1) == sizetype && hi == 0
1221 && low >= 0
1222 && (TYPE_MAX_VALUE (sizetype) == NULL
1223 || low <= TREE_INT_CST_LOW (TYPE_MAX_VALUE (sizetype)))
1224 && ! overflow
1225 && ! TREE_OVERFLOW (arg1) && ! TREE_OVERFLOW (arg2))
1226 t = size_int (low);
1227 else
1229 t = build_int_2 (low, hi);
1230 TREE_TYPE (t) = TREE_TYPE (arg1);
1233 TREE_OVERFLOW (t)
1234 = ((notrunc ? (!uns || forsize) && overflow
1235 : force_fit_type (t, (!uns || forsize) && overflow) && ! no_overflow)
1236 | TREE_OVERFLOW (arg1)
1237 | TREE_OVERFLOW (arg2));
1238 /* If we're doing a size calculation, unsigned arithmetic does overflow.
1239 So check if force_fit_type truncated the value. */
1240 if (forsize
1241 && ! TREE_OVERFLOW (t)
1242 && (TREE_INT_CST_HIGH (t) != hi
1243 || TREE_INT_CST_LOW (t) != low))
1244 TREE_OVERFLOW (t) = 1;
1245 TREE_CONSTANT_OVERFLOW (t) = (TREE_OVERFLOW (t)
1246 | TREE_CONSTANT_OVERFLOW (arg1)
1247 | TREE_CONSTANT_OVERFLOW (arg2));
1248 return t;
1251 /* Combine two constants ARG1 and ARG2 under operation CODE
1252 to produce a new constant.
1253 We assume ARG1 and ARG2 have the same data type,
1254 or at least are the same kind of constant and the same machine mode.
1256 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1258 static tree
1259 const_binop (code, arg1, arg2, notrunc)
1260 enum tree_code code;
1261 register tree arg1, arg2;
1262 int notrunc;
1264 STRIP_NOPS (arg1); STRIP_NOPS (arg2);
1266 if (TREE_CODE (arg1) == INTEGER_CST)
1267 return int_const_binop (code, arg1, arg2, notrunc, 0);
1269 #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1270 if (TREE_CODE (arg1) == REAL_CST)
1272 REAL_VALUE_TYPE d1;
1273 REAL_VALUE_TYPE d2;
1274 int overflow = 0;
1275 REAL_VALUE_TYPE value;
1276 tree t;
1278 d1 = TREE_REAL_CST (arg1);
1279 d2 = TREE_REAL_CST (arg2);
1281 /* If either operand is a NaN, just return it. Otherwise, set up
1282 for floating-point trap; we return an overflow. */
1283 if (REAL_VALUE_ISNAN (d1))
1284 return arg1;
1285 else if (REAL_VALUE_ISNAN (d2))
1286 return arg2;
1287 else if (setjmp (float_error))
1289 t = copy_node (arg1);
1290 overflow = 1;
1291 goto got_float;
1294 set_float_handler (float_error);
1296 #ifdef REAL_ARITHMETIC
1297 REAL_ARITHMETIC (value, code, d1, d2);
1298 #else
1299 switch (code)
1301 case PLUS_EXPR:
1302 value = d1 + d2;
1303 break;
1305 case MINUS_EXPR:
1306 value = d1 - d2;
1307 break;
1309 case MULT_EXPR:
1310 value = d1 * d2;
1311 break;
1313 case RDIV_EXPR:
1314 #ifndef REAL_INFINITY
1315 if (d2 == 0)
1316 abort ();
1317 #endif
1319 value = d1 / d2;
1320 break;
1322 case MIN_EXPR:
1323 value = MIN (d1, d2);
1324 break;
1326 case MAX_EXPR:
1327 value = MAX (d1, d2);
1328 break;
1330 default:
1331 abort ();
1333 #endif /* no REAL_ARITHMETIC */
1334 t = build_real (TREE_TYPE (arg1),
1335 real_value_truncate (TYPE_MODE (TREE_TYPE (arg1)), value));
1336 got_float:
1337 set_float_handler (NULL_PTR);
1339 TREE_OVERFLOW (t)
1340 = (force_fit_type (t, overflow)
1341 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1342 TREE_CONSTANT_OVERFLOW (t)
1343 = TREE_OVERFLOW (t)
1344 | TREE_CONSTANT_OVERFLOW (arg1)
1345 | TREE_CONSTANT_OVERFLOW (arg2);
1346 return t;
1348 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1349 if (TREE_CODE (arg1) == COMPLEX_CST)
1351 register tree type = TREE_TYPE (arg1);
1352 register tree r1 = TREE_REALPART (arg1);
1353 register tree i1 = TREE_IMAGPART (arg1);
1354 register tree r2 = TREE_REALPART (arg2);
1355 register tree i2 = TREE_IMAGPART (arg2);
1356 register tree t;
1358 switch (code)
1360 case PLUS_EXPR:
1361 t = build_complex (type,
1362 const_binop (PLUS_EXPR, r1, r2, notrunc),
1363 const_binop (PLUS_EXPR, i1, i2, notrunc));
1364 break;
1366 case MINUS_EXPR:
1367 t = build_complex (type,
1368 const_binop (MINUS_EXPR, r1, r2, notrunc),
1369 const_binop (MINUS_EXPR, i1, i2, notrunc));
1370 break;
1372 case MULT_EXPR:
1373 t = build_complex (type,
1374 const_binop (MINUS_EXPR,
1375 const_binop (MULT_EXPR,
1376 r1, r2, notrunc),
1377 const_binop (MULT_EXPR,
1378 i1, i2, notrunc),
1379 notrunc),
1380 const_binop (PLUS_EXPR,
1381 const_binop (MULT_EXPR,
1382 r1, i2, notrunc),
1383 const_binop (MULT_EXPR,
1384 i1, r2, notrunc),
1385 notrunc));
1386 break;
1388 case RDIV_EXPR:
1390 register tree magsquared
1391 = const_binop (PLUS_EXPR,
1392 const_binop (MULT_EXPR, r2, r2, notrunc),
1393 const_binop (MULT_EXPR, i2, i2, notrunc),
1394 notrunc);
1396 t = build_complex (type,
1397 const_binop
1398 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1399 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1400 const_binop (PLUS_EXPR,
1401 const_binop (MULT_EXPR, r1, r2,
1402 notrunc),
1403 const_binop (MULT_EXPR, i1, i2,
1404 notrunc),
1405 notrunc),
1406 magsquared, notrunc),
1407 const_binop
1408 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1409 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1410 const_binop (MINUS_EXPR,
1411 const_binop (MULT_EXPR, i1, r2,
1412 notrunc),
1413 const_binop (MULT_EXPR, r1, i2,
1414 notrunc),
1415 notrunc),
1416 magsquared, notrunc));
1418 break;
1420 default:
1421 abort ();
1423 return t;
1425 return 0;
1428 /* Return an INTEGER_CST with value V . The type is determined by bit_p:
1429 if it is zero, the type is taken from sizetype; if it is one, the type
1430 is taken from bitsizetype. */
1432 tree
1433 size_int_wide (number, high, bit_p)
1434 unsigned HOST_WIDE_INT number, high;
1435 int bit_p;
1437 register tree t;
1438 /* Type-size nodes already made for small sizes. */
1439 static tree size_table[2*HOST_BITS_PER_WIDE_INT + 1][2];
1441 if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && ! high
1442 && size_table[number][bit_p] != 0)
1443 return size_table[number][bit_p];
1444 if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && ! high)
1446 push_obstacks_nochange ();
1447 /* Make this a permanent node. */
1448 end_temporary_allocation ();
1449 t = build_int_2 (number, 0);
1450 TREE_TYPE (t) = bit_p ? bitsizetype : sizetype;
1451 size_table[number][bit_p] = t;
1452 pop_obstacks ();
1454 else
1456 t = build_int_2 (number, high);
1457 TREE_TYPE (t) = bit_p ? bitsizetype : sizetype;
1458 TREE_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (t) = force_fit_type (t, 0);
1460 return t;
1463 /* Combine operands OP1 and OP2 with arithmetic operation CODE.
1464 CODE is a tree code. Data type is taken from `sizetype',
1465 If the operands are constant, so is the result. */
1467 tree
1468 size_binop (code, arg0, arg1)
1469 enum tree_code code;
1470 tree arg0, arg1;
1472 /* Handle the special case of two integer constants faster. */
1473 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1475 /* And some specific cases even faster than that. */
1476 if (code == PLUS_EXPR && integer_zerop (arg0))
1477 return arg1;
1478 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1479 && integer_zerop (arg1))
1480 return arg0;
1481 else if (code == MULT_EXPR && integer_onep (arg0))
1482 return arg1;
1484 /* Handle general case of two integer constants. */
1485 return int_const_binop (code, arg0, arg1, 0, 1);
1488 if (arg0 == error_mark_node || arg1 == error_mark_node)
1489 return error_mark_node;
1491 return fold (build (code, sizetype, arg0, arg1));
1494 /* Combine operands OP1 and OP2 with arithmetic operation CODE.
1495 CODE is a tree code. Data type is taken from `ssizetype',
1496 If the operands are constant, so is the result. */
1498 tree
1499 ssize_binop (code, arg0, arg1)
1500 enum tree_code code;
1501 tree arg0, arg1;
1503 /* Handle the special case of two integer constants faster. */
1504 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1506 /* And some specific cases even faster than that. */
1507 if (code == PLUS_EXPR && integer_zerop (arg0))
1508 return arg1;
1509 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1510 && integer_zerop (arg1))
1511 return arg0;
1512 else if (code == MULT_EXPR && integer_onep (arg0))
1513 return arg1;
1515 /* Handle general case of two integer constants. We convert
1516 arg0 to ssizetype because int_const_binop uses its type for the
1517 return value. */
1518 arg0 = convert (ssizetype, arg0);
1519 return int_const_binop (code, arg0, arg1, 0, 0);
1522 if (arg0 == error_mark_node || arg1 == error_mark_node)
1523 return error_mark_node;
1525 return fold (build (code, ssizetype, arg0, arg1));
1528 /* Given T, a tree representing type conversion of ARG1, a constant,
1529 return a constant tree representing the result of conversion. */
1531 static tree
1532 fold_convert (t, arg1)
1533 register tree t;
1534 register tree arg1;
1536 register tree type = TREE_TYPE (t);
1537 int overflow = 0;
1539 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
1541 if (TREE_CODE (arg1) == INTEGER_CST)
1543 /* If we would build a constant wider than GCC supports,
1544 leave the conversion unfolded. */
1545 if (TYPE_PRECISION (type) > 2 * HOST_BITS_PER_WIDE_INT)
1546 return t;
1548 /* Given an integer constant, make new constant with new type,
1549 appropriately sign-extended or truncated. */
1550 t = build_int_2 (TREE_INT_CST_LOW (arg1),
1551 TREE_INT_CST_HIGH (arg1));
1552 TREE_TYPE (t) = type;
1553 /* Indicate an overflow if (1) ARG1 already overflowed,
1554 or (2) force_fit_type indicates an overflow.
1555 Tell force_fit_type that an overflow has already occurred
1556 if ARG1 is a too-large unsigned value and T is signed.
1557 But don't indicate an overflow if converting a pointer. */
1558 TREE_OVERFLOW (t)
1559 = ((force_fit_type (t,
1560 (TREE_INT_CST_HIGH (arg1) < 0
1561 && (TREE_UNSIGNED (type)
1562 < TREE_UNSIGNED (TREE_TYPE (arg1)))))
1563 && ! POINTER_TYPE_P (TREE_TYPE (arg1)))
1564 || TREE_OVERFLOW (arg1));
1565 TREE_CONSTANT_OVERFLOW (t)
1566 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1568 #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1569 else if (TREE_CODE (arg1) == REAL_CST)
1571 /* Don't initialize these, use assignments.
1572 Initialized local aggregates don't work on old compilers. */
1573 REAL_VALUE_TYPE x;
1574 REAL_VALUE_TYPE l;
1575 REAL_VALUE_TYPE u;
1576 tree type1 = TREE_TYPE (arg1);
1577 int no_upper_bound;
1579 x = TREE_REAL_CST (arg1);
1580 l = real_value_from_int_cst (type1, TYPE_MIN_VALUE (type));
1582 no_upper_bound = (TYPE_MAX_VALUE (type) == NULL);
1583 if (!no_upper_bound)
1584 u = real_value_from_int_cst (type1, TYPE_MAX_VALUE (type));
1586 /* See if X will be in range after truncation towards 0.
1587 To compensate for truncation, move the bounds away from 0,
1588 but reject if X exactly equals the adjusted bounds. */
1589 #ifdef REAL_ARITHMETIC
1590 REAL_ARITHMETIC (l, MINUS_EXPR, l, dconst1);
1591 if (!no_upper_bound)
1592 REAL_ARITHMETIC (u, PLUS_EXPR, u, dconst1);
1593 #else
1594 l--;
1595 if (!no_upper_bound)
1596 u++;
1597 #endif
1598 /* If X is a NaN, use zero instead and show we have an overflow.
1599 Otherwise, range check. */
1600 if (REAL_VALUE_ISNAN (x))
1601 overflow = 1, x = dconst0;
1602 else if (! (REAL_VALUES_LESS (l, x)
1603 && !no_upper_bound
1604 && REAL_VALUES_LESS (x, u)))
1605 overflow = 1;
1607 #ifndef REAL_ARITHMETIC
1609 HOST_WIDE_INT low, high;
1610 HOST_WIDE_INT half_word
1611 = (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2);
1613 if (x < 0)
1614 x = -x;
1616 high = (HOST_WIDE_INT) (x / half_word / half_word);
1617 x -= (REAL_VALUE_TYPE) high * half_word * half_word;
1618 if (x >= (REAL_VALUE_TYPE) half_word * half_word / 2)
1620 low = x - (REAL_VALUE_TYPE) half_word * half_word / 2;
1621 low |= (HOST_WIDE_INT) -1 << (HOST_BITS_PER_WIDE_INT - 1);
1623 else
1624 low = (HOST_WIDE_INT) x;
1625 if (TREE_REAL_CST (arg1) < 0)
1626 neg_double (low, high, &low, &high);
1627 t = build_int_2 (low, high);
1629 #else
1631 HOST_WIDE_INT low, high;
1632 REAL_VALUE_TO_INT (&low, &high, x);
1633 t = build_int_2 (low, high);
1635 #endif
1636 TREE_TYPE (t) = type;
1637 TREE_OVERFLOW (t)
1638 = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow);
1639 TREE_CONSTANT_OVERFLOW (t)
1640 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1642 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1643 TREE_TYPE (t) = type;
1645 else if (TREE_CODE (type) == REAL_TYPE)
1647 #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1648 if (TREE_CODE (arg1) == INTEGER_CST)
1649 return build_real_from_int_cst (type, arg1);
1650 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1651 if (TREE_CODE (arg1) == REAL_CST)
1653 if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
1655 t = arg1;
1656 TREE_TYPE (arg1) = type;
1657 return t;
1659 else if (setjmp (float_error))
1661 overflow = 1;
1662 t = copy_node (arg1);
1663 goto got_it;
1665 set_float_handler (float_error);
1667 t = build_real (type, real_value_truncate (TYPE_MODE (type),
1668 TREE_REAL_CST (arg1)));
1669 set_float_handler (NULL_PTR);
1671 got_it:
1672 TREE_OVERFLOW (t)
1673 = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow);
1674 TREE_CONSTANT_OVERFLOW (t)
1675 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1676 return t;
1679 TREE_CONSTANT (t) = 1;
1680 return t;
1683 /* Return an expr equal to X but certainly not valid as an lvalue. */
1685 tree
1686 non_lvalue (x)
1687 tree x;
1689 tree result;
1691 /* These things are certainly not lvalues. */
1692 if (TREE_CODE (x) == NON_LVALUE_EXPR
1693 || TREE_CODE (x) == INTEGER_CST
1694 || TREE_CODE (x) == REAL_CST
1695 || TREE_CODE (x) == STRING_CST
1696 || TREE_CODE (x) == ADDR_EXPR)
1697 return x;
1699 result = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
1700 TREE_CONSTANT (result) = TREE_CONSTANT (x);
1701 return result;
1704 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
1705 Zero means allow extended lvalues. */
1707 int pedantic_lvalues;
1709 /* When pedantic, return an expr equal to X but certainly not valid as a
1710 pedantic lvalue. Otherwise, return X. */
1712 tree
1713 pedantic_non_lvalue (x)
1714 tree x;
1716 if (pedantic_lvalues)
1717 return non_lvalue (x);
1718 else
1719 return x;
1722 /* Given a tree comparison code, return the code that is the logical inverse
1723 of the given code. It is not safe to do this for floating-point
1724 comparisons, except for NE_EXPR and EQ_EXPR. */
1726 static enum tree_code
1727 invert_tree_comparison (code)
1728 enum tree_code code;
1730 switch (code)
1732 case EQ_EXPR:
1733 return NE_EXPR;
1734 case NE_EXPR:
1735 return EQ_EXPR;
1736 case GT_EXPR:
1737 return LE_EXPR;
1738 case GE_EXPR:
1739 return LT_EXPR;
1740 case LT_EXPR:
1741 return GE_EXPR;
1742 case LE_EXPR:
1743 return GT_EXPR;
1744 default:
1745 abort ();
1749 /* Similar, but return the comparison that results if the operands are
1750 swapped. This is safe for floating-point. */
1752 static enum tree_code
1753 swap_tree_comparison (code)
1754 enum tree_code code;
1756 switch (code)
1758 case EQ_EXPR:
1759 case NE_EXPR:
1760 return code;
1761 case GT_EXPR:
1762 return LT_EXPR;
1763 case GE_EXPR:
1764 return LE_EXPR;
1765 case LT_EXPR:
1766 return GT_EXPR;
1767 case LE_EXPR:
1768 return GE_EXPR;
1769 default:
1770 abort ();
1774 /* Return nonzero if CODE is a tree code that represents a truth value. */
1776 static int
1777 truth_value_p (code)
1778 enum tree_code code;
1780 return (TREE_CODE_CLASS (code) == '<'
1781 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
1782 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
1783 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
1786 /* Return nonzero if two operands are necessarily equal.
1787 If ONLY_CONST is non-zero, only return non-zero for constants.
1788 This function tests whether the operands are indistinguishable;
1789 it does not test whether they are equal using C's == operation.
1790 The distinction is important for IEEE floating point, because
1791 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
1792 (2) two NaNs may be indistinguishable, but NaN!=NaN. */
1795 operand_equal_p (arg0, arg1, only_const)
1796 tree arg0, arg1;
1797 int only_const;
1799 /* If both types don't have the same signedness, then we can't consider
1800 them equal. We must check this before the STRIP_NOPS calls
1801 because they may change the signedness of the arguments. */
1802 if (TREE_UNSIGNED (TREE_TYPE (arg0)) != TREE_UNSIGNED (TREE_TYPE (arg1)))
1803 return 0;
1805 STRIP_NOPS (arg0);
1806 STRIP_NOPS (arg1);
1808 if (TREE_CODE (arg0) != TREE_CODE (arg1)
1809 /* This is needed for conversions and for COMPONENT_REF.
1810 Might as well play it safe and always test this. */
1811 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
1812 return 0;
1814 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
1815 We don't care about side effects in that case because the SAVE_EXPR
1816 takes care of that for us. In all other cases, two expressions are
1817 equal if they have no side effects. If we have two identical
1818 expressions with side effects that should be treated the same due
1819 to the only side effects being identical SAVE_EXPR's, that will
1820 be detected in the recursive calls below. */
1821 if (arg0 == arg1 && ! only_const
1822 && (TREE_CODE (arg0) == SAVE_EXPR
1823 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
1824 return 1;
1826 /* Next handle constant cases, those for which we can return 1 even
1827 if ONLY_CONST is set. */
1828 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
1829 switch (TREE_CODE (arg0))
1831 case INTEGER_CST:
1832 return (! TREE_CONSTANT_OVERFLOW (arg0)
1833 && ! TREE_CONSTANT_OVERFLOW (arg1)
1834 && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
1835 && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1));
1837 case REAL_CST:
1838 return (! TREE_CONSTANT_OVERFLOW (arg0)
1839 && ! TREE_CONSTANT_OVERFLOW (arg1)
1840 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
1841 TREE_REAL_CST (arg1)));
1843 case COMPLEX_CST:
1844 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
1845 only_const)
1846 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
1847 only_const));
1849 case STRING_CST:
1850 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
1851 && ! strncmp (TREE_STRING_POINTER (arg0),
1852 TREE_STRING_POINTER (arg1),
1853 TREE_STRING_LENGTH (arg0)));
1855 case ADDR_EXPR:
1856 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
1858 default:
1859 break;
1862 if (only_const)
1863 return 0;
1865 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
1867 case '1':
1868 /* Two conversions are equal only if signedness and modes match. */
1869 if ((TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == CONVERT_EXPR)
1870 && (TREE_UNSIGNED (TREE_TYPE (arg0))
1871 != TREE_UNSIGNED (TREE_TYPE (arg1))))
1872 return 0;
1874 return operand_equal_p (TREE_OPERAND (arg0, 0),
1875 TREE_OPERAND (arg1, 0), 0);
1877 case '<':
1878 case '2':
1879 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)
1880 && operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1),
1882 return 1;
1884 /* For commutative ops, allow the other order. */
1885 return ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MULT_EXPR
1886 || TREE_CODE (arg0) == MIN_EXPR || TREE_CODE (arg0) == MAX_EXPR
1887 || TREE_CODE (arg0) == BIT_IOR_EXPR
1888 || TREE_CODE (arg0) == BIT_XOR_EXPR
1889 || TREE_CODE (arg0) == BIT_AND_EXPR
1890 || TREE_CODE (arg0) == NE_EXPR || TREE_CODE (arg0) == EQ_EXPR)
1891 && operand_equal_p (TREE_OPERAND (arg0, 0),
1892 TREE_OPERAND (arg1, 1), 0)
1893 && operand_equal_p (TREE_OPERAND (arg0, 1),
1894 TREE_OPERAND (arg1, 0), 0));
1896 case 'r':
1897 switch (TREE_CODE (arg0))
1899 case INDIRECT_REF:
1900 return operand_equal_p (TREE_OPERAND (arg0, 0),
1901 TREE_OPERAND (arg1, 0), 0);
1903 case COMPONENT_REF:
1904 case ARRAY_REF:
1905 return (operand_equal_p (TREE_OPERAND (arg0, 0),
1906 TREE_OPERAND (arg1, 0), 0)
1907 && operand_equal_p (TREE_OPERAND (arg0, 1),
1908 TREE_OPERAND (arg1, 1), 0));
1910 case BIT_FIELD_REF:
1911 return (operand_equal_p (TREE_OPERAND (arg0, 0),
1912 TREE_OPERAND (arg1, 0), 0)
1913 && operand_equal_p (TREE_OPERAND (arg0, 1),
1914 TREE_OPERAND (arg1, 1), 0)
1915 && operand_equal_p (TREE_OPERAND (arg0, 2),
1916 TREE_OPERAND (arg1, 2), 0));
1917 default:
1918 return 0;
1921 case 'e':
1922 if (TREE_CODE (arg0) == RTL_EXPR)
1923 return rtx_equal_p (RTL_EXPR_RTL (arg0), RTL_EXPR_RTL (arg1));
1924 return 0;
1926 default:
1927 return 0;
1931 /* Similar to operand_equal_p, but see if ARG0 might have been made by
1932 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
1934 When in doubt, return 0. */
1936 static int
1937 operand_equal_for_comparison_p (arg0, arg1, other)
1938 tree arg0, arg1;
1939 tree other;
1941 int unsignedp1, unsignedpo;
1942 tree primarg0, primarg1, primother;
1943 unsigned correct_width;
1945 if (operand_equal_p (arg0, arg1, 0))
1946 return 1;
1948 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
1949 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
1950 return 0;
1952 /* Discard any conversions that don't change the modes of ARG0 and ARG1
1953 and see if the inner values are the same. This removes any
1954 signedness comparison, which doesn't matter here. */
1955 primarg0 = arg0, primarg1 = arg1;
1956 STRIP_NOPS (primarg0); STRIP_NOPS (primarg1);
1957 if (operand_equal_p (primarg0, primarg1, 0))
1958 return 1;
1960 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
1961 actual comparison operand, ARG0.
1963 First throw away any conversions to wider types
1964 already present in the operands. */
1966 primarg1 = get_narrower (arg1, &unsignedp1);
1967 primother = get_narrower (other, &unsignedpo);
1969 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
1970 if (unsignedp1 == unsignedpo
1971 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
1972 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
1974 tree type = TREE_TYPE (arg0);
1976 /* Make sure shorter operand is extended the right way
1977 to match the longer operand. */
1978 primarg1 = convert (signed_or_unsigned_type (unsignedp1,
1979 TREE_TYPE (primarg1)),
1980 primarg1);
1982 if (operand_equal_p (arg0, convert (type, primarg1), 0))
1983 return 1;
1986 return 0;
1989 /* See if ARG is an expression that is either a comparison or is performing
1990 arithmetic on comparisons. The comparisons must only be comparing
1991 two different values, which will be stored in *CVAL1 and *CVAL2; if
1992 they are non-zero it means that some operands have already been found.
1993 No variables may be used anywhere else in the expression except in the
1994 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
1995 the expression and save_expr needs to be called with CVAL1 and CVAL2.
1997 If this is true, return 1. Otherwise, return zero. */
1999 static int
2000 twoval_comparison_p (arg, cval1, cval2, save_p)
2001 tree arg;
2002 tree *cval1, *cval2;
2003 int *save_p;
2005 enum tree_code code = TREE_CODE (arg);
2006 char class = TREE_CODE_CLASS (code);
2008 /* We can handle some of the 'e' cases here. */
2009 if (class == 'e' && code == TRUTH_NOT_EXPR)
2010 class = '1';
2011 else if (class == 'e'
2012 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2013 || code == COMPOUND_EXPR))
2014 class = '2';
2016 /* ??? Disable this since the SAVE_EXPR might already be in use outside
2017 the expression. There may be no way to make this work, but it needs
2018 to be looked at again for 2.6. */
2019 #if 0
2020 else if (class == 'e' && code == SAVE_EXPR && SAVE_EXPR_RTL (arg) == 0)
2022 /* If we've already found a CVAL1 or CVAL2, this expression is
2023 two complex to handle. */
2024 if (*cval1 || *cval2)
2025 return 0;
2027 class = '1';
2028 *save_p = 1;
2030 #endif
2032 switch (class)
2034 case '1':
2035 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
2037 case '2':
2038 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2039 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2040 cval1, cval2, save_p));
2042 case 'c':
2043 return 1;
2045 case 'e':
2046 if (code == COND_EXPR)
2047 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2048 cval1, cval2, save_p)
2049 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2050 cval1, cval2, save_p)
2051 && twoval_comparison_p (TREE_OPERAND (arg, 2),
2052 cval1, cval2, save_p));
2053 return 0;
2055 case '<':
2056 /* First see if we can handle the first operand, then the second. For
2057 the second operand, we know *CVAL1 can't be zero. It must be that
2058 one side of the comparison is each of the values; test for the
2059 case where this isn't true by failing if the two operands
2060 are the same. */
2062 if (operand_equal_p (TREE_OPERAND (arg, 0),
2063 TREE_OPERAND (arg, 1), 0))
2064 return 0;
2066 if (*cval1 == 0)
2067 *cval1 = TREE_OPERAND (arg, 0);
2068 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2070 else if (*cval2 == 0)
2071 *cval2 = TREE_OPERAND (arg, 0);
2072 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2074 else
2075 return 0;
2077 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2079 else if (*cval2 == 0)
2080 *cval2 = TREE_OPERAND (arg, 1);
2081 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2083 else
2084 return 0;
2086 return 1;
2088 default:
2089 return 0;
2093 /* ARG is a tree that is known to contain just arithmetic operations and
2094 comparisons. Evaluate the operations in the tree substituting NEW0 for
2095 any occurrence of OLD0 as an operand of a comparison and likewise for
2096 NEW1 and OLD1. */
2098 static tree
2099 eval_subst (arg, old0, new0, old1, new1)
2100 tree arg;
2101 tree old0, new0, old1, new1;
2103 tree type = TREE_TYPE (arg);
2104 enum tree_code code = TREE_CODE (arg);
2105 char class = TREE_CODE_CLASS (code);
2107 /* We can handle some of the 'e' cases here. */
2108 if (class == 'e' && code == TRUTH_NOT_EXPR)
2109 class = '1';
2110 else if (class == 'e'
2111 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2112 class = '2';
2114 switch (class)
2116 case '1':
2117 return fold (build1 (code, type,
2118 eval_subst (TREE_OPERAND (arg, 0),
2119 old0, new0, old1, new1)));
2121 case '2':
2122 return fold (build (code, type,
2123 eval_subst (TREE_OPERAND (arg, 0),
2124 old0, new0, old1, new1),
2125 eval_subst (TREE_OPERAND (arg, 1),
2126 old0, new0, old1, new1)));
2128 case 'e':
2129 switch (code)
2131 case SAVE_EXPR:
2132 return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2134 case COMPOUND_EXPR:
2135 return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2137 case COND_EXPR:
2138 return fold (build (code, type,
2139 eval_subst (TREE_OPERAND (arg, 0),
2140 old0, new0, old1, new1),
2141 eval_subst (TREE_OPERAND (arg, 1),
2142 old0, new0, old1, new1),
2143 eval_subst (TREE_OPERAND (arg, 2),
2144 old0, new0, old1, new1)));
2145 default:
2146 break;
2148 /* fall through (???) */
2150 case '<':
2152 tree arg0 = TREE_OPERAND (arg, 0);
2153 tree arg1 = TREE_OPERAND (arg, 1);
2155 /* We need to check both for exact equality and tree equality. The
2156 former will be true if the operand has a side-effect. In that
2157 case, we know the operand occurred exactly once. */
2159 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2160 arg0 = new0;
2161 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2162 arg0 = new1;
2164 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2165 arg1 = new0;
2166 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2167 arg1 = new1;
2169 return fold (build (code, type, arg0, arg1));
2172 default:
2173 return arg;
2177 /* Return a tree for the case when the result of an expression is RESULT
2178 converted to TYPE and OMITTED was previously an operand of the expression
2179 but is now not needed (e.g., we folded OMITTED * 0).
2181 If OMITTED has side effects, we must evaluate it. Otherwise, just do
2182 the conversion of RESULT to TYPE. */
2184 static tree
2185 omit_one_operand (type, result, omitted)
2186 tree type, result, omitted;
2188 tree t = convert (type, result);
2190 if (TREE_SIDE_EFFECTS (omitted))
2191 return build (COMPOUND_EXPR, type, omitted, t);
2193 return non_lvalue (t);
2196 /* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
2198 static tree
2199 pedantic_omit_one_operand (type, result, omitted)
2200 tree type, result, omitted;
2202 tree t = convert (type, result);
2204 if (TREE_SIDE_EFFECTS (omitted))
2205 return build (COMPOUND_EXPR, type, omitted, t);
2207 return pedantic_non_lvalue (t);
2212 /* Return a simplified tree node for the truth-negation of ARG. This
2213 never alters ARG itself. We assume that ARG is an operation that
2214 returns a truth value (0 or 1). */
2216 tree
2217 invert_truthvalue (arg)
2218 tree arg;
2220 tree type = TREE_TYPE (arg);
2221 enum tree_code code = TREE_CODE (arg);
2223 if (code == ERROR_MARK)
2224 return arg;
2226 /* If this is a comparison, we can simply invert it, except for
2227 floating-point non-equality comparisons, in which case we just
2228 enclose a TRUTH_NOT_EXPR around what we have. */
2230 if (TREE_CODE_CLASS (code) == '<')
2232 if (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg, 0)))
2233 && !flag_fast_math && code != NE_EXPR && code != EQ_EXPR)
2234 return build1 (TRUTH_NOT_EXPR, type, arg);
2235 else
2236 return build (invert_tree_comparison (code), type,
2237 TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
2240 switch (code)
2242 case INTEGER_CST:
2243 return convert (type, build_int_2 (TREE_INT_CST_LOW (arg) == 0
2244 && TREE_INT_CST_HIGH (arg) == 0, 0));
2246 case TRUTH_AND_EXPR:
2247 return build (TRUTH_OR_EXPR, type,
2248 invert_truthvalue (TREE_OPERAND (arg, 0)),
2249 invert_truthvalue (TREE_OPERAND (arg, 1)));
2251 case TRUTH_OR_EXPR:
2252 return build (TRUTH_AND_EXPR, type,
2253 invert_truthvalue (TREE_OPERAND (arg, 0)),
2254 invert_truthvalue (TREE_OPERAND (arg, 1)));
2256 case TRUTH_XOR_EXPR:
2257 /* Here we can invert either operand. We invert the first operand
2258 unless the second operand is a TRUTH_NOT_EXPR in which case our
2259 result is the XOR of the first operand with the inside of the
2260 negation of the second operand. */
2262 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
2263 return build (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2264 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
2265 else
2266 return build (TRUTH_XOR_EXPR, type,
2267 invert_truthvalue (TREE_OPERAND (arg, 0)),
2268 TREE_OPERAND (arg, 1));
2270 case TRUTH_ANDIF_EXPR:
2271 return build (TRUTH_ORIF_EXPR, type,
2272 invert_truthvalue (TREE_OPERAND (arg, 0)),
2273 invert_truthvalue (TREE_OPERAND (arg, 1)));
2275 case TRUTH_ORIF_EXPR:
2276 return build (TRUTH_ANDIF_EXPR, type,
2277 invert_truthvalue (TREE_OPERAND (arg, 0)),
2278 invert_truthvalue (TREE_OPERAND (arg, 1)));
2280 case TRUTH_NOT_EXPR:
2281 return TREE_OPERAND (arg, 0);
2283 case COND_EXPR:
2284 return build (COND_EXPR, type, TREE_OPERAND (arg, 0),
2285 invert_truthvalue (TREE_OPERAND (arg, 1)),
2286 invert_truthvalue (TREE_OPERAND (arg, 2)));
2288 case COMPOUND_EXPR:
2289 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2290 invert_truthvalue (TREE_OPERAND (arg, 1)));
2292 case NON_LVALUE_EXPR:
2293 return invert_truthvalue (TREE_OPERAND (arg, 0));
2295 case NOP_EXPR:
2296 case CONVERT_EXPR:
2297 case FLOAT_EXPR:
2298 return build1 (TREE_CODE (arg), type,
2299 invert_truthvalue (TREE_OPERAND (arg, 0)));
2301 case BIT_AND_EXPR:
2302 if (!integer_onep (TREE_OPERAND (arg, 1)))
2303 break;
2304 return build (EQ_EXPR, type, arg, convert (type, integer_zero_node));
2306 case SAVE_EXPR:
2307 return build1 (TRUTH_NOT_EXPR, type, arg);
2309 case CLEANUP_POINT_EXPR:
2310 return build1 (CLEANUP_POINT_EXPR, type,
2311 invert_truthvalue (TREE_OPERAND (arg, 0)));
2313 default:
2314 break;
2316 if (TREE_CODE (TREE_TYPE (arg)) != BOOLEAN_TYPE)
2317 abort ();
2318 return build1 (TRUTH_NOT_EXPR, type, arg);
2321 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
2322 operands are another bit-wise operation with a common input. If so,
2323 distribute the bit operations to save an operation and possibly two if
2324 constants are involved. For example, convert
2325 (A | B) & (A | C) into A | (B & C)
2326 Further simplification will occur if B and C are constants.
2328 If this optimization cannot be done, 0 will be returned. */
2330 static tree
2331 distribute_bit_expr (code, type, arg0, arg1)
2332 enum tree_code code;
2333 tree type;
2334 tree arg0, arg1;
2336 tree common;
2337 tree left, right;
2339 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2340 || TREE_CODE (arg0) == code
2341 || (TREE_CODE (arg0) != BIT_AND_EXPR
2342 && TREE_CODE (arg0) != BIT_IOR_EXPR))
2343 return 0;
2345 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
2347 common = TREE_OPERAND (arg0, 0);
2348 left = TREE_OPERAND (arg0, 1);
2349 right = TREE_OPERAND (arg1, 1);
2351 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
2353 common = TREE_OPERAND (arg0, 0);
2354 left = TREE_OPERAND (arg0, 1);
2355 right = TREE_OPERAND (arg1, 0);
2357 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
2359 common = TREE_OPERAND (arg0, 1);
2360 left = TREE_OPERAND (arg0, 0);
2361 right = TREE_OPERAND (arg1, 1);
2363 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
2365 common = TREE_OPERAND (arg0, 1);
2366 left = TREE_OPERAND (arg0, 0);
2367 right = TREE_OPERAND (arg1, 0);
2369 else
2370 return 0;
2372 return fold (build (TREE_CODE (arg0), type, common,
2373 fold (build (code, type, left, right))));
2376 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
2377 starting at BITPOS. The field is unsigned if UNSIGNEDP is non-zero. */
2379 static tree
2380 make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
2381 tree inner;
2382 tree type;
2383 int bitsize, bitpos;
2384 int unsignedp;
2386 tree result = build (BIT_FIELD_REF, type, inner,
2387 size_int (bitsize), bitsize_int (bitpos, 0L));
2389 TREE_UNSIGNED (result) = unsignedp;
2391 return result;
2394 /* Optimize a bit-field compare.
2396 There are two cases: First is a compare against a constant and the
2397 second is a comparison of two items where the fields are at the same
2398 bit position relative to the start of a chunk (byte, halfword, word)
2399 large enough to contain it. In these cases we can avoid the shift
2400 implicit in bitfield extractions.
2402 For constants, we emit a compare of the shifted constant with the
2403 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
2404 compared. For two fields at the same position, we do the ANDs with the
2405 similar mask and compare the result of the ANDs.
2407 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
2408 COMPARE_TYPE is the type of the comparison, and LHS and RHS
2409 are the left and right operands of the comparison, respectively.
2411 If the optimization described above can be done, we return the resulting
2412 tree. Otherwise we return zero. */
2414 static tree
2415 optimize_bit_field_compare (code, compare_type, lhs, rhs)
2416 enum tree_code code;
2417 tree compare_type;
2418 tree lhs, rhs;
2420 int lbitpos, lbitsize, rbitpos, rbitsize;
2421 int lnbitpos, lnbitsize, rnbitpos = 0, rnbitsize = 0;
2422 tree type = TREE_TYPE (lhs);
2423 tree signed_type, unsigned_type;
2424 int const_p = TREE_CODE (rhs) == INTEGER_CST;
2425 enum machine_mode lmode, rmode, lnmode, rnmode = VOIDmode;
2426 int lunsignedp, runsignedp;
2427 int lvolatilep = 0, rvolatilep = 0;
2428 int alignment;
2429 tree linner, rinner = NULL_TREE;
2430 tree mask;
2431 tree offset;
2433 /* Get all the information about the extractions being done. If the bit size
2434 if the same as the size of the underlying object, we aren't doing an
2435 extraction at all and so can do nothing. */
2436 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
2437 &lunsignedp, &lvolatilep, &alignment);
2438 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
2439 || offset != 0)
2440 return 0;
2442 if (!const_p)
2444 /* If this is not a constant, we can only do something if bit positions,
2445 sizes, and signedness are the same. */
2446 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
2447 &runsignedp, &rvolatilep, &alignment);
2449 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
2450 || lunsignedp != runsignedp || offset != 0)
2451 return 0;
2454 /* See if we can find a mode to refer to this field. We should be able to,
2455 but fail if we can't. */
2456 lnmode = get_best_mode (lbitsize, lbitpos,
2457 TYPE_ALIGN (TREE_TYPE (linner)), word_mode,
2458 lvolatilep);
2459 if (lnmode == VOIDmode)
2460 return 0;
2462 /* Set signed and unsigned types of the precision of this mode for the
2463 shifts below. */
2464 signed_type = type_for_mode (lnmode, 0);
2465 unsigned_type = type_for_mode (lnmode, 1);
2467 if (! const_p)
2469 rnmode = get_best_mode (rbitsize, rbitpos,
2470 TYPE_ALIGN (TREE_TYPE (rinner)), word_mode,
2471 rvolatilep);
2472 if (rnmode == VOIDmode)
2473 return 0;
2476 /* Compute the bit position and size for the new reference and our offset
2477 within it. If the new reference is the same size as the original, we
2478 won't optimize anything, so return zero. */
2479 lnbitsize = GET_MODE_BITSIZE (lnmode);
2480 lnbitpos = lbitpos & ~ (lnbitsize - 1);
2481 lbitpos -= lnbitpos;
2482 if (lnbitsize == lbitsize)
2483 return 0;
2485 if (! const_p)
2487 rnbitsize = GET_MODE_BITSIZE (rnmode);
2488 rnbitpos = rbitpos & ~ (rnbitsize - 1);
2489 rbitpos -= rnbitpos;
2490 if (rnbitsize == rbitsize)
2491 return 0;
2494 if (BYTES_BIG_ENDIAN)
2495 lbitpos = lnbitsize - lbitsize - lbitpos;
2497 /* Make the mask to be used against the extracted field. */
2498 mask = build_int_2 (~0, ~0);
2499 TREE_TYPE (mask) = unsigned_type;
2500 force_fit_type (mask, 0);
2501 mask = convert (unsigned_type, mask);
2502 mask = const_binop (LSHIFT_EXPR, mask, size_int (lnbitsize - lbitsize), 0);
2503 mask = const_binop (RSHIFT_EXPR, mask,
2504 size_int (lnbitsize - lbitsize - lbitpos), 0);
2506 if (! const_p)
2507 /* If not comparing with constant, just rework the comparison
2508 and return. */
2509 return build (code, compare_type,
2510 build (BIT_AND_EXPR, unsigned_type,
2511 make_bit_field_ref (linner, unsigned_type,
2512 lnbitsize, lnbitpos, 1),
2513 mask),
2514 build (BIT_AND_EXPR, unsigned_type,
2515 make_bit_field_ref (rinner, unsigned_type,
2516 rnbitsize, rnbitpos, 1),
2517 mask));
2519 /* Otherwise, we are handling the constant case. See if the constant is too
2520 big for the field. Warn and return a tree of for 0 (false) if so. We do
2521 this not only for its own sake, but to avoid having to test for this
2522 error case below. If we didn't, we might generate wrong code.
2524 For unsigned fields, the constant shifted right by the field length should
2525 be all zero. For signed fields, the high-order bits should agree with
2526 the sign bit. */
2528 if (lunsignedp)
2530 if (! integer_zerop (const_binop (RSHIFT_EXPR,
2531 convert (unsigned_type, rhs),
2532 size_int (lbitsize), 0)))
2534 warning ("comparison is always %s due to width of bitfield",
2535 code == NE_EXPR ? "one" : "zero");
2536 return convert (compare_type,
2537 (code == NE_EXPR
2538 ? integer_one_node : integer_zero_node));
2541 else
2543 tree tem = const_binop (RSHIFT_EXPR, convert (signed_type, rhs),
2544 size_int (lbitsize - 1), 0);
2545 if (! integer_zerop (tem) && ! integer_all_onesp (tem))
2547 warning ("comparison is always %s due to width of bitfield",
2548 code == NE_EXPR ? "one" : "zero");
2549 return convert (compare_type,
2550 (code == NE_EXPR
2551 ? integer_one_node : integer_zero_node));
2555 /* Single-bit compares should always be against zero. */
2556 if (lbitsize == 1 && ! integer_zerop (rhs))
2558 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
2559 rhs = convert (type, integer_zero_node);
2562 /* Make a new bitfield reference, shift the constant over the
2563 appropriate number of bits and mask it with the computed mask
2564 (in case this was a signed field). If we changed it, make a new one. */
2565 lhs = make_bit_field_ref (linner, unsigned_type, lnbitsize, lnbitpos, 1);
2566 if (lvolatilep)
2568 TREE_SIDE_EFFECTS (lhs) = 1;
2569 TREE_THIS_VOLATILE (lhs) = 1;
2572 rhs = fold (const_binop (BIT_AND_EXPR,
2573 const_binop (LSHIFT_EXPR,
2574 convert (unsigned_type, rhs),
2575 size_int (lbitpos), 0),
2576 mask, 0));
2578 return build (code, compare_type,
2579 build (BIT_AND_EXPR, unsigned_type, lhs, mask),
2580 rhs);
2583 /* Subroutine for fold_truthop: decode a field reference.
2585 If EXP is a comparison reference, we return the innermost reference.
2587 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
2588 set to the starting bit number.
2590 If the innermost field can be completely contained in a mode-sized
2591 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
2593 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
2594 otherwise it is not changed.
2596 *PUNSIGNEDP is set to the signedness of the field.
2598 *PMASK is set to the mask used. This is either contained in a
2599 BIT_AND_EXPR or derived from the width of the field.
2601 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
2603 Return 0 if this is not a component reference or is one that we can't
2604 do anything with. */
2606 static tree
2607 decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp,
2608 pvolatilep, pmask, pand_mask)
2609 tree exp;
2610 int *pbitsize, *pbitpos;
2611 enum machine_mode *pmode;
2612 int *punsignedp, *pvolatilep;
2613 tree *pmask;
2614 tree *pand_mask;
2616 tree and_mask = 0;
2617 tree mask, inner, offset;
2618 tree unsigned_type;
2619 int precision;
2620 int alignment;
2622 /* All the optimizations using this function assume integer fields.
2623 There are problems with FP fields since the type_for_size call
2624 below can fail for, e.g., XFmode. */
2625 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
2626 return 0;
2628 STRIP_NOPS (exp);
2630 if (TREE_CODE (exp) == BIT_AND_EXPR)
2632 and_mask = TREE_OPERAND (exp, 1);
2633 exp = TREE_OPERAND (exp, 0);
2634 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
2635 if (TREE_CODE (and_mask) != INTEGER_CST)
2636 return 0;
2640 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
2641 punsignedp, pvolatilep, &alignment);
2642 if ((inner == exp && and_mask == 0)
2643 || *pbitsize < 0 || offset != 0)
2644 return 0;
2646 /* Compute the mask to access the bitfield. */
2647 unsigned_type = type_for_size (*pbitsize, 1);
2648 precision = TYPE_PRECISION (unsigned_type);
2650 mask = build_int_2 (~0, ~0);
2651 TREE_TYPE (mask) = unsigned_type;
2652 force_fit_type (mask, 0);
2653 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2654 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2656 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
2657 if (and_mask != 0)
2658 mask = fold (build (BIT_AND_EXPR, unsigned_type,
2659 convert (unsigned_type, and_mask), mask));
2661 *pmask = mask;
2662 *pand_mask = and_mask;
2663 return inner;
2666 /* Return non-zero if MASK represents a mask of SIZE ones in the low-order
2667 bit positions. */
2669 static int
2670 all_ones_mask_p (mask, size)
2671 tree mask;
2672 int size;
2674 tree type = TREE_TYPE (mask);
2675 int precision = TYPE_PRECISION (type);
2676 tree tmask;
2678 tmask = build_int_2 (~0, ~0);
2679 TREE_TYPE (tmask) = signed_type (type);
2680 force_fit_type (tmask, 0);
2681 return
2682 tree_int_cst_equal (mask,
2683 const_binop (RSHIFT_EXPR,
2684 const_binop (LSHIFT_EXPR, tmask,
2685 size_int (precision - size),
2687 size_int (precision - size), 0));
2690 /* Subroutine for fold_truthop: determine if an operand is simple enough
2691 to be evaluated unconditionally. */
2693 static int
2694 simple_operand_p (exp)
2695 tree exp;
2697 /* Strip any conversions that don't change the machine mode. */
2698 while ((TREE_CODE (exp) == NOP_EXPR
2699 || TREE_CODE (exp) == CONVERT_EXPR)
2700 && (TYPE_MODE (TREE_TYPE (exp))
2701 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
2702 exp = TREE_OPERAND (exp, 0);
2704 return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
2705 || (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
2706 && ! TREE_ADDRESSABLE (exp)
2707 && ! TREE_THIS_VOLATILE (exp)
2708 && ! DECL_NONLOCAL (exp)
2709 /* Don't regard global variables as simple. They may be
2710 allocated in ways unknown to the compiler (shared memory,
2711 #pragma weak, etc). */
2712 && ! TREE_PUBLIC (exp)
2713 && ! DECL_EXTERNAL (exp)
2714 /* Loading a static variable is unduly expensive, but global
2715 registers aren't expensive. */
2716 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
2719 /* The following functions are subroutines to fold_range_test and allow it to
2720 try to change a logical combination of comparisons into a range test.
2722 For example, both
2723 X == 2 && X == 3 && X == 4 && X == 5
2725 X >= 2 && X <= 5
2726 are converted to
2727 (unsigned) (X - 2) <= 3
2729 We describe each set of comparisons as being either inside or outside
2730 a range, using a variable named like IN_P, and then describe the
2731 range with a lower and upper bound. If one of the bounds is omitted,
2732 it represents either the highest or lowest value of the type.
2734 In the comments below, we represent a range by two numbers in brackets
2735 preceded by a "+" to designate being inside that range, or a "-" to
2736 designate being outside that range, so the condition can be inverted by
2737 flipping the prefix. An omitted bound is represented by a "-". For
2738 example, "- [-, 10]" means being outside the range starting at the lowest
2739 possible value and ending at 10, in other words, being greater than 10.
2740 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
2741 always false.
2743 We set up things so that the missing bounds are handled in a consistent
2744 manner so neither a missing bound nor "true" and "false" need to be
2745 handled using a special case. */
2747 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
2748 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
2749 and UPPER1_P are nonzero if the respective argument is an upper bound
2750 and zero for a lower. TYPE, if nonzero, is the type of the result; it
2751 must be specified for a comparison. ARG1 will be converted to ARG0's
2752 type if both are specified. */
2754 static tree
2755 range_binop (code, type, arg0, upper0_p, arg1, upper1_p)
2756 enum tree_code code;
2757 tree type;
2758 tree arg0, arg1;
2759 int upper0_p, upper1_p;
2761 tree tem;
2762 int result;
2763 int sgn0, sgn1;
2765 /* If neither arg represents infinity, do the normal operation.
2766 Else, if not a comparison, return infinity. Else handle the special
2767 comparison rules. Note that most of the cases below won't occur, but
2768 are handled for consistency. */
2770 if (arg0 != 0 && arg1 != 0)
2772 tem = fold (build (code, type != 0 ? type : TREE_TYPE (arg0),
2773 arg0, convert (TREE_TYPE (arg0), arg1)));
2774 STRIP_NOPS (tem);
2775 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
2778 if (TREE_CODE_CLASS (code) != '<')
2779 return 0;
2781 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
2782 for neither. Then compute our result treating them as never equal
2783 and comparing bounds to non-bounds as above. */
2784 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
2785 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
2786 switch (code)
2788 case EQ_EXPR: case NE_EXPR:
2789 result = (code == NE_EXPR);
2790 break;
2791 case LT_EXPR: case LE_EXPR:
2792 result = sgn0 < sgn1;
2793 break;
2794 case GT_EXPR: case GE_EXPR:
2795 result = sgn0 > sgn1;
2796 break;
2797 default:
2798 abort ();
2801 return convert (type, result ? integer_one_node : integer_zero_node);
2804 /* Given EXP, a logical expression, set the range it is testing into
2805 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
2806 actually being tested. *PLOW and *PHIGH will have be made the same type
2807 as the returned expression. If EXP is not a comparison, we will most
2808 likely not be returning a useful value and range. */
2810 static tree
2811 make_range (exp, pin_p, plow, phigh)
2812 tree exp;
2813 int *pin_p;
2814 tree *plow, *phigh;
2816 enum tree_code code;
2817 tree arg0, arg1, type = NULL_TREE;
2818 tree orig_type = NULL_TREE;
2819 int in_p, n_in_p;
2820 tree low, high, n_low, n_high;
2822 /* Start with simply saying "EXP != 0" and then look at the code of EXP
2823 and see if we can refine the range. Some of the cases below may not
2824 happen, but it doesn't seem worth worrying about this. We "continue"
2825 the outer loop when we've changed something; otherwise we "break"
2826 the switch, which will "break" the while. */
2828 in_p = 0, low = high = convert (TREE_TYPE (exp), integer_zero_node);
2830 while (1)
2832 code = TREE_CODE (exp);
2834 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
2836 arg0 = TREE_OPERAND (exp, 0);
2837 if (TREE_CODE_CLASS (code) == '<'
2838 || TREE_CODE_CLASS (code) == '1'
2839 || TREE_CODE_CLASS (code) == '2')
2840 type = TREE_TYPE (arg0);
2841 if (TREE_CODE_CLASS (code) == '2'
2842 || TREE_CODE_CLASS (code) == '<'
2843 || (TREE_CODE_CLASS (code) == 'e'
2844 && tree_code_length[(int) code] > 1))
2845 arg1 = TREE_OPERAND (exp, 1);
2848 switch (code)
2850 case TRUTH_NOT_EXPR:
2851 in_p = ! in_p, exp = arg0;
2852 continue;
2854 case EQ_EXPR: case NE_EXPR:
2855 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
2856 /* We can only do something if the range is testing for zero
2857 and if the second operand is an integer constant. Note that
2858 saying something is "in" the range we make is done by
2859 complementing IN_P since it will set in the initial case of
2860 being not equal to zero; "out" is leaving it alone. */
2861 if (low == 0 || high == 0
2862 || ! integer_zerop (low) || ! integer_zerop (high)
2863 || TREE_CODE (arg1) != INTEGER_CST)
2864 break;
2866 switch (code)
2868 case NE_EXPR: /* - [c, c] */
2869 low = high = arg1;
2870 break;
2871 case EQ_EXPR: /* + [c, c] */
2872 in_p = ! in_p, low = high = arg1;
2873 break;
2874 case GT_EXPR: /* - [-, c] */
2875 low = 0, high = arg1;
2876 break;
2877 case GE_EXPR: /* + [c, -] */
2878 in_p = ! in_p, low = arg1, high = 0;
2879 break;
2880 case LT_EXPR: /* - [c, -] */
2881 low = arg1, high = 0;
2882 break;
2883 case LE_EXPR: /* + [-, c] */
2884 in_p = ! in_p, low = 0, high = arg1;
2885 break;
2886 default:
2887 abort ();
2890 exp = arg0;
2892 /* If this is an unsigned comparison, we also know that EXP is
2893 greater than or equal to zero. We base the range tests we make
2894 on that fact, so we record it here so we can parse existing
2895 range tests. */
2896 if (TREE_UNSIGNED (type) && (low == 0 || high == 0))
2898 if (! merge_ranges (&n_in_p, &n_low, &n_high, in_p, low, high,
2899 1, convert (type, integer_zero_node),
2900 NULL_TREE))
2901 break;
2903 in_p = n_in_p, low = n_low, high = n_high;
2905 /* If the high bound is missing, reverse the range so it
2906 goes from zero to the low bound minus 1. */
2907 if (high == 0)
2909 in_p = ! in_p;
2910 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
2911 integer_one_node, 0);
2912 low = convert (type, integer_zero_node);
2915 continue;
2917 case NEGATE_EXPR:
2918 /* (-x) IN [a,b] -> x in [-b, -a] */
2919 n_low = range_binop (MINUS_EXPR, type,
2920 convert (type, integer_zero_node), 0, high, 1);
2921 n_high = range_binop (MINUS_EXPR, type,
2922 convert (type, integer_zero_node), 0, low, 0);
2923 low = n_low, high = n_high;
2924 exp = arg0;
2925 continue;
2927 case BIT_NOT_EXPR:
2928 /* ~ X -> -X - 1 */
2929 exp = build (MINUS_EXPR, type, build1 (NEGATE_EXPR, type, arg0),
2930 convert (type, integer_one_node));
2931 continue;
2933 case PLUS_EXPR: case MINUS_EXPR:
2934 if (TREE_CODE (arg1) != INTEGER_CST)
2935 break;
2937 /* If EXP is signed, any overflow in the computation is undefined,
2938 so we don't worry about it so long as our computations on
2939 the bounds don't overflow. For unsigned, overflow is defined
2940 and this is exactly the right thing. */
2941 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
2942 type, low, 0, arg1, 0);
2943 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
2944 type, high, 1, arg1, 0);
2945 if ((n_low != 0 && TREE_OVERFLOW (n_low))
2946 || (n_high != 0 && TREE_OVERFLOW (n_high)))
2947 break;
2949 /* Check for an unsigned range which has wrapped around the maximum
2950 value thus making n_high < n_low, and normalize it. */
2951 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
2953 low = range_binop (PLUS_EXPR, type, n_high, 0,
2954 integer_one_node, 0);
2955 high = range_binop (MINUS_EXPR, type, n_low, 0,
2956 integer_one_node, 0);
2957 in_p = ! in_p;
2959 else
2960 low = n_low, high = n_high;
2962 exp = arg0;
2963 continue;
2965 case NOP_EXPR: case NON_LVALUE_EXPR: case CONVERT_EXPR:
2966 if (orig_type == NULL_TREE)
2967 orig_type = type;
2968 if (TYPE_PRECISION (type) > TYPE_PRECISION (orig_type))
2969 break;
2971 if (! INTEGRAL_TYPE_P (type)
2972 || (low != 0 && ! int_fits_type_p (low, type))
2973 || (high != 0 && ! int_fits_type_p (high, type)))
2974 break;
2976 n_low = low, n_high = high;
2978 if (n_low != 0)
2979 n_low = convert (type, n_low);
2981 if (n_high != 0)
2982 n_high = convert (type, n_high);
2984 /* If we're converting from an unsigned to a signed type,
2985 we will be doing the comparison as unsigned. The tests above
2986 have already verified that LOW and HIGH are both positive.
2988 So we have to make sure that the original unsigned value will
2989 be interpreted as positive. */
2990 if (TREE_UNSIGNED (type) && ! TREE_UNSIGNED (TREE_TYPE (exp)))
2992 tree equiv_type = type_for_mode (TYPE_MODE (type), 1);
2993 tree high_positive;
2995 /* A range without an upper bound is, naturally, unbounded.
2996 Since convert would have cropped a very large value, use
2997 the max value for the destination type. */
2999 high_positive = TYPE_MAX_VALUE (equiv_type);
3000 if (!high_positive)
3002 high_positive = TYPE_MAX_VALUE (type);
3003 if (!high_positive)
3004 abort();
3006 high_positive = fold (build (RSHIFT_EXPR, type,
3007 convert (type, high_positive),
3008 convert (type, integer_one_node)));
3010 /* If the low bound is specified, "and" the range with the
3011 range for which the original unsigned value will be
3012 positive. */
3013 if (low != 0)
3015 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3016 1, n_low, n_high,
3017 1, convert (type, integer_zero_node),
3018 high_positive))
3019 break;
3021 in_p = (n_in_p == in_p);
3023 else
3025 /* Otherwise, "or" the range with the range of the input
3026 that will be interpreted as negative. */
3027 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3028 0, n_low, n_high,
3029 1, convert (type, integer_zero_node),
3030 high_positive))
3031 break;
3033 in_p = (in_p != n_in_p);
3037 exp = arg0;
3038 low = n_low, high = n_high;
3039 continue;
3041 default:
3042 break;
3045 break;
3048 /* If EXP is a constant, we can evaluate whether this is true or false. */
3049 if (TREE_CODE (exp) == INTEGER_CST)
3051 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
3052 exp, 0, low, 0))
3053 && integer_onep (range_binop (LE_EXPR, integer_type_node,
3054 exp, 1, high, 1)));
3055 low = high = 0;
3056 exp = 0;
3059 *pin_p = in_p, *plow = low, *phigh = high;
3060 return exp;
3063 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
3064 type, TYPE, return an expression to test if EXP is in (or out of, depending
3065 on IN_P) the range. */
3067 static tree
3068 build_range_check (type, exp, in_p, low, high)
3069 tree type;
3070 tree exp;
3071 int in_p;
3072 tree low, high;
3074 tree etype = TREE_TYPE (exp);
3075 tree utype, value;
3077 if (! in_p
3078 && (0 != (value = build_range_check (type, exp, 1, low, high))))
3079 return invert_truthvalue (value);
3081 else if (low == 0 && high == 0)
3082 return convert (type, integer_one_node);
3084 else if (low == 0)
3085 return fold (build (LE_EXPR, type, exp, high));
3087 else if (high == 0)
3088 return fold (build (GE_EXPR, type, exp, low));
3090 else if (operand_equal_p (low, high, 0))
3091 return fold (build (EQ_EXPR, type, exp, low));
3093 else if (TREE_UNSIGNED (etype) && integer_zerop (low))
3094 return build_range_check (type, exp, 1, 0, high);
3096 else if (integer_zerop (low))
3098 utype = unsigned_type (etype);
3099 return build_range_check (type, convert (utype, exp), 1, 0,
3100 convert (utype, high));
3103 else if (0 != (value = const_binop (MINUS_EXPR, high, low, 0))
3104 && ! TREE_OVERFLOW (value))
3105 return build_range_check (type,
3106 fold (build (MINUS_EXPR, etype, exp, low)),
3107 1, convert (etype, integer_zero_node), value);
3108 else
3109 return 0;
3112 /* Given two ranges, see if we can merge them into one. Return 1 if we
3113 can, 0 if we can't. Set the output range into the specified parameters. */
3115 static int
3116 merge_ranges (pin_p, plow, phigh, in0_p, low0, high0, in1_p, low1, high1)
3117 int *pin_p;
3118 tree *plow, *phigh;
3119 int in0_p, in1_p;
3120 tree low0, high0, low1, high1;
3122 int no_overlap;
3123 int subset;
3124 int temp;
3125 tree tem;
3126 int in_p;
3127 tree low, high;
3128 int lowequal = ((low0 == 0 && low1 == 0)
3129 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3130 low0, 0, low1, 0)));
3131 int highequal = ((high0 == 0 && high1 == 0)
3132 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3133 high0, 1, high1, 1)));
3135 /* Make range 0 be the range that starts first, or ends last if they
3136 start at the same value. Swap them if it isn't. */
3137 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
3138 low0, 0, low1, 0))
3139 || (lowequal
3140 && integer_onep (range_binop (GT_EXPR, integer_type_node,
3141 high1, 1, high0, 1))))
3143 temp = in0_p, in0_p = in1_p, in1_p = temp;
3144 tem = low0, low0 = low1, low1 = tem;
3145 tem = high0, high0 = high1, high1 = tem;
3148 /* Now flag two cases, whether the ranges are disjoint or whether the
3149 second range is totally subsumed in the first. Note that the tests
3150 below are simplified by the ones above. */
3151 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
3152 high0, 1, low1, 0));
3153 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
3154 high1, 1, high0, 1));
3156 /* We now have four cases, depending on whether we are including or
3157 excluding the two ranges. */
3158 if (in0_p && in1_p)
3160 /* If they don't overlap, the result is false. If the second range
3161 is a subset it is the result. Otherwise, the range is from the start
3162 of the second to the end of the first. */
3163 if (no_overlap)
3164 in_p = 0, low = high = 0;
3165 else if (subset)
3166 in_p = 1, low = low1, high = high1;
3167 else
3168 in_p = 1, low = low1, high = high0;
3171 else if (in0_p && ! in1_p)
3173 /* If they don't overlap, the result is the first range. If they are
3174 equal, the result is false. If the second range is a subset of the
3175 first, and the ranges begin at the same place, we go from just after
3176 the end of the first range to the end of the second. If the second
3177 range is not a subset of the first, or if it is a subset and both
3178 ranges end at the same place, the range starts at the start of the
3179 first range and ends just before the second range.
3180 Otherwise, we can't describe this as a single range. */
3181 if (no_overlap)
3182 in_p = 1, low = low0, high = high0;
3183 else if (lowequal && highequal)
3184 in_p = 0, low = high = 0;
3185 else if (subset && lowequal)
3187 in_p = 1, high = high0;
3188 low = range_binop (PLUS_EXPR, NULL_TREE, high1, 0,
3189 integer_one_node, 0);
3191 else if (! subset || highequal)
3193 in_p = 1, low = low0;
3194 high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
3195 integer_one_node, 0);
3197 else
3198 return 0;
3201 else if (! in0_p && in1_p)
3203 /* If they don't overlap, the result is the second range. If the second
3204 is a subset of the first, the result is false. Otherwise,
3205 the range starts just after the first range and ends at the
3206 end of the second. */
3207 if (no_overlap)
3208 in_p = 1, low = low1, high = high1;
3209 else if (subset)
3210 in_p = 0, low = high = 0;
3211 else
3213 in_p = 1, high = high1;
3214 low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
3215 integer_one_node, 0);
3219 else
3221 /* The case where we are excluding both ranges. Here the complex case
3222 is if they don't overlap. In that case, the only time we have a
3223 range is if they are adjacent. If the second is a subset of the
3224 first, the result is the first. Otherwise, the range to exclude
3225 starts at the beginning of the first range and ends at the end of the
3226 second. */
3227 if (no_overlap)
3229 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
3230 range_binop (PLUS_EXPR, NULL_TREE,
3231 high0, 1,
3232 integer_one_node, 1),
3233 1, low1, 0)))
3234 in_p = 0, low = low0, high = high1;
3235 else
3236 return 0;
3238 else if (subset)
3239 in_p = 0, low = low0, high = high0;
3240 else
3241 in_p = 0, low = low0, high = high1;
3244 *pin_p = in_p, *plow = low, *phigh = high;
3245 return 1;
3248 /* EXP is some logical combination of boolean tests. See if we can
3249 merge it into some range test. Return the new tree if so. */
3251 static tree
3252 fold_range_test (exp)
3253 tree exp;
3255 int or_op = (TREE_CODE (exp) == TRUTH_ORIF_EXPR
3256 || TREE_CODE (exp) == TRUTH_OR_EXPR);
3257 int in0_p, in1_p, in_p;
3258 tree low0, low1, low, high0, high1, high;
3259 tree lhs = make_range (TREE_OPERAND (exp, 0), &in0_p, &low0, &high0);
3260 tree rhs = make_range (TREE_OPERAND (exp, 1), &in1_p, &low1, &high1);
3261 tree tem;
3263 /* If this is an OR operation, invert both sides; we will invert
3264 again at the end. */
3265 if (or_op)
3266 in0_p = ! in0_p, in1_p = ! in1_p;
3268 /* If both expressions are the same, if we can merge the ranges, and we
3269 can build the range test, return it or it inverted. If one of the
3270 ranges is always true or always false, consider it to be the same
3271 expression as the other. */
3272 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
3273 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
3274 in1_p, low1, high1)
3275 && 0 != (tem = (build_range_check (TREE_TYPE (exp),
3276 lhs != 0 ? lhs
3277 : rhs != 0 ? rhs : integer_zero_node,
3278 in_p, low, high))))
3279 return or_op ? invert_truthvalue (tem) : tem;
3281 /* On machines where the branch cost is expensive, if this is a
3282 short-circuited branch and the underlying object on both sides
3283 is the same, make a non-short-circuit operation. */
3284 else if (BRANCH_COST >= 2
3285 && (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3286 || TREE_CODE (exp) == TRUTH_ORIF_EXPR)
3287 && operand_equal_p (lhs, rhs, 0))
3289 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
3290 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
3291 which cases we can't do this. */
3292 if (simple_operand_p (lhs))
3293 return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3294 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3295 TREE_TYPE (exp), TREE_OPERAND (exp, 0),
3296 TREE_OPERAND (exp, 1));
3298 else if (current_function_decl != 0
3299 && ! contains_placeholder_p (lhs))
3301 tree common = save_expr (lhs);
3303 if (0 != (lhs = build_range_check (TREE_TYPE (exp), common,
3304 or_op ? ! in0_p : in0_p,
3305 low0, high0))
3306 && (0 != (rhs = build_range_check (TREE_TYPE (exp), common,
3307 or_op ? ! in1_p : in1_p,
3308 low1, high1))))
3309 return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3310 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3311 TREE_TYPE (exp), lhs, rhs);
3316 return 0;
3319 /* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
3320 bit value. Arrange things so the extra bits will be set to zero if and
3321 only if C is signed-extended to its full width. If MASK is nonzero,
3322 it is an INTEGER_CST that should be AND'ed with the extra bits. */
3324 static tree
3325 unextend (c, p, unsignedp, mask)
3326 tree c;
3327 int p;
3328 int unsignedp;
3329 tree mask;
3331 tree type = TREE_TYPE (c);
3332 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
3333 tree temp;
3335 if (p == modesize || unsignedp)
3336 return c;
3338 /* We work by getting just the sign bit into the low-order bit, then
3339 into the high-order bit, then sign-extend. We then XOR that value
3340 with C. */
3341 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
3342 temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
3344 /* We must use a signed type in order to get an arithmetic right shift.
3345 However, we must also avoid introducing accidental overflows, so that
3346 a subsequent call to integer_zerop will work. Hence we must
3347 do the type conversion here. At this point, the constant is either
3348 zero or one, and the conversion to a signed type can never overflow.
3349 We could get an overflow if this conversion is done anywhere else. */
3350 if (TREE_UNSIGNED (type))
3351 temp = convert (signed_type (type), temp);
3353 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
3354 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
3355 if (mask != 0)
3356 temp = const_binop (BIT_AND_EXPR, temp, convert (TREE_TYPE (c), mask), 0);
3357 /* If necessary, convert the type back to match the type of C. */
3358 if (TREE_UNSIGNED (type))
3359 temp = convert (type, temp);
3361 return convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
3364 /* Find ways of folding logical expressions of LHS and RHS:
3365 Try to merge two comparisons to the same innermost item.
3366 Look for range tests like "ch >= '0' && ch <= '9'".
3367 Look for combinations of simple terms on machines with expensive branches
3368 and evaluate the RHS unconditionally.
3370 For example, if we have p->a == 2 && p->b == 4 and we can make an
3371 object large enough to span both A and B, we can do this with a comparison
3372 against the object ANDed with the a mask.
3374 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
3375 operations to do this with one comparison.
3377 We check for both normal comparisons and the BIT_AND_EXPRs made this by
3378 function and the one above.
3380 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
3381 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
3383 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
3384 two operands.
3386 We return the simplified tree or 0 if no optimization is possible. */
3388 static tree
3389 fold_truthop (code, truth_type, lhs, rhs)
3390 enum tree_code code;
3391 tree truth_type, lhs, rhs;
3393 /* If this is the "or" of two comparisons, we can do something if we
3394 the comparisons are NE_EXPR. If this is the "and", we can do something
3395 if the comparisons are EQ_EXPR. I.e.,
3396 (a->b == 2 && a->c == 4) can become (a->new == NEW).
3398 WANTED_CODE is this operation code. For single bit fields, we can
3399 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
3400 comparison for one-bit fields. */
3402 enum tree_code wanted_code;
3403 enum tree_code lcode, rcode;
3404 tree ll_arg, lr_arg, rl_arg, rr_arg;
3405 tree ll_inner, lr_inner, rl_inner, rr_inner;
3406 int ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
3407 int rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
3408 int xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
3409 int lnbitsize, lnbitpos, rnbitsize, rnbitpos;
3410 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
3411 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
3412 enum machine_mode lnmode, rnmode;
3413 tree ll_mask, lr_mask, rl_mask, rr_mask;
3414 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
3415 tree l_const, r_const;
3416 tree type, result;
3417 int first_bit, end_bit;
3418 int volatilep;
3420 /* Start by getting the comparison codes. Fail if anything is volatile.
3421 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
3422 it were surrounded with a NE_EXPR. */
3424 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
3425 return 0;
3427 lcode = TREE_CODE (lhs);
3428 rcode = TREE_CODE (rhs);
3430 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
3431 lcode = NE_EXPR, lhs = build (NE_EXPR, truth_type, lhs, integer_zero_node);
3433 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
3434 rcode = NE_EXPR, rhs = build (NE_EXPR, truth_type, rhs, integer_zero_node);
3436 if (TREE_CODE_CLASS (lcode) != '<' || TREE_CODE_CLASS (rcode) != '<')
3437 return 0;
3439 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
3440 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
3442 ll_arg = TREE_OPERAND (lhs, 0);
3443 lr_arg = TREE_OPERAND (lhs, 1);
3444 rl_arg = TREE_OPERAND (rhs, 0);
3445 rr_arg = TREE_OPERAND (rhs, 1);
3447 /* If the RHS can be evaluated unconditionally and its operands are
3448 simple, it wins to evaluate the RHS unconditionally on machines
3449 with expensive branches. In this case, this isn't a comparison
3450 that can be merged. */
3452 /* @@ I'm not sure it wins on the m88110 to do this if the comparisons
3453 are with zero (tmw). */
3455 if (BRANCH_COST >= 2
3456 && INTEGRAL_TYPE_P (TREE_TYPE (rhs))
3457 && simple_operand_p (rl_arg)
3458 && simple_operand_p (rr_arg))
3459 return build (code, truth_type, lhs, rhs);
3461 /* See if the comparisons can be merged. Then get all the parameters for
3462 each side. */
3464 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
3465 || (rcode != EQ_EXPR && rcode != NE_EXPR))
3466 return 0;
3468 volatilep = 0;
3469 ll_inner = decode_field_reference (ll_arg,
3470 &ll_bitsize, &ll_bitpos, &ll_mode,
3471 &ll_unsignedp, &volatilep, &ll_mask,
3472 &ll_and_mask);
3473 lr_inner = decode_field_reference (lr_arg,
3474 &lr_bitsize, &lr_bitpos, &lr_mode,
3475 &lr_unsignedp, &volatilep, &lr_mask,
3476 &lr_and_mask);
3477 rl_inner = decode_field_reference (rl_arg,
3478 &rl_bitsize, &rl_bitpos, &rl_mode,
3479 &rl_unsignedp, &volatilep, &rl_mask,
3480 &rl_and_mask);
3481 rr_inner = decode_field_reference (rr_arg,
3482 &rr_bitsize, &rr_bitpos, &rr_mode,
3483 &rr_unsignedp, &volatilep, &rr_mask,
3484 &rr_and_mask);
3486 /* It must be true that the inner operation on the lhs of each
3487 comparison must be the same if we are to be able to do anything.
3488 Then see if we have constants. If not, the same must be true for
3489 the rhs's. */
3490 if (volatilep || ll_inner == 0 || rl_inner == 0
3491 || ! operand_equal_p (ll_inner, rl_inner, 0))
3492 return 0;
3494 if (TREE_CODE (lr_arg) == INTEGER_CST
3495 && TREE_CODE (rr_arg) == INTEGER_CST)
3496 l_const = lr_arg, r_const = rr_arg;
3497 else if (lr_inner == 0 || rr_inner == 0
3498 || ! operand_equal_p (lr_inner, rr_inner, 0))
3499 return 0;
3500 else
3501 l_const = r_const = 0;
3503 /* If either comparison code is not correct for our logical operation,
3504 fail. However, we can convert a one-bit comparison against zero into
3505 the opposite comparison against that bit being set in the field. */
3507 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
3508 if (lcode != wanted_code)
3510 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
3512 if (ll_unsignedp || tree_log2 (ll_mask) + 1 < ll_bitsize)
3513 l_const = ll_mask;
3514 else
3515 /* Since ll_arg is a single bit bit mask, we can sign extend
3516 it appropriately with a NEGATE_EXPR.
3517 l_const is made a signed value here, but since for l_const != NULL
3518 lr_unsignedp is not used, we don't need to clear the latter. */
3519 l_const = fold (build1 (NEGATE_EXPR, TREE_TYPE (ll_arg),
3520 convert (TREE_TYPE (ll_arg), ll_mask)));
3522 else
3523 return 0;
3526 if (rcode != wanted_code)
3528 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
3530 if (rl_unsignedp || tree_log2 (rl_mask) + 1 < rl_bitsize)
3531 r_const = rl_mask;
3532 else
3533 /* This is analogous to the code for l_const above. */
3534 r_const = fold (build1 (NEGATE_EXPR, TREE_TYPE (rl_arg),
3535 convert (TREE_TYPE (rl_arg), rl_mask)));
3537 else
3538 return 0;
3541 /* See if we can find a mode that contains both fields being compared on
3542 the left. If we can't, fail. Otherwise, update all constants and masks
3543 to be relative to a field of that size. */
3544 first_bit = MIN (ll_bitpos, rl_bitpos);
3545 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
3546 lnmode = get_best_mode (end_bit - first_bit, first_bit,
3547 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
3548 volatilep);
3549 if (lnmode == VOIDmode)
3550 return 0;
3552 lnbitsize = GET_MODE_BITSIZE (lnmode);
3553 lnbitpos = first_bit & ~ (lnbitsize - 1);
3554 type = type_for_size (lnbitsize, 1);
3555 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
3557 if (BYTES_BIG_ENDIAN)
3559 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
3560 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
3563 ll_mask = const_binop (LSHIFT_EXPR, convert (type, ll_mask),
3564 size_int (xll_bitpos), 0);
3565 rl_mask = const_binop (LSHIFT_EXPR, convert (type, rl_mask),
3566 size_int (xrl_bitpos), 0);
3568 if (l_const)
3570 l_const = convert (type, l_const);
3571 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
3572 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
3573 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
3574 fold (build1 (BIT_NOT_EXPR,
3575 type, ll_mask)),
3576 0)))
3578 warning ("comparison is always %s",
3579 wanted_code == NE_EXPR ? "one" : "zero");
3581 return convert (truth_type,
3582 wanted_code == NE_EXPR
3583 ? integer_one_node : integer_zero_node);
3586 if (r_const)
3588 r_const = convert (type, r_const);
3589 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
3590 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
3591 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
3592 fold (build1 (BIT_NOT_EXPR,
3593 type, rl_mask)),
3594 0)))
3596 warning ("comparison is always %s",
3597 wanted_code == NE_EXPR ? "one" : "zero");
3599 return convert (truth_type,
3600 wanted_code == NE_EXPR
3601 ? integer_one_node : integer_zero_node);
3605 /* If the right sides are not constant, do the same for it. Also,
3606 disallow this optimization if a size or signedness mismatch occurs
3607 between the left and right sides. */
3608 if (l_const == 0)
3610 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
3611 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
3612 /* Make sure the two fields on the right
3613 correspond to the left without being swapped. */
3614 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
3615 return 0;
3617 first_bit = MIN (lr_bitpos, rr_bitpos);
3618 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
3619 rnmode = get_best_mode (end_bit - first_bit, first_bit,
3620 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
3621 volatilep);
3622 if (rnmode == VOIDmode)
3623 return 0;
3625 rnbitsize = GET_MODE_BITSIZE (rnmode);
3626 rnbitpos = first_bit & ~ (rnbitsize - 1);
3627 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
3629 if (BYTES_BIG_ENDIAN)
3631 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
3632 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
3635 lr_mask = const_binop (LSHIFT_EXPR, convert (type, lr_mask),
3636 size_int (xlr_bitpos), 0);
3637 rr_mask = const_binop (LSHIFT_EXPR, convert (type, rr_mask),
3638 size_int (xrr_bitpos), 0);
3640 /* Make a mask that corresponds to both fields being compared.
3641 Do this for both items being compared. If the masks agree,
3642 we can do this by masking both and comparing the masked
3643 results. */
3644 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3645 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
3646 if (operand_equal_p (ll_mask, lr_mask, 0) && lnbitsize == rnbitsize)
3648 lhs = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
3649 ll_unsignedp || rl_unsignedp);
3650 rhs = make_bit_field_ref (lr_inner, type, rnbitsize, rnbitpos,
3651 lr_unsignedp || rr_unsignedp);
3652 if (! all_ones_mask_p (ll_mask, lnbitsize))
3654 lhs = build (BIT_AND_EXPR, type, lhs, ll_mask);
3655 rhs = build (BIT_AND_EXPR, type, rhs, ll_mask);
3657 return build (wanted_code, truth_type, lhs, rhs);
3660 /* There is still another way we can do something: If both pairs of
3661 fields being compared are adjacent, we may be able to make a wider
3662 field containing them both. */
3663 if ((ll_bitsize + ll_bitpos == rl_bitpos
3664 && lr_bitsize + lr_bitpos == rr_bitpos)
3665 || (ll_bitpos == rl_bitpos + rl_bitsize
3666 && lr_bitpos == rr_bitpos + rr_bitsize))
3667 return build (wanted_code, truth_type,
3668 make_bit_field_ref (ll_inner, type,
3669 ll_bitsize + rl_bitsize,
3670 MIN (ll_bitpos, rl_bitpos),
3671 ll_unsignedp),
3672 make_bit_field_ref (lr_inner, type,
3673 lr_bitsize + rr_bitsize,
3674 MIN (lr_bitpos, rr_bitpos),
3675 lr_unsignedp));
3677 return 0;
3680 /* Handle the case of comparisons with constants. If there is something in
3681 common between the masks, those bits of the constants must be the same.
3682 If not, the condition is always false. Test for this to avoid generating
3683 incorrect code below. */
3684 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
3685 if (! integer_zerop (result)
3686 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
3687 const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
3689 if (wanted_code == NE_EXPR)
3691 warning ("`or' of unmatched not-equal tests is always 1");
3692 return convert (truth_type, integer_one_node);
3694 else
3696 warning ("`and' of mutually exclusive equal-tests is always zero");
3697 return convert (truth_type, integer_zero_node);
3701 /* Construct the expression we will return. First get the component
3702 reference we will make. Unless the mask is all ones the width of
3703 that field, perform the mask operation. Then compare with the
3704 merged constant. */
3705 result = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
3706 ll_unsignedp || rl_unsignedp);
3708 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3709 if (! all_ones_mask_p (ll_mask, lnbitsize))
3710 result = build (BIT_AND_EXPR, type, result, ll_mask);
3712 return build (wanted_code, truth_type, result,
3713 const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
3716 /* If T contains a COMPOUND_EXPR which was inserted merely to evaluate
3717 S, a SAVE_EXPR, return the expression actually being evaluated. Note
3718 that we may sometimes modify the tree. */
3720 static tree
3721 strip_compound_expr (t, s)
3722 tree t;
3723 tree s;
3725 enum tree_code code = TREE_CODE (t);
3727 /* See if this is the COMPOUND_EXPR we want to eliminate. */
3728 if (code == COMPOUND_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR
3729 && TREE_OPERAND (TREE_OPERAND (t, 0), 0) == s)
3730 return TREE_OPERAND (t, 1);
3732 /* See if this is a COND_EXPR or a simple arithmetic operator. We
3733 don't bother handling any other types. */
3734 else if (code == COND_EXPR)
3736 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3737 TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
3738 TREE_OPERAND (t, 2) = strip_compound_expr (TREE_OPERAND (t, 2), s);
3740 else if (TREE_CODE_CLASS (code) == '1')
3741 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3742 else if (TREE_CODE_CLASS (code) == '<'
3743 || TREE_CODE_CLASS (code) == '2')
3745 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3746 TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
3749 return t;
3752 /* Return a node which has the indicated constant VALUE (either 0 or
3753 1), and is of the indicated TYPE. */
3755 static tree
3756 constant_boolean_node (value, type)
3757 int value;
3758 tree type;
3760 if (type == integer_type_node)
3761 return value ? integer_one_node : integer_zero_node;
3762 else if (TREE_CODE (type) == BOOLEAN_TYPE)
3763 return truthvalue_conversion (value ? integer_one_node :
3764 integer_zero_node);
3765 else
3767 tree t = build_int_2 (value, 0);
3768 TREE_TYPE (t) = type;
3769 return t;
3773 /* Perform constant folding and related simplification of EXPR.
3774 The related simplifications include x*1 => x, x*0 => 0, etc.,
3775 and application of the associative law.
3776 NOP_EXPR conversions may be removed freely (as long as we
3777 are careful not to change the C type of the overall expression)
3778 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
3779 but we can constant-fold them if they have constant operands. */
3781 tree
3782 fold (expr)
3783 tree expr;
3785 register tree t = expr;
3786 tree t1 = NULL_TREE;
3787 tree tem;
3788 tree type = TREE_TYPE (expr);
3789 register tree arg0 = NULL_TREE, arg1 = NULL_TREE;
3790 register enum tree_code code = TREE_CODE (t);
3791 register int kind;
3792 int invert;
3794 /* WINS will be nonzero when the switch is done
3795 if all operands are constant. */
3797 int wins = 1;
3799 /* Don't try to process an RTL_EXPR since its operands aren't trees.
3800 Likewise for a SAVE_EXPR that's already been evaluated. */
3801 if (code == RTL_EXPR || (code == SAVE_EXPR && SAVE_EXPR_RTL (t)) != 0)
3802 return t;
3804 /* Return right away if already constant. */
3805 if (TREE_CONSTANT (t))
3807 if (code == CONST_DECL)
3808 return DECL_INITIAL (t);
3809 return t;
3812 #ifdef MAX_INTEGER_COMPUTATION_MODE
3813 check_max_integer_computation_mode (expr);
3814 #endif
3816 kind = TREE_CODE_CLASS (code);
3817 if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
3819 tree subop;
3821 /* Special case for conversion ops that can have fixed point args. */
3822 arg0 = TREE_OPERAND (t, 0);
3824 /* Don't use STRIP_NOPS, because signedness of argument type matters. */
3825 if (arg0 != 0)
3826 STRIP_TYPE_NOPS (arg0);
3828 if (arg0 != 0 && TREE_CODE (arg0) == COMPLEX_CST)
3829 subop = TREE_REALPART (arg0);
3830 else
3831 subop = arg0;
3833 if (subop != 0 && TREE_CODE (subop) != INTEGER_CST
3834 #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3835 && TREE_CODE (subop) != REAL_CST
3836 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3838 /* Note that TREE_CONSTANT isn't enough:
3839 static var addresses are constant but we can't
3840 do arithmetic on them. */
3841 wins = 0;
3843 else if (kind == 'e' || kind == '<'
3844 || kind == '1' || kind == '2' || kind == 'r')
3846 register int len = tree_code_length[(int) code];
3847 register int i;
3848 for (i = 0; i < len; i++)
3850 tree op = TREE_OPERAND (t, i);
3851 tree subop;
3853 if (op == 0)
3854 continue; /* Valid for CALL_EXPR, at least. */
3856 if (kind == '<' || code == RSHIFT_EXPR)
3858 /* Signedness matters here. Perhaps we can refine this
3859 later. */
3860 STRIP_TYPE_NOPS (op);
3862 else
3864 /* Strip any conversions that don't change the mode. */
3865 STRIP_NOPS (op);
3868 if (TREE_CODE (op) == COMPLEX_CST)
3869 subop = TREE_REALPART (op);
3870 else
3871 subop = op;
3873 if (TREE_CODE (subop) != INTEGER_CST
3874 #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3875 && TREE_CODE (subop) != REAL_CST
3876 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3878 /* Note that TREE_CONSTANT isn't enough:
3879 static var addresses are constant but we can't
3880 do arithmetic on them. */
3881 wins = 0;
3883 if (i == 0)
3884 arg0 = op;
3885 else if (i == 1)
3886 arg1 = op;
3890 /* If this is a commutative operation, and ARG0 is a constant, move it
3891 to ARG1 to reduce the number of tests below. */
3892 if ((code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
3893 || code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
3894 || code == BIT_AND_EXPR)
3895 && (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST))
3897 tem = arg0; arg0 = arg1; arg1 = tem;
3899 tem = TREE_OPERAND (t, 0); TREE_OPERAND (t, 0) = TREE_OPERAND (t, 1);
3900 TREE_OPERAND (t, 1) = tem;
3903 /* Now WINS is set as described above,
3904 ARG0 is the first operand of EXPR,
3905 and ARG1 is the second operand (if it has more than one operand).
3907 First check for cases where an arithmetic operation is applied to a
3908 compound, conditional, or comparison operation. Push the arithmetic
3909 operation inside the compound or conditional to see if any folding
3910 can then be done. Convert comparison to conditional for this purpose.
3911 The also optimizes non-constant cases that used to be done in
3912 expand_expr.
3914 Before we do that, see if this is a BIT_AND_EXPR or a BIT_OR_EXPR,
3915 one of the operands is a comparison and the other is a comparison, a
3916 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
3917 code below would make the expression more complex. Change it to a
3918 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
3919 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
3921 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
3922 || code == EQ_EXPR || code == NE_EXPR)
3923 && ((truth_value_p (TREE_CODE (arg0))
3924 && (truth_value_p (TREE_CODE (arg1))
3925 || (TREE_CODE (arg1) == BIT_AND_EXPR
3926 && integer_onep (TREE_OPERAND (arg1, 1)))))
3927 || (truth_value_p (TREE_CODE (arg1))
3928 && (truth_value_p (TREE_CODE (arg0))
3929 || (TREE_CODE (arg0) == BIT_AND_EXPR
3930 && integer_onep (TREE_OPERAND (arg0, 1)))))))
3932 t = fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
3933 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
3934 : TRUTH_XOR_EXPR,
3935 type, arg0, arg1));
3937 if (code == EQ_EXPR)
3938 t = invert_truthvalue (t);
3940 return t;
3943 if (TREE_CODE_CLASS (code) == '1')
3945 if (TREE_CODE (arg0) == COMPOUND_EXPR)
3946 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
3947 fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
3948 else if (TREE_CODE (arg0) == COND_EXPR)
3950 t = fold (build (COND_EXPR, type, TREE_OPERAND (arg0, 0),
3951 fold (build1 (code, type, TREE_OPERAND (arg0, 1))),
3952 fold (build1 (code, type, TREE_OPERAND (arg0, 2)))));
3954 /* If this was a conversion, and all we did was to move into
3955 inside the COND_EXPR, bring it back out. But leave it if
3956 it is a conversion from integer to integer and the
3957 result precision is no wider than a word since such a
3958 conversion is cheap and may be optimized away by combine,
3959 while it couldn't if it were outside the COND_EXPR. Then return
3960 so we don't get into an infinite recursion loop taking the
3961 conversion out and then back in. */
3963 if ((code == NOP_EXPR || code == CONVERT_EXPR
3964 || code == NON_LVALUE_EXPR)
3965 && TREE_CODE (t) == COND_EXPR
3966 && TREE_CODE (TREE_OPERAND (t, 1)) == code
3967 && TREE_CODE (TREE_OPERAND (t, 2)) == code
3968 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0))
3969 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 2), 0)))
3970 && ! (INTEGRAL_TYPE_P (TREE_TYPE (t))
3971 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0)))
3972 && TYPE_PRECISION (TREE_TYPE (t)) <= BITS_PER_WORD))
3973 t = build1 (code, type,
3974 build (COND_EXPR,
3975 TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0)),
3976 TREE_OPERAND (t, 0),
3977 TREE_OPERAND (TREE_OPERAND (t, 1), 0),
3978 TREE_OPERAND (TREE_OPERAND (t, 2), 0)));
3979 return t;
3981 else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
3982 return fold (build (COND_EXPR, type, arg0,
3983 fold (build1 (code, type, integer_one_node)),
3984 fold (build1 (code, type, integer_zero_node))));
3986 else if (TREE_CODE_CLASS (code) == '2'
3987 || TREE_CODE_CLASS (code) == '<')
3989 if (TREE_CODE (arg1) == COMPOUND_EXPR)
3990 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
3991 fold (build (code, type,
3992 arg0, TREE_OPERAND (arg1, 1))));
3993 else if ((TREE_CODE (arg1) == COND_EXPR
3994 || (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
3995 && TREE_CODE_CLASS (code) != '<'))
3996 && (! TREE_SIDE_EFFECTS (arg0)
3997 || (current_function_decl != 0
3998 && ! contains_placeholder_p (arg0))))
4000 tree test, true_value, false_value;
4001 tree lhs = 0, rhs = 0;
4003 if (TREE_CODE (arg1) == COND_EXPR)
4005 test = TREE_OPERAND (arg1, 0);
4006 true_value = TREE_OPERAND (arg1, 1);
4007 false_value = TREE_OPERAND (arg1, 2);
4009 else
4011 tree testtype = TREE_TYPE (arg1);
4012 test = arg1;
4013 true_value = convert (testtype, integer_one_node);
4014 false_value = convert (testtype, integer_zero_node);
4017 /* If ARG0 is complex we want to make sure we only evaluate
4018 it once. Though this is only required if it is volatile, it
4019 might be more efficient even if it is not. However, if we
4020 succeed in folding one part to a constant, we do not need
4021 to make this SAVE_EXPR. Since we do this optimization
4022 primarily to see if we do end up with constant and this
4023 SAVE_EXPR interferes with later optimizations, suppressing
4024 it when we can is important.
4026 If we are not in a function, we can't make a SAVE_EXPR, so don't
4027 try to do so. Don't try to see if the result is a constant
4028 if an arm is a COND_EXPR since we get exponential behavior
4029 in that case. */
4031 if (TREE_CODE (arg0) != SAVE_EXPR && ! TREE_CONSTANT (arg0)
4032 && current_function_decl != 0
4033 && ((TREE_CODE (arg0) != VAR_DECL
4034 && TREE_CODE (arg0) != PARM_DECL)
4035 || TREE_SIDE_EFFECTS (arg0)))
4037 if (TREE_CODE (true_value) != COND_EXPR)
4038 lhs = fold (build (code, type, arg0, true_value));
4040 if (TREE_CODE (false_value) != COND_EXPR)
4041 rhs = fold (build (code, type, arg0, false_value));
4043 if ((lhs == 0 || ! TREE_CONSTANT (lhs))
4044 && (rhs == 0 || !TREE_CONSTANT (rhs)))
4045 arg0 = save_expr (arg0), lhs = rhs = 0;
4048 if (lhs == 0)
4049 lhs = fold (build (code, type, arg0, true_value));
4050 if (rhs == 0)
4051 rhs = fold (build (code, type, arg0, false_value));
4053 test = fold (build (COND_EXPR, type, test, lhs, rhs));
4055 if (TREE_CODE (arg0) == SAVE_EXPR)
4056 return build (COMPOUND_EXPR, type,
4057 convert (void_type_node, arg0),
4058 strip_compound_expr (test, arg0));
4059 else
4060 return convert (type, test);
4063 else if (TREE_CODE (arg0) == COMPOUND_EXPR)
4064 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
4065 fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
4066 else if ((TREE_CODE (arg0) == COND_EXPR
4067 || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
4068 && TREE_CODE_CLASS (code) != '<'))
4069 && (! TREE_SIDE_EFFECTS (arg1)
4070 || (current_function_decl != 0
4071 && ! contains_placeholder_p (arg1))))
4073 tree test, true_value, false_value;
4074 tree lhs = 0, rhs = 0;
4076 if (TREE_CODE (arg0) == COND_EXPR)
4078 test = TREE_OPERAND (arg0, 0);
4079 true_value = TREE_OPERAND (arg0, 1);
4080 false_value = TREE_OPERAND (arg0, 2);
4082 else
4084 tree testtype = TREE_TYPE (arg0);
4085 test = arg0;
4086 true_value = convert (testtype, integer_one_node);
4087 false_value = convert (testtype, integer_zero_node);
4090 if (TREE_CODE (arg1) != SAVE_EXPR && ! TREE_CONSTANT (arg0)
4091 && current_function_decl != 0
4092 && ((TREE_CODE (arg1) != VAR_DECL
4093 && TREE_CODE (arg1) != PARM_DECL)
4094 || TREE_SIDE_EFFECTS (arg1)))
4096 if (TREE_CODE (true_value) != COND_EXPR)
4097 lhs = fold (build (code, type, true_value, arg1));
4099 if (TREE_CODE (false_value) != COND_EXPR)
4100 rhs = fold (build (code, type, false_value, arg1));
4102 if ((lhs == 0 || ! TREE_CONSTANT (lhs))
4103 && (rhs == 0 || !TREE_CONSTANT (rhs)))
4104 arg1 = save_expr (arg1), lhs = rhs = 0;
4107 if (lhs == 0)
4108 lhs = fold (build (code, type, true_value, arg1));
4110 if (rhs == 0)
4111 rhs = fold (build (code, type, false_value, arg1));
4113 test = fold (build (COND_EXPR, type, test, lhs, rhs));
4114 if (TREE_CODE (arg1) == SAVE_EXPR)
4115 return build (COMPOUND_EXPR, type,
4116 convert (void_type_node, arg1),
4117 strip_compound_expr (test, arg1));
4118 else
4119 return convert (type, test);
4122 else if (TREE_CODE_CLASS (code) == '<'
4123 && TREE_CODE (arg0) == COMPOUND_EXPR)
4124 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
4125 fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
4126 else if (TREE_CODE_CLASS (code) == '<'
4127 && TREE_CODE (arg1) == COMPOUND_EXPR)
4128 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
4129 fold (build (code, type, arg0, TREE_OPERAND (arg1, 1))));
4131 switch (code)
4133 case INTEGER_CST:
4134 case REAL_CST:
4135 case STRING_CST:
4136 case COMPLEX_CST:
4137 case CONSTRUCTOR:
4138 return t;
4140 case CONST_DECL:
4141 return fold (DECL_INITIAL (t));
4143 case NOP_EXPR:
4144 case FLOAT_EXPR:
4145 case CONVERT_EXPR:
4146 case FIX_TRUNC_EXPR:
4147 /* Other kinds of FIX are not handled properly by fold_convert. */
4149 if (TREE_TYPE (TREE_OPERAND (t, 0)) == TREE_TYPE (t))
4150 return TREE_OPERAND (t, 0);
4152 /* Handle cases of two conversions in a row. */
4153 if (TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
4154 || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
4156 tree inside_type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4157 tree inter_type = TREE_TYPE (TREE_OPERAND (t, 0));
4158 tree final_type = TREE_TYPE (t);
4159 int inside_int = INTEGRAL_TYPE_P (inside_type);
4160 int inside_ptr = POINTER_TYPE_P (inside_type);
4161 int inside_float = FLOAT_TYPE_P (inside_type);
4162 int inside_prec = TYPE_PRECISION (inside_type);
4163 int inside_unsignedp = TREE_UNSIGNED (inside_type);
4164 int inter_int = INTEGRAL_TYPE_P (inter_type);
4165 int inter_ptr = POINTER_TYPE_P (inter_type);
4166 int inter_float = FLOAT_TYPE_P (inter_type);
4167 int inter_prec = TYPE_PRECISION (inter_type);
4168 int inter_unsignedp = TREE_UNSIGNED (inter_type);
4169 int final_int = INTEGRAL_TYPE_P (final_type);
4170 int final_ptr = POINTER_TYPE_P (final_type);
4171 int final_float = FLOAT_TYPE_P (final_type);
4172 int final_prec = TYPE_PRECISION (final_type);
4173 int final_unsignedp = TREE_UNSIGNED (final_type);
4175 /* In addition to the cases of two conversions in a row
4176 handled below, if we are converting something to its own
4177 type via an object of identical or wider precision, neither
4178 conversion is needed. */
4179 if (inside_type == final_type
4180 && ((inter_int && final_int) || (inter_float && final_float))
4181 && inter_prec >= final_prec)
4182 return TREE_OPERAND (TREE_OPERAND (t, 0), 0);
4184 /* Likewise, if the intermediate and final types are either both
4185 float or both integer, we don't need the middle conversion if
4186 it is wider than the final type and doesn't change the signedness
4187 (for integers). Avoid this if the final type is a pointer
4188 since then we sometimes need the inner conversion. Likewise if
4189 the outer has a precision not equal to the size of its mode. */
4190 if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
4191 || (inter_float && inside_float))
4192 && inter_prec >= inside_prec
4193 && (inter_float || inter_unsignedp == inside_unsignedp)
4194 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
4195 && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
4196 && ! final_ptr)
4197 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4199 /* If we have a sign-extension of a zero-extended value, we can
4200 replace that by a single zero-extension. */
4201 if (inside_int && inter_int && final_int
4202 && inside_prec < inter_prec && inter_prec < final_prec
4203 && inside_unsignedp && !inter_unsignedp)
4204 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4206 /* Two conversions in a row are not needed unless:
4207 - some conversion is floating-point (overstrict for now), or
4208 - the intermediate type is narrower than both initial and
4209 final, or
4210 - the intermediate type and innermost type differ in signedness,
4211 and the outermost type is wider than the intermediate, or
4212 - the initial type is a pointer type and the precisions of the
4213 intermediate and final types differ, or
4214 - the final type is a pointer type and the precisions of the
4215 initial and intermediate types differ. */
4216 if (! inside_float && ! inter_float && ! final_float
4217 && (inter_prec > inside_prec || inter_prec > final_prec)
4218 && ! (inside_int && inter_int
4219 && inter_unsignedp != inside_unsignedp
4220 && inter_prec < final_prec)
4221 && ((inter_unsignedp && inter_prec > inside_prec)
4222 == (final_unsignedp && final_prec > inter_prec))
4223 && ! (inside_ptr && inter_prec != final_prec)
4224 && ! (final_ptr && inside_prec != inter_prec)
4225 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
4226 && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
4227 && ! final_ptr)
4228 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4231 if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
4232 && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1))
4233 /* Detect assigning a bitfield. */
4234 && !(TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == COMPONENT_REF
4235 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 1))))
4237 /* Don't leave an assignment inside a conversion
4238 unless assigning a bitfield. */
4239 tree prev = TREE_OPERAND (t, 0);
4240 TREE_OPERAND (t, 0) = TREE_OPERAND (prev, 1);
4241 /* First do the assignment, then return converted constant. */
4242 t = build (COMPOUND_EXPR, TREE_TYPE (t), prev, fold (t));
4243 TREE_USED (t) = 1;
4244 return t;
4246 if (!wins)
4248 TREE_CONSTANT (t) = TREE_CONSTANT (arg0);
4249 return t;
4251 return fold_convert (t, arg0);
4253 #if 0 /* This loses on &"foo"[0]. */
4254 case ARRAY_REF:
4256 int i;
4258 /* Fold an expression like: "foo"[2] */
4259 if (TREE_CODE (arg0) == STRING_CST
4260 && TREE_CODE (arg1) == INTEGER_CST
4261 && !TREE_INT_CST_HIGH (arg1)
4262 && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0))
4264 t = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0);
4265 TREE_TYPE (t) = TREE_TYPE (TREE_TYPE (arg0));
4266 force_fit_type (t, 0);
4269 return t;
4270 #endif /* 0 */
4272 case COMPONENT_REF:
4273 if (TREE_CODE (arg0) == CONSTRUCTOR)
4275 tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
4276 if (m)
4277 t = TREE_VALUE (m);
4279 return t;
4281 case RANGE_EXPR:
4282 TREE_CONSTANT (t) = wins;
4283 return t;
4285 case NEGATE_EXPR:
4286 if (wins)
4288 if (TREE_CODE (arg0) == INTEGER_CST)
4290 HOST_WIDE_INT low, high;
4291 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
4292 TREE_INT_CST_HIGH (arg0),
4293 &low, &high);
4294 t = build_int_2 (low, high);
4295 TREE_TYPE (t) = type;
4296 TREE_OVERFLOW (t)
4297 = (TREE_OVERFLOW (arg0)
4298 | force_fit_type (t, overflow && !TREE_UNSIGNED (type)));
4299 TREE_CONSTANT_OVERFLOW (t)
4300 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
4302 else if (TREE_CODE (arg0) == REAL_CST)
4303 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
4305 else if (TREE_CODE (arg0) == NEGATE_EXPR)
4306 return TREE_OPERAND (arg0, 0);
4308 /* Convert - (a - b) to (b - a) for non-floating-point. */
4309 else if (TREE_CODE (arg0) == MINUS_EXPR && ! FLOAT_TYPE_P (type))
4310 return build (MINUS_EXPR, type, TREE_OPERAND (arg0, 1),
4311 TREE_OPERAND (arg0, 0));
4313 return t;
4315 case ABS_EXPR:
4316 if (wins)
4318 if (TREE_CODE (arg0) == INTEGER_CST)
4320 if (! TREE_UNSIGNED (type)
4321 && TREE_INT_CST_HIGH (arg0) < 0)
4323 HOST_WIDE_INT low, high;
4324 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
4325 TREE_INT_CST_HIGH (arg0),
4326 &low, &high);
4327 t = build_int_2 (low, high);
4328 TREE_TYPE (t) = type;
4329 TREE_OVERFLOW (t)
4330 = (TREE_OVERFLOW (arg0)
4331 | force_fit_type (t, overflow));
4332 TREE_CONSTANT_OVERFLOW (t)
4333 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
4336 else if (TREE_CODE (arg0) == REAL_CST)
4338 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
4339 t = build_real (type,
4340 REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
4343 else if (TREE_CODE (arg0) == ABS_EXPR || TREE_CODE (arg0) == NEGATE_EXPR)
4344 return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
4345 return t;
4347 case CONJ_EXPR:
4348 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
4349 return arg0;
4350 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
4351 return build (COMPLEX_EXPR, TREE_TYPE (arg0),
4352 TREE_OPERAND (arg0, 0),
4353 fold (build1 (NEGATE_EXPR,
4354 TREE_TYPE (TREE_TYPE (arg0)),
4355 TREE_OPERAND (arg0, 1))));
4356 else if (TREE_CODE (arg0) == COMPLEX_CST)
4357 return build_complex (type, TREE_OPERAND (arg0, 0),
4358 fold (build1 (NEGATE_EXPR,
4359 TREE_TYPE (TREE_TYPE (arg0)),
4360 TREE_OPERAND (arg0, 1))));
4361 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
4362 return fold (build (TREE_CODE (arg0), type,
4363 fold (build1 (CONJ_EXPR, type,
4364 TREE_OPERAND (arg0, 0))),
4365 fold (build1 (CONJ_EXPR,
4366 type, TREE_OPERAND (arg0, 1)))));
4367 else if (TREE_CODE (arg0) == CONJ_EXPR)
4368 return TREE_OPERAND (arg0, 0);
4369 return t;
4371 case BIT_NOT_EXPR:
4372 if (wins)
4374 t = build_int_2 (~ TREE_INT_CST_LOW (arg0),
4375 ~ TREE_INT_CST_HIGH (arg0));
4376 TREE_TYPE (t) = type;
4377 force_fit_type (t, 0);
4378 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg0);
4379 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (arg0);
4381 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
4382 return TREE_OPERAND (arg0, 0);
4383 return t;
4385 case PLUS_EXPR:
4386 /* A + (-B) -> A - B */
4387 if (TREE_CODE (arg1) == NEGATE_EXPR)
4388 return fold (build (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
4389 else if (! FLOAT_TYPE_P (type))
4391 if (integer_zerop (arg1))
4392 return non_lvalue (convert (type, arg0));
4394 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
4395 with a constant, and the two constants have no bits in common,
4396 we should treat this as a BIT_IOR_EXPR since this may produce more
4397 simplifications. */
4398 if (TREE_CODE (arg0) == BIT_AND_EXPR
4399 && TREE_CODE (arg1) == BIT_AND_EXPR
4400 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
4401 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
4402 && integer_zerop (const_binop (BIT_AND_EXPR,
4403 TREE_OPERAND (arg0, 1),
4404 TREE_OPERAND (arg1, 1), 0)))
4406 code = BIT_IOR_EXPR;
4407 goto bit_ior;
4410 if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
4412 tree arg00, arg01, arg10, arg11;
4413 tree alt0, alt1, same;
4415 /* (A * C) + (B * C) -> (A+B) * C.
4416 We are most concerned about the case where C is a constant,
4417 but other combinations show up during loop reduction. Since
4418 it is not difficult, try all four possibilities. */
4420 arg00 = TREE_OPERAND (arg0, 0);
4421 arg01 = TREE_OPERAND (arg0, 1);
4422 arg10 = TREE_OPERAND (arg1, 0);
4423 arg11 = TREE_OPERAND (arg1, 1);
4424 same = NULL_TREE;
4426 if (operand_equal_p (arg01, arg11, 0))
4427 same = arg01, alt0 = arg00, alt1 = arg10;
4428 else if (operand_equal_p (arg00, arg10, 0))
4429 same = arg00, alt0 = arg01, alt1 = arg11;
4430 else if (operand_equal_p (arg00, arg11, 0))
4431 same = arg00, alt0 = arg01, alt1 = arg10;
4432 else if (operand_equal_p (arg01, arg10, 0))
4433 same = arg01, alt0 = arg00, alt1 = arg11;
4435 if (same)
4436 return fold (build (MULT_EXPR, type,
4437 fold (build (PLUS_EXPR, type, alt0, alt1)),
4438 same));
4441 /* In IEEE floating point, x+0 may not equal x. */
4442 else if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4443 || flag_fast_math)
4444 && real_zerop (arg1))
4445 return non_lvalue (convert (type, arg0));
4446 associate:
4447 /* In most languages, can't associate operations on floats
4448 through parentheses. Rather than remember where the parentheses
4449 were, we don't associate floats at all. It shouldn't matter much.
4450 However, associating multiplications is only very slightly
4451 inaccurate, so do that if -ffast-math is specified. */
4452 if (FLOAT_TYPE_P (type)
4453 && ! (flag_fast_math && code == MULT_EXPR))
4454 goto binary;
4456 /* The varsign == -1 cases happen only for addition and subtraction.
4457 It says that the arg that was split was really CON minus VAR.
4458 The rest of the code applies to all associative operations. */
4459 if (!wins)
4461 tree var, con;
4462 int varsign;
4464 if (split_tree (arg0, code, &var, &con, &varsign))
4466 if (varsign == -1)
4468 /* EXPR is (CON-VAR) +- ARG1. */
4469 /* If it is + and VAR==ARG1, return just CONST. */
4470 if (code == PLUS_EXPR && operand_equal_p (var, arg1, 0))
4471 return convert (TREE_TYPE (t), con);
4473 /* If ARG0 is a constant, don't change things around;
4474 instead keep all the constant computations together. */
4476 if (TREE_CONSTANT (arg0))
4477 return t;
4479 /* Otherwise return (CON +- ARG1) - VAR. */
4480 t = build (MINUS_EXPR, type,
4481 fold (build (code, type, con, arg1)), var);
4483 else
4485 /* EXPR is (VAR+CON) +- ARG1. */
4486 /* If it is - and VAR==ARG1, return just CONST. */
4487 if (code == MINUS_EXPR && operand_equal_p (var, arg1, 0))
4488 return convert (TREE_TYPE (t), con);
4490 /* If ARG0 is a constant, don't change things around;
4491 instead keep all the constant computations together. */
4493 if (TREE_CONSTANT (arg0))
4494 return t;
4496 /* Otherwise return VAR +- (ARG1 +- CON). */
4497 tem = fold (build (code, type, arg1, con));
4498 t = build (code, type, var, tem);
4500 if (integer_zerop (tem)
4501 && (code == PLUS_EXPR || code == MINUS_EXPR))
4502 return convert (type, var);
4503 /* If we have x +/- (c - d) [c an explicit integer]
4504 change it to x -/+ (d - c) since if d is relocatable
4505 then the latter can be a single immediate insn
4506 and the former cannot. */
4507 if (TREE_CODE (tem) == MINUS_EXPR
4508 && TREE_CODE (TREE_OPERAND (tem, 0)) == INTEGER_CST)
4510 tree tem1 = TREE_OPERAND (tem, 1);
4511 TREE_OPERAND (tem, 1) = TREE_OPERAND (tem, 0);
4512 TREE_OPERAND (tem, 0) = tem1;
4513 TREE_SET_CODE (t,
4514 (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
4517 return t;
4520 if (split_tree (arg1, code, &var, &con, &varsign))
4522 if (TREE_CONSTANT (arg1))
4523 return t;
4525 if (varsign == -1)
4526 TREE_SET_CODE (t,
4527 (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
4529 /* EXPR is ARG0 +- (CON +- VAR). */
4530 if (TREE_CODE (t) == MINUS_EXPR
4531 && operand_equal_p (var, arg0, 0))
4533 /* If VAR and ARG0 cancel, return just CON or -CON. */
4534 if (code == PLUS_EXPR)
4535 return convert (TREE_TYPE (t), con);
4536 return fold (build1 (NEGATE_EXPR, TREE_TYPE (t),
4537 convert (TREE_TYPE (t), con)));
4540 t = build (TREE_CODE (t), type,
4541 fold (build (code, TREE_TYPE (t), arg0, con)), var);
4543 if (integer_zerop (TREE_OPERAND (t, 0))
4544 && TREE_CODE (t) == PLUS_EXPR)
4545 return convert (TREE_TYPE (t), var);
4546 return t;
4549 binary:
4550 #if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC)
4551 if (TREE_CODE (arg1) == REAL_CST)
4552 return t;
4553 #endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */
4554 if (wins)
4555 t1 = const_binop (code, arg0, arg1, 0);
4556 if (t1 != NULL_TREE)
4558 /* The return value should always have
4559 the same type as the original expression. */
4560 if (TREE_TYPE (t1) != TREE_TYPE (t))
4561 t1 = convert (TREE_TYPE (t), t1);
4563 return t1;
4565 return t;
4567 case MINUS_EXPR:
4568 if (! FLOAT_TYPE_P (type))
4570 if (! wins && integer_zerop (arg0))
4571 return build1 (NEGATE_EXPR, type, arg1);
4572 if (integer_zerop (arg1))
4573 return non_lvalue (convert (type, arg0));
4575 /* (A * C) - (B * C) -> (A-B) * C. Since we are most concerned
4576 about the case where C is a constant, just try one of the
4577 four possibilities. */
4579 if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR
4580 && operand_equal_p (TREE_OPERAND (arg0, 1),
4581 TREE_OPERAND (arg1, 1), 0))
4582 return fold (build (MULT_EXPR, type,
4583 fold (build (MINUS_EXPR, type,
4584 TREE_OPERAND (arg0, 0),
4585 TREE_OPERAND (arg1, 0))),
4586 TREE_OPERAND (arg0, 1)));
4588 /* Convert A - (-B) to A + B. */
4589 else if (TREE_CODE (arg1) == NEGATE_EXPR)
4590 return fold (build (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
4592 else if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4593 || flag_fast_math)
4595 /* Except with IEEE floating point, 0-x equals -x. */
4596 if (! wins && real_zerop (arg0))
4597 return build1 (NEGATE_EXPR, type, arg1);
4598 /* Except with IEEE floating point, x-0 equals x. */
4599 if (real_zerop (arg1))
4600 return non_lvalue (convert (type, arg0));
4603 /* Fold &x - &x. This can happen from &x.foo - &x.
4604 This is unsafe for certain floats even in non-IEEE formats.
4605 In IEEE, it is unsafe because it does wrong for NaNs.
4606 Also note that operand_equal_p is always false if an operand
4607 is volatile. */
4609 if ((! FLOAT_TYPE_P (type) || flag_fast_math)
4610 && operand_equal_p (arg0, arg1, 0))
4611 return convert (type, integer_zero_node);
4613 goto associate;
4615 case MULT_EXPR:
4616 if (! FLOAT_TYPE_P (type))
4618 if (integer_zerop (arg1))
4619 return omit_one_operand (type, arg1, arg0);
4620 if (integer_onep (arg1))
4621 return non_lvalue (convert (type, arg0));
4623 /* ((A / C) * C) is A if the division is an
4624 EXACT_DIV_EXPR. Since C is normally a constant,
4625 just check for one of the four possibilities. */
4627 if (TREE_CODE (arg0) == EXACT_DIV_EXPR
4628 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
4629 return TREE_OPERAND (arg0, 0);
4631 /* (a * (1 << b)) is (a << b) */
4632 if (TREE_CODE (arg1) == LSHIFT_EXPR
4633 && integer_onep (TREE_OPERAND (arg1, 0)))
4634 return fold (build (LSHIFT_EXPR, type, arg0,
4635 TREE_OPERAND (arg1, 1)));
4636 if (TREE_CODE (arg0) == LSHIFT_EXPR
4637 && integer_onep (TREE_OPERAND (arg0, 0)))
4638 return fold (build (LSHIFT_EXPR, type, arg1,
4639 TREE_OPERAND (arg0, 1)));
4641 else
4643 /* x*0 is 0, except for IEEE floating point. */
4644 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4645 || flag_fast_math)
4646 && real_zerop (arg1))
4647 return omit_one_operand (type, arg1, arg0);
4648 /* In IEEE floating point, x*1 is not equivalent to x for snans.
4649 However, ANSI says we can drop signals,
4650 so we can do this anyway. */
4651 if (real_onep (arg1))
4652 return non_lvalue (convert (type, arg0));
4653 /* x*2 is x+x */
4654 if (! wins && real_twop (arg1) && current_function_decl != 0
4655 && ! contains_placeholder_p (arg0))
4657 tree arg = save_expr (arg0);
4658 return build (PLUS_EXPR, type, arg, arg);
4661 goto associate;
4663 case BIT_IOR_EXPR:
4664 bit_ior:
4666 register enum tree_code code0, code1;
4668 if (integer_all_onesp (arg1))
4669 return omit_one_operand (type, arg1, arg0);
4670 if (integer_zerop (arg1))
4671 return non_lvalue (convert (type, arg0));
4672 t1 = distribute_bit_expr (code, type, arg0, arg1);
4673 if (t1 != NULL_TREE)
4674 return t1;
4676 /* (A << C1) | (A >> C2) if A is unsigned and C1+C2 is the size of A
4677 is a rotate of A by C1 bits. */
4678 /* (A << B) | (A >> (Z - B)) if A is unsigned and Z is the size of A
4679 is a rotate of A by B bits. */
4681 code0 = TREE_CODE (arg0);
4682 code1 = TREE_CODE (arg1);
4683 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
4684 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
4685 && operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1,0), 0)
4686 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
4688 register tree tree01, tree11;
4689 register enum tree_code code01, code11;
4691 tree01 = TREE_OPERAND (arg0, 1);
4692 tree11 = TREE_OPERAND (arg1, 1);
4693 code01 = TREE_CODE (tree01);
4694 code11 = TREE_CODE (tree11);
4695 if (code01 == INTEGER_CST
4696 && code11 == INTEGER_CST
4697 && TREE_INT_CST_HIGH (tree01) == 0
4698 && TREE_INT_CST_HIGH (tree11) == 0
4699 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
4700 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
4701 return build (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
4702 code0 == LSHIFT_EXPR ? tree01 : tree11);
4703 else if (code11 == MINUS_EXPR
4704 && TREE_CODE (TREE_OPERAND (tree11, 0)) == INTEGER_CST
4705 && TREE_INT_CST_HIGH (TREE_OPERAND (tree11, 0)) == 0
4706 && TREE_INT_CST_LOW (TREE_OPERAND (tree11, 0))
4707 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))
4708 && operand_equal_p (tree01, TREE_OPERAND (tree11, 1), 0))
4709 return build (code0 == LSHIFT_EXPR ? LROTATE_EXPR : RROTATE_EXPR,
4710 type, TREE_OPERAND (arg0, 0), tree01);
4711 else if (code01 == MINUS_EXPR
4712 && TREE_CODE (TREE_OPERAND (tree01, 0)) == INTEGER_CST
4713 && TREE_INT_CST_HIGH (TREE_OPERAND (tree01, 0)) == 0
4714 && TREE_INT_CST_LOW (TREE_OPERAND (tree01, 0))
4715 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))
4716 && operand_equal_p (tree11, TREE_OPERAND (tree01, 1), 0))
4717 return build (code0 != LSHIFT_EXPR ? LROTATE_EXPR : RROTATE_EXPR,
4718 type, TREE_OPERAND (arg0, 0), tree11);
4721 goto associate;
4724 case BIT_XOR_EXPR:
4725 if (integer_zerop (arg1))
4726 return non_lvalue (convert (type, arg0));
4727 if (integer_all_onesp (arg1))
4728 return fold (build1 (BIT_NOT_EXPR, type, arg0));
4729 goto associate;
4731 case BIT_AND_EXPR:
4732 bit_and:
4733 if (integer_all_onesp (arg1))
4734 return non_lvalue (convert (type, arg0));
4735 if (integer_zerop (arg1))
4736 return omit_one_operand (type, arg1, arg0);
4737 t1 = distribute_bit_expr (code, type, arg0, arg1);
4738 if (t1 != NULL_TREE)
4739 return t1;
4740 /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */
4741 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR
4742 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0))))
4744 int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)));
4745 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
4746 && (~TREE_INT_CST_LOW (arg0)
4747 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
4748 return build1 (NOP_EXPR, type, TREE_OPERAND (arg1, 0));
4750 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
4751 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
4753 int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
4754 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
4755 && (~TREE_INT_CST_LOW (arg1)
4756 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
4757 return build1 (NOP_EXPR, type, TREE_OPERAND (arg0, 0));
4759 goto associate;
4761 case BIT_ANDTC_EXPR:
4762 if (integer_all_onesp (arg0))
4763 return non_lvalue (convert (type, arg1));
4764 if (integer_zerop (arg0))
4765 return omit_one_operand (type, arg0, arg1);
4766 if (TREE_CODE (arg1) == INTEGER_CST)
4768 arg1 = fold (build1 (BIT_NOT_EXPR, type, arg1));
4769 code = BIT_AND_EXPR;
4770 goto bit_and;
4772 goto binary;
4774 case RDIV_EXPR:
4775 /* In most cases, do nothing with a divide by zero. */
4776 #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
4777 #ifndef REAL_INFINITY
4778 if (TREE_CODE (arg1) == REAL_CST && real_zerop (arg1))
4779 return t;
4780 #endif
4781 #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
4783 /* In IEEE floating point, x/1 is not equivalent to x for snans.
4784 However, ANSI says we can drop signals, so we can do this anyway. */
4785 if (real_onep (arg1))
4786 return non_lvalue (convert (type, arg0));
4788 /* If ARG1 is a constant, we can convert this to a multiply by the
4789 reciprocal. This does not have the same rounding properties,
4790 so only do this if -ffast-math. We can actually always safely
4791 do it if ARG1 is a power of two, but it's hard to tell if it is
4792 or not in a portable manner. */
4793 if (TREE_CODE (arg1) == REAL_CST)
4795 if (flag_fast_math
4796 && 0 != (tem = const_binop (code, build_real (type, dconst1),
4797 arg1, 0)))
4798 return fold (build (MULT_EXPR, type, arg0, tem));
4799 /* Find the reciprocal if optimizing and the result is exact. */
4800 else if (optimize)
4802 REAL_VALUE_TYPE r;
4803 r = TREE_REAL_CST (arg1);
4804 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
4806 tem = build_real (type, r);
4807 return fold (build (MULT_EXPR, type, arg0, tem));
4811 goto binary;
4813 case TRUNC_DIV_EXPR:
4814 case ROUND_DIV_EXPR:
4815 case FLOOR_DIV_EXPR:
4816 case CEIL_DIV_EXPR:
4817 case EXACT_DIV_EXPR:
4818 if (integer_onep (arg1))
4819 return non_lvalue (convert (type, arg0));
4820 if (integer_zerop (arg1))
4821 return t;
4823 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
4824 operation, EXACT_DIV_EXPR.
4826 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
4827 At one time others generated faster code, it's not clear if they do
4828 after the last round to changes to the DIV code in expmed.c. */
4829 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
4830 && multiple_of_p (type, arg0, arg1))
4831 return fold (build (EXACT_DIV_EXPR, type, arg0, arg1));
4833 /* If we have ((a / C1) / C2) where both division are the same type, try
4834 to simplify. First see if C1 * C2 overflows or not. */
4835 if (TREE_CODE (arg0) == code && TREE_CODE (arg1) == INTEGER_CST
4836 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
4838 tree new_divisor;
4840 new_divisor = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 1), arg1, 0);
4841 tem = const_binop (FLOOR_DIV_EXPR, new_divisor, arg1, 0);
4843 if (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) == TREE_INT_CST_LOW (tem)
4844 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == TREE_INT_CST_HIGH (tem))
4846 /* If no overflow, divide by C1*C2. */
4847 return fold (build (code, type, TREE_OPERAND (arg0, 0), new_divisor));
4851 /* Look for ((a * C1) / C3) or (((a * C1) + C2) / C3),
4852 where C1 % C3 == 0 or C3 % C1 == 0. We can simplify these
4853 expressions, which often appear in the offsets or sizes of
4854 objects with a varying size. Only deal with positive divisors
4855 and multiplicands. If C2 is negative, we must have C2 % C3 == 0.
4857 Look for NOPs and SAVE_EXPRs inside. */
4859 if (TREE_CODE (arg1) == INTEGER_CST
4860 && tree_int_cst_sgn (arg1) >= 0)
4862 int have_save_expr = 0;
4863 tree c2 = integer_zero_node;
4864 tree xarg0 = arg0;
4866 if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
4867 have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
4869 STRIP_NOPS (xarg0);
4871 /* Look inside the dividend and simplify using EXACT_DIV_EXPR
4872 if possible. */
4873 if (TREE_CODE (xarg0) == MULT_EXPR
4874 && multiple_of_p (type, TREE_OPERAND (xarg0, 0), arg1))
4876 tree t;
4878 t = fold (build (MULT_EXPR, type,
4879 fold (build (EXACT_DIV_EXPR, type,
4880 TREE_OPERAND (xarg0, 0), arg1)),
4881 TREE_OPERAND (xarg0, 1)));
4882 if (have_save_expr)
4883 t = save_expr (t);
4884 return t;
4888 if (TREE_CODE (xarg0) == MULT_EXPR
4889 && multiple_of_p (type, TREE_OPERAND (xarg0, 1), arg1))
4891 tree t;
4893 t = fold (build (MULT_EXPR, type,
4894 fold (build (EXACT_DIV_EXPR, type,
4895 TREE_OPERAND (xarg0, 1), arg1)),
4896 TREE_OPERAND (xarg0, 0)));
4897 if (have_save_expr)
4898 t = save_expr (t);
4899 return t;
4902 if (TREE_CODE (xarg0) == PLUS_EXPR
4903 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
4904 c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
4905 else if (TREE_CODE (xarg0) == MINUS_EXPR
4906 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4907 /* If we are doing this computation unsigned, the negate
4908 is incorrect. */
4909 && ! TREE_UNSIGNED (type))
4911 c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
4912 xarg0 = TREE_OPERAND (xarg0, 0);
4915 if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
4916 have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
4918 STRIP_NOPS (xarg0);
4920 if (TREE_CODE (xarg0) == MULT_EXPR
4921 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4922 && tree_int_cst_sgn (TREE_OPERAND (xarg0, 1)) >= 0
4923 && (integer_zerop (const_binop (TRUNC_MOD_EXPR,
4924 TREE_OPERAND (xarg0, 1), arg1, 1))
4925 || integer_zerop (const_binop (TRUNC_MOD_EXPR, arg1,
4926 TREE_OPERAND (xarg0, 1), 1)))
4927 && (tree_int_cst_sgn (c2) >= 0
4928 || integer_zerop (const_binop (TRUNC_MOD_EXPR, c2,
4929 arg1, 1))))
4931 tree outer_div = integer_one_node;
4932 tree c1 = TREE_OPERAND (xarg0, 1);
4933 tree c3 = arg1;
4935 /* If C3 > C1, set them equal and do a divide by
4936 C3/C1 at the end of the operation. */
4937 if (tree_int_cst_lt (c1, c3))
4938 outer_div = const_binop (code, c3, c1, 0), c3 = c1;
4940 /* The result is A * (C1/C3) + (C2/C3). */
4941 t = fold (build (PLUS_EXPR, type,
4942 fold (build (MULT_EXPR, type,
4943 TREE_OPERAND (xarg0, 0),
4944 const_binop (code, c1, c3, 1))),
4945 const_binop (code, c2, c3, 1)));
4947 if (! integer_onep (outer_div))
4948 t = fold (build (code, type, t, convert (type, outer_div)));
4950 if (have_save_expr)
4951 t = save_expr (t);
4953 return t;
4957 goto binary;
4959 case CEIL_MOD_EXPR:
4960 case FLOOR_MOD_EXPR:
4961 case ROUND_MOD_EXPR:
4962 case TRUNC_MOD_EXPR:
4963 if (integer_onep (arg1))
4964 return omit_one_operand (type, integer_zero_node, arg0);
4965 if (integer_zerop (arg1))
4966 return t;
4968 /* Look for ((a * C1) % C3) or (((a * C1) + C2) % C3),
4969 where C1 % C3 == 0. Handle similarly to the division case,
4970 but don't bother with SAVE_EXPRs. */
4972 if (TREE_CODE (arg1) == INTEGER_CST
4973 && ! integer_zerop (arg1))
4975 tree c2 = integer_zero_node;
4976 tree xarg0 = arg0;
4978 if (TREE_CODE (xarg0) == PLUS_EXPR
4979 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
4980 c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
4981 else if (TREE_CODE (xarg0) == MINUS_EXPR
4982 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4983 && ! TREE_UNSIGNED (type))
4985 c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
4986 xarg0 = TREE_OPERAND (xarg0, 0);
4989 STRIP_NOPS (xarg0);
4991 if (TREE_CODE (xarg0) == MULT_EXPR
4992 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4993 && integer_zerop (const_binop (TRUNC_MOD_EXPR,
4994 TREE_OPERAND (xarg0, 1),
4995 arg1, 1))
4996 && tree_int_cst_sgn (c2) >= 0)
4997 /* The result is (C2%C3). */
4998 return omit_one_operand (type, const_binop (code, c2, arg1, 1),
4999 TREE_OPERAND (xarg0, 0));
5002 goto binary;
5004 case LSHIFT_EXPR:
5005 case RSHIFT_EXPR:
5006 case LROTATE_EXPR:
5007 case RROTATE_EXPR:
5008 if (integer_zerop (arg1))
5009 return non_lvalue (convert (type, arg0));
5010 /* Since negative shift count is not well-defined,
5011 don't try to compute it in the compiler. */
5012 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
5013 return t;
5014 /* Rewrite an LROTATE_EXPR by a constant into an
5015 RROTATE_EXPR by a new constant. */
5016 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
5018 TREE_SET_CODE (t, RROTATE_EXPR);
5019 code = RROTATE_EXPR;
5020 TREE_OPERAND (t, 1) = arg1
5021 = const_binop
5022 (MINUS_EXPR,
5023 convert (TREE_TYPE (arg1),
5024 build_int_2 (GET_MODE_BITSIZE (TYPE_MODE (type)), 0)),
5025 arg1, 0);
5026 if (tree_int_cst_sgn (arg1) < 0)
5027 return t;
5030 /* If we have a rotate of a bit operation with the rotate count and
5031 the second operand of the bit operation both constant,
5032 permute the two operations. */
5033 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
5034 && (TREE_CODE (arg0) == BIT_AND_EXPR
5035 || TREE_CODE (arg0) == BIT_ANDTC_EXPR
5036 || TREE_CODE (arg0) == BIT_IOR_EXPR
5037 || TREE_CODE (arg0) == BIT_XOR_EXPR)
5038 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
5039 return fold (build (TREE_CODE (arg0), type,
5040 fold (build (code, type,
5041 TREE_OPERAND (arg0, 0), arg1)),
5042 fold (build (code, type,
5043 TREE_OPERAND (arg0, 1), arg1))));
5045 /* Two consecutive rotates adding up to the width of the mode can
5046 be ignored. */
5047 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
5048 && TREE_CODE (arg0) == RROTATE_EXPR
5049 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
5050 && TREE_INT_CST_HIGH (arg1) == 0
5051 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
5052 && ((TREE_INT_CST_LOW (arg1)
5053 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
5054 == GET_MODE_BITSIZE (TYPE_MODE (type))))
5055 return TREE_OPERAND (arg0, 0);
5057 goto binary;
5059 case MIN_EXPR:
5060 if (operand_equal_p (arg0, arg1, 0))
5061 return arg0;
5062 if (INTEGRAL_TYPE_P (type)
5063 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), 1))
5064 return omit_one_operand (type, arg1, arg0);
5065 goto associate;
5067 case MAX_EXPR:
5068 if (operand_equal_p (arg0, arg1, 0))
5069 return arg0;
5070 if (INTEGRAL_TYPE_P (type)
5071 && TYPE_MAX_VALUE (type)
5072 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), 1))
5073 return omit_one_operand (type, arg1, arg0);
5074 goto associate;
5076 case TRUTH_NOT_EXPR:
5077 /* Note that the operand of this must be an int
5078 and its values must be 0 or 1.
5079 ("true" is a fixed value perhaps depending on the language,
5080 but we don't handle values other than 1 correctly yet.) */
5081 tem = invert_truthvalue (arg0);
5082 /* Avoid infinite recursion. */
5083 if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
5084 return t;
5085 return convert (type, tem);
5087 case TRUTH_ANDIF_EXPR:
5088 /* Note that the operands of this must be ints
5089 and their values must be 0 or 1.
5090 ("true" is a fixed value perhaps depending on the language.) */
5091 /* If first arg is constant zero, return it. */
5092 if (integer_zerop (arg0))
5093 return arg0;
5094 case TRUTH_AND_EXPR:
5095 /* If either arg is constant true, drop it. */
5096 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5097 return non_lvalue (arg1);
5098 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
5099 return non_lvalue (arg0);
5100 /* If second arg is constant zero, result is zero, but first arg
5101 must be evaluated. */
5102 if (integer_zerop (arg1))
5103 return omit_one_operand (type, arg1, arg0);
5104 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
5105 case will be handled here. */
5106 if (integer_zerop (arg0))
5107 return omit_one_operand (type, arg0, arg1);
5109 truth_andor:
5110 /* We only do these simplifications if we are optimizing. */
5111 if (!optimize)
5112 return t;
5114 /* Check for things like (A || B) && (A || C). We can convert this
5115 to A || (B && C). Note that either operator can be any of the four
5116 truth and/or operations and the transformation will still be
5117 valid. Also note that we only care about order for the
5118 ANDIF and ORIF operators. If B contains side effects, this
5119 might change the truth-value of A. */
5120 if (TREE_CODE (arg0) == TREE_CODE (arg1)
5121 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
5122 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
5123 || TREE_CODE (arg0) == TRUTH_AND_EXPR
5124 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
5125 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
5127 tree a00 = TREE_OPERAND (arg0, 0);
5128 tree a01 = TREE_OPERAND (arg0, 1);
5129 tree a10 = TREE_OPERAND (arg1, 0);
5130 tree a11 = TREE_OPERAND (arg1, 1);
5131 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
5132 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
5133 && (code == TRUTH_AND_EXPR
5134 || code == TRUTH_OR_EXPR));
5136 if (operand_equal_p (a00, a10, 0))
5137 return fold (build (TREE_CODE (arg0), type, a00,
5138 fold (build (code, type, a01, a11))));
5139 else if (commutative && operand_equal_p (a00, a11, 0))
5140 return fold (build (TREE_CODE (arg0), type, a00,
5141 fold (build (code, type, a01, a10))));
5142 else if (commutative && operand_equal_p (a01, a10, 0))
5143 return fold (build (TREE_CODE (arg0), type, a01,
5144 fold (build (code, type, a00, a11))));
5146 /* This case if tricky because we must either have commutative
5147 operators or else A10 must not have side-effects. */
5149 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
5150 && operand_equal_p (a01, a11, 0))
5151 return fold (build (TREE_CODE (arg0), type,
5152 fold (build (code, type, a00, a10)),
5153 a01));
5156 /* See if we can build a range comparison. */
5157 if (0 != (tem = fold_range_test (t)))
5158 return tem;
5160 /* Check for the possibility of merging component references. If our
5161 lhs is another similar operation, try to merge its rhs with our
5162 rhs. Then try to merge our lhs and rhs. */
5163 if (TREE_CODE (arg0) == code
5164 && 0 != (tem = fold_truthop (code, type,
5165 TREE_OPERAND (arg0, 1), arg1)))
5166 return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
5168 if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
5169 return tem;
5171 return t;
5173 case TRUTH_ORIF_EXPR:
5174 /* Note that the operands of this must be ints
5175 and their values must be 0 or true.
5176 ("true" is a fixed value perhaps depending on the language.) */
5177 /* If first arg is constant true, return it. */
5178 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5179 return arg0;
5180 case TRUTH_OR_EXPR:
5181 /* If either arg is constant zero, drop it. */
5182 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
5183 return non_lvalue (arg1);
5184 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1))
5185 return non_lvalue (arg0);
5186 /* If second arg is constant true, result is true, but we must
5187 evaluate first arg. */
5188 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
5189 return omit_one_operand (type, arg1, arg0);
5190 /* Likewise for first arg, but note this only occurs here for
5191 TRUTH_OR_EXPR. */
5192 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5193 return omit_one_operand (type, arg0, arg1);
5194 goto truth_andor;
5196 case TRUTH_XOR_EXPR:
5197 /* If either arg is constant zero, drop it. */
5198 if (integer_zerop (arg0))
5199 return non_lvalue (arg1);
5200 if (integer_zerop (arg1))
5201 return non_lvalue (arg0);
5202 /* If either arg is constant true, this is a logical inversion. */
5203 if (integer_onep (arg0))
5204 return non_lvalue (invert_truthvalue (arg1));
5205 if (integer_onep (arg1))
5206 return non_lvalue (invert_truthvalue (arg0));
5207 return t;
5209 case EQ_EXPR:
5210 case NE_EXPR:
5211 case LT_EXPR:
5212 case GT_EXPR:
5213 case LE_EXPR:
5214 case GE_EXPR:
5215 /* If one arg is a constant integer, put it last. */
5216 if (TREE_CODE (arg0) == INTEGER_CST
5217 && TREE_CODE (arg1) != INTEGER_CST)
5219 TREE_OPERAND (t, 0) = arg1;
5220 TREE_OPERAND (t, 1) = arg0;
5221 arg0 = TREE_OPERAND (t, 0);
5222 arg1 = TREE_OPERAND (t, 1);
5223 code = swap_tree_comparison (code);
5224 TREE_SET_CODE (t, code);
5227 /* Convert foo++ == CONST into ++foo == CONST + INCR.
5228 First, see if one arg is constant; find the constant arg
5229 and the other one. */
5231 tree constop = 0, varop = NULL_TREE;
5232 int constopnum = -1;
5234 if (TREE_CONSTANT (arg1))
5235 constopnum = 1, constop = arg1, varop = arg0;
5236 if (TREE_CONSTANT (arg0))
5237 constopnum = 0, constop = arg0, varop = arg1;
5239 if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR)
5241 /* This optimization is invalid for ordered comparisons
5242 if CONST+INCR overflows or if foo+incr might overflow.
5243 This optimization is invalid for floating point due to rounding.
5244 For pointer types we assume overflow doesn't happen. */
5245 if (POINTER_TYPE_P (TREE_TYPE (varop))
5246 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
5247 && (code == EQ_EXPR || code == NE_EXPR)))
5249 tree newconst
5250 = fold (build (PLUS_EXPR, TREE_TYPE (varop),
5251 constop, TREE_OPERAND (varop, 1)));
5252 TREE_SET_CODE (varop, PREINCREMENT_EXPR);
5254 /* If VAROP is a reference to a bitfield, we must mask
5255 the constant by the width of the field. */
5256 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
5257 && DECL_BIT_FIELD(TREE_OPERAND
5258 (TREE_OPERAND (varop, 0), 1)))
5260 int size
5261 = TREE_INT_CST_LOW (DECL_SIZE
5262 (TREE_OPERAND
5263 (TREE_OPERAND (varop, 0), 1)));
5264 tree mask, unsigned_type;
5265 int precision;
5266 tree folded_compare;
5268 /* First check whether the comparison would come out
5269 always the same. If we don't do that we would
5270 change the meaning with the masking. */
5271 if (constopnum == 0)
5272 folded_compare = fold (build (code, type, constop,
5273 TREE_OPERAND (varop, 0)));
5274 else
5275 folded_compare = fold (build (code, type,
5276 TREE_OPERAND (varop, 0),
5277 constop));
5278 if (integer_zerop (folded_compare)
5279 || integer_onep (folded_compare))
5280 return omit_one_operand (type, folded_compare, varop);
5282 unsigned_type = type_for_size (size, 1);
5283 precision = TYPE_PRECISION (unsigned_type);
5284 mask = build_int_2 (~0, ~0);
5285 TREE_TYPE (mask) = unsigned_type;
5286 force_fit_type (mask, 0);
5287 mask = const_binop (RSHIFT_EXPR, mask,
5288 size_int (precision - size), 0);
5289 newconst = fold (build (BIT_AND_EXPR,
5290 TREE_TYPE (varop), newconst,
5291 convert (TREE_TYPE (varop),
5292 mask)));
5296 t = build (code, type, TREE_OPERAND (t, 0),
5297 TREE_OPERAND (t, 1));
5298 TREE_OPERAND (t, constopnum) = newconst;
5299 return t;
5302 else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
5304 if (POINTER_TYPE_P (TREE_TYPE (varop))
5305 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
5306 && (code == EQ_EXPR || code == NE_EXPR)))
5308 tree newconst
5309 = fold (build (MINUS_EXPR, TREE_TYPE (varop),
5310 constop, TREE_OPERAND (varop, 1)));
5311 TREE_SET_CODE (varop, PREDECREMENT_EXPR);
5313 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
5314 && DECL_BIT_FIELD(TREE_OPERAND
5315 (TREE_OPERAND (varop, 0), 1)))
5317 int size
5318 = TREE_INT_CST_LOW (DECL_SIZE
5319 (TREE_OPERAND
5320 (TREE_OPERAND (varop, 0), 1)));
5321 tree mask, unsigned_type;
5322 int precision;
5323 tree folded_compare;
5325 if (constopnum == 0)
5326 folded_compare = fold (build (code, type, constop,
5327 TREE_OPERAND (varop, 0)));
5328 else
5329 folded_compare = fold (build (code, type,
5330 TREE_OPERAND (varop, 0),
5331 constop));
5332 if (integer_zerop (folded_compare)
5333 || integer_onep (folded_compare))
5334 return omit_one_operand (type, folded_compare, varop);
5336 unsigned_type = type_for_size (size, 1);
5337 precision = TYPE_PRECISION (unsigned_type);
5338 mask = build_int_2 (~0, ~0);
5339 TREE_TYPE (mask) = TREE_TYPE (varop);
5340 force_fit_type (mask, 0);
5341 mask = const_binop (RSHIFT_EXPR, mask,
5342 size_int (precision - size), 0);
5343 newconst = fold (build (BIT_AND_EXPR,
5344 TREE_TYPE (varop), newconst,
5345 convert (TREE_TYPE (varop),
5346 mask)));
5350 t = build (code, type, TREE_OPERAND (t, 0),
5351 TREE_OPERAND (t, 1));
5352 TREE_OPERAND (t, constopnum) = newconst;
5353 return t;
5358 /* Change X >= CST to X > (CST - 1) if CST is positive. */
5359 if (TREE_CODE (arg1) == INTEGER_CST
5360 && TREE_CODE (arg0) != INTEGER_CST
5361 && tree_int_cst_sgn (arg1) > 0)
5363 switch (TREE_CODE (t))
5365 case GE_EXPR:
5366 code = GT_EXPR;
5367 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
5368 t = build (code, type, TREE_OPERAND (t, 0), arg1);
5369 break;
5371 case LT_EXPR:
5372 code = LE_EXPR;
5373 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
5374 t = build (code, type, TREE_OPERAND (t, 0), arg1);
5375 break;
5377 default:
5378 break;
5382 /* If this is an EQ or NE comparison with zero and ARG0 is
5383 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
5384 two operations, but the latter can be done in one less insn
5385 on machines that have only two-operand insns or on which a
5386 constant cannot be the first operand. */
5387 if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
5388 && TREE_CODE (arg0) == BIT_AND_EXPR)
5390 if (TREE_CODE (TREE_OPERAND (arg0, 0)) == LSHIFT_EXPR
5391 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)))
5392 return
5393 fold (build (code, type,
5394 build (BIT_AND_EXPR, TREE_TYPE (arg0),
5395 build (RSHIFT_EXPR,
5396 TREE_TYPE (TREE_OPERAND (arg0, 0)),
5397 TREE_OPERAND (arg0, 1),
5398 TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)),
5399 convert (TREE_TYPE (arg0),
5400 integer_one_node)),
5401 arg1));
5402 else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
5403 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
5404 return
5405 fold (build (code, type,
5406 build (BIT_AND_EXPR, TREE_TYPE (arg0),
5407 build (RSHIFT_EXPR,
5408 TREE_TYPE (TREE_OPERAND (arg0, 1)),
5409 TREE_OPERAND (arg0, 0),
5410 TREE_OPERAND (TREE_OPERAND (arg0, 1), 1)),
5411 convert (TREE_TYPE (arg0),
5412 integer_one_node)),
5413 arg1));
5416 /* If this is an NE or EQ comparison of zero against the result of a
5417 signed MOD operation whose second operand is a power of 2, make
5418 the MOD operation unsigned since it is simpler and equivalent. */
5419 if ((code == NE_EXPR || code == EQ_EXPR)
5420 && integer_zerop (arg1)
5421 && ! TREE_UNSIGNED (TREE_TYPE (arg0))
5422 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
5423 || TREE_CODE (arg0) == CEIL_MOD_EXPR
5424 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
5425 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
5426 && integer_pow2p (TREE_OPERAND (arg0, 1)))
5428 tree newtype = unsigned_type (TREE_TYPE (arg0));
5429 tree newmod = build (TREE_CODE (arg0), newtype,
5430 convert (newtype, TREE_OPERAND (arg0, 0)),
5431 convert (newtype, TREE_OPERAND (arg0, 1)));
5433 return build (code, type, newmod, convert (newtype, arg1));
5436 /* If this is an NE comparison of zero with an AND of one, remove the
5437 comparison since the AND will give the correct value. */
5438 if (code == NE_EXPR && integer_zerop (arg1)
5439 && TREE_CODE (arg0) == BIT_AND_EXPR
5440 && integer_onep (TREE_OPERAND (arg0, 1)))
5441 return convert (type, arg0);
5443 /* If we have (A & C) == C where C is a power of 2, convert this into
5444 (A & C) != 0. Similarly for NE_EXPR. */
5445 if ((code == EQ_EXPR || code == NE_EXPR)
5446 && TREE_CODE (arg0) == BIT_AND_EXPR
5447 && integer_pow2p (TREE_OPERAND (arg0, 1))
5448 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
5449 return build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
5450 arg0, integer_zero_node);
5452 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
5453 and similarly for >= into !=. */
5454 if ((code == LT_EXPR || code == GE_EXPR)
5455 && TREE_UNSIGNED (TREE_TYPE (arg0))
5456 && TREE_CODE (arg1) == LSHIFT_EXPR
5457 && integer_onep (TREE_OPERAND (arg1, 0)))
5458 return build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
5459 build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
5460 TREE_OPERAND (arg1, 1)),
5461 convert (TREE_TYPE (arg0), integer_zero_node));
5463 else if ((code == LT_EXPR || code == GE_EXPR)
5464 && TREE_UNSIGNED (TREE_TYPE (arg0))
5465 && (TREE_CODE (arg1) == NOP_EXPR
5466 || TREE_CODE (arg1) == CONVERT_EXPR)
5467 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
5468 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
5469 return
5470 build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
5471 convert (TREE_TYPE (arg0),
5472 build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
5473 TREE_OPERAND (TREE_OPERAND (arg1, 0), 1))),
5474 convert (TREE_TYPE (arg0), integer_zero_node));
5476 /* Simplify comparison of something with itself. (For IEEE
5477 floating-point, we can only do some of these simplifications.) */
5478 if (operand_equal_p (arg0, arg1, 0))
5480 switch (code)
5482 case EQ_EXPR:
5483 case GE_EXPR:
5484 case LE_EXPR:
5485 if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
5486 return constant_boolean_node (1, type);
5487 code = EQ_EXPR;
5488 TREE_SET_CODE (t, code);
5489 break;
5491 case NE_EXPR:
5492 /* For NE, we can only do this simplification if integer. */
5493 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
5494 break;
5495 /* ... fall through ... */
5496 case GT_EXPR:
5497 case LT_EXPR:
5498 return constant_boolean_node (0, type);
5499 default:
5500 abort ();
5504 /* An unsigned comparison against 0 can be simplified. */
5505 if (integer_zerop (arg1)
5506 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
5507 || POINTER_TYPE_P (TREE_TYPE (arg1)))
5508 && TREE_UNSIGNED (TREE_TYPE (arg1)))
5510 switch (TREE_CODE (t))
5512 case GT_EXPR:
5513 code = NE_EXPR;
5514 TREE_SET_CODE (t, NE_EXPR);
5515 break;
5516 case LE_EXPR:
5517 code = EQ_EXPR;
5518 TREE_SET_CODE (t, EQ_EXPR);
5519 break;
5520 case GE_EXPR:
5521 return omit_one_operand (type,
5522 convert (type, integer_one_node),
5523 arg0);
5524 case LT_EXPR:
5525 return omit_one_operand (type,
5526 convert (type, integer_zero_node),
5527 arg0);
5528 default:
5529 break;
5533 /* An unsigned <= 0x7fffffff can be simplified. */
5535 int width = TYPE_PRECISION (TREE_TYPE (arg1));
5536 if (TREE_CODE (arg1) == INTEGER_CST
5537 && ! TREE_CONSTANT_OVERFLOW (arg1)
5538 && width <= HOST_BITS_PER_WIDE_INT
5539 && TREE_INT_CST_LOW (arg1) == ((HOST_WIDE_INT) 1 << (width - 1)) - 1
5540 && TREE_INT_CST_HIGH (arg1) == 0
5541 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
5542 || POINTER_TYPE_P (TREE_TYPE (arg1)))
5543 && TREE_UNSIGNED (TREE_TYPE (arg1)))
5545 switch (TREE_CODE (t))
5547 case LE_EXPR:
5548 return fold (build (GE_EXPR, type,
5549 convert (signed_type (TREE_TYPE (arg0)),
5550 arg0),
5551 convert (signed_type (TREE_TYPE (arg1)),
5552 integer_zero_node)));
5553 case GT_EXPR:
5554 return fold (build (LT_EXPR, type,
5555 convert (signed_type (TREE_TYPE (arg0)),
5556 arg0),
5557 convert (signed_type (TREE_TYPE (arg1)),
5558 integer_zero_node)));
5559 default:
5560 break;
5565 /* If we are comparing an expression that just has comparisons
5566 of two integer values, arithmetic expressions of those comparisons,
5567 and constants, we can simplify it. There are only three cases
5568 to check: the two values can either be equal, the first can be
5569 greater, or the second can be greater. Fold the expression for
5570 those three values. Since each value must be 0 or 1, we have
5571 eight possibilities, each of which corresponds to the constant 0
5572 or 1 or one of the six possible comparisons.
5574 This handles common cases like (a > b) == 0 but also handles
5575 expressions like ((x > y) - (y > x)) > 0, which supposedly
5576 occur in macroized code. */
5578 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
5580 tree cval1 = 0, cval2 = 0;
5581 int save_p = 0;
5583 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
5584 /* Don't handle degenerate cases here; they should already
5585 have been handled anyway. */
5586 && cval1 != 0 && cval2 != 0
5587 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
5588 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
5589 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
5590 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
5591 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
5592 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
5593 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
5595 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
5596 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
5598 /* We can't just pass T to eval_subst in case cval1 or cval2
5599 was the same as ARG1. */
5601 tree high_result
5602 = fold (build (code, type,
5603 eval_subst (arg0, cval1, maxval, cval2, minval),
5604 arg1));
5605 tree equal_result
5606 = fold (build (code, type,
5607 eval_subst (arg0, cval1, maxval, cval2, maxval),
5608 arg1));
5609 tree low_result
5610 = fold (build (code, type,
5611 eval_subst (arg0, cval1, minval, cval2, maxval),
5612 arg1));
5614 /* All three of these results should be 0 or 1. Confirm they
5615 are. Then use those values to select the proper code
5616 to use. */
5618 if ((integer_zerop (high_result)
5619 || integer_onep (high_result))
5620 && (integer_zerop (equal_result)
5621 || integer_onep (equal_result))
5622 && (integer_zerop (low_result)
5623 || integer_onep (low_result)))
5625 /* Make a 3-bit mask with the high-order bit being the
5626 value for `>', the next for '=', and the low for '<'. */
5627 switch ((integer_onep (high_result) * 4)
5628 + (integer_onep (equal_result) * 2)
5629 + integer_onep (low_result))
5631 case 0:
5632 /* Always false. */
5633 return omit_one_operand (type, integer_zero_node, arg0);
5634 case 1:
5635 code = LT_EXPR;
5636 break;
5637 case 2:
5638 code = EQ_EXPR;
5639 break;
5640 case 3:
5641 code = LE_EXPR;
5642 break;
5643 case 4:
5644 code = GT_EXPR;
5645 break;
5646 case 5:
5647 code = NE_EXPR;
5648 break;
5649 case 6:
5650 code = GE_EXPR;
5651 break;
5652 case 7:
5653 /* Always true. */
5654 return omit_one_operand (type, integer_one_node, arg0);
5657 t = build (code, type, cval1, cval2);
5658 if (save_p)
5659 return save_expr (t);
5660 else
5661 return fold (t);
5666 /* If this is a comparison of a field, we may be able to simplify it. */
5667 if ((TREE_CODE (arg0) == COMPONENT_REF
5668 || TREE_CODE (arg0) == BIT_FIELD_REF)
5669 && (code == EQ_EXPR || code == NE_EXPR)
5670 /* Handle the constant case even without -O
5671 to make sure the warnings are given. */
5672 && (optimize || TREE_CODE (arg1) == INTEGER_CST))
5674 t1 = optimize_bit_field_compare (code, type, arg0, arg1);
5675 return t1 ? t1 : t;
5678 /* If this is a comparison of complex values and either or both sides
5679 are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
5680 comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
5681 This may prevent needless evaluations. */
5682 if ((code == EQ_EXPR || code == NE_EXPR)
5683 && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
5684 && (TREE_CODE (arg0) == COMPLEX_EXPR
5685 || TREE_CODE (arg1) == COMPLEX_EXPR
5686 || TREE_CODE (arg0) == COMPLEX_CST
5687 || TREE_CODE (arg1) == COMPLEX_CST))
5689 tree subtype = TREE_TYPE (TREE_TYPE (arg0));
5690 tree real0, imag0, real1, imag1;
5692 arg0 = save_expr (arg0);
5693 arg1 = save_expr (arg1);
5694 real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
5695 imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
5696 real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
5697 imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
5699 return fold (build ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
5700 : TRUTH_ORIF_EXPR),
5701 type,
5702 fold (build (code, type, real0, real1)),
5703 fold (build (code, type, imag0, imag1))));
5706 /* From here on, the only cases we handle are when the result is
5707 known to be a constant.
5709 To compute GT, swap the arguments and do LT.
5710 To compute GE, do LT and invert the result.
5711 To compute LE, swap the arguments, do LT and invert the result.
5712 To compute NE, do EQ and invert the result.
5714 Therefore, the code below must handle only EQ and LT. */
5716 if (code == LE_EXPR || code == GT_EXPR)
5718 tem = arg0, arg0 = arg1, arg1 = tem;
5719 code = swap_tree_comparison (code);
5722 /* Note that it is safe to invert for real values here because we
5723 will check below in the one case that it matters. */
5725 invert = 0;
5726 if (code == NE_EXPR || code == GE_EXPR)
5728 invert = 1;
5729 code = invert_tree_comparison (code);
5732 /* Compute a result for LT or EQ if args permit;
5733 otherwise return T. */
5734 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
5736 if (code == EQ_EXPR)
5737 t1 = build_int_2 ((TREE_INT_CST_LOW (arg0)
5738 == TREE_INT_CST_LOW (arg1))
5739 && (TREE_INT_CST_HIGH (arg0)
5740 == TREE_INT_CST_HIGH (arg1)),
5742 else
5743 t1 = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0))
5744 ? INT_CST_LT_UNSIGNED (arg0, arg1)
5745 : INT_CST_LT (arg0, arg1)),
5749 #if 0 /* This is no longer useful, but breaks some real code. */
5750 /* Assume a nonexplicit constant cannot equal an explicit one,
5751 since such code would be undefined anyway.
5752 Exception: on sysvr4, using #pragma weak,
5753 a label can come out as 0. */
5754 else if (TREE_CODE (arg1) == INTEGER_CST
5755 && !integer_zerop (arg1)
5756 && TREE_CONSTANT (arg0)
5757 && TREE_CODE (arg0) == ADDR_EXPR
5758 && code == EQ_EXPR)
5759 t1 = build_int_2 (0, 0);
5760 #endif
5761 /* Two real constants can be compared explicitly. */
5762 else if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
5764 /* If either operand is a NaN, the result is false with two
5765 exceptions: First, an NE_EXPR is true on NaNs, but that case
5766 is already handled correctly since we will be inverting the
5767 result for NE_EXPR. Second, if we had inverted a LE_EXPR
5768 or a GE_EXPR into a LT_EXPR, we must return true so that it
5769 will be inverted into false. */
5771 if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
5772 || REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
5773 t1 = build_int_2 (invert && code == LT_EXPR, 0);
5775 else if (code == EQ_EXPR)
5776 t1 = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
5777 TREE_REAL_CST (arg1)),
5779 else
5780 t1 = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0),
5781 TREE_REAL_CST (arg1)),
5785 if (t1 == NULL_TREE)
5786 return t;
5788 if (invert)
5789 TREE_INT_CST_LOW (t1) ^= 1;
5791 TREE_TYPE (t1) = type;
5792 if (TREE_CODE (type) == BOOLEAN_TYPE)
5793 return truthvalue_conversion (t1);
5794 return t1;
5796 case COND_EXPR:
5797 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
5798 so all simple results must be passed through pedantic_non_lvalue. */
5799 if (TREE_CODE (arg0) == INTEGER_CST)
5800 return pedantic_non_lvalue
5801 (TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1)));
5802 else if (operand_equal_p (arg1, TREE_OPERAND (expr, 2), 0))
5803 return pedantic_omit_one_operand (type, arg1, arg0);
5805 /* If the second operand is zero, invert the comparison and swap
5806 the second and third operands. Likewise if the second operand
5807 is constant and the third is not or if the third operand is
5808 equivalent to the first operand of the comparison. */
5810 if (integer_zerop (arg1)
5811 || (TREE_CONSTANT (arg1) && ! TREE_CONSTANT (TREE_OPERAND (t, 2)))
5812 || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
5813 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
5814 TREE_OPERAND (t, 2),
5815 TREE_OPERAND (arg0, 1))))
5817 /* See if this can be inverted. If it can't, possibly because
5818 it was a floating-point inequality comparison, don't do
5819 anything. */
5820 tem = invert_truthvalue (arg0);
5822 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
5824 t = build (code, type, tem,
5825 TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
5826 arg0 = tem;
5827 /* arg1 should be the first argument of the new T. */
5828 arg1 = TREE_OPERAND (t, 1);
5829 STRIP_NOPS (arg1);
5833 /* If we have A op B ? A : C, we may be able to convert this to a
5834 simpler expression, depending on the operation and the values
5835 of B and C. IEEE floating point prevents this though,
5836 because A or B might be -0.0 or a NaN. */
5838 if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
5839 && (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
5840 || ! FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0)))
5841 || flag_fast_math)
5842 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
5843 arg1, TREE_OPERAND (arg0, 1)))
5845 tree arg2 = TREE_OPERAND (t, 2);
5846 enum tree_code comp_code = TREE_CODE (arg0);
5848 STRIP_NOPS (arg2);
5850 /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or abs (-A),
5851 depending on the comparison operation. */
5852 if ((FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 1)))
5853 ? real_zerop (TREE_OPERAND (arg0, 1))
5854 : integer_zerop (TREE_OPERAND (arg0, 1)))
5855 && TREE_CODE (arg2) == NEGATE_EXPR
5856 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
5857 switch (comp_code)
5859 case EQ_EXPR:
5860 return pedantic_non_lvalue
5861 (fold (build1 (NEGATE_EXPR, type, arg1)));
5862 case NE_EXPR:
5863 return pedantic_non_lvalue (convert (type, arg1));
5864 case GE_EXPR:
5865 case GT_EXPR:
5866 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
5867 arg1 = convert (signed_type (TREE_TYPE (arg1)), arg1);
5868 return pedantic_non_lvalue
5869 (convert (type, fold (build1 (ABS_EXPR,
5870 TREE_TYPE (arg1), arg1))));
5871 case LE_EXPR:
5872 case LT_EXPR:
5873 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
5874 arg1 = convert (signed_type (TREE_TYPE (arg1)), arg1);
5875 return pedantic_non_lvalue
5876 (fold (build1 (NEGATE_EXPR, type,
5877 convert (type,
5878 fold (build1 (ABS_EXPR,
5879 TREE_TYPE (arg1),
5880 arg1))))));
5881 default:
5882 abort ();
5885 /* If this is A != 0 ? A : 0, this is simply A. For ==, it is
5886 always zero. */
5888 if (integer_zerop (TREE_OPERAND (arg0, 1)) && integer_zerop (arg2))
5890 if (comp_code == NE_EXPR)
5891 return pedantic_non_lvalue (convert (type, arg1));
5892 else if (comp_code == EQ_EXPR)
5893 return pedantic_non_lvalue (convert (type, integer_zero_node));
5896 /* If this is A op B ? A : B, this is either A, B, min (A, B),
5897 or max (A, B), depending on the operation. */
5899 if (operand_equal_for_comparison_p (TREE_OPERAND (arg0, 1),
5900 arg2, TREE_OPERAND (arg0, 0)))
5902 tree comp_op0 = TREE_OPERAND (arg0, 0);
5903 tree comp_op1 = TREE_OPERAND (arg0, 1);
5904 tree comp_type = TREE_TYPE (comp_op0);
5906 switch (comp_code)
5908 case EQ_EXPR:
5909 return pedantic_non_lvalue (convert (type, arg2));
5910 case NE_EXPR:
5911 return pedantic_non_lvalue (convert (type, arg1));
5912 case LE_EXPR:
5913 case LT_EXPR:
5914 /* In C++ a ?: expression can be an lvalue, so put the
5915 operand which will be used if they are equal first
5916 so that we can convert this back to the
5917 corresponding COND_EXPR. */
5918 return pedantic_non_lvalue
5919 (convert (type, (fold (build (MIN_EXPR, comp_type,
5920 (comp_code == LE_EXPR
5921 ? comp_op0 : comp_op1),
5922 (comp_code == LE_EXPR
5923 ? comp_op1 : comp_op0))))));
5924 break;
5925 case GE_EXPR:
5926 case GT_EXPR:
5927 return pedantic_non_lvalue
5928 (convert (type, fold (build (MAX_EXPR, comp_type,
5929 (comp_code == GE_EXPR
5930 ? comp_op0 : comp_op1),
5931 (comp_code == GE_EXPR
5932 ? comp_op1 : comp_op0)))));
5933 break;
5934 default:
5935 abort ();
5939 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5940 we might still be able to simplify this. For example,
5941 if C1 is one less or one more than C2, this might have started
5942 out as a MIN or MAX and been transformed by this function.
5943 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
5945 if (INTEGRAL_TYPE_P (type)
5946 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
5947 && TREE_CODE (arg2) == INTEGER_CST)
5948 switch (comp_code)
5950 case EQ_EXPR:
5951 /* We can replace A with C1 in this case. */
5952 arg1 = convert (type, TREE_OPERAND (arg0, 1));
5953 t = build (code, type, TREE_OPERAND (t, 0), arg1,
5954 TREE_OPERAND (t, 2));
5955 break;
5957 case LT_EXPR:
5958 /* If C1 is C2 + 1, this is min(A, C2). */
5959 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
5960 && operand_equal_p (TREE_OPERAND (arg0, 1),
5961 const_binop (PLUS_EXPR, arg2,
5962 integer_one_node, 0), 1))
5963 return pedantic_non_lvalue
5964 (fold (build (MIN_EXPR, type, arg1, arg2)));
5965 break;
5967 case LE_EXPR:
5968 /* If C1 is C2 - 1, this is min(A, C2). */
5969 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
5970 && operand_equal_p (TREE_OPERAND (arg0, 1),
5971 const_binop (MINUS_EXPR, arg2,
5972 integer_one_node, 0), 1))
5973 return pedantic_non_lvalue
5974 (fold (build (MIN_EXPR, type, arg1, arg2)));
5975 break;
5977 case GT_EXPR:
5978 /* If C1 is C2 - 1, this is max(A, C2). */
5979 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
5980 && operand_equal_p (TREE_OPERAND (arg0, 1),
5981 const_binop (MINUS_EXPR, arg2,
5982 integer_one_node, 0), 1))
5983 return pedantic_non_lvalue
5984 (fold (build (MAX_EXPR, type, arg1, arg2)));
5985 break;
5987 case GE_EXPR:
5988 /* If C1 is C2 + 1, this is max(A, C2). */
5989 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
5990 && operand_equal_p (TREE_OPERAND (arg0, 1),
5991 const_binop (PLUS_EXPR, arg2,
5992 integer_one_node, 0), 1))
5993 return pedantic_non_lvalue
5994 (fold (build (MAX_EXPR, type, arg1, arg2)));
5995 break;
5996 case NE_EXPR:
5997 break;
5998 default:
5999 abort ();
6003 /* If the second operand is simpler than the third, swap them
6004 since that produces better jump optimization results. */
6005 if ((TREE_CONSTANT (arg1) || TREE_CODE_CLASS (TREE_CODE (arg1)) == 'd'
6006 || TREE_CODE (arg1) == SAVE_EXPR)
6007 && ! (TREE_CONSTANT (TREE_OPERAND (t, 2))
6008 || TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 2))) == 'd'
6009 || TREE_CODE (TREE_OPERAND (t, 2)) == SAVE_EXPR))
6011 /* See if this can be inverted. If it can't, possibly because
6012 it was a floating-point inequality comparison, don't do
6013 anything. */
6014 tem = invert_truthvalue (arg0);
6016 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
6018 t = build (code, type, tem,
6019 TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
6020 arg0 = tem;
6021 /* arg1 should be the first argument of the new T. */
6022 arg1 = TREE_OPERAND (t, 1);
6023 STRIP_NOPS (arg1);
6027 /* Convert A ? 1 : 0 to simply A. */
6028 if (integer_onep (TREE_OPERAND (t, 1))
6029 && integer_zerop (TREE_OPERAND (t, 2))
6030 /* If we try to convert TREE_OPERAND (t, 0) to our type, the
6031 call to fold will try to move the conversion inside
6032 a COND, which will recurse. In that case, the COND_EXPR
6033 is probably the best choice, so leave it alone. */
6034 && type == TREE_TYPE (arg0))
6035 return pedantic_non_lvalue (arg0);
6037 /* Look for expressions of the form A & 2 ? 2 : 0. The result of this
6038 operation is simply A & 2. */
6040 if (integer_zerop (TREE_OPERAND (t, 2))
6041 && TREE_CODE (arg0) == NE_EXPR
6042 && integer_zerop (TREE_OPERAND (arg0, 1))
6043 && integer_pow2p (arg1)
6044 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
6045 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
6046 arg1, 1))
6047 return pedantic_non_lvalue (convert (type, TREE_OPERAND (arg0, 0)));
6049 return t;
6051 case COMPOUND_EXPR:
6052 /* When pedantic, a compound expression can be neither an lvalue
6053 nor an integer constant expression. */
6054 if (TREE_SIDE_EFFECTS (arg0) || pedantic)
6055 return t;
6056 /* Don't let (0, 0) be null pointer constant. */
6057 if (integer_zerop (arg1))
6058 return build1 (NOP_EXPR, TREE_TYPE (arg1), arg1);
6059 return arg1;
6061 case COMPLEX_EXPR:
6062 if (wins)
6063 return build_complex (type, arg0, arg1);
6064 return t;
6066 case REALPART_EXPR:
6067 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
6068 return t;
6069 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
6070 return omit_one_operand (type, TREE_OPERAND (arg0, 0),
6071 TREE_OPERAND (arg0, 1));
6072 else if (TREE_CODE (arg0) == COMPLEX_CST)
6073 return TREE_REALPART (arg0);
6074 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
6075 return fold (build (TREE_CODE (arg0), type,
6076 fold (build1 (REALPART_EXPR, type,
6077 TREE_OPERAND (arg0, 0))),
6078 fold (build1 (REALPART_EXPR,
6079 type, TREE_OPERAND (arg0, 1)))));
6080 return t;
6082 case IMAGPART_EXPR:
6083 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
6084 return convert (type, integer_zero_node);
6085 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
6086 return omit_one_operand (type, TREE_OPERAND (arg0, 1),
6087 TREE_OPERAND (arg0, 0));
6088 else if (TREE_CODE (arg0) == COMPLEX_CST)
6089 return TREE_IMAGPART (arg0);
6090 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
6091 return fold (build (TREE_CODE (arg0), type,
6092 fold (build1 (IMAGPART_EXPR, type,
6093 TREE_OPERAND (arg0, 0))),
6094 fold (build1 (IMAGPART_EXPR, type,
6095 TREE_OPERAND (arg0, 1)))));
6096 return t;
6098 /* Pull arithmetic ops out of the CLEANUP_POINT_EXPR where
6099 appropriate. */
6100 case CLEANUP_POINT_EXPR:
6101 if (! has_cleanups (arg0))
6102 return TREE_OPERAND (t, 0);
6105 enum tree_code code0 = TREE_CODE (arg0);
6106 int kind0 = TREE_CODE_CLASS (code0);
6107 tree arg00 = TREE_OPERAND (arg0, 0);
6108 tree arg01;
6110 if (kind0 == '1' || code0 == TRUTH_NOT_EXPR)
6111 return fold (build1 (code0, type,
6112 fold (build1 (CLEANUP_POINT_EXPR,
6113 TREE_TYPE (arg00), arg00))));
6115 if (kind0 == '<' || kind0 == '2'
6116 || code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR
6117 || code0 == TRUTH_AND_EXPR || code0 == TRUTH_OR_EXPR
6118 || code0 == TRUTH_XOR_EXPR)
6120 arg01 = TREE_OPERAND (arg0, 1);
6122 if (TREE_CONSTANT (arg00)
6123 || ((code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR)
6124 && ! has_cleanups (arg00)))
6125 return fold (build (code0, type, arg00,
6126 fold (build1 (CLEANUP_POINT_EXPR,
6127 TREE_TYPE (arg01), arg01))));
6129 if (TREE_CONSTANT (arg01))
6130 return fold (build (code0, type,
6131 fold (build1 (CLEANUP_POINT_EXPR,
6132 TREE_TYPE (arg00), arg00)),
6133 arg01));
6136 return t;
6139 default:
6140 return t;
6141 } /* switch (code) */
6144 /* Determine if first argument is a multiple of second argument.
6145 Return 0 if it is not, or is not easily determined to so be.
6147 An example of the sort of thing we care about (at this point --
6148 this routine could surely be made more general, and expanded
6149 to do what the *_DIV_EXPR's fold() cases do now) is discovering
6150 that
6152 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
6154 is a multiple of
6156 SAVE_EXPR (J * 8)
6158 when we know that the two `SAVE_EXPR (J * 8)' nodes are the
6159 same node (which means they will have the same value at run
6160 time, even though we don't know when they'll be assigned).
6162 This code also handles discovering that
6164 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
6166 is a multiple of
6170 (of course) so we don't have to worry about dealing with a
6171 possible remainder.
6173 Note that we _look_ inside a SAVE_EXPR only to determine
6174 how it was calculated; it is not safe for fold() to do much
6175 of anything else with the internals of a SAVE_EXPR, since
6176 fold() cannot know when it will be evaluated at run time.
6177 For example, the latter example above _cannot_ be implemented
6180 SAVE_EXPR (I) * J
6182 or any variant thereof, since the value of J at evaluation time
6183 of the original SAVE_EXPR is not necessarily the same at the time
6184 the new expression is evaluated. The only optimization of this
6185 sort that would be valid is changing
6187 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
6188 divided by
6193 SAVE_EXPR (I) * SAVE_EXPR (J)
6195 (where the same SAVE_EXPR (J) is used in the original and the
6196 transformed version). */
6198 static int
6199 multiple_of_p (type, top, bottom)
6200 tree type;
6201 tree top;
6202 tree bottom;
6204 if (operand_equal_p (top, bottom, 0))
6205 return 1;
6207 if (TREE_CODE (type) != INTEGER_TYPE)
6208 return 0;
6210 switch (TREE_CODE (top))
6212 case MULT_EXPR:
6213 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
6214 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
6216 case PLUS_EXPR:
6217 case MINUS_EXPR:
6218 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
6219 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
6221 case NOP_EXPR:
6222 /* Punt if conversion from non-integral or wider integral type. */
6223 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
6224 || (TYPE_PRECISION (type)
6225 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
6226 return 0;
6227 /* Fall through. */
6228 case SAVE_EXPR:
6229 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
6231 case INTEGER_CST:
6232 if ((TREE_CODE (bottom) != INTEGER_CST)
6233 || (tree_int_cst_sgn (top) < 0)
6234 || (tree_int_cst_sgn (bottom) < 0))
6235 return 0;
6236 return integer_zerop (const_binop (TRUNC_MOD_EXPR,
6237 top, bottom, 0));
6239 default:
6240 return 0;