|
|
1.1 root 1: /* Fold a constant sub-tree into a single node for C-compiler
2: Copyright (C) 1987, 1988, 1992, 1993 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
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.
10:
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.
15:
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: /*@@ Fix lossage on folding division of big integers. */
21:
22: /*@@ This file should be rewritten to use an arbitrary precision
23: @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24: @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25: @@ The routines that translate from the ap rep should
26: @@ warn if precision et. al. is lost.
27: @@ This would also make life easier when this technology is used
28: @@ for cross-compilers. */
29:
30:
31: /* The entry points in this file are fold, size_int and size_binop.
32:
33: fold takes a tree as argument and returns a simplified tree.
34:
35: size_binop takes a tree code for an arithmetic operation
36: and two operands that are trees, and produces a tree for the
37: result, assuming the type comes from `sizetype'.
38:
39: size_int takes an integer value, and creates a tree constant
40: with type from `sizetype'. */
41:
42: #include <stdio.h>
43: #include <setjmp.h>
44: #include "config.h"
45: #include "flags.h"
46: #include "tree.h"
47:
48: /* Handle floating overflow for `const_binop'. */
49: static jmp_buf float_error;
50:
51: static void encode PROTO((short *, HOST_WIDE_INT, HOST_WIDE_INT));
52: static void decode PROTO((short *, HOST_WIDE_INT *, HOST_WIDE_INT *));
53: static int div_and_round_double PROTO((enum tree_code, int, HOST_WIDE_INT,
54: HOST_WIDE_INT, HOST_WIDE_INT,
55: HOST_WIDE_INT, HOST_WIDE_INT *,
56: HOST_WIDE_INT *, HOST_WIDE_INT *,
57: HOST_WIDE_INT *));
58: static int split_tree PROTO((tree, enum tree_code, tree *, tree *, int *));
59: static tree const_binop PROTO((enum tree_code, tree, tree, int));
60: static tree fold_convert PROTO((tree, tree));
61: static enum tree_code invert_tree_comparison PROTO((enum tree_code));
62: static enum tree_code swap_tree_comparison PROTO((enum tree_code));
63: static int operand_equal_for_comparison_p PROTO((tree, tree, tree));
64: static int twoval_comparison_p PROTO((tree, tree *, tree *, int *));
65: static tree eval_subst PROTO((tree, tree, tree, tree, tree));
66: static tree omit_one_operand PROTO((tree, tree, tree));
67: static tree distribute_bit_expr PROTO((enum tree_code, tree, tree, tree));
68: static tree make_bit_field_ref PROTO((tree, tree, int, int, int));
69: static tree optimize_bit_field_compare PROTO((enum tree_code, tree,
70: tree, tree));
71: static tree decode_field_reference PROTO((tree, int *, int *,
72: enum machine_mode *, int *,
73: int *, tree *));
74: static int all_ones_mask_p PROTO((tree, int));
75: static int simple_operand_p PROTO((tree));
76: static tree range_test PROTO((enum tree_code, tree, enum tree_code,
77: enum tree_code, tree, tree, tree));
78: static tree fold_truthop PROTO((enum tree_code, tree, tree, tree));
79:
80: #ifndef BRANCH_COST
81: #define BRANCH_COST 1
82: #endif
83:
84: /* Yield nonzero if a signed left shift of A by B bits overflows. */
85: #define left_shift_overflows(a, b) ((a) != ((a) << (b)) >> (b))
86:
87: /* Suppose A1 + B1 = SUM1, using 2's complement arithmetic ignoring overflow.
88: Suppose A, B and SUM have the same respective signs as A1, B1, and SUM1.
89: Then this yields nonzero if overflow occurred during the addition.
90: Overflow occurs if A and B have the same sign, but A and SUM differ in sign.
91: Use `^' to test whether signs differ, and `< 0' to isolate the sign. */
92: #define overflow_sum_sign(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
93:
94: /* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
95: We do that by representing the two-word integer as MAX_SHORTS shorts,
96: with only 8 bits stored in each short, as a positive number. */
97:
98: /* Unpack a two-word integer into MAX_SHORTS shorts.
99: LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
100: SHORTS points to the array of shorts. */
101:
102: static void
103: encode (shorts, low, hi)
104: short *shorts;
105: HOST_WIDE_INT low, hi;
106: {
107: register int i;
108:
109: for (i = 0; i < MAX_SHORTS / 2; i++)
110: {
111: shorts[i] = (low >> (i * 8)) & 0xff;
112: shorts[i + MAX_SHORTS / 2] = (hi >> (i * 8) & 0xff);
113: }
114: }
115:
116: /* Pack an array of MAX_SHORTS shorts into a two-word integer.
117: SHORTS points to the array of shorts.
118: The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
119:
120: static void
121: decode (shorts, low, hi)
122: short *shorts;
123: HOST_WIDE_INT *low, *hi;
124: {
125: register int i;
126: HOST_WIDE_INT lv = 0, hv = 0;
127:
128: for (i = 0; i < MAX_SHORTS / 2; i++)
129: {
130: lv |= (HOST_WIDE_INT) shorts[i] << (i * 8);
131: hv |= (HOST_WIDE_INT) shorts[i + MAX_SHORTS / 2] << (i * 8);
132: }
133:
134: *low = lv, *hi = hv;
135: }
136:
137: /* Make the integer constant T valid for its type
138: by setting to 0 or 1 all the bits in the constant
139: that don't belong in the type.
140: Yield 1 if a signed overflow occurs, 0 otherwise.
141: If OVERFLOW is nonzero, a signed overflow has already occurred
142: in calculating T, so propagate it. */
143:
144: int
145: force_fit_type (t, overflow)
146: tree t;
147: int overflow;
148: {
149: HOST_WIDE_INT low, high;
150: register int prec;
151:
152: if (TREE_CODE (t) != INTEGER_CST)
153: return overflow;
154:
155: low = TREE_INT_CST_LOW (t);
156: high = TREE_INT_CST_HIGH (t);
157:
158: if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
159: prec = POINTER_SIZE;
160: else
161: prec = TYPE_PRECISION (TREE_TYPE (t));
162:
163: /* First clear all bits that are beyond the type's precision. */
164:
165: if (prec == 2 * HOST_BITS_PER_WIDE_INT)
166: ;
167: else if (prec > HOST_BITS_PER_WIDE_INT)
168: {
169: TREE_INT_CST_HIGH (t)
170: &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
171: }
172: else
173: {
174: TREE_INT_CST_HIGH (t) = 0;
175: if (prec < HOST_BITS_PER_WIDE_INT)
176: TREE_INT_CST_LOW (t) &= ~((HOST_WIDE_INT) (-1) << prec);
177: }
178:
179: /* Unsigned types do not suffer sign extension or overflow. */
180: if (TREE_UNSIGNED (TREE_TYPE (t)))
181: return 0;
182:
183: /* If the value's sign bit is set, extend the sign. */
184: if (prec != 2 * HOST_BITS_PER_WIDE_INT
185: && (prec > HOST_BITS_PER_WIDE_INT
186: ? (TREE_INT_CST_HIGH (t)
187: & ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
188: : TREE_INT_CST_LOW (t) & ((HOST_WIDE_INT) 1 << (prec - 1))))
189: {
190: /* Value is negative:
191: set to 1 all the bits that are outside this type's precision. */
192: if (prec > HOST_BITS_PER_WIDE_INT)
193: {
194: TREE_INT_CST_HIGH (t)
195: |= ((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
196: }
197: else
198: {
199: TREE_INT_CST_HIGH (t) = -1;
200: if (prec < HOST_BITS_PER_WIDE_INT)
201: TREE_INT_CST_LOW (t) |= ((HOST_WIDE_INT) (-1) << prec);
202: }
203: }
204:
205: /* Yield nonzero if signed overflow occurred. */
206: return
207: ((overflow | (low ^ TREE_INT_CST_LOW (t)) | (high ^ TREE_INT_CST_HIGH (t)))
208: != 0);
209: }
210:
211: /* Add two doubleword integers with doubleword result.
212: Each argument is given as two `HOST_WIDE_INT' pieces.
213: One argument is L1 and H1; the other, L2 and H2.
214: The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.
215: We use the 8-shorts representation internally. */
216:
217: int
218: add_double (l1, h1, l2, h2, lv, hv)
219: HOST_WIDE_INT l1, h1, l2, h2;
220: HOST_WIDE_INT *lv, *hv;
221: {
222: short arg1[MAX_SHORTS];
223: short arg2[MAX_SHORTS];
224: register int carry = 0;
225: register int i;
226:
227: encode (arg1, l1, h1);
228: encode (arg2, l2, h2);
229:
230: for (i = 0; i < MAX_SHORTS; i++)
231: {
232: carry += arg1[i] + arg2[i];
233: arg1[i] = carry & 0xff;
234: carry >>= 8;
235: }
236:
237: decode (arg1, lv, hv);
238: return overflow_sum_sign (h1, h2, *hv);
239: }
240:
241: /* Negate a doubleword integer with doubleword result.
242: Return nonzero if the operation overflows, assuming it's signed.
243: The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
244: The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.
245: We use the 8-shorts representation internally. */
246:
247: int
248: neg_double (l1, h1, lv, hv)
249: HOST_WIDE_INT l1, h1;
250: HOST_WIDE_INT *lv, *hv;
251: {
252: if (l1 == 0)
253: {
254: *lv = 0;
255: *hv = - h1;
256: return (*hv & h1) < 0;
257: }
258: else
259: {
260: *lv = - l1;
261: *hv = ~ h1;
262: return 0;
263: }
264: }
265:
266: /* Multiply two doubleword integers with doubleword result.
267: Return nonzero if the operation overflows, assuming it's signed.
268: Each argument is given as two `HOST_WIDE_INT' pieces.
269: One argument is L1 and H1; the other, L2 and H2.
270: The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.
271: We use the 8-shorts representation internally. */
272:
273: int
274: mul_double (l1, h1, l2, h2, lv, hv)
275: HOST_WIDE_INT l1, h1, l2, h2;
276: HOST_WIDE_INT *lv, *hv;
277: {
278: short arg1[MAX_SHORTS];
279: short arg2[MAX_SHORTS];
280: short prod[MAX_SHORTS * 2];
281: register int carry = 0;
282: register int i, j, k;
283: HOST_WIDE_INT toplow, tophigh, neglow, neghigh;
284:
285: /* These cases are used extensively, arising from pointer combinations. */
286: if (h2 == 0)
287: {
288: if (l2 == 2)
289: {
290: int overflow = left_shift_overflows (h1, 1);
291: unsigned HOST_WIDE_INT temp = l1 + l1;
292: *hv = (h1 << 1) + (temp < l1);
293: *lv = temp;
294: return overflow;
295: }
296: if (l2 == 4)
297: {
298: int overflow = left_shift_overflows (h1, 2);
299: unsigned HOST_WIDE_INT temp = l1 + l1;
300: h1 = (h1 << 2) + ((temp < l1) << 1);
301: l1 = temp;
302: temp += temp;
303: h1 += (temp < l1);
304: *lv = temp;
305: *hv = h1;
306: return overflow;
307: }
308: if (l2 == 8)
309: {
310: int overflow = left_shift_overflows (h1, 3);
311: unsigned HOST_WIDE_INT temp = l1 + l1;
312: h1 = (h1 << 3) + ((temp < l1) << 2);
313: l1 = temp;
314: temp += temp;
315: h1 += (temp < l1) << 1;
316: l1 = temp;
317: temp += temp;
318: h1 += (temp < l1);
319: *lv = temp;
320: *hv = h1;
321: return overflow;
322: }
323: }
324:
325: encode (arg1, l1, h1);
326: encode (arg2, l2, h2);
327:
328: bzero (prod, sizeof prod);
329:
330: for (i = 0; i < MAX_SHORTS; i++)
331: for (j = 0; j < MAX_SHORTS; j++)
332: {
333: k = i + j;
334: carry = arg1[i] * arg2[j];
335: while (carry)
336: {
337: carry += prod[k];
338: prod[k] = carry & 0xff;
339: carry >>= 8;
340: k++;
341: }
342: }
343:
344: decode (prod, lv, hv); /* This ignores
345: prod[MAX_SHORTS] -> prod[MAX_SHORTS*2-1] */
346:
347: /* Check for overflow by calculating the top half of the answer in full;
348: it should agree with the low half's sign bit. */
349: decode (prod+MAX_SHORTS, &toplow, &tophigh);
350: if (h1 < 0)
351: {
352: neg_double (l2, h2, &neglow, &neghigh);
353: add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
354: }
355: if (h2 < 0)
356: {
357: neg_double (l1, h1, &neglow, &neghigh);
358: add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
359: }
360: return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
361: }
362:
363: /* Shift the doubleword integer in L1, H1 left by COUNT places
364: keeping only PREC bits of result.
365: Shift right if COUNT is negative.
366: ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
367: Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
368:
369: void
370: lshift_double (l1, h1, count, prec, lv, hv, arith)
371: HOST_WIDE_INT l1, h1, count;
372: int prec;
373: HOST_WIDE_INT *lv, *hv;
374: int arith;
375: {
376: short arg1[MAX_SHORTS];
377: register int i;
378: register int carry;
379:
380: if (count < 0)
381: {
382: rshift_double (l1, h1, - count, prec, lv, hv, arith);
383: return;
384: }
385:
386: encode (arg1, l1, h1);
387:
388: if (count > prec)
389: count = prec;
390:
391: while (count > 0)
392: {
393: carry = 0;
394: for (i = 0; i < MAX_SHORTS; i++)
395: {
396: carry += arg1[i] << 1;
397: arg1[i] = carry & 0xff;
398: carry >>= 8;
399: }
400: count--;
401: }
402:
403: decode (arg1, lv, hv);
404: }
405:
406: /* Shift the doubleword integer in L1, H1 right by COUNT places
407: keeping only PREC bits of result. COUNT must be positive.
408: ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
409: Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
410:
411: void
412: rshift_double (l1, h1, count, prec, lv, hv, arith)
413: HOST_WIDE_INT l1, h1, count;
414: int prec;
415: HOST_WIDE_INT *lv, *hv;
416: int arith;
417: {
418: short arg1[MAX_SHORTS];
419: register int i;
420: register int carry;
421:
422: encode (arg1, l1, h1);
423:
424: if (count > prec)
425: count = prec;
426:
427: while (count > 0)
428: {
429: carry = arith && arg1[7] >> 7;
430: for (i = MAX_SHORTS - 1; i >= 0; i--)
431: {
432: carry <<= 8;
433: carry += arg1[i];
434: arg1[i] = (carry >> 1) & 0xff;
435: }
436: count--;
437: }
438:
439: decode (arg1, lv, hv);
440: }
441:
442: /* Rotate the doubldword integer in L1, H1 left by COUNT places
443: keeping only PREC bits of result.
444: Rotate right if COUNT is negative.
445: Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
446:
447: void
448: lrotate_double (l1, h1, count, prec, lv, hv)
449: HOST_WIDE_INT l1, h1, count;
450: int prec;
451: HOST_WIDE_INT *lv, *hv;
452: {
453: short arg1[MAX_SHORTS];
454: register int i;
455: register int carry;
456:
457: if (count < 0)
458: {
459: rrotate_double (l1, h1, - count, prec, lv, hv);
460: return;
461: }
462:
463: encode (arg1, l1, h1);
464:
465: if (count > prec)
466: count = prec;
467:
468: carry = arg1[MAX_SHORTS - 1] >> 7;
469: while (count > 0)
470: {
471: for (i = 0; i < MAX_SHORTS; i++)
472: {
473: carry += arg1[i] << 1;
474: arg1[i] = carry & 0xff;
475: carry >>= 8;
476: }
477: count--;
478: }
479:
480: decode (arg1, lv, hv);
481: }
482:
483: /* Rotate the doubleword integer in L1, H1 left by COUNT places
484: keeping only PREC bits of result. COUNT must be positive.
485: Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
486:
487: void
488: rrotate_double (l1, h1, count, prec, lv, hv)
489: HOST_WIDE_INT l1, h1, count;
490: int prec;
491: HOST_WIDE_INT *lv, *hv;
492: {
493: short arg1[MAX_SHORTS];
494: register int i;
495: register int carry;
496:
497: encode (arg1, l1, h1);
498:
499: if (count > prec)
500: count = prec;
501:
502: carry = arg1[0] & 1;
503: while (count > 0)
504: {
505: for (i = MAX_SHORTS - 1; i >= 0; i--)
506: {
507: carry <<= 8;
508: carry += arg1[i];
509: arg1[i] = (carry >> 1) & 0xff;
510: }
511: count--;
512: }
513:
514: decode (arg1, lv, hv);
515: }
516:
517: /* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
518: for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
519: CODE is a tree code for a kind of division, one of
520: TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
521: or EXACT_DIV_EXPR
522: It controls how the quotient is rounded to a integer.
523: Return nonzero if the operation overflows.
524: UNS nonzero says do unsigned division. */
525:
526: static int
527: div_and_round_double (code, uns,
528: lnum_orig, hnum_orig, lden_orig, hden_orig,
529: lquo, hquo, lrem, hrem)
530: enum tree_code code;
531: int uns;
532: HOST_WIDE_INT lnum_orig, hnum_orig; /* num == numerator == dividend */
533: HOST_WIDE_INT lden_orig, hden_orig; /* den == denominator == divisor */
534: HOST_WIDE_INT *lquo, *hquo, *lrem, *hrem;
535: {
536: int quo_neg = 0;
537: short num[MAX_SHORTS + 1]; /* extra element for scaling. */
538: short den[MAX_SHORTS], quo[MAX_SHORTS];
539: register int i, j, work;
540: register int carry = 0;
541: HOST_WIDE_INT lnum = lnum_orig;
542: HOST_WIDE_INT hnum = hnum_orig;
543: HOST_WIDE_INT lden = lden_orig;
544: HOST_WIDE_INT hden = hden_orig;
545: int overflow = 0;
546:
547: if ((hden == 0) && (lden == 0))
548: abort ();
549:
550: /* calculate quotient sign and convert operands to unsigned. */
551: if (!uns)
552: {
553: if (hnum < 0)
554: {
555: quo_neg = ~ quo_neg;
556: /* (minimum integer) / (-1) is the only overflow case. */
557: if (neg_double (lnum, hnum, &lnum, &hnum) && (lden & hden) == -1)
558: overflow = 1;
559: }
560: if (hden < 0)
561: {
562: quo_neg = ~ quo_neg;
563: neg_double (lden, hden, &lden, &hden);
564: }
565: }
566:
567: if (hnum == 0 && hden == 0)
568: { /* single precision */
569: *hquo = *hrem = 0;
570: /* This unsigned division rounds toward zero. */
571: *lquo = lnum / (unsigned HOST_WIDE_INT) lden;
572: goto finish_up;
573: }
574:
575: if (hnum == 0)
576: { /* trivial case: dividend < divisor */
577: /* hden != 0 already checked. */
578: *hquo = *lquo = 0;
579: *hrem = hnum;
580: *lrem = lnum;
581: goto finish_up;
582: }
583:
584: bzero (quo, sizeof quo);
585:
586: bzero (num, sizeof num); /* to zero 9th element */
587: bzero (den, sizeof den);
588:
589: encode (num, lnum, hnum);
590: encode (den, lden, hden);
591:
592: /* This code requires more than just hden == 0.
593: We also have to require that we don't need more than three bytes
594: to hold CARRY. If we ever did need four bytes to hold it, we
595: would lose part of it when computing WORK on the next round. */
596: if (hden == 0 && (((unsigned HOST_WIDE_INT) lden << 8) >> 8) == lden)
597: { /* simpler algorithm */
598: /* hnum != 0 already checked. */
599: for (i = MAX_SHORTS - 1; i >= 0; i--)
600: {
601: work = num[i] + (carry << 8);
602: quo[i] = work / (unsigned HOST_WIDE_INT) lden;
603: carry = work % (unsigned HOST_WIDE_INT) lden;
604: }
605: }
606: else { /* full double precision,
607: with thanks to Don Knuth's
608: "Seminumerical Algorithms". */
609: #define BASE 256
610: int quo_est, scale, num_hi_sig, den_hi_sig, quo_hi_sig;
611:
612: /* Find the highest non-zero divisor digit. */
613: for (i = MAX_SHORTS - 1; ; i--)
614: if (den[i] != 0) {
615: den_hi_sig = i;
616: break;
617: }
618: for (i = MAX_SHORTS - 1; ; i--)
619: if (num[i] != 0) {
620: num_hi_sig = i;
621: break;
622: }
623: quo_hi_sig = num_hi_sig - den_hi_sig + 1;
624:
625: /* Insure that the first digit of the divisor is at least BASE/2.
626: This is required by the quotient digit estimation algorithm. */
627:
628: scale = BASE / (den[den_hi_sig] + 1);
629: if (scale > 1) { /* scale divisor and dividend */
630: carry = 0;
631: for (i = 0; i <= MAX_SHORTS - 1; i++) {
632: work = (num[i] * scale) + carry;
633: num[i] = work & 0xff;
634: carry = work >> 8;
635: if (num[i] != 0) num_hi_sig = i;
636: }
637: carry = 0;
638: for (i = 0; i <= MAX_SHORTS - 1; i++) {
639: work = (den[i] * scale) + carry;
640: den[i] = work & 0xff;
641: carry = work >> 8;
642: if (den[i] != 0) den_hi_sig = i;
643: }
644: }
645:
646: /* Main loop */
647: for (i = quo_hi_sig; i > 0; i--) {
648: /* guess the next quotient digit, quo_est, by dividing the first
649: two remaining dividend digits by the high order quotient digit.
650: quo_est is never low and is at most 2 high. */
651:
652: int num_hi; /* index of highest remaining dividend digit */
653:
654: num_hi = i + den_hi_sig;
655:
656: work = (num[num_hi] * BASE) + (num_hi > 0 ? num[num_hi - 1] : 0);
657: if (num[num_hi] != den[den_hi_sig]) {
658: quo_est = work / den[den_hi_sig];
659: }
660: else {
661: quo_est = BASE - 1;
662: }
663:
664: /* refine quo_est so it's usually correct, and at most one high. */
665: while ((den[den_hi_sig - 1] * quo_est)
666: > (((work - (quo_est * den[den_hi_sig])) * BASE)
667: + ((num_hi - 1) > 0 ? num[num_hi - 2] : 0)))
668: quo_est--;
669:
670: /* Try QUO_EST as the quotient digit, by multiplying the
671: divisor by QUO_EST and subtracting from the remaining dividend.
672: Keep in mind that QUO_EST is the I - 1st digit. */
673:
674: carry = 0;
675:
676: for (j = 0; j <= den_hi_sig; j++)
677: {
678: int digit;
679:
680: work = num[i + j - 1] - (quo_est * den[j]) + carry;
681: digit = work & 0xff;
682: carry = work >> 8;
683: if (digit < 0)
684: {
685: digit += BASE;
686: carry--;
687: }
688: num[i + j - 1] = digit;
689: }
690:
691: /* if quo_est was high by one, then num[i] went negative and
692: we need to correct things. */
693:
694: if (num[num_hi] < 0)
695: {
696: quo_est--;
697: carry = 0; /* add divisor back in */
698: for (j = 0; j <= den_hi_sig; j++)
699: {
700: work = num[i + j - 1] + den[j] + carry;
701: if (work > BASE)
702: {
703: work -= BASE;
704: carry = 1;
705: }
706: else
707: {
708: carry = 0;
709: }
710: num[i + j - 1] = work;
711: }
712: num [num_hi] += carry;
713: }
714:
715: /* store the quotient digit. */
716: quo[i - 1] = quo_est;
717: }
718: }
719:
720: decode (quo, lquo, hquo);
721:
722: finish_up:
723: /* if result is negative, make it so. */
724: if (quo_neg)
725: neg_double (*lquo, *hquo, lquo, hquo);
726:
727: /* compute trial remainder: rem = num - (quo * den) */
728: mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
729: neg_double (*lrem, *hrem, lrem, hrem);
730: add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
731:
732: switch (code)
733: {
734: case TRUNC_DIV_EXPR:
735: case TRUNC_MOD_EXPR: /* round toward zero */
736: case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
737: return overflow;
738:
739: case FLOOR_DIV_EXPR:
740: case FLOOR_MOD_EXPR: /* round toward negative infinity */
741: if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
742: {
743: /* quo = quo - 1; */
744: add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
745: lquo, hquo);
746: }
747: else return overflow;
748: break;
749:
750: case CEIL_DIV_EXPR:
751: case CEIL_MOD_EXPR: /* round toward positive infinity */
752: if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
753: {
754: add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
755: lquo, hquo);
756: }
757: else return overflow;
758: break;
759:
760: case ROUND_DIV_EXPR:
761: case ROUND_MOD_EXPR: /* round to closest integer */
762: {
763: HOST_WIDE_INT labs_rem = *lrem, habs_rem = *hrem;
764: HOST_WIDE_INT labs_den = lden, habs_den = hden, ltwice, htwice;
765:
766: /* get absolute values */
767: if (*hrem < 0) neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
768: if (hden < 0) neg_double (lden, hden, &labs_den, &habs_den);
769:
770: /* if (2 * abs (lrem) >= abs (lden)) */
771: mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
772: labs_rem, habs_rem, <wice, &htwice);
773: if (((unsigned HOST_WIDE_INT) habs_den
774: < (unsigned HOST_WIDE_INT) htwice)
775: || (((unsigned HOST_WIDE_INT) habs_den
776: == (unsigned HOST_WIDE_INT) htwice)
777: && ((HOST_WIDE_INT unsigned) labs_den
778: < (unsigned HOST_WIDE_INT) ltwice)))
779: {
780: if (*hquo < 0)
781: /* quo = quo - 1; */
782: add_double (*lquo, *hquo,
783: (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
784: else
785: /* quo = quo + 1; */
786: add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
787: lquo, hquo);
788: }
789: else return overflow;
790: }
791: break;
792:
793: default:
794: abort ();
795: }
796:
797: /* compute true remainder: rem = num - (quo * den) */
798: mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
799: neg_double (*lrem, *hrem, lrem, hrem);
800: add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
801: return overflow;
802: }
803:
804: #ifndef REAL_ARITHMETIC
805: /* Effectively truncate a real value to represent
806: the nearest possible value in a narrower mode.
807: The result is actually represented in the same data type as the argument,
808: but its value is usually different. */
809:
810: REAL_VALUE_TYPE
811: real_value_truncate (mode, arg)
812: enum machine_mode mode;
813: REAL_VALUE_TYPE arg;
814: {
815: #ifdef __STDC__
816: /* Make sure the value is actually stored in memory before we turn off
817: the handler. */
818: volatile
819: #endif
820: REAL_VALUE_TYPE value;
821: jmp_buf handler, old_handler;
822: int handled;
823:
824: if (setjmp (handler))
825: {
826: error ("floating overflow");
827: return dconst0;
828: }
829: handled = push_float_handler (handler, old_handler);
830: value = REAL_VALUE_TRUNCATE (mode, arg);
831: pop_float_handler (handled, old_handler);
832: return value;
833: }
834:
835: #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
836:
837: /* Check for infinity in an IEEE double precision number. */
838:
839: int
840: target_isinf (x)
841: REAL_VALUE_TYPE x;
842: {
843: /* The IEEE 64-bit double format. */
844: union {
845: REAL_VALUE_TYPE d;
846: struct {
847: unsigned sign : 1;
848: unsigned exponent : 11;
849: unsigned mantissa1 : 20;
850: unsigned mantissa2;
851: } little_endian;
852: struct {
853: unsigned mantissa2;
854: unsigned mantissa1 : 20;
855: unsigned exponent : 11;
856: unsigned sign : 1;
857: } big_endian;
858: } u;
859:
860: u.d = dconstm1;
861: if (u.big_endian.sign == 1)
862: {
863: u.d = x;
864: return (u.big_endian.exponent == 2047
865: && u.big_endian.mantissa1 == 0
866: && u.big_endian.mantissa2 == 0);
867: }
868: else
869: {
870: u.d = x;
871: return (u.little_endian.exponent == 2047
872: && u.little_endian.mantissa1 == 0
873: && u.little_endian.mantissa2 == 0);
874: }
875: }
876:
877: /* Check whether an IEEE double precision number is a NaN. */
878:
879: int
880: target_isnan (x)
881: REAL_VALUE_TYPE x;
882: {
883: /* The IEEE 64-bit double format. */
884: union {
885: REAL_VALUE_TYPE d;
886: struct {
887: unsigned sign : 1;
888: unsigned exponent : 11;
889: unsigned mantissa1 : 20;
890: unsigned mantissa2;
891: } little_endian;
892: struct {
893: unsigned mantissa2;
894: unsigned mantissa1 : 20;
895: unsigned exponent : 11;
896: unsigned sign : 1;
897: } big_endian;
898: } u;
899:
900: u.d = dconstm1;
901: if (u.big_endian.sign == 1)
902: {
903: u.d = x;
904: return (u.big_endian.exponent == 2047
905: && (u.big_endian.mantissa1 != 0
906: || u.big_endian.mantissa2 != 0));
907: }
908: else
909: {
910: u.d = x;
911: return (u.little_endian.exponent == 2047
912: && (u.little_endian.mantissa1 != 0
913: || u.little_endian.mantissa2 != 0));
914: }
915: }
916:
917: /* Check for a negative IEEE double precision number. */
918:
919: int
920: target_negative (x)
921: REAL_VALUE_TYPE x;
922: {
923: /* The IEEE 64-bit double format. */
924: union {
925: REAL_VALUE_TYPE d;
926: struct {
927: unsigned sign : 1;
928: unsigned exponent : 11;
929: unsigned mantissa1 : 20;
930: unsigned mantissa2;
931: } little_endian;
932: struct {
933: unsigned mantissa2;
934: unsigned mantissa1 : 20;
935: unsigned exponent : 11;
936: unsigned sign : 1;
937: } big_endian;
938: } u;
939:
940: u.d = dconstm1;
941: if (u.big_endian.sign == 1)
942: {
943: u.d = x;
944: return u.big_endian.sign;
945: }
946: else
947: {
948: u.d = x;
949: return u.little_endian.sign;
950: }
951: }
952: #else /* Target not IEEE */
953:
954: /* Let's assume other float formats don't have infinity.
955: (This can be overridden by redefining REAL_VALUE_ISINF.) */
956:
957: target_isinf (x)
958: REAL_VALUE_TYPE x;
959: {
960: return 0;
961: }
962:
963: /* Let's assume other float formats don't have NaNs.
964: (This can be overridden by redefining REAL_VALUE_ISNAN.) */
965:
966: target_isnan (x)
967: REAL_VALUE_TYPE x;
968: {
969: return 0;
970: }
971:
972: /* Let's assume other float formats don't have minus zero.
973: (This can be overridden by redefining REAL_VALUE_NEGATIVE.) */
974:
975: target_negative (x)
976: REAL_VALUE_TYPE x;
977: {
978: return x < 0;
979: }
980: #endif /* Target not IEEE */
981: #endif /* no REAL_ARITHMETIC */
982:
983: /* Split a tree IN into a constant and a variable part
984: that could be combined with CODE to make IN.
985: CODE must be a commutative arithmetic operation.
986: Store the constant part into *CONP and the variable in &VARP.
987: Return 1 if this was done; zero means the tree IN did not decompose
988: this way.
989:
990: If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.
991: Therefore, we must tell the caller whether the variable part
992: was subtracted. We do this by storing 1 or -1 into *VARSIGNP.
993: The value stored is the coefficient for the variable term.
994: The constant term we return should always be added;
995: we negate it if necessary. */
996:
997: static int
998: split_tree (in, code, varp, conp, varsignp)
999: tree in;
1000: enum tree_code code;
1001: tree *varp, *conp;
1002: int *varsignp;
1003: {
1004: register tree outtype = TREE_TYPE (in);
1005: *varp = 0;
1006: *conp = 0;
1007:
1008: /* Strip any conversions that don't change the machine mode. */
1009: while ((TREE_CODE (in) == NOP_EXPR
1010: || TREE_CODE (in) == CONVERT_EXPR)
1011: && (TYPE_MODE (TREE_TYPE (in))
1012: == TYPE_MODE (TREE_TYPE (TREE_OPERAND (in, 0)))))
1013: in = TREE_OPERAND (in, 0);
1014:
1015: if (TREE_CODE (in) == code
1016: || (! FLOAT_TYPE_P (TREE_TYPE (in))
1017: /* We can associate addition and subtraction together
1018: (even though the C standard doesn't say so)
1019: for integers because the value is not affected.
1020: For reals, the value might be affected, so we can't. */
1021: && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1022: || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1023: {
1024: enum tree_code code = TREE_CODE (TREE_OPERAND (in, 0));
1025: if (code == INTEGER_CST)
1026: {
1027: *conp = TREE_OPERAND (in, 0);
1028: *varp = TREE_OPERAND (in, 1);
1029: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1030: && TREE_TYPE (*varp) != outtype)
1031: *varp = convert (outtype, *varp);
1032: *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1033: return 1;
1034: }
1035: if (TREE_CONSTANT (TREE_OPERAND (in, 1)))
1036: {
1037: *conp = TREE_OPERAND (in, 1);
1038: *varp = TREE_OPERAND (in, 0);
1039: *varsignp = 1;
1040: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1041: && TREE_TYPE (*varp) != outtype)
1042: *varp = convert (outtype, *varp);
1043: if (TREE_CODE (in) == MINUS_EXPR)
1044: {
1045: /* If operation is subtraction and constant is second,
1046: must negate it to get an additive constant.
1047: And this cannot be done unless it is a manifest constant.
1048: It could also be the address of a static variable.
1049: We cannot negate that, so give up. */
1050: if (TREE_CODE (*conp) == INTEGER_CST)
1051: /* Subtracting from integer_zero_node loses for long long. */
1052: *conp = fold (build1 (NEGATE_EXPR, TREE_TYPE (*conp), *conp));
1053: else
1054: return 0;
1055: }
1056: return 1;
1057: }
1058: if (TREE_CONSTANT (TREE_OPERAND (in, 0)))
1059: {
1060: *conp = TREE_OPERAND (in, 0);
1061: *varp = TREE_OPERAND (in, 1);
1062: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1063: && TREE_TYPE (*varp) != outtype)
1064: *varp = convert (outtype, *varp);
1065: *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1066: return 1;
1067: }
1068: }
1069: return 0;
1070: }
1071:
1072: /* Combine two constants NUM and ARG2 under operation CODE
1073: to produce a new constant.
1074: We assume ARG1 and ARG2 have the same data type,
1075: or at least are the same kind of constant and the same machine mode.
1076:
1077: If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1078:
1079: static tree
1080: const_binop (code, arg1, arg2, notrunc)
1081: enum tree_code code;
1082: register tree arg1, arg2;
1083: int notrunc;
1084: {
1085: if (TREE_CODE (arg1) == INTEGER_CST)
1086: {
1087: register HOST_WIDE_INT int1l = TREE_INT_CST_LOW (arg1);
1088: register HOST_WIDE_INT int1h = TREE_INT_CST_HIGH (arg1);
1089: HOST_WIDE_INT int2l = TREE_INT_CST_LOW (arg2);
1090: HOST_WIDE_INT int2h = TREE_INT_CST_HIGH (arg2);
1091: HOST_WIDE_INT low, hi;
1092: HOST_WIDE_INT garbagel, garbageh;
1093: register tree t;
1094: int uns = TREE_UNSIGNED (TREE_TYPE (arg1));
1095: int overflow = 0;
1096:
1097: switch (code)
1098: {
1099: case BIT_IOR_EXPR:
1100: t = build_int_2 (int1l | int2l, int1h | int2h);
1101: break;
1102:
1103: case BIT_XOR_EXPR:
1104: t = build_int_2 (int1l ^ int2l, int1h ^ int2h);
1105: break;
1106:
1107: case BIT_AND_EXPR:
1108: t = build_int_2 (int1l & int2l, int1h & int2h);
1109: break;
1110:
1111: case BIT_ANDTC_EXPR:
1112: t = build_int_2 (int1l & ~int2l, int1h & ~int2h);
1113: break;
1114:
1115: case RSHIFT_EXPR:
1116: int2l = - int2l;
1117: case LSHIFT_EXPR:
1118: /* It's unclear from the C standard whether shifts can overflow.
1119: The following code ignores overflow; perhaps a C standard
1120: interpretation ruling is needed. */
1121: lshift_double (int1l, int1h, int2l,
1122: TYPE_PRECISION (TREE_TYPE (arg1)),
1123: &low, &hi,
1124: !uns);
1125: t = build_int_2 (low, hi);
1126: TREE_TYPE (t) = TREE_TYPE (arg1);
1127: if (!notrunc)
1128: force_fit_type (t, 0);
1129: TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1130: TREE_CONSTANT_OVERFLOW (t)
1131: = TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2);
1132: return t;
1133:
1134: case RROTATE_EXPR:
1135: int2l = - int2l;
1136: case LROTATE_EXPR:
1137: lrotate_double (int1l, int1h, int2l,
1138: TYPE_PRECISION (TREE_TYPE (arg1)),
1139: &low, &hi);
1140: t = build_int_2 (low, hi);
1141: break;
1142:
1143: case PLUS_EXPR:
1144: if (int1h == 0)
1145: {
1146: int2l += int1l;
1147: if ((unsigned HOST_WIDE_INT) int2l < int1l)
1148: {
1149: hi = int2h++;
1150: overflow = int2h < hi;
1151: }
1152: t = build_int_2 (int2l, int2h);
1153: break;
1154: }
1155: if (int2h == 0)
1156: {
1157: int1l += int2l;
1158: if ((unsigned HOST_WIDE_INT) int1l < int2l)
1159: {
1160: hi = int1h++;
1161: overflow = int1h < hi;
1162: }
1163: t = build_int_2 (int1l, int1h);
1164: break;
1165: }
1166: overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1167: t = build_int_2 (low, hi);
1168: break;
1169:
1170: case MINUS_EXPR:
1171: if (int2h == 0 && int2l == 0)
1172: {
1173: t = build_int_2 (int1l, int1h);
1174: break;
1175: }
1176: neg_double (int2l, int2h, &low, &hi);
1177: add_double (int1l, int1h, low, hi, &low, &hi);
1178: overflow = overflow_sum_sign (hi, int2h, int1h);
1179: t = build_int_2 (low, hi);
1180: break;
1181:
1182: case MULT_EXPR:
1183: /* Optimize simple cases. */
1184: if (int1h == 0)
1185: {
1186: unsigned HOST_WIDE_INT temp;
1187:
1188: switch (int1l)
1189: {
1190: case 0:
1191: t = build_int_2 (0, 0);
1192: goto got_it;
1193: case 1:
1194: t = build_int_2 (int2l, int2h);
1195: goto got_it;
1196: case 2:
1197: overflow = left_shift_overflows (int2h, 1);
1198: temp = int2l + int2l;
1199: int2h = (int2h << 1) + (temp < int2l);
1200: t = build_int_2 (temp, int2h);
1201: goto got_it;
1202: #if 0 /* This code can lose carries. */
1203: case 3:
1204: temp = int2l + int2l + int2l;
1205: int2h = int2h * 3 + (temp < int2l);
1206: t = build_int_2 (temp, int2h);
1207: goto got_it;
1208: #endif
1209: case 4:
1210: overflow = left_shift_overflows (int2h, 2);
1211: temp = int2l + int2l;
1212: int2h = (int2h << 2) + ((temp < int2l) << 1);
1213: int2l = temp;
1214: temp += temp;
1215: int2h += (temp < int2l);
1216: t = build_int_2 (temp, int2h);
1217: goto got_it;
1218: case 8:
1219: overflow = left_shift_overflows (int2h, 3);
1220: temp = int2l + int2l;
1221: int2h = (int2h << 3) + ((temp < int2l) << 2);
1222: int2l = temp;
1223: temp += temp;
1224: int2h += (temp < int2l) << 1;
1225: int2l = temp;
1226: temp += temp;
1227: int2h += (temp < int2l);
1228: t = build_int_2 (temp, int2h);
1229: goto got_it;
1230: default:
1231: break;
1232: }
1233: }
1234:
1235: if (int2h == 0)
1236: {
1237: if (int2l == 0)
1238: {
1239: t = build_int_2 (0, 0);
1240: break;
1241: }
1242: if (int2l == 1)
1243: {
1244: t = build_int_2 (int1l, int1h);
1245: break;
1246: }
1247: }
1248:
1249: overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1250: t = build_int_2 (low, hi);
1251: break;
1252:
1253: case TRUNC_DIV_EXPR:
1254: case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1255: case EXACT_DIV_EXPR:
1256: /* This is a shortcut for a common special case.
1257: It reduces the number of tree nodes generated
1258: and saves time. */
1259: if (int2h == 0 && int2l > 0
1260: && TREE_TYPE (arg1) == sizetype
1261: && int1h == 0 && int1l >= 0)
1262: {
1263: if (code == CEIL_DIV_EXPR)
1264: int1l += int2l-1;
1265: return size_int (int1l / int2l);
1266: }
1267: case ROUND_DIV_EXPR:
1268: if (int2h == 0 && int2l == 1)
1269: {
1270: t = build_int_2 (int1l, int1h);
1271: break;
1272: }
1273: if (int1l == int2l && int1h == int2h)
1274: {
1275: if ((int1l | int1h) == 0)
1276: abort ();
1277: t = build_int_2 (1, 0);
1278: break;
1279: }
1280: overflow = div_and_round_double (code, uns,
1281: int1l, int1h, int2l, int2h,
1282: &low, &hi, &garbagel, &garbageh);
1283: t = build_int_2 (low, hi);
1284: break;
1285:
1286: case TRUNC_MOD_EXPR: case ROUND_MOD_EXPR:
1287: case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1288: overflow = div_and_round_double (code, uns,
1289: int1l, int1h, int2l, int2h,
1290: &garbagel, &garbageh, &low, &hi);
1291: t = build_int_2 (low, hi);
1292: break;
1293:
1294: case MIN_EXPR:
1295: case MAX_EXPR:
1296: if (uns)
1297: {
1298: low = (((unsigned HOST_WIDE_INT) int1h
1299: < (unsigned HOST_WIDE_INT) int2h)
1300: || (((unsigned HOST_WIDE_INT) int1h
1301: == (unsigned HOST_WIDE_INT) int2h)
1302: && ((unsigned HOST_WIDE_INT) int1l
1303: < (unsigned HOST_WIDE_INT) int2l)));
1304: }
1305: else
1306: {
1307: low = ((int1h < int2h)
1308: || ((int1h == int2h)
1309: && ((unsigned HOST_WIDE_INT) int1l
1310: < (unsigned HOST_WIDE_INT) int2l)));
1311: }
1312: if (low == (code == MIN_EXPR))
1313: t = build_int_2 (int1l, int1h);
1314: else
1315: t = build_int_2 (int2l, int2h);
1316: break;
1317:
1318: default:
1319: abort ();
1320: }
1321: got_it:
1322: TREE_TYPE (t) = TREE_TYPE (arg1);
1323: TREE_OVERFLOW (t)
1324: = ((notrunc ? !uns && overflow : force_fit_type (t, overflow))
1325: | TREE_OVERFLOW (arg1)
1326: | TREE_OVERFLOW (arg2));
1327: TREE_CONSTANT_OVERFLOW (t) = (TREE_OVERFLOW (t)
1328: | TREE_CONSTANT_OVERFLOW (arg1)
1329: | TREE_CONSTANT_OVERFLOW (arg2));
1330: return t;
1331: }
1332: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1333: if (TREE_CODE (arg1) == REAL_CST)
1334: {
1335: REAL_VALUE_TYPE d1;
1336: REAL_VALUE_TYPE d2;
1337: REAL_VALUE_TYPE value;
1338: tree t;
1339:
1340: d1 = TREE_REAL_CST (arg1);
1341: d2 = TREE_REAL_CST (arg2);
1342: if (setjmp (float_error))
1343: {
1344: pedwarn ("floating overflow in constant expression");
1345: return build (code, TREE_TYPE (arg1), arg1, arg2);
1346: }
1347: set_float_handler (float_error);
1348:
1349: #ifdef REAL_ARITHMETIC
1350: REAL_ARITHMETIC (value, code, d1, d2);
1351: #else
1352: switch (code)
1353: {
1354: case PLUS_EXPR:
1355: value = d1 + d2;
1356: break;
1357:
1358: case MINUS_EXPR:
1359: value = d1 - d2;
1360: break;
1361:
1362: case MULT_EXPR:
1363: value = d1 * d2;
1364: break;
1365:
1366: case RDIV_EXPR:
1367: #ifndef REAL_INFINITY
1368: if (d2 == 0)
1369: abort ();
1370: #endif
1371:
1372: value = d1 / d2;
1373: break;
1374:
1375: case MIN_EXPR:
1376: value = MIN (d1, d2);
1377: break;
1378:
1379: case MAX_EXPR:
1380: value = MAX (d1, d2);
1381: break;
1382:
1383: default:
1384: abort ();
1385: }
1386: #endif /* no REAL_ARITHMETIC */
1387: t = build_real (TREE_TYPE (arg1),
1388: real_value_truncate (TYPE_MODE (TREE_TYPE (arg1)), value));
1389: set_float_handler (NULL_PTR);
1390: return t;
1391: }
1392: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1393: if (TREE_CODE (arg1) == COMPLEX_CST)
1394: {
1395: register tree r1 = TREE_REALPART (arg1);
1396: register tree i1 = TREE_IMAGPART (arg1);
1397: register tree r2 = TREE_REALPART (arg2);
1398: register tree i2 = TREE_IMAGPART (arg2);
1399: register tree t;
1400:
1401: switch (code)
1402: {
1403: case PLUS_EXPR:
1404: t = build_complex (const_binop (PLUS_EXPR, r1, r2, notrunc),
1405: const_binop (PLUS_EXPR, i1, i2, notrunc));
1406: break;
1407:
1408: case MINUS_EXPR:
1409: t = build_complex (const_binop (MINUS_EXPR, r1, r2, notrunc),
1410: const_binop (MINUS_EXPR, i1, i2, notrunc));
1411: break;
1412:
1413: case MULT_EXPR:
1414: t = build_complex (const_binop (MINUS_EXPR,
1415: const_binop (MULT_EXPR,
1416: r1, r2, notrunc),
1417: const_binop (MULT_EXPR,
1418: i1, i2, notrunc),
1419: notrunc),
1420: const_binop (PLUS_EXPR,
1421: const_binop (MULT_EXPR,
1422: r1, i2, notrunc),
1423: const_binop (MULT_EXPR,
1424: i1, r2, notrunc),
1425: notrunc));
1426: break;
1427:
1428: case RDIV_EXPR:
1429: {
1430: register tree magsquared
1431: = const_binop (PLUS_EXPR,
1432: const_binop (MULT_EXPR, r2, r2, notrunc),
1433: const_binop (MULT_EXPR, i2, i2, notrunc),
1434: notrunc);
1435: t = build_complex (const_binop (RDIV_EXPR,
1436: const_binop (PLUS_EXPR,
1437: const_binop (MULT_EXPR, r1, r2, notrunc),
1438: const_binop (MULT_EXPR, i1, i2, notrunc),
1439: notrunc),
1440: magsquared, notrunc),
1441: const_binop (RDIV_EXPR,
1442: const_binop (MINUS_EXPR,
1443: const_binop (MULT_EXPR, i1, r2, notrunc),
1444: const_binop (MULT_EXPR, r1, i2, notrunc),
1445: notrunc),
1446: magsquared, notrunc));
1447: }
1448: break;
1449:
1450: default:
1451: abort ();
1452: }
1453: TREE_TYPE (t) = TREE_TYPE (arg1);
1454: return t;
1455: }
1456: return 0;
1457: }
1458:
1459: /* Return an INTEGER_CST with value V and type from `sizetype'. */
1460:
1461: tree
1462: size_int (number)
1463: unsigned int number;
1464: {
1465: register tree t;
1466: /* Type-size nodes already made for small sizes. */
1467: static tree size_table[2*HOST_BITS_PER_WIDE_INT + 1];
1468:
1469: if (number < 2*HOST_BITS_PER_WIDE_INT + 1
1470: && size_table[number] != 0)
1471: return size_table[number];
1472: if (number < 2*HOST_BITS_PER_WIDE_INT + 1)
1473: {
1474: push_obstacks_nochange ();
1475: /* Make this a permanent node. */
1476: end_temporary_allocation ();
1477: t = build_int_2 (number, 0);
1478: TREE_TYPE (t) = sizetype;
1479: size_table[number] = t;
1480: pop_obstacks ();
1481: }
1482: else
1483: {
1484: t = build_int_2 (number, 0);
1485: TREE_TYPE (t) = sizetype;
1486: }
1487: return t;
1488: }
1489:
1490: /* Combine operands OP1 and OP2 with arithmetic operation CODE.
1491: CODE is a tree code. Data type is taken from `sizetype',
1492: If the operands are constant, so is the result. */
1493:
1494: tree
1495: size_binop (code, arg0, arg1)
1496: enum tree_code code;
1497: tree arg0, arg1;
1498: {
1499: /* Handle the special case of two integer constants faster. */
1500: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1501: {
1502: /* And some specific cases even faster than that. */
1503: if (code == PLUS_EXPR
1504: && TREE_INT_CST_LOW (arg0) == 0
1505: && TREE_INT_CST_HIGH (arg0) == 0)
1506: return arg1;
1507: if (code == MINUS_EXPR
1508: && TREE_INT_CST_LOW (arg1) == 0
1509: && TREE_INT_CST_HIGH (arg1) == 0)
1510: return arg0;
1511: if (code == MULT_EXPR
1512: && TREE_INT_CST_LOW (arg0) == 1
1513: && TREE_INT_CST_HIGH (arg0) == 0)
1514: return arg1;
1515: /* Handle general case of two integer constants. */
1516: return const_binop (code, arg0, arg1, 1);
1517: }
1518:
1519: if (arg0 == error_mark_node || arg1 == error_mark_node)
1520: return error_mark_node;
1521:
1522: return fold (build (code, sizetype, arg0, arg1));
1523: }
1524:
1525: /* Given T, a tree representing type conversion of ARG1, a constant,
1526: return a constant tree representing the result of conversion. */
1527:
1528: static tree
1529: fold_convert (t, arg1)
1530: register tree t;
1531: register tree arg1;
1532: {
1533: register tree type = TREE_TYPE (t);
1534:
1535: if (TREE_CODE (type) == POINTER_TYPE || INTEGRAL_TYPE_P (type))
1536: {
1537: if (TREE_CODE (arg1) == INTEGER_CST)
1538: {
1539: /* Given an integer constant, make new constant with new type,
1540: appropriately sign-extended or truncated. */
1541: t = build_int_2 (TREE_INT_CST_LOW (arg1),
1542: TREE_INT_CST_HIGH (arg1));
1543: TREE_TYPE (t) = type;
1544: /* Indicate an overflow if (1) ARG1 already overflowed,
1545: or (2) force_fit_type indicates an overflow.
1546: Tell force_fit_type that an overflow has already occurred
1547: if ARG1 is a too-large unsigned value and T is signed. */
1548: TREE_OVERFLOW (t)
1549: = (TREE_OVERFLOW (arg1)
1550: | force_fit_type (t,
1551: (TREE_INT_CST_HIGH (arg1) < 0
1552: & (TREE_UNSIGNED (type)
1553: < TREE_UNSIGNED (TREE_TYPE (arg1))))));
1554: TREE_CONSTANT_OVERFLOW (t)
1555: = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
1556: }
1557: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1558: else if (TREE_CODE (arg1) == REAL_CST)
1559: {
1560: REAL_VALUE_TYPE l, x, u;
1561:
1562: l = real_value_from_int_cst (TYPE_MIN_VALUE (type));
1563: x = TREE_REAL_CST (arg1);
1564: u = real_value_from_int_cst (TYPE_MAX_VALUE (type));
1565:
1566: /* See if X will be in range after truncation towards 0.
1567: To compensate for truncation, move the bounds away from 0,
1568: but reject if X exactly equals the adjusted bounds. */
1569: #ifdef REAL_ARITHMETIC
1570: REAL_ARITHMETIC (l, MINUS_EXPR, l, dconst1);
1571: REAL_ARITHMETIC (u, PLUS_EXPR, u, dconst1);
1572: #else
1573: l--;
1574: u++;
1575: #endif
1576: if (! (REAL_VALUES_LESS (l, x) && REAL_VALUES_LESS (x, u)))
1577: {
1578: pedwarn ("real constant out of range for integer conversion");
1579: return t;
1580: }
1581: #ifndef REAL_ARITHMETIC
1582: {
1583: REAL_VALUE_TYPE d;
1584: HOST_WIDE_INT low, high;
1585: HOST_WIDE_INT half_word
1586: = (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2);
1587:
1588: d = TREE_REAL_CST (arg1);
1589: if (d < 0)
1590: d = -d;
1591:
1592: high = (HOST_WIDE_INT) (d / half_word / half_word);
1593: d -= (REAL_VALUE_TYPE) high * half_word * half_word;
1594: if (d >= (REAL_VALUE_TYPE) half_word * half_word / 2)
1595: {
1596: low = d - (REAL_VALUE_TYPE) half_word * half_word / 2;
1597: low |= (HOST_WIDE_INT) -1 << (HOST_BITS_PER_WIDE_INT - 1);
1598: }
1599: else
1600: low = (HOST_WIDE_INT) d;
1601: if (TREE_REAL_CST (arg1) < 0)
1602: neg_double (low, high, &low, &high);
1603: t = build_int_2 (low, high);
1604: }
1605: #else
1606: {
1607: HOST_WIDE_INT low, high;
1608: REAL_VALUE_TO_INT (&low, &high, (TREE_REAL_CST (arg1)));
1609: t = build_int_2 (low, high);
1610: }
1611: #endif
1612: TREE_TYPE (t) = type;
1613: force_fit_type (t, 0);
1614: }
1615: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1616: TREE_TYPE (t) = type;
1617: }
1618: else if (TREE_CODE (type) == REAL_TYPE)
1619: {
1620: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1621: if (TREE_CODE (arg1) == INTEGER_CST)
1622: return build_real_from_int_cst (type, arg1);
1623: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1624: if (TREE_CODE (arg1) == REAL_CST)
1625: {
1626: if (setjmp (float_error))
1627: {
1628: pedwarn ("floating overflow in constant expression");
1629: return t;
1630: }
1631: set_float_handler (float_error);
1632:
1633: t = build_real (type, real_value_truncate (TYPE_MODE (type),
1634: TREE_REAL_CST (arg1)));
1635: set_float_handler (NULL_PTR);
1636: return t;
1637: }
1638: }
1639: TREE_CONSTANT (t) = 1;
1640: return t;
1641: }
1642:
1643: /* Return an expr equal to X but certainly not valid as an lvalue.
1644: Also make sure it is not valid as an null pointer constant. */
1645:
1646: tree
1647: non_lvalue (x)
1648: tree x;
1649: {
1650: tree result;
1651:
1652: /* These things are certainly not lvalues. */
1653: if (TREE_CODE (x) == NON_LVALUE_EXPR
1654: || TREE_CODE (x) == INTEGER_CST
1655: || TREE_CODE (x) == REAL_CST
1656: || TREE_CODE (x) == STRING_CST
1657: || TREE_CODE (x) == ADDR_EXPR)
1658: {
1659: if (TREE_CODE (x) == INTEGER_CST && integer_zerop (x))
1660: {
1661: /* Use NOP_EXPR instead of NON_LVALUE_EXPR
1662: so convert_for_assignment won't strip it.
1663: This is so this 0 won't be treated as a null pointer constant. */
1664: result = build1 (NOP_EXPR, TREE_TYPE (x), x);
1665: TREE_CONSTANT (result) = TREE_CONSTANT (x);
1666: return result;
1667: }
1668: return x;
1669: }
1670:
1671: result = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
1672: TREE_CONSTANT (result) = TREE_CONSTANT (x);
1673: return result;
1674: }
1675:
1676: /* When pedantic, return an expr equal to X but certainly not valid as a
1677: pedantic lvalue. Otherwise, return X. */
1678:
1679: tree
1680: pedantic_non_lvalue (x)
1681: tree x;
1682: {
1683: if (pedantic)
1684: return non_lvalue (x);
1685: else
1686: return x;
1687: }
1688:
1689: /* Given a tree comparison code, return the code that is the logical inverse
1690: of the given code. It is not safe to do this for floating-point
1691: comparisons, except for NE_EXPR and EQ_EXPR. */
1692:
1693: static enum tree_code
1694: invert_tree_comparison (code)
1695: enum tree_code code;
1696: {
1697: switch (code)
1698: {
1699: case EQ_EXPR:
1700: return NE_EXPR;
1701: case NE_EXPR:
1702: return EQ_EXPR;
1703: case GT_EXPR:
1704: return LE_EXPR;
1705: case GE_EXPR:
1706: return LT_EXPR;
1707: case LT_EXPR:
1708: return GE_EXPR;
1709: case LE_EXPR:
1710: return GT_EXPR;
1711: default:
1712: abort ();
1713: }
1714: }
1715:
1716: /* Similar, but return the comparison that results if the operands are
1717: swapped. This is safe for floating-point. */
1718:
1719: static enum tree_code
1720: swap_tree_comparison (code)
1721: enum tree_code code;
1722: {
1723: switch (code)
1724: {
1725: case EQ_EXPR:
1726: case NE_EXPR:
1727: return code;
1728: case GT_EXPR:
1729: return LT_EXPR;
1730: case GE_EXPR:
1731: return LE_EXPR;
1732: case LT_EXPR:
1733: return GT_EXPR;
1734: case LE_EXPR:
1735: return GE_EXPR;
1736: default:
1737: abort ();
1738: }
1739: }
1740:
1741: /* Return nonzero if two operands are necessarily equal.
1742: If ONLY_CONST is non-zero, only return non-zero for constants.
1743: This function tests whether the operands are indistinguishable;
1744: it does not test whether they are equal using C's == operation.
1745: The distinction is important for IEEE floating point, because
1746: (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
1747: (2) two NaNs may be indistinguishable, but NaN!=NaN. */
1748:
1749: int
1750: operand_equal_p (arg0, arg1, only_const)
1751: tree arg0, arg1;
1752: int only_const;
1753: {
1754: /* If both types don't have the same signedness, then we can't consider
1755: them equal. We must check this before the STRIP_NOPS calls
1756: because they may change the signedness of the arguments. */
1757: if (TREE_UNSIGNED (TREE_TYPE (arg0)) != TREE_UNSIGNED (TREE_TYPE (arg1)))
1758: return 0;
1759:
1760: STRIP_NOPS (arg0);
1761: STRIP_NOPS (arg1);
1762:
1763: /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
1764: We don't care about side effects in that case because the SAVE_EXPR
1765: takes care of that for us. */
1766: if (TREE_CODE (arg0) == SAVE_EXPR && arg0 == arg1)
1767: return ! only_const;
1768:
1769: if (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))
1770: return 0;
1771:
1772: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1773: && TREE_CODE (arg0) == ADDR_EXPR
1774: && TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0))
1775: return 1;
1776:
1777: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1778: && TREE_CODE (arg0) == INTEGER_CST
1779: && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
1780: && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1))
1781: return 1;
1782:
1783: /* Detect when real constants are equal. */
1784: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1785: && TREE_CODE (arg0) == REAL_CST)
1786: return !bcmp (&TREE_REAL_CST (arg0), &TREE_REAL_CST (arg1),
1787: sizeof (REAL_VALUE_TYPE));
1788:
1789: if (only_const)
1790: return 0;
1791:
1792: if (arg0 == arg1)
1793: return 1;
1794:
1795: if (TREE_CODE (arg0) != TREE_CODE (arg1))
1796: return 0;
1797: /* This is needed for conversions and for COMPONENT_REF.
1798: Might as well play it safe and always test this. */
1799: if (TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
1800: return 0;
1801:
1802: switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
1803: {
1804: case '1':
1805: /* Two conversions are equal only if signedness and modes match. */
1806: if ((TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == CONVERT_EXPR)
1807: && (TREE_UNSIGNED (TREE_TYPE (arg0))
1808: != TREE_UNSIGNED (TREE_TYPE (arg1))))
1809: return 0;
1810:
1811: return operand_equal_p (TREE_OPERAND (arg0, 0),
1812: TREE_OPERAND (arg1, 0), 0);
1813:
1814: case '<':
1815: case '2':
1816: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1817: TREE_OPERAND (arg1, 0), 0)
1818: && operand_equal_p (TREE_OPERAND (arg0, 1),
1819: TREE_OPERAND (arg1, 1), 0));
1820:
1821: case 'r':
1822: switch (TREE_CODE (arg0))
1823: {
1824: case INDIRECT_REF:
1825: return operand_equal_p (TREE_OPERAND (arg0, 0),
1826: TREE_OPERAND (arg1, 0), 0);
1827:
1828: case COMPONENT_REF:
1829: case ARRAY_REF:
1830: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1831: TREE_OPERAND (arg1, 0), 0)
1832: && operand_equal_p (TREE_OPERAND (arg0, 1),
1833: TREE_OPERAND (arg1, 1), 0));
1834:
1835: case BIT_FIELD_REF:
1836: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1837: TREE_OPERAND (arg1, 0), 0)
1838: && operand_equal_p (TREE_OPERAND (arg0, 1),
1839: TREE_OPERAND (arg1, 1), 0)
1840: && operand_equal_p (TREE_OPERAND (arg0, 2),
1841: TREE_OPERAND (arg1, 2), 0));
1842: }
1843: break;
1844: }
1845:
1846: return 0;
1847: }
1848:
1849: /* Similar to operand_equal_p, but see if ARG0 might have been made by
1850: shorten_compare from ARG1 when ARG1 was being compared with OTHER.
1851:
1852: When in doubt, return 0. */
1853:
1854: static int
1855: operand_equal_for_comparison_p (arg0, arg1, other)
1856: tree arg0, arg1;
1857: tree other;
1858: {
1859: int unsignedp1, unsignedpo;
1860: tree primarg1, primother;
1861: int correct_width;
1862:
1863: if (operand_equal_p (arg0, arg1, 0))
1864: return 1;
1865:
1866: if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
1867: return 0;
1868:
1869: /* Duplicate what shorten_compare does to ARG1 and see if that gives the
1870: actual comparison operand, ARG0.
1871:
1872: First throw away any conversions to wider types
1873: already present in the operands. */
1874:
1875: primarg1 = get_narrower (arg1, &unsignedp1);
1876: primother = get_narrower (other, &unsignedpo);
1877:
1878: correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
1879: if (unsignedp1 == unsignedpo
1880: && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
1881: && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
1882: {
1883: tree type = TREE_TYPE (arg0);
1884:
1885: /* Make sure shorter operand is extended the right way
1886: to match the longer operand. */
1887: primarg1 = convert (signed_or_unsigned_type (unsignedp1,
1888: TREE_TYPE (primarg1)),
1889: primarg1);
1890:
1891: if (operand_equal_p (arg0, convert (type, primarg1), 0))
1892: return 1;
1893: }
1894:
1895: return 0;
1896: }
1897:
1898: /* See if ARG is an expression that is either a comparison or is performing
1899: arithmetic on comparisons. The comparisons must only be comparing
1900: two different values, which will be stored in *CVAL1 and *CVAL2; if
1901: they are non-zero it means that some operands have already been found.
1902: No variables may be used anywhere else in the expression except in the
1903: comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
1904: the expression and save_expr needs to be called with CVAL1 and CVAL2.
1905:
1906: If this is true, return 1. Otherwise, return zero. */
1907:
1908: static int
1909: twoval_comparison_p (arg, cval1, cval2, save_p)
1910: tree arg;
1911: tree *cval1, *cval2;
1912: int *save_p;
1913: {
1914: enum tree_code code = TREE_CODE (arg);
1915: char class = TREE_CODE_CLASS (code);
1916:
1917: /* We can handle some of the 'e' cases here. */
1918: if (class == 'e' && code == TRUTH_NOT_EXPR)
1919: class = '1';
1920: else if (class == 'e'
1921: && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
1922: || code == COMPOUND_EXPR))
1923: class = '2';
1924:
1925: /* ??? Disable this since the SAVE_EXPR might already be in use outside
1926: the expression. There may be no way to make this work, but it needs
1927: to be looked at again for 2.6. */
1928: #if 0
1929: else if (class == 'e' && code == SAVE_EXPR && SAVE_EXPR_RTL (arg) == 0)
1930: {
1931: /* If we've already found a CVAL1 or CVAL2, this expression is
1932: two complex to handle. */
1933: if (*cval1 || *cval2)
1934: return 0;
1935:
1936: class = '1';
1937: *save_p = 1;
1938: }
1939: #endif
1940:
1941: switch (class)
1942: {
1943: case '1':
1944: return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
1945:
1946: case '2':
1947: return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
1948: && twoval_comparison_p (TREE_OPERAND (arg, 1),
1949: cval1, cval2, save_p));
1950:
1951: case 'c':
1952: return 1;
1953:
1954: case 'e':
1955: if (code == COND_EXPR)
1956: return (twoval_comparison_p (TREE_OPERAND (arg, 0),
1957: cval1, cval2, save_p)
1958: && twoval_comparison_p (TREE_OPERAND (arg, 1),
1959: cval1, cval2, save_p)
1960: && twoval_comparison_p (TREE_OPERAND (arg, 2),
1961: cval1, cval2, save_p));
1962: return 0;
1963:
1964: case '<':
1965: /* First see if we can handle the first operand, then the second. For
1966: the second operand, we know *CVAL1 can't be zero. It must be that
1967: one side of the comparison is each of the values; test for the
1968: case where this isn't true by failing if the two operands
1969: are the same. */
1970:
1971: if (operand_equal_p (TREE_OPERAND (arg, 0),
1972: TREE_OPERAND (arg, 1), 0))
1973: return 0;
1974:
1975: if (*cval1 == 0)
1976: *cval1 = TREE_OPERAND (arg, 0);
1977: else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
1978: ;
1979: else if (*cval2 == 0)
1980: *cval2 = TREE_OPERAND (arg, 0);
1981: else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
1982: ;
1983: else
1984: return 0;
1985:
1986: if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
1987: ;
1988: else if (*cval2 == 0)
1989: *cval2 = TREE_OPERAND (arg, 1);
1990: else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
1991: ;
1992: else
1993: return 0;
1994:
1995: return 1;
1996: }
1997:
1998: return 0;
1999: }
2000:
2001: /* ARG is a tree that is known to contain just arithmetic operations and
2002: comparisons. Evaluate the operations in the tree substituting NEW0 for
2003: any occurrence of OLD0 as an operand of a comparison and likewise for
2004: NEW1 and OLD1. */
2005:
2006: static tree
2007: eval_subst (arg, old0, new0, old1, new1)
2008: tree arg;
2009: tree old0, new0, old1, new1;
2010: {
2011: tree type = TREE_TYPE (arg);
2012: enum tree_code code = TREE_CODE (arg);
2013: char class = TREE_CODE_CLASS (code);
2014:
2015: /* We can handle some of the 'e' cases here. */
2016: if (class == 'e' && code == TRUTH_NOT_EXPR)
2017: class = '1';
2018: else if (class == 'e'
2019: && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2020: class = '2';
2021:
2022: switch (class)
2023: {
2024: case '1':
2025: return fold (build1 (code, type,
2026: eval_subst (TREE_OPERAND (arg, 0),
2027: old0, new0, old1, new1)));
2028:
2029: case '2':
2030: return fold (build (code, type,
2031: eval_subst (TREE_OPERAND (arg, 0),
2032: old0, new0, old1, new1),
2033: eval_subst (TREE_OPERAND (arg, 1),
2034: old0, new0, old1, new1)));
2035:
2036: case 'e':
2037: switch (code)
2038: {
2039: case SAVE_EXPR:
2040: return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2041:
2042: case COMPOUND_EXPR:
2043: return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2044:
2045: case COND_EXPR:
2046: return fold (build (code, type,
2047: eval_subst (TREE_OPERAND (arg, 0),
2048: old0, new0, old1, new1),
2049: eval_subst (TREE_OPERAND (arg, 1),
2050: old0, new0, old1, new1),
2051: eval_subst (TREE_OPERAND (arg, 2),
2052: old0, new0, old1, new1)));
2053: }
2054:
2055: case '<':
2056: {
2057: tree arg0 = TREE_OPERAND (arg, 0);
2058: tree arg1 = TREE_OPERAND (arg, 1);
2059:
2060: /* We need to check both for exact equality and tree equality. The
2061: former will be true if the operand has a side-effect. In that
2062: case, we know the operand occurred exactly once. */
2063:
2064: if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2065: arg0 = new0;
2066: else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2067: arg0 = new1;
2068:
2069: if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2070: arg1 = new0;
2071: else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2072: arg1 = new1;
2073:
2074: return fold (build (code, type, arg0, arg1));
2075: }
2076: }
2077:
2078: return arg;
2079: }
2080:
2081: /* Return a tree for the case when the result of an expression is RESULT
2082: converted to TYPE and OMITTED was previously an operand of the expression
2083: but is now not needed (e.g., we folded OMITTED * 0).
2084:
2085: If OMITTED has side effects, we must evaluate it. Otherwise, just do
2086: the conversion of RESULT to TYPE. */
2087:
2088: static tree
2089: omit_one_operand (type, result, omitted)
2090: tree type, result, omitted;
2091: {
2092: tree t = convert (type, result);
2093:
2094: if (TREE_SIDE_EFFECTS (omitted))
2095: return build (COMPOUND_EXPR, type, omitted, t);
2096:
2097: return non_lvalue (t);
2098: }
2099:
2100: /* Return a simplified tree node for the truth-negation of ARG. This
2101: never alters ARG itself. We assume that ARG is an operation that
2102: returns a truth value (0 or 1). */
2103:
2104: tree
2105: invert_truthvalue (arg)
2106: tree arg;
2107: {
2108: tree type = TREE_TYPE (arg);
2109: enum tree_code code = TREE_CODE (arg);
2110:
2111: if (code == ERROR_MARK)
2112: return arg;
2113:
2114: /* If this is a comparison, we can simply invert it, except for
2115: floating-point non-equality comparisons, in which case we just
2116: enclose a TRUTH_NOT_EXPR around what we have. */
2117:
2118: if (TREE_CODE_CLASS (code) == '<')
2119: {
2120: if (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg, 0)))
2121: && code != NE_EXPR && code != EQ_EXPR)
2122: return build1 (TRUTH_NOT_EXPR, type, arg);
2123: else
2124: return build (invert_tree_comparison (code), type,
2125: TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
2126: }
2127:
2128: switch (code)
2129: {
2130: case INTEGER_CST:
2131: return convert (type, build_int_2 (TREE_INT_CST_LOW (arg) == 0
2132: && TREE_INT_CST_HIGH (arg) == 0, 0));
2133:
2134: case TRUTH_AND_EXPR:
2135: return build (TRUTH_OR_EXPR, type,
2136: invert_truthvalue (TREE_OPERAND (arg, 0)),
2137: invert_truthvalue (TREE_OPERAND (arg, 1)));
2138:
2139: case TRUTH_OR_EXPR:
2140: return build (TRUTH_AND_EXPR, type,
2141: invert_truthvalue (TREE_OPERAND (arg, 0)),
2142: invert_truthvalue (TREE_OPERAND (arg, 1)));
2143:
2144: case TRUTH_XOR_EXPR:
2145: /* Here we can invert either operand. We invert the first operand
2146: unless the second operand is a TRUTH_NOT_EXPR in which case our
2147: result is the XOR of the first operand with the inside of the
2148: negation of the second operand. */
2149:
2150: if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
2151: return build (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2152: TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
2153: else
2154: return build (TRUTH_XOR_EXPR, type,
2155: invert_truthvalue (TREE_OPERAND (arg, 0)),
2156: TREE_OPERAND (arg, 1));
2157:
2158: case TRUTH_ANDIF_EXPR:
2159: return build (TRUTH_ORIF_EXPR, type,
2160: invert_truthvalue (TREE_OPERAND (arg, 0)),
2161: invert_truthvalue (TREE_OPERAND (arg, 1)));
2162:
2163: case TRUTH_ORIF_EXPR:
2164: return build (TRUTH_ANDIF_EXPR, type,
2165: invert_truthvalue (TREE_OPERAND (arg, 0)),
2166: invert_truthvalue (TREE_OPERAND (arg, 1)));
2167:
2168: case TRUTH_NOT_EXPR:
2169: return TREE_OPERAND (arg, 0);
2170:
2171: case COND_EXPR:
2172: return build (COND_EXPR, type, TREE_OPERAND (arg, 0),
2173: invert_truthvalue (TREE_OPERAND (arg, 1)),
2174: invert_truthvalue (TREE_OPERAND (arg, 2)));
2175:
2176: case COMPOUND_EXPR:
2177: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2178: invert_truthvalue (TREE_OPERAND (arg, 1)));
2179:
2180: case NON_LVALUE_EXPR:
2181: return invert_truthvalue (TREE_OPERAND (arg, 0));
2182:
2183: case NOP_EXPR:
2184: case CONVERT_EXPR:
2185: case FLOAT_EXPR:
2186: return build1 (TREE_CODE (arg), type,
2187: invert_truthvalue (TREE_OPERAND (arg, 0)));
2188:
2189: case BIT_AND_EXPR:
2190: if (!integer_onep (TREE_OPERAND (arg, 1)))
2191: break;
2192: return build (EQ_EXPR, type, arg, convert (type, integer_zero_node));
2193:
2194: case SAVE_EXPR:
2195: return build1 (TRUTH_NOT_EXPR, type, arg);
2196: }
2197: if (TREE_CODE (TREE_TYPE (arg)) != BOOLEAN_TYPE)
2198: abort ();
2199: return build1 (TRUTH_NOT_EXPR, type, arg);
2200: }
2201:
2202: /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
2203: operands are another bit-wise operation with a common input. If so,
2204: distribute the bit operations to save an operation and possibly two if
2205: constants are involved. For example, convert
2206: (A | B) & (A | C) into A | (B & C)
2207: Further simplification will occur if B and C are constants.
2208:
2209: If this optimization cannot be done, 0 will be returned. */
2210:
2211: static tree
2212: distribute_bit_expr (code, type, arg0, arg1)
2213: enum tree_code code;
2214: tree type;
2215: tree arg0, arg1;
2216: {
2217: tree common;
2218: tree left, right;
2219:
2220: if (TREE_CODE (arg0) != TREE_CODE (arg1)
2221: || TREE_CODE (arg0) == code
2222: || (TREE_CODE (arg0) != BIT_AND_EXPR
2223: && TREE_CODE (arg0) != BIT_IOR_EXPR))
2224: return 0;
2225:
2226: if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
2227: {
2228: common = TREE_OPERAND (arg0, 0);
2229: left = TREE_OPERAND (arg0, 1);
2230: right = TREE_OPERAND (arg1, 1);
2231: }
2232: else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
2233: {
2234: common = TREE_OPERAND (arg0, 0);
2235: left = TREE_OPERAND (arg0, 1);
2236: right = TREE_OPERAND (arg1, 0);
2237: }
2238: else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
2239: {
2240: common = TREE_OPERAND (arg0, 1);
2241: left = TREE_OPERAND (arg0, 0);
2242: right = TREE_OPERAND (arg1, 1);
2243: }
2244: else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
2245: {
2246: common = TREE_OPERAND (arg0, 1);
2247: left = TREE_OPERAND (arg0, 0);
2248: right = TREE_OPERAND (arg1, 0);
2249: }
2250: else
2251: return 0;
2252:
2253: return fold (build (TREE_CODE (arg0), type, common,
2254: fold (build (code, type, left, right))));
2255: }
2256:
2257: /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
2258: starting at BITPOS. The field is unsigned if UNSIGNEDP is non-zero. */
2259:
2260: static tree
2261: make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
2262: tree inner;
2263: tree type;
2264: int bitsize, bitpos;
2265: int unsignedp;
2266: {
2267: tree result = build (BIT_FIELD_REF, type, inner,
2268: size_int (bitsize), size_int (bitpos));
2269:
2270: TREE_UNSIGNED (result) = unsignedp;
2271:
2272: return result;
2273: }
2274:
2275: /* Optimize a bit-field compare.
2276:
2277: There are two cases: First is a compare against a constant and the
2278: second is a comparison of two items where the fields are at the same
2279: bit position relative to the start of a chunk (byte, halfword, word)
2280: large enough to contain it. In these cases we can avoid the shift
2281: implicit in bitfield extractions.
2282:
2283: For constants, we emit a compare of the shifted constant with the
2284: BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
2285: compared. For two fields at the same position, we do the ANDs with the
2286: similar mask and compare the result of the ANDs.
2287:
2288: CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
2289: COMPARE_TYPE is the type of the comparison, and LHS and RHS
2290: are the left and right operands of the comparison, respectively.
2291:
2292: If the optimization described above can be done, we return the resulting
2293: tree. Otherwise we return zero. */
2294:
2295: static tree
2296: optimize_bit_field_compare (code, compare_type, lhs, rhs)
2297: enum tree_code code;
2298: tree compare_type;
2299: tree lhs, rhs;
2300: {
2301: int lbitpos, lbitsize, rbitpos, rbitsize;
2302: int lnbitpos, lnbitsize, rnbitpos, rnbitsize;
2303: tree type = TREE_TYPE (lhs);
2304: tree signed_type, unsigned_type;
2305: int const_p = TREE_CODE (rhs) == INTEGER_CST;
2306: enum machine_mode lmode, rmode, lnmode, rnmode;
2307: int lunsignedp, runsignedp;
2308: int lvolatilep = 0, rvolatilep = 0;
2309: tree linner, rinner;
2310: tree mask;
2311: tree offset;
2312:
2313: /* Get all the information about the extractions being done. If the bit size
2314: if the same as the size of the underlying object, we aren't doing an
2315: extraction at all and so can do nothing. */
2316: linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
2317: &lunsignedp, &lvolatilep);
2318: if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
2319: || offset != 0)
2320: return 0;
2321:
2322: if (!const_p)
2323: {
2324: /* If this is not a constant, we can only do something if bit positions,
2325: sizes, and signedness are the same. */
2326: rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset,
2327: &rmode, &runsignedp, &rvolatilep);
2328:
2329: if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
2330: || lunsignedp != runsignedp || offset != 0)
2331: return 0;
2332: }
2333:
2334: /* See if we can find a mode to refer to this field. We should be able to,
2335: but fail if we can't. */
2336: lnmode = get_best_mode (lbitsize, lbitpos,
2337: TYPE_ALIGN (TREE_TYPE (linner)), word_mode,
2338: lvolatilep);
2339: if (lnmode == VOIDmode)
2340: return 0;
2341:
2342: /* Set signed and unsigned types of the precision of this mode for the
2343: shifts below. */
2344: signed_type = type_for_mode (lnmode, 0);
2345: unsigned_type = type_for_mode (lnmode, 1);
2346:
2347: if (! const_p)
2348: {
2349: rnmode = get_best_mode (rbitsize, rbitpos,
2350: TYPE_ALIGN (TREE_TYPE (rinner)), word_mode,
2351: rvolatilep);
2352: if (rnmode == VOIDmode)
2353: return 0;
2354: }
2355:
2356: /* Compute the bit position and size for the new reference and our offset
2357: within it. If the new reference is the same size as the original, we
2358: won't optimize anything, so return zero. */
2359: lnbitsize = GET_MODE_BITSIZE (lnmode);
2360: lnbitpos = lbitpos & ~ (lnbitsize - 1);
2361: lbitpos -= lnbitpos;
2362: if (lnbitsize == lbitsize)
2363: return 0;
2364:
2365: if (! const_p)
2366: {
2367: rnbitsize = GET_MODE_BITSIZE (rnmode);
2368: rnbitpos = rbitpos & ~ (rnbitsize - 1);
2369: rbitpos -= rnbitpos;
2370: if (rnbitsize == rbitsize)
2371: return 0;
2372: }
2373:
2374: #if BYTES_BIG_ENDIAN
2375: lbitpos = lnbitsize - lbitsize - lbitpos;
2376: #endif
2377:
2378: /* Make the mask to be used against the extracted field. */
2379: mask = build_int_2 (~0, ~0);
2380: TREE_TYPE (mask) = unsigned_type;
2381: force_fit_type (mask, 0);
2382: mask = convert (unsigned_type, mask);
2383: mask = const_binop (LSHIFT_EXPR, mask, size_int (lnbitsize - lbitsize), 0);
2384: mask = const_binop (RSHIFT_EXPR, mask,
2385: size_int (lnbitsize - lbitsize - lbitpos), 0);
2386:
2387: if (! const_p)
2388: /* If not comparing with constant, just rework the comparison
2389: and return. */
2390: return build (code, compare_type,
2391: build (BIT_AND_EXPR, unsigned_type,
2392: make_bit_field_ref (linner, unsigned_type,
2393: lnbitsize, lnbitpos, 1),
2394: mask),
2395: build (BIT_AND_EXPR, unsigned_type,
2396: make_bit_field_ref (rinner, unsigned_type,
2397: rnbitsize, rnbitpos, 1),
2398: mask));
2399:
2400: /* Otherwise, we are handling the constant case. See if the constant is too
2401: big for the field. Warn and return a tree of for 0 (false) if so. We do
2402: this not only for its own sake, but to avoid having to test for this
2403: error case below. If we didn't, we might generate wrong code.
2404:
2405: For unsigned fields, the constant shifted right by the field length should
2406: be all zero. For signed fields, the high-order bits should agree with
2407: the sign bit. */
2408:
2409: if (lunsignedp)
2410: {
2411: if (! integer_zerop (const_binop (RSHIFT_EXPR,
2412: convert (unsigned_type, rhs),
2413: size_int (lbitsize), 0)))
2414: {
2415: warning ("comparison is always %s due to width of bitfield",
2416: code == NE_EXPR ? "one" : "zero");
2417: return convert (compare_type,
2418: (code == NE_EXPR
2419: ? integer_one_node : integer_zero_node));
2420: }
2421: }
2422: else
2423: {
2424: tree tem = const_binop (RSHIFT_EXPR, convert (signed_type, rhs),
2425: size_int (lbitsize - 1), 0);
2426: if (! integer_zerop (tem) && ! integer_all_onesp (tem))
2427: {
2428: warning ("comparison is always %s due to width of bitfield",
2429: code == NE_EXPR ? "one" : "zero");
2430: return convert (compare_type,
2431: (code == NE_EXPR
2432: ? integer_one_node : integer_zero_node));
2433: }
2434: }
2435:
2436: /* Single-bit compares should always be against zero. */
2437: if (lbitsize == 1 && ! integer_zerop (rhs))
2438: {
2439: code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
2440: rhs = convert (type, integer_zero_node);
2441: }
2442:
2443: /* Make a new bitfield reference, shift the constant over the
2444: appropriate number of bits and mask it with the computed mask
2445: (in case this was a signed field). If we changed it, make a new one. */
2446: lhs = make_bit_field_ref (linner, unsigned_type, lnbitsize, lnbitpos, 1);
2447: if (lvolatilep)
2448: {
2449: TREE_SIDE_EFFECTS (lhs) = 1;
2450: TREE_THIS_VOLATILE (lhs) = 1;
2451: }
2452:
2453: rhs = fold (const_binop (BIT_AND_EXPR,
2454: const_binop (LSHIFT_EXPR,
2455: convert (unsigned_type, rhs),
2456: size_int (lbitpos), 0),
2457: mask, 0));
2458:
2459: return build (code, compare_type,
2460: build (BIT_AND_EXPR, unsigned_type, lhs, mask),
2461: rhs);
2462: }
2463:
2464: /* Subroutine for fold_truthop: decode a field reference.
2465:
2466: If EXP is a comparison reference, we return the innermost reference.
2467:
2468: *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
2469: set to the starting bit number.
2470:
2471: If the innermost field can be completely contained in a mode-sized
2472: unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
2473:
2474: *PVOLATILEP is set to 1 if the any expression encountered is volatile;
2475: otherwise it is not changed.
2476:
2477: *PUNSIGNEDP is set to the signedness of the field.
2478:
2479: *PMASK is set to the mask used. This is either contained in a
2480: BIT_AND_EXPR or derived from the width of the field.
2481:
2482: Return 0 if this is not a component reference or is one that we can't
2483: do anything with. */
2484:
2485: static tree
2486: decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp,
2487: pvolatilep, pmask)
2488: tree exp;
2489: int *pbitsize, *pbitpos;
2490: enum machine_mode *pmode;
2491: int *punsignedp, *pvolatilep;
2492: tree *pmask;
2493: {
2494: tree mask = 0;
2495: tree inner;
2496: tree offset;
2497:
2498: /* All the optimizations using this function assume integer fields.
2499: There are problems with FP fields since the type_for_size call
2500: below can fail for, e.g., XFmode. */
2501: if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
2502: return 0;
2503:
2504: STRIP_NOPS (exp);
2505:
2506: if (TREE_CODE (exp) == BIT_AND_EXPR)
2507: {
2508: mask = TREE_OPERAND (exp, 1);
2509: exp = TREE_OPERAND (exp, 0);
2510: STRIP_NOPS (exp); STRIP_NOPS (mask);
2511: if (TREE_CODE (mask) != INTEGER_CST)
2512: return 0;
2513: }
2514:
2515: if (TREE_CODE (exp) != COMPONENT_REF && TREE_CODE (exp) != ARRAY_REF
2516: && TREE_CODE (exp) != BIT_FIELD_REF)
2517: return 0;
2518:
2519: inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
2520: punsignedp, pvolatilep);
2521: if (inner == exp || *pbitsize < 0 || offset != 0)
2522: return 0;
2523:
2524: if (mask == 0)
2525: {
2526: tree unsigned_type = type_for_size (*pbitsize, 1);
2527: int precision = TYPE_PRECISION (unsigned_type);
2528:
2529: mask = build_int_2 (~0, ~0);
2530: TREE_TYPE (mask) = unsigned_type;
2531: force_fit_type (mask, 0);
2532: mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2533: mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2534: }
2535:
2536: *pmask = mask;
2537: return inner;
2538: }
2539:
2540: /* Return non-zero if MASK represents a mask of SIZE ones in the low-order
2541: bit positions. */
2542:
2543: static int
2544: all_ones_mask_p (mask, size)
2545: tree mask;
2546: int size;
2547: {
2548: tree type = TREE_TYPE (mask);
2549: int precision = TYPE_PRECISION (type);
2550: tree tmask;
2551:
2552: tmask = build_int_2 (~0, ~0);
2553: TREE_TYPE (tmask) = signed_type (type);
2554: force_fit_type (tmask, 0);
2555: return
2556: operand_equal_p (mask,
2557: const_binop (RSHIFT_EXPR,
2558: const_binop (LSHIFT_EXPR, tmask,
2559: size_int (precision - size), 0),
2560: size_int (precision - size), 0),
2561: 0);
2562: }
2563:
2564: /* Subroutine for fold_truthop: determine if an operand is simple enough
2565: to be evaluated unconditionally. */
2566:
2567: static int
2568: simple_operand_p (exp)
2569: tree exp;
2570: {
2571: /* Strip any conversions that don't change the machine mode. */
2572: while ((TREE_CODE (exp) == NOP_EXPR
2573: || TREE_CODE (exp) == CONVERT_EXPR)
2574: && (TYPE_MODE (TREE_TYPE (exp))
2575: == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
2576: exp = TREE_OPERAND (exp, 0);
2577:
2578: return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
2579: || (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
2580: && ! TREE_ADDRESSABLE (exp)
2581: && ! TREE_THIS_VOLATILE (exp)
2582: && ! DECL_NONLOCAL (exp)
2583: /* Don't regard global variables as simple. They may be
2584: allocated in ways unknown to the compiler (shared memory,
2585: #pragma weak, etc). */
2586: && ! TREE_PUBLIC (exp)
2587: && ! DECL_EXTERNAL (exp)
2588: /* Loading a static variable is unduly expensive, but global
2589: registers aren't expensive. */
2590: && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
2591: }
2592:
2593: /* Subroutine for fold_truthop: try to optimize a range test.
2594:
2595: For example, "i >= 2 && i =< 9" can be done as "(unsigned) (i - 2) <= 7".
2596:
2597: JCODE is the logical combination of the two terms. It is TRUTH_AND_EXPR
2598: (representing TRUTH_ANDIF_EXPR and TRUTH_AND_EXPR) or TRUTH_OR_EXPR
2599: (representing TRUTH_ORIF_EXPR and TRUTH_OR_EXPR). TYPE is the type of
2600: the result.
2601:
2602: VAR is the value being tested. LO_CODE and HI_CODE are the comparison
2603: operators comparing VAR to LO_CST and HI_CST. LO_CST is known to be no
2604: larger than HI_CST (they may be equal).
2605:
2606: We return the simplified tree or 0 if no optimization is possible. */
2607:
2608: static tree
2609: range_test (jcode, type, lo_code, hi_code, var, lo_cst, hi_cst)
2610: enum tree_code jcode, lo_code, hi_code;
2611: tree type, var, lo_cst, hi_cst;
2612: {
2613: tree utype;
2614: enum tree_code rcode;
2615:
2616: /* See if this is a range test and normalize the constant terms. */
2617:
2618: if (jcode == TRUTH_AND_EXPR)
2619: {
2620: switch (lo_code)
2621: {
2622: case NE_EXPR:
2623: /* See if we have VAR != CST && VAR != CST+1. */
2624: if (! (hi_code == NE_EXPR
2625: && TREE_INT_CST_LOW (hi_cst) - TREE_INT_CST_LOW (lo_cst) == 1
2626: && tree_int_cst_equal (integer_one_node,
2627: const_binop (MINUS_EXPR,
2628: hi_cst, lo_cst, 0))))
2629: return 0;
2630:
2631: rcode = GT_EXPR;
2632: break;
2633:
2634: case GT_EXPR:
2635: case GE_EXPR:
2636: if (hi_code == LT_EXPR)
2637: hi_cst = const_binop (MINUS_EXPR, hi_cst, integer_one_node, 0);
2638: else if (hi_code != LE_EXPR)
2639: return 0;
2640:
2641: if (lo_code == GT_EXPR)
2642: lo_cst = const_binop (PLUS_EXPR, lo_cst, integer_one_node, 0);
2643:
2644: /* We now have VAR >= LO_CST && VAR <= HI_CST. */
2645: rcode = LE_EXPR;
2646: break;
2647:
2648: default:
2649: return 0;
2650: }
2651: }
2652: else
2653: {
2654: switch (lo_code)
2655: {
2656: case EQ_EXPR:
2657: /* See if we have VAR == CST || VAR == CST+1. */
2658: if (! (hi_code == EQ_EXPR
2659: && TREE_INT_CST_LOW (hi_cst) - TREE_INT_CST_LOW (lo_cst) == 1
2660: && tree_int_cst_equal (integer_one_node,
2661: const_binop (MINUS_EXPR,
2662: hi_cst, lo_cst, 0))))
2663: return 0;
2664:
2665: rcode = LE_EXPR;
2666: break;
2667:
2668: case LE_EXPR:
2669: case LT_EXPR:
2670: if (hi_code == GE_EXPR)
2671: hi_cst = const_binop (MINUS_EXPR, hi_cst, integer_one_node, 0);
2672: else if (hi_code != GT_EXPR)
2673: return 0;
2674:
2675: if (lo_code == LE_EXPR)
2676: lo_cst = const_binop (PLUS_EXPR, lo_cst, integer_one_node, 0);
2677:
2678: /* We now have VAR < LO_CST || VAR > HI_CST. */
2679: rcode = GT_EXPR;
2680: break;
2681:
2682: default:
2683: return 0;
2684: }
2685: }
2686:
2687: /* When normalizing, it is possible to both increment the smaller constant
2688: and decrement the larger constant. See if they are still ordered. */
2689: if (tree_int_cst_lt (hi_cst, lo_cst))
2690: return 0;
2691:
2692: /* Fail if VAR isn't an integer. */
2693: utype = TREE_TYPE (var);
2694: if (! INTEGRAL_TYPE_P (utype))
2695: return 0;
2696:
2697: /* The range test is invalid if subtracting the two constants results
2698: in overflow. This can happen in traditional mode. */
2699: if (! int_fits_type_p (hi_cst, TREE_TYPE (var))
2700: || ! int_fits_type_p (lo_cst, TREE_TYPE (var)))
2701: return 0;
2702:
2703: if (! TREE_UNSIGNED (utype))
2704: {
2705: utype = unsigned_type (utype);
2706: var = convert (utype, var);
2707: lo_cst = convert (utype, lo_cst);
2708: hi_cst = convert (utype, hi_cst);
2709: }
2710:
2711: return fold (convert (type,
2712: build (rcode, utype,
2713: build (MINUS_EXPR, utype, var, lo_cst),
2714: const_binop (MINUS_EXPR, hi_cst, lo_cst, 0))));
2715: }
2716:
2717: /* Find ways of folding logical expressions of LHS and RHS:
2718: Try to merge two comparisons to the same innermost item.
2719: Look for range tests like "ch >= '0' && ch <= '9'".
2720: Look for combinations of simple terms on machines with expensive branches
2721: and evaluate the RHS unconditionally.
2722:
2723: For example, if we have p->a == 2 && p->b == 4 and we can make an
2724: object large enough to span both A and B, we can do this with a comparison
2725: against the object ANDed with the a mask.
2726:
2727: If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
2728: operations to do this with one comparison.
2729:
2730: We check for both normal comparisons and the BIT_AND_EXPRs made this by
2731: function and the one above.
2732:
2733: CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
2734: TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
2735:
2736: TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
2737: two operands.
2738:
2739: We return the simplified tree or 0 if no optimization is possible. */
2740:
2741: static tree
2742: fold_truthop (code, truth_type, lhs, rhs)
2743: enum tree_code code;
2744: tree truth_type, lhs, rhs;
2745: {
2746: /* If this is the "or" of two comparisons, we can do something if we
2747: the comparisons are NE_EXPR. If this is the "and", we can do something
2748: if the comparisons are EQ_EXPR. I.e.,
2749: (a->b == 2 && a->c == 4) can become (a->new == NEW).
2750:
2751: WANTED_CODE is this operation code. For single bit fields, we can
2752: convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
2753: comparison for one-bit fields. */
2754:
2755: enum tree_code wanted_code;
2756: enum tree_code lcode, rcode;
2757: tree ll_arg, lr_arg, rl_arg, rr_arg;
2758: tree ll_inner, lr_inner, rl_inner, rr_inner;
2759: int ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
2760: int rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
2761: int xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
2762: int lnbitsize, lnbitpos, rnbitsize, rnbitpos;
2763: int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
2764: enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
2765: enum machine_mode lnmode, rnmode;
2766: tree ll_mask, lr_mask, rl_mask, rr_mask;
2767: tree l_const, r_const;
2768: tree type, result;
2769: int first_bit, end_bit;
2770: int volatilep;
2771:
2772: /* Start by getting the comparison codes and seeing if this looks like
2773: a range test. Fail if anything is volatile. If one operand is a
2774: BIT_AND_EXPR with the constant one, treat it as if it were surrounded
2775: with a NE_EXPR. */
2776:
2777: if (TREE_SIDE_EFFECTS (lhs)
2778: || TREE_SIDE_EFFECTS (rhs))
2779: return 0;
2780:
2781: lcode = TREE_CODE (lhs);
2782: rcode = TREE_CODE (rhs);
2783:
2784: if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
2785: lcode = NE_EXPR, lhs = build (NE_EXPR, truth_type, lhs, integer_zero_node);
2786:
2787: if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
2788: rcode = NE_EXPR, rhs = build (NE_EXPR, truth_type, rhs, integer_zero_node);
2789:
2790: if (TREE_CODE_CLASS (lcode) != '<'
2791: || TREE_CODE_CLASS (rcode) != '<')
2792: return 0;
2793:
2794: code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
2795: ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
2796:
2797: ll_arg = TREE_OPERAND (lhs, 0);
2798: lr_arg = TREE_OPERAND (lhs, 1);
2799: rl_arg = TREE_OPERAND (rhs, 0);
2800: rr_arg = TREE_OPERAND (rhs, 1);
2801:
2802: if (TREE_CODE (lr_arg) == INTEGER_CST
2803: && TREE_CODE (rr_arg) == INTEGER_CST
2804: && operand_equal_p (ll_arg, rl_arg, 0))
2805: {
2806: if (tree_int_cst_lt (lr_arg, rr_arg))
2807: result = range_test (code, truth_type, lcode, rcode,
2808: ll_arg, lr_arg, rr_arg);
2809: else
2810: result = range_test (code, truth_type, rcode, lcode,
2811: ll_arg, rr_arg, lr_arg);
2812:
2813: /* If this isn't a range test, it also isn't a comparison that
2814: can be merged. However, it wins to evaluate the RHS unconditionally
2815: on machines with expensive branches. */
2816:
2817: if (result == 0 && BRANCH_COST >= 2)
2818: {
2819: if (TREE_CODE (ll_arg) != VAR_DECL
2820: && TREE_CODE (ll_arg) != PARM_DECL)
2821: {
2822: /* Avoid evaluating the variable part twice. */
2823: ll_arg = save_expr (ll_arg);
2824: lhs = build (lcode, TREE_TYPE (lhs), ll_arg, lr_arg);
2825: rhs = build (rcode, TREE_TYPE (rhs), ll_arg, rr_arg);
2826: }
2827: return build (code, truth_type, lhs, rhs);
2828: }
2829: return result;
2830: }
2831:
2832: /* If the RHS can be evaluated unconditionally and its operands are
2833: simple, it wins to evaluate the RHS unconditionally on machines
2834: with expensive branches. In this case, this isn't a comparison
2835: that can be merged. */
2836:
2837: /* @@ I'm not sure it wins on the m88110 to do this if the comparisons
2838: are with zero (tmw). */
2839:
2840: if (BRANCH_COST >= 2
2841: && INTEGRAL_TYPE_P (TREE_TYPE (rhs))
2842: && simple_operand_p (rl_arg)
2843: && simple_operand_p (rr_arg))
2844: return build (code, truth_type, lhs, rhs);
2845:
2846: /* See if the comparisons can be merged. Then get all the parameters for
2847: each side. */
2848:
2849: if ((lcode != EQ_EXPR && lcode != NE_EXPR)
2850: || (rcode != EQ_EXPR && rcode != NE_EXPR))
2851: return 0;
2852:
2853: volatilep = 0;
2854: ll_inner = decode_field_reference (ll_arg,
2855: &ll_bitsize, &ll_bitpos, &ll_mode,
2856: &ll_unsignedp, &volatilep, &ll_mask);
2857: lr_inner = decode_field_reference (lr_arg,
2858: &lr_bitsize, &lr_bitpos, &lr_mode,
2859: &lr_unsignedp, &volatilep, &lr_mask);
2860: rl_inner = decode_field_reference (rl_arg,
2861: &rl_bitsize, &rl_bitpos, &rl_mode,
2862: &rl_unsignedp, &volatilep, &rl_mask);
2863: rr_inner = decode_field_reference (rr_arg,
2864: &rr_bitsize, &rr_bitpos, &rr_mode,
2865: &rr_unsignedp, &volatilep, &rr_mask);
2866:
2867: /* It must be true that the inner operation on the lhs of each
2868: comparison must be the same if we are to be able to do anything.
2869: Then see if we have constants. If not, the same must be true for
2870: the rhs's. */
2871: if (volatilep || ll_inner == 0 || rl_inner == 0
2872: || ! operand_equal_p (ll_inner, rl_inner, 0))
2873: return 0;
2874:
2875: if (TREE_CODE (lr_arg) == INTEGER_CST
2876: && TREE_CODE (rr_arg) == INTEGER_CST)
2877: l_const = lr_arg, r_const = rr_arg;
2878: else if (lr_inner == 0 || rr_inner == 0
2879: || ! operand_equal_p (lr_inner, rr_inner, 0))
2880: return 0;
2881: else
2882: l_const = r_const = 0;
2883:
2884: /* If either comparison code is not correct for our logical operation,
2885: fail. However, we can convert a one-bit comparison against zero into
2886: the opposite comparison against that bit being set in the field. */
2887:
2888: wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
2889: if (lcode != wanted_code)
2890: {
2891: if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
2892: l_const = ll_mask;
2893: else
2894: return 0;
2895: }
2896:
2897: if (rcode != wanted_code)
2898: {
2899: if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
2900: r_const = rl_mask;
2901: else
2902: return 0;
2903: }
2904:
2905: /* See if we can find a mode that contains both fields being compared on
2906: the left. If we can't, fail. Otherwise, update all constants and masks
2907: to be relative to a field of that size. */
2908: first_bit = MIN (ll_bitpos, rl_bitpos);
2909: end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
2910: lnmode = get_best_mode (end_bit - first_bit, first_bit,
2911: TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
2912: volatilep);
2913: if (lnmode == VOIDmode)
2914: return 0;
2915:
2916: lnbitsize = GET_MODE_BITSIZE (lnmode);
2917: lnbitpos = first_bit & ~ (lnbitsize - 1);
2918: type = type_for_size (lnbitsize, 1);
2919: xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
2920:
2921: #if BYTES_BIG_ENDIAN
2922: xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
2923: xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
2924: #endif
2925:
2926: ll_mask = const_binop (LSHIFT_EXPR, convert (type, ll_mask),
2927: size_int (xll_bitpos), 0);
2928: rl_mask = const_binop (LSHIFT_EXPR, convert (type, rl_mask),
2929: size_int (xrl_bitpos), 0);
2930:
2931: /* Make sure the constants are interpreted as unsigned, so we
2932: don't have sign bits outside the range of their type. */
2933:
2934: if (l_const)
2935: {
2936: l_const = convert (unsigned_type (TREE_TYPE (l_const)), l_const);
2937: l_const = const_binop (LSHIFT_EXPR, convert (type, l_const),
2938: size_int (xll_bitpos), 0);
2939: }
2940: if (r_const)
2941: {
2942: r_const = convert (unsigned_type (TREE_TYPE (r_const)), r_const);
2943: r_const = const_binop (LSHIFT_EXPR, convert (type, r_const),
2944: size_int (xrl_bitpos), 0);
2945: }
2946:
2947: /* If the right sides are not constant, do the same for it. Also,
2948: disallow this optimization if a size or signedness mismatch occurs
2949: between the left and right sides. */
2950: if (l_const == 0)
2951: {
2952: if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
2953: || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
2954: /* Make sure the two fields on the right
2955: correspond to the left without being swapped. */
2956: || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
2957: return 0;
2958:
2959: first_bit = MIN (lr_bitpos, rr_bitpos);
2960: end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
2961: rnmode = get_best_mode (end_bit - first_bit, first_bit,
2962: TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
2963: volatilep);
2964: if (rnmode == VOIDmode)
2965: return 0;
2966:
2967: rnbitsize = GET_MODE_BITSIZE (rnmode);
2968: rnbitpos = first_bit & ~ (rnbitsize - 1);
2969: xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
2970:
2971: #if BYTES_BIG_ENDIAN
2972: xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
2973: xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
2974: #endif
2975:
2976: lr_mask = const_binop (LSHIFT_EXPR, convert (type, lr_mask),
2977: size_int (xlr_bitpos), 0);
2978: rr_mask = const_binop (LSHIFT_EXPR, convert (type, rr_mask),
2979: size_int (xrr_bitpos), 0);
2980:
2981: /* Make a mask that corresponds to both fields being compared.
2982: Do this for both items being compared. If the masks agree,
2983: we can do this by masking both and comparing the masked
2984: results. */
2985: ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
2986: lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
2987: if (operand_equal_p (ll_mask, lr_mask, 0) && lnbitsize == rnbitsize)
2988: {
2989: lhs = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
2990: ll_unsignedp || rl_unsignedp);
2991: rhs = make_bit_field_ref (lr_inner, type, rnbitsize, rnbitpos,
2992: lr_unsignedp || rr_unsignedp);
2993: if (! all_ones_mask_p (ll_mask, lnbitsize))
2994: {
2995: lhs = build (BIT_AND_EXPR, type, lhs, ll_mask);
2996: rhs = build (BIT_AND_EXPR, type, rhs, ll_mask);
2997: }
2998: return build (wanted_code, truth_type, lhs, rhs);
2999: }
3000:
3001: /* There is still another way we can do something: If both pairs of
3002: fields being compared are adjacent, we may be able to make a wider
3003: field containing them both. */
3004: if ((ll_bitsize + ll_bitpos == rl_bitpos
3005: && lr_bitsize + lr_bitpos == rr_bitpos)
3006: || (ll_bitpos == rl_bitpos + rl_bitsize
3007: && lr_bitpos == rr_bitpos + rr_bitsize))
3008: return build (wanted_code, truth_type,
3009: make_bit_field_ref (ll_inner, type,
3010: ll_bitsize + rl_bitsize,
3011: MIN (ll_bitpos, rl_bitpos),
3012: ll_unsignedp),
3013: make_bit_field_ref (lr_inner, type,
3014: lr_bitsize + rr_bitsize,
3015: MIN (lr_bitpos, rr_bitpos),
3016: lr_unsignedp));
3017:
3018: return 0;
3019: }
3020:
3021: /* Handle the case of comparisons with constants. If there is something in
3022: common between the masks, those bits of the constants must be the same.
3023: If not, the condition is always false. Test for this to avoid generating
3024: incorrect code below. */
3025: result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
3026: if (! integer_zerop (result)
3027: && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
3028: const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
3029: {
3030: if (wanted_code == NE_EXPR)
3031: {
3032: warning ("`or' of unmatched not-equal tests is always 1");
3033: return convert (truth_type, integer_one_node);
3034: }
3035: else
3036: {
3037: warning ("`and' of mutually exclusive equal-tests is always zero");
3038: return convert (truth_type, integer_zero_node);
3039: }
3040: }
3041:
3042: /* Construct the expression we will return. First get the component
3043: reference we will make. Unless the mask is all ones the width of
3044: that field, perform the mask operation. Then compare with the
3045: merged constant. */
3046: result = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
3047: ll_unsignedp || rl_unsignedp);
3048:
3049: ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3050: if (! all_ones_mask_p (ll_mask, lnbitsize))
3051: result = build (BIT_AND_EXPR, type, result, ll_mask);
3052:
3053: return build (wanted_code, truth_type, result,
3054: const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
3055: }
3056:
3057: /* Perform constant folding and related simplification of EXPR.
3058: The related simplifications include x*1 => x, x*0 => 0, etc.,
3059: and application of the associative law.
3060: NOP_EXPR conversions may be removed freely (as long as we
3061: are careful not to change the C type of the overall expression)
3062: We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
3063: but we can constant-fold them if they have constant operands. */
3064:
3065: tree
3066: fold (expr)
3067: tree expr;
3068: {
3069: register tree t = expr;
3070: tree t1 = NULL_TREE;
3071: tree tem;
3072: tree type = TREE_TYPE (expr);
3073: register tree arg0, arg1;
3074: register enum tree_code code = TREE_CODE (t);
3075: register int kind;
3076: int invert;
3077:
3078: /* WINS will be nonzero when the switch is done
3079: if all operands are constant. */
3080:
3081: int wins = 1;
3082:
3083: /* Don't try to process an RTL_EXPR since its operands aren't trees. */
3084: if (code == RTL_EXPR)
3085: return t;
3086:
3087: /* Return right away if already constant. */
3088: if (TREE_CONSTANT (t))
3089: {
3090: if (code == CONST_DECL)
3091: return DECL_INITIAL (t);
3092: return t;
3093: }
3094:
3095: kind = TREE_CODE_CLASS (code);
3096: if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
3097: {
3098: tree subop;
3099:
3100: /* Special case for conversion ops that can have fixed point args. */
3101: arg0 = TREE_OPERAND (t, 0);
3102:
3103: /* Don't use STRIP_NOPS, because signedness of argument type matters. */
3104: if (arg0 != 0)
3105: STRIP_TYPE_NOPS (arg0);
3106:
3107: if (arg0 != 0 && TREE_CODE (arg0) == COMPLEX_CST)
3108: subop = TREE_REALPART (arg0);
3109: else
3110: subop = arg0;
3111:
3112: if (subop != 0 && TREE_CODE (subop) != INTEGER_CST
3113: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3114: && TREE_CODE (subop) != REAL_CST
3115: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3116: )
3117: /* Note that TREE_CONSTANT isn't enough:
3118: static var addresses are constant but we can't
3119: do arithmetic on them. */
3120: wins = 0;
3121: }
3122: else if (kind == 'e' || kind == '<'
3123: || kind == '1' || kind == '2' || kind == 'r')
3124: {
3125: register int len = tree_code_length[(int) code];
3126: register int i;
3127: for (i = 0; i < len; i++)
3128: {
3129: tree op = TREE_OPERAND (t, i);
3130: tree subop;
3131:
3132: if (op == 0)
3133: continue; /* Valid for CALL_EXPR, at least. */
3134:
3135: if (kind == '<' || code == RSHIFT_EXPR)
3136: {
3137: /* Signedness matters here. Perhaps we can refine this
3138: later. */
3139: STRIP_TYPE_NOPS (op);
3140: }
3141: else
3142: {
3143: /* Strip any conversions that don't change the mode. */
3144: STRIP_NOPS (op);
3145: }
3146:
3147: if (TREE_CODE (op) == COMPLEX_CST)
3148: subop = TREE_REALPART (op);
3149: else
3150: subop = op;
3151:
3152: if (TREE_CODE (subop) != INTEGER_CST
3153: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3154: && TREE_CODE (subop) != REAL_CST
3155: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3156: )
3157: /* Note that TREE_CONSTANT isn't enough:
3158: static var addresses are constant but we can't
3159: do arithmetic on them. */
3160: wins = 0;
3161:
3162: if (i == 0)
3163: arg0 = op;
3164: else if (i == 1)
3165: arg1 = op;
3166: }
3167: }
3168:
3169: /* If this is a commutative operation, and ARG0 is a constant, move it
3170: to ARG1 to reduce the number of tests below. */
3171: if ((code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
3172: || code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
3173: || code == BIT_AND_EXPR)
3174: && (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST))
3175: {
3176: tem = arg0; arg0 = arg1; arg1 = tem;
3177:
3178: tem = TREE_OPERAND (t, 0); TREE_OPERAND (t, 0) = TREE_OPERAND (t, 1);
3179: TREE_OPERAND (t, 1) = tem;
3180: }
3181:
3182: /* Now WINS is set as described above,
3183: ARG0 is the first operand of EXPR,
3184: and ARG1 is the second operand (if it has more than one operand).
3185:
3186: First check for cases where an arithmetic operation is applied to a
3187: compound, conditional, or comparison operation. Push the arithmetic
3188: operation inside the compound or conditional to see if any folding
3189: can then be done. Convert comparison to conditional for this purpose.
3190: The also optimizes non-constant cases that used to be done in
3191: expand_expr.
3192:
3193: Before we do that, see if this is a BIT_AND_EXPR or a BIT_OR_EXPR,
3194: one of the operands is a comparison and the other is either a comparison
3195: or a BIT_AND_EXPR with the constant 1. In that case, the code below
3196: would make the expression more complex. Change it to a
3197: TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
3198: TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
3199:
3200: if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
3201: || code == EQ_EXPR || code == NE_EXPR)
3202: && ((TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
3203: && (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
3204: || (TREE_CODE (arg1) == BIT_AND_EXPR
3205: && integer_onep (TREE_OPERAND (arg1, 1)))))
3206: || (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
3207: && (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
3208: || (TREE_CODE (arg0) == BIT_AND_EXPR
3209: && integer_onep (TREE_OPERAND (arg0, 1)))))))
3210: {
3211: t = fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
3212: : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
3213: : TRUTH_XOR_EXPR,
3214: type, arg0, arg1));
3215:
3216: if (code == EQ_EXPR)
3217: t = invert_truthvalue (t);
3218:
3219: return t;
3220: }
3221:
3222: if (TREE_CODE_CLASS (code) == '1')
3223: {
3224: if (TREE_CODE (arg0) == COMPOUND_EXPR)
3225: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
3226: fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
3227: else if (TREE_CODE (arg0) == COND_EXPR)
3228: {
3229: t = fold (build (COND_EXPR, type, TREE_OPERAND (arg0, 0),
3230: fold (build1 (code, type, TREE_OPERAND (arg0, 1))),
3231: fold (build1 (code, type, TREE_OPERAND (arg0, 2)))));
3232:
3233: /* If this was a conversion, and all we did was to move into
3234: inside the COND_EXPR, bring it back out. Then return so we
3235: don't get into an infinite recursion loop taking the conversion
3236: out and then back in. */
3237:
3238: if ((code == NOP_EXPR || code == CONVERT_EXPR
3239: || code == NON_LVALUE_EXPR)
3240: && TREE_CODE (t) == COND_EXPR
3241: && TREE_CODE (TREE_OPERAND (t, 1)) == code
3242: && TREE_CODE (TREE_OPERAND (t, 2)) == code
3243: && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0))
3244: == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 2), 0))))
3245: t = build1 (code, type,
3246: build (COND_EXPR,
3247: TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0)),
3248: TREE_OPERAND (t, 0),
3249: TREE_OPERAND (TREE_OPERAND (t, 1), 0),
3250: TREE_OPERAND (TREE_OPERAND (t, 2), 0)));
3251: return t;
3252: }
3253: else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
3254: return fold (build (COND_EXPR, type, arg0,
3255: fold (build1 (code, type, integer_one_node)),
3256: fold (build1 (code, type, integer_zero_node))));
3257: }
3258: else if (TREE_CODE_CLASS (code) == '2'
3259: || TREE_CODE_CLASS (code) == '<')
3260: {
3261: if (TREE_CODE (arg1) == COMPOUND_EXPR)
3262: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
3263: fold (build (code, type,
3264: arg0, TREE_OPERAND (arg1, 1))));
3265: else if (TREE_CODE (arg1) == COND_EXPR
3266: || TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
3267: {
3268: tree test, true_value, false_value;
3269:
3270: if (TREE_CODE (arg1) == COND_EXPR)
3271: {
3272: test = TREE_OPERAND (arg1, 0);
3273: true_value = TREE_OPERAND (arg1, 1);
3274: false_value = TREE_OPERAND (arg1, 2);
3275: }
3276: else
3277: {
3278: test = arg1;
3279: true_value = integer_one_node;
3280: false_value = integer_zero_node;
3281: }
3282:
3283: /* If ARG0 is complex we want to make sure we only evaluate
3284: it once. Though this is only required if it is volatile, it
3285: might be more efficient even if it is not. However, if we
3286: succeed in folding one part to a constant, we do not need
3287: to make this SAVE_EXPR. Since we do this optimization
3288: primarily to see if we do end up with constant and this
3289: SAVE_EXPR interfers with later optimizations, suppressing
3290: it when we can is important. */
3291:
3292: if ((TREE_CODE (arg0) != VAR_DECL && TREE_CODE (arg0) != PARM_DECL)
3293: || TREE_SIDE_EFFECTS (arg0))
3294: {
3295: tree lhs = fold (build (code, type, arg0, true_value));
3296: tree rhs = fold (build (code, type, arg0, false_value));
3297:
3298: if (TREE_CONSTANT (lhs) || TREE_CONSTANT (rhs))
3299: return fold (build (COND_EXPR, type, test, lhs, rhs));
3300:
3301: arg0 = save_expr (arg0);
3302: }
3303:
3304: test = fold (build (COND_EXPR, type, test,
3305: fold (build (code, type, arg0, true_value)),
3306: fold (build (code, type, arg0, false_value))));
3307: if (TREE_CODE (arg0) == SAVE_EXPR)
3308: return build (COMPOUND_EXPR, type,
3309: convert (void_type_node, arg0), test);
3310: else
3311: return convert (type, test);
3312: }
3313:
3314: else if (TREE_CODE (arg0) == COMPOUND_EXPR)
3315: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
3316: fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
3317: else if (TREE_CODE (arg0) == COND_EXPR
3318: || TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
3319: {
3320: tree test, true_value, false_value;
3321:
3322: if (TREE_CODE (arg0) == COND_EXPR)
3323: {
3324: test = TREE_OPERAND (arg0, 0);
3325: true_value = TREE_OPERAND (arg0, 1);
3326: false_value = TREE_OPERAND (arg0, 2);
3327: }
3328: else
3329: {
3330: test = arg0;
3331: true_value = integer_one_node;
3332: false_value = integer_zero_node;
3333: }
3334:
3335: if ((TREE_CODE (arg1) != VAR_DECL && TREE_CODE (arg1) != PARM_DECL)
3336: || TREE_SIDE_EFFECTS (arg1))
3337: {
3338: tree lhs = fold (build (code, type, true_value, arg1));
3339: tree rhs = fold (build (code, type, false_value, arg1));
3340:
3341: if (TREE_CONSTANT (lhs) || TREE_CONSTANT (rhs))
3342: return fold (build (COND_EXPR, type, test, lhs, rhs));
3343:
3344: arg1 = save_expr (arg1);
3345: }
3346:
3347: test = fold (build (COND_EXPR, type, test,
3348: fold (build (code, type, true_value, arg1)),
3349: fold (build (code, type, false_value, arg1))));
3350: if (TREE_CODE (arg1) == SAVE_EXPR)
3351: return build (COMPOUND_EXPR, type,
3352: convert (void_type_node, arg1), test);
3353: else
3354: return convert (type, test);
3355: }
3356: }
3357: else if (TREE_CODE_CLASS (code) == '<'
3358: && TREE_CODE (arg0) == COMPOUND_EXPR)
3359: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
3360: fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
3361: else if (TREE_CODE_CLASS (code) == '<'
3362: && TREE_CODE (arg1) == COMPOUND_EXPR)
3363: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
3364: fold (build (code, type, arg0, TREE_OPERAND (arg1, 1))));
3365:
3366: switch (code)
3367: {
3368: case INTEGER_CST:
3369: case REAL_CST:
3370: case STRING_CST:
3371: case COMPLEX_CST:
3372: case CONSTRUCTOR:
3373: return t;
3374:
3375: case CONST_DECL:
3376: return fold (DECL_INITIAL (t));
3377:
3378: case NOP_EXPR:
3379: case FLOAT_EXPR:
3380: case CONVERT_EXPR:
3381: case FIX_TRUNC_EXPR:
3382: /* Other kinds of FIX are not handled properly by fold_convert. */
3383:
3384: /* In addition to the cases of two conversions in a row
3385: handled below, if we are converting something to its own
3386: type via an object of identical or wider precision, neither
3387: conversion is needed. */
3388: if ((TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
3389: || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
3390: && TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == TREE_TYPE (t)
3391: && ((INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
3392: && INTEGRAL_TYPE_P (TREE_TYPE (t)))
3393: || (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
3394: && FLOAT_TYPE_P (TREE_TYPE (t))))
3395: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3396: >= TYPE_PRECISION (TREE_TYPE (t))))
3397: return TREE_OPERAND (TREE_OPERAND (t, 0), 0);
3398:
3399: /* Two conversions in a row are not needed unless:
3400: - the intermediate type is narrower than both initial and final, or
3401: - the intermediate type and innermost type differ in signedness,
3402: and the outermost type is wider than the intermediate, or
3403: - the initial type is a pointer type and the precisions of the
3404: intermediate and final types differ, or
3405: - the final type is a pointer type and the precisions of the
3406: initial and intermediate types differ. */
3407: if ((TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
3408: || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
3409: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3410: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
3411: ||
3412: TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3413: > TYPE_PRECISION (TREE_TYPE (t)))
3414: && ! ((TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
3415: == INTEGER_TYPE)
3416: && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
3417: == INTEGER_TYPE)
3418: && (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
3419: != TREE_UNSIGNED (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
3420: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3421: < TYPE_PRECISION (TREE_TYPE (t))))
3422: && ((TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
3423: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3424: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))))
3425: ==
3426: (TREE_UNSIGNED (TREE_TYPE (t))
3427: && (TYPE_PRECISION (TREE_TYPE (t))
3428: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0))))))
3429: && ! ((TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
3430: == POINTER_TYPE)
3431: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
3432: != TYPE_PRECISION (TREE_TYPE (t))))
3433: && ! (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
3434: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
3435: != TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0))))))
3436: return convert (TREE_TYPE (t), TREE_OPERAND (TREE_OPERAND (t, 0), 0));
3437:
3438: if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
3439: && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1))
3440: /* Detect assigning a bitfield. */
3441: && !(TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == COMPONENT_REF
3442: && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 1))))
3443: {
3444: /* Don't leave an assignment inside a conversion
3445: unless assigning a bitfield. */
3446: tree prev = TREE_OPERAND (t, 0);
3447: TREE_OPERAND (t, 0) = TREE_OPERAND (prev, 1);
3448: /* First do the assignment, then return converted constant. */
3449: t = build (COMPOUND_EXPR, TREE_TYPE (t), prev, fold (t));
3450: TREE_USED (t) = 1;
3451: return t;
3452: }
3453: if (!wins)
3454: {
3455: TREE_CONSTANT (t) = TREE_CONSTANT (arg0);
3456: return t;
3457: }
3458: return fold_convert (t, arg0);
3459:
3460: #if 0 /* This loses on &"foo"[0]. */
3461: case ARRAY_REF:
3462: {
3463: int i;
3464:
3465: /* Fold an expression like: "foo"[2] */
3466: if (TREE_CODE (arg0) == STRING_CST
3467: && TREE_CODE (arg1) == INTEGER_CST
3468: && !TREE_INT_CST_HIGH (arg1)
3469: && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0))
3470: {
3471: t = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0);
3472: TREE_TYPE (t) = TREE_TYPE (TREE_TYPE (arg0));
3473: force_fit_type (t, 0);
3474: }
3475: }
3476: return t;
3477: #endif /* 0 */
3478:
3479: case RANGE_EXPR:
3480: TREE_CONSTANT (t) = wins;
3481: return t;
3482:
3483: case NEGATE_EXPR:
3484: if (wins)
3485: {
3486: if (TREE_CODE (arg0) == INTEGER_CST)
3487: {
3488: HOST_WIDE_INT low, high;
3489: int overflow = neg_double (TREE_INT_CST_LOW (arg0),
3490: TREE_INT_CST_HIGH (arg0),
3491: &low, &high);
3492: t = build_int_2 (low, high);
3493: TREE_TYPE (t) = type;
3494: TREE_OVERFLOW (t)
3495: = (TREE_OVERFLOW (arg0)
3496: | force_fit_type (t, overflow));
3497: TREE_CONSTANT_OVERFLOW (t)
3498: = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
3499: }
3500: else if (TREE_CODE (arg0) == REAL_CST)
3501: t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
3502: TREE_TYPE (t) = type;
3503: }
3504: else if (TREE_CODE (arg0) == NEGATE_EXPR)
3505: return TREE_OPERAND (arg0, 0);
3506:
3507: /* Convert - (a - b) to (b - a) for non-floating-point. */
3508: else if (TREE_CODE (arg0) == MINUS_EXPR && ! FLOAT_TYPE_P (type))
3509: return build (MINUS_EXPR, type, TREE_OPERAND (arg0, 1),
3510: TREE_OPERAND (arg0, 0));
3511:
3512: return t;
3513:
3514: case ABS_EXPR:
3515: if (wins)
3516: {
3517: if (TREE_CODE (arg0) == INTEGER_CST)
3518: {
3519: if (! TREE_UNSIGNED (type)
3520: && TREE_INT_CST_HIGH (arg0) < 0)
3521: {
3522: HOST_WIDE_INT low, high;
3523: int overflow = neg_double (TREE_INT_CST_LOW (arg0),
3524: TREE_INT_CST_HIGH (arg0),
3525: &low, &high);
3526: t = build_int_2 (low, high);
3527: TREE_TYPE (t) = type;
3528: TREE_OVERFLOW (t)
3529: = (TREE_OVERFLOW (arg0)
3530: | force_fit_type (t, overflow));
3531: TREE_CONSTANT_OVERFLOW (t)
3532: = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
3533: }
3534: }
3535: else if (TREE_CODE (arg0) == REAL_CST)
3536: {
3537: if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
3538: t = build_real (type,
3539: REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
3540: }
3541: TREE_TYPE (t) = type;
3542: }
3543: else if (TREE_CODE (arg0) == ABS_EXPR || TREE_CODE (arg0) == NEGATE_EXPR)
3544: return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
3545: return t;
3546:
3547: case CONJ_EXPR:
3548: if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
3549: return arg0;
3550: else if (TREE_CODE (arg0) == COMPLEX_EXPR)
3551: return build (COMPLEX_EXPR, TREE_TYPE (arg0),
3552: TREE_OPERAND (arg0, 0),
3553: fold (build1 (NEGATE_EXPR,
3554: TREE_TYPE (TREE_TYPE (arg0)),
3555: TREE_OPERAND (arg0, 1))));
3556: else if (TREE_CODE (arg0) == COMPLEX_CST)
3557: return build_complex (TREE_OPERAND (arg0, 0),
3558: fold (build1 (NEGATE_EXPR,
3559: TREE_TYPE (TREE_TYPE (arg0)),
3560: TREE_OPERAND (arg0, 1))));
3561: else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
3562: return fold (build (TREE_CODE (arg0), type,
3563: fold (build1 (CONJ_EXPR, type,
3564: TREE_OPERAND (arg0, 0))),
3565: fold (build1 (CONJ_EXPR,
3566: type, TREE_OPERAND (arg0, 1)))));
3567: else if (TREE_CODE (arg0) == CONJ_EXPR)
3568: return TREE_OPERAND (arg0, 0);
3569: return t;
3570:
3571: case BIT_NOT_EXPR:
3572: if (wins)
3573: {
3574: if (TREE_CODE (arg0) == INTEGER_CST)
3575: t = build_int_2 (~ TREE_INT_CST_LOW (arg0),
3576: ~ TREE_INT_CST_HIGH (arg0));
3577: TREE_TYPE (t) = type;
3578: force_fit_type (t, 0);
3579: TREE_OVERFLOW (t) = TREE_OVERFLOW (arg0);
3580: TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (arg0);
3581: }
3582: else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
3583: return TREE_OPERAND (arg0, 0);
3584: return t;
3585:
3586: case PLUS_EXPR:
3587: /* A + (-B) -> A - B */
3588: if (TREE_CODE (arg1) == NEGATE_EXPR)
3589: return fold (build (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
3590: else if (! FLOAT_TYPE_P (type))
3591: {
3592: if (integer_zerop (arg1))
3593: return non_lvalue (convert (type, arg0));
3594:
3595: /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
3596: with a constant, and the two constants have no bits in common,
3597: we should treat this as a BIT_IOR_EXPR since this may produce more
3598: simplifications. */
3599: if (TREE_CODE (arg0) == BIT_AND_EXPR
3600: && TREE_CODE (arg1) == BIT_AND_EXPR
3601: && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
3602: && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
3603: && integer_zerop (const_binop (BIT_AND_EXPR,
3604: TREE_OPERAND (arg0, 1),
3605: TREE_OPERAND (arg1, 1), 0)))
3606: {
3607: code = BIT_IOR_EXPR;
3608: goto bit_ior;
3609: }
3610:
3611: /* (A * C) + (B * C) -> (A+B) * C. Since we are most concerned
3612: about the case where C is a constant, just try one of the
3613: four possibilities. */
3614:
3615: if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR
3616: && operand_equal_p (TREE_OPERAND (arg0, 1),
3617: TREE_OPERAND (arg1, 1), 0))
3618: return fold (build (MULT_EXPR, type,
3619: fold (build (PLUS_EXPR, type,
3620: TREE_OPERAND (arg0, 0),
3621: TREE_OPERAND (arg1, 0))),
3622: TREE_OPERAND (arg0, 1)));
3623: }
3624: /* In IEEE floating point, x+0 may not equal x. */
3625: else if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3626: && real_zerop (arg1))
3627: return non_lvalue (convert (type, arg0));
3628: associate:
3629: /* In most languages, can't associate operations on floats
3630: through parentheses. Rather than remember where the parentheses
3631: were, we don't associate floats at all. It shouldn't matter much. */
3632: if (FLOAT_TYPE_P (type))
3633: goto binary;
3634: /* The varsign == -1 cases happen only for addition and subtraction.
3635: It says that the arg that was split was really CON minus VAR.
3636: The rest of the code applies to all associative operations. */
3637: if (!wins)
3638: {
3639: tree var, con;
3640: int varsign;
3641:
3642: if (split_tree (arg0, code, &var, &con, &varsign))
3643: {
3644: if (varsign == -1)
3645: {
3646: /* EXPR is (CON-VAR) +- ARG1. */
3647: /* If it is + and VAR==ARG1, return just CONST. */
3648: if (code == PLUS_EXPR && operand_equal_p (var, arg1, 0))
3649: return convert (TREE_TYPE (t), con);
3650:
3651: /* If ARG0 is a constant, don't change things around;
3652: instead keep all the constant computations together. */
3653:
3654: if (TREE_CONSTANT (arg0))
3655: return t;
3656:
3657: /* Otherwise return (CON +- ARG1) - VAR. */
3658: TREE_SET_CODE (t, MINUS_EXPR);
3659: TREE_OPERAND (t, 1) = var;
3660: TREE_OPERAND (t, 0)
3661: = fold (build (code, TREE_TYPE (t), con, arg1));
3662: }
3663: else
3664: {
3665: /* EXPR is (VAR+CON) +- ARG1. */
3666: /* If it is - and VAR==ARG1, return just CONST. */
3667: if (code == MINUS_EXPR && operand_equal_p (var, arg1, 0))
3668: return convert (TREE_TYPE (t), con);
3669:
3670: /* If ARG0 is a constant, don't change things around;
3671: instead keep all the constant computations together. */
3672:
3673: if (TREE_CONSTANT (arg0))
3674: return t;
3675:
3676: /* Otherwise return VAR +- (ARG1 +- CON). */
3677: TREE_OPERAND (t, 1) = tem
3678: = fold (build (code, TREE_TYPE (t), arg1, con));
3679: TREE_OPERAND (t, 0) = var;
3680: if (integer_zerop (tem)
3681: && (code == PLUS_EXPR || code == MINUS_EXPR))
3682: return convert (type, var);
3683: /* If we have x +/- (c - d) [c an explicit integer]
3684: change it to x -/+ (d - c) since if d is relocatable
3685: then the latter can be a single immediate insn
3686: and the former cannot. */
3687: if (TREE_CODE (tem) == MINUS_EXPR
3688: && TREE_CODE (TREE_OPERAND (tem, 0)) == INTEGER_CST)
3689: {
3690: tree tem1 = TREE_OPERAND (tem, 1);
3691: TREE_OPERAND (tem, 1) = TREE_OPERAND (tem, 0);
3692: TREE_OPERAND (tem, 0) = tem1;
3693: TREE_SET_CODE (t,
3694: (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
3695: }
3696: }
3697: return t;
3698: }
3699:
3700: if (split_tree (arg1, code, &var, &con, &varsign))
3701: {
3702: if (TREE_CONSTANT (arg1))
3703: return t;
3704:
3705: if (varsign == -1)
3706: TREE_SET_CODE (t,
3707: (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
3708:
3709: /* EXPR is ARG0 +- (CON +- VAR). */
3710: if (TREE_CODE (t) == MINUS_EXPR
3711: && operand_equal_p (var, arg0, 0))
3712: {
3713: /* If VAR and ARG0 cancel, return just CON or -CON. */
3714: if (code == PLUS_EXPR)
3715: return convert (TREE_TYPE (t), con);
3716: return fold (build1 (NEGATE_EXPR, TREE_TYPE (t),
3717: convert (TREE_TYPE (t), con)));
3718: }
3719:
3720: TREE_OPERAND (t, 0)
3721: = fold (build (code, TREE_TYPE (t), arg0, con));
3722: TREE_OPERAND (t, 1) = var;
3723: if (integer_zerop (TREE_OPERAND (t, 0))
3724: && TREE_CODE (t) == PLUS_EXPR)
3725: return convert (TREE_TYPE (t), var);
3726: return t;
3727: }
3728: }
3729: binary:
3730: #if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC)
3731: if (TREE_CODE (arg1) == REAL_CST)
3732: return t;
3733: #endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */
3734: if (wins)
3735: t1 = const_binop (code, arg0, arg1, 0);
3736: if (t1 != NULL_TREE)
3737: {
3738: /* The return value should always have
3739: the same type as the original expression. */
3740: TREE_TYPE (t1) = TREE_TYPE (t);
3741: return t1;
3742: }
3743: return t;
3744:
3745: case MINUS_EXPR:
3746: if (! FLOAT_TYPE_P (type))
3747: {
3748: if (! wins && integer_zerop (arg0))
3749: return build1 (NEGATE_EXPR, type, arg1);
3750: if (integer_zerop (arg1))
3751: return non_lvalue (convert (type, arg0));
3752:
3753: /* (A * C) - (B * C) -> (A-B) * C. Since we are most concerned
3754: about the case where C is a constant, just try one of the
3755: four possibilities. */
3756:
3757: if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR
3758: && operand_equal_p (TREE_OPERAND (arg0, 1),
3759: TREE_OPERAND (arg1, 1), 0))
3760: return fold (build (MULT_EXPR, type,
3761: fold (build (MINUS_EXPR, type,
3762: TREE_OPERAND (arg0, 0),
3763: TREE_OPERAND (arg1, 0))),
3764: TREE_OPERAND (arg0, 1)));
3765: }
3766: /* Convert A - (-B) to A + B. */
3767: else if (TREE_CODE (arg1) == NEGATE_EXPR)
3768: return fold (build (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
3769: else if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
3770: {
3771: /* Except with IEEE floating point, 0-x equals -x. */
3772: if (! wins && real_zerop (arg0))
3773: return build1 (NEGATE_EXPR, type, arg1);
3774: /* Except with IEEE floating point, x-0 equals x. */
3775: if (real_zerop (arg1))
3776: return non_lvalue (convert (type, arg0));
3777:
3778: /* Fold &x - &x. This can happen from &x.foo - &x.
3779: This is unsafe for certain floats even in non-IEEE formats.
3780: In IEEE, it is unsafe because it does wrong for NaNs.
3781: Also note that operand_equal_p is always false if an operand
3782: is volatile. */
3783:
3784: if (operand_equal_p (arg0, arg1, FLOAT_TYPE_P (type)))
3785: return convert (type, integer_zero_node);
3786: }
3787: goto associate;
3788:
3789: case MULT_EXPR:
3790: if (! FLOAT_TYPE_P (type))
3791: {
3792: if (integer_zerop (arg1))
3793: return omit_one_operand (type, arg1, arg0);
3794: if (integer_onep (arg1))
3795: return non_lvalue (convert (type, arg0));
3796:
3797: /* (a * (1 << b)) is (a << b) */
3798: if (TREE_CODE (arg1) == LSHIFT_EXPR
3799: && integer_onep (TREE_OPERAND (arg1, 0)))
3800: return fold (build (LSHIFT_EXPR, type, arg0,
3801: TREE_OPERAND (arg1, 1)));
3802: if (TREE_CODE (arg0) == LSHIFT_EXPR
3803: && integer_onep (TREE_OPERAND (arg0, 0)))
3804: return fold (build (LSHIFT_EXPR, type, arg1,
3805: TREE_OPERAND (arg0, 1)));
3806: }
3807: else
3808: {
3809: /* x*0 is 0, except for IEEE floating point. */
3810: if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3811: && real_zerop (arg1))
3812: return omit_one_operand (type, arg1, arg0);
3813: /* In IEEE floating point, x*1 is not equivalent to x for snans.
3814: However, ANSI says we can drop signals,
3815: so we can do this anyway. */
3816: if (real_onep (arg1))
3817: return non_lvalue (convert (type, arg0));
3818: /* x*2 is x+x */
3819: if (! wins && real_twop (arg1))
3820: {
3821: tree arg = save_expr (arg0);
3822: return build (PLUS_EXPR, type, arg, arg);
3823: }
3824: }
3825: goto associate;
3826:
3827: case BIT_IOR_EXPR:
3828: bit_ior:
3829: if (integer_all_onesp (arg1))
3830: return omit_one_operand (type, arg1, arg0);
3831: if (integer_zerop (arg1))
3832: return non_lvalue (convert (type, arg0));
3833: t1 = distribute_bit_expr (code, type, arg0, arg1);
3834: if (t1 != NULL_TREE)
3835: return t1;
3836:
3837: /* (a << C1) | (a >> C2) if A is unsigned and C1+C2 is the size of A
3838: is a rotate of A by C1 bits. */
3839:
3840: if ((TREE_CODE (arg0) == RSHIFT_EXPR
3841: || TREE_CODE (arg0) == LSHIFT_EXPR)
3842: && (TREE_CODE (arg1) == RSHIFT_EXPR
3843: || TREE_CODE (arg1) == LSHIFT_EXPR)
3844: && TREE_CODE (arg0) != TREE_CODE (arg1)
3845: && operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1,0), 0)
3846: && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0)))
3847: && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
3848: && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
3849: && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
3850: && TREE_INT_CST_HIGH (TREE_OPERAND (arg1, 1)) == 0
3851: && ((TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
3852: + TREE_INT_CST_LOW (TREE_OPERAND (arg1, 1)))
3853: == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
3854: return build (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
3855: TREE_CODE (arg0) == LSHIFT_EXPR
3856: ? TREE_OPERAND (arg0, 1) : TREE_OPERAND (arg1, 1));
3857:
3858: goto associate;
3859:
3860: case BIT_XOR_EXPR:
3861: if (integer_zerop (arg1))
3862: return non_lvalue (convert (type, arg0));
3863: if (integer_all_onesp (arg1))
3864: return fold (build1 (BIT_NOT_EXPR, type, arg0));
3865: goto associate;
3866:
3867: case BIT_AND_EXPR:
3868: bit_and:
3869: if (integer_all_onesp (arg1))
3870: return non_lvalue (convert (type, arg0));
3871: if (integer_zerop (arg1))
3872: return omit_one_operand (type, arg1, arg0);
3873: t1 = distribute_bit_expr (code, type, arg0, arg1);
3874: if (t1 != NULL_TREE)
3875: return t1;
3876: /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */
3877: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR
3878: && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0))))
3879: {
3880: int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)));
3881: if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
3882: && (~TREE_INT_CST_LOW (arg0)
3883: & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
3884: return build1 (NOP_EXPR, type, TREE_OPERAND (arg1, 0));
3885: }
3886: if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
3887: && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
3888: {
3889: int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
3890: if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
3891: && (~TREE_INT_CST_LOW (arg1)
3892: & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
3893: return build1 (NOP_EXPR, type, TREE_OPERAND (arg0, 0));
3894: }
3895: goto associate;
3896:
3897: case BIT_ANDTC_EXPR:
3898: if (integer_all_onesp (arg0))
3899: return non_lvalue (convert (type, arg1));
3900: if (integer_zerop (arg0))
3901: return omit_one_operand (type, arg0, arg1);
3902: if (TREE_CODE (arg1) == INTEGER_CST)
3903: {
3904: arg1 = fold (build1 (BIT_NOT_EXPR, type, arg1));
3905: code = BIT_AND_EXPR;
3906: goto bit_and;
3907: }
3908: goto binary;
3909:
3910: case TRUNC_DIV_EXPR:
3911: case ROUND_DIV_EXPR:
3912: case FLOOR_DIV_EXPR:
3913: case CEIL_DIV_EXPR:
3914: case EXACT_DIV_EXPR:
3915: case RDIV_EXPR:
3916: if (integer_onep (arg1))
3917: return non_lvalue (convert (type, arg0));
3918: if (integer_zerop (arg1))
3919: return t;
3920:
3921: /* Look for ((a * C1) / C3) or (((a * C1) + C2) / C3),
3922: where C1 % C3 == 0 or C3 % C1 == 0. We can simplify these
3923: expressions, which often appear in the offsets or sizes of
3924: objects with a varying size. Only deal with positive divisors
3925: and multiplicands. If C2 is negative, we must have C2 % C3 == 0.
3926:
3927: Look for NOPs and SAVE_EXPRs inside. */
3928:
3929: if (TREE_CODE (arg1) == INTEGER_CST
3930: && tree_int_cst_lt (integer_zero_node, arg1))
3931: {
3932: int have_save_expr = 0;
3933: tree c2 = integer_zero_node;
3934: tree xarg0 = arg0;
3935:
3936: if (TREE_CODE (xarg0) == SAVE_EXPR)
3937: have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
3938:
3939: STRIP_NOPS (xarg0);
3940:
3941: if (TREE_CODE (xarg0) == PLUS_EXPR
3942: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
3943: c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
3944: else if (TREE_CODE (xarg0) == MINUS_EXPR
3945: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
3946: /* If we are doing this computation unsigned, the negate
3947: is incorrect. */
3948: && ! TREE_UNSIGNED (type))
3949: {
3950: c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
3951: xarg0 = TREE_OPERAND (xarg0, 0);
3952: }
3953:
3954: if (TREE_CODE (xarg0) == SAVE_EXPR)
3955: have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
3956:
3957: STRIP_NOPS (xarg0);
3958:
3959: if (TREE_CODE (xarg0) == MULT_EXPR
3960: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
3961: && tree_int_cst_lt (integer_zero_node, TREE_OPERAND (xarg0, 1))
3962: && (integer_zerop (const_binop (TRUNC_MOD_EXPR,
3963: TREE_OPERAND (xarg0, 1), arg1, 1))
3964: || integer_zerop (const_binop (TRUNC_MOD_EXPR, arg1,
3965: TREE_OPERAND (xarg0, 1), 1)))
3966: && (tree_int_cst_lt (integer_zero_node, c2)
3967: || integer_zerop (const_binop (TRUNC_MOD_EXPR, c2,
3968: arg1, 1))))
3969: {
3970: tree outer_div = integer_one_node;
3971: tree c1 = TREE_OPERAND (xarg0, 1);
3972: tree c3 = arg1;
3973:
3974: /* If C3 > C1, set them equal and do a divide by
3975: C3/C1 at the end of the operation. */
3976: if (tree_int_cst_lt (c1, c3))
3977: outer_div = const_binop (code, c3, c1, 0), c3 = c1;
3978:
3979: /* The result is A * (C1/C3) + (C2/C3). */
3980: t = fold (build (PLUS_EXPR, type,
3981: fold (build (MULT_EXPR, type,
3982: TREE_OPERAND (xarg0, 0),
3983: const_binop (code, c1, c3, 1))),
3984: const_binop (code, c2, c3, 1)));
3985:
3986: if (! integer_onep (outer_div))
3987: t = fold (build (code, type, t, outer_div));
3988:
3989: if (have_save_expr)
3990: t = save_expr (t);
3991:
3992: return t;
3993: }
3994: }
3995:
3996: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3997: #ifndef REAL_INFINITY
3998: if (TREE_CODE (arg1) == REAL_CST
3999: && real_zerop (arg1))
4000: return t;
4001: #endif
4002: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
4003:
4004: goto binary;
4005:
4006: case CEIL_MOD_EXPR:
4007: case FLOOR_MOD_EXPR:
4008: case ROUND_MOD_EXPR:
4009: case TRUNC_MOD_EXPR:
4010: if (integer_onep (arg1))
4011: return omit_one_operand (type, integer_zero_node, arg0);
4012: if (integer_zerop (arg1))
4013: return t;
4014:
4015: /* Look for ((a * C1) % C3) or (((a * C1) + C2) % C3),
4016: where C1 % C3 == 0. Handle similarly to the division case,
4017: but don't bother with SAVE_EXPRs. */
4018:
4019: if (TREE_CODE (arg1) == INTEGER_CST
4020: && ! integer_zerop (arg1))
4021: {
4022: tree c2 = integer_zero_node;
4023: tree xarg0 = arg0;
4024:
4025: if (TREE_CODE (xarg0) == PLUS_EXPR
4026: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
4027: c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
4028: else if (TREE_CODE (xarg0) == MINUS_EXPR
4029: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4030: && ! TREE_UNSIGNED (type))
4031: {
4032: c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
4033: xarg0 = TREE_OPERAND (xarg0, 0);
4034: }
4035:
4036: STRIP_NOPS (xarg0);
4037:
4038: if (TREE_CODE (xarg0) == MULT_EXPR
4039: && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4040: && integer_zerop (const_binop (TRUNC_MOD_EXPR,
4041: TREE_OPERAND (xarg0, 1),
4042: arg1, 1))
4043: && tree_int_cst_lt (integer_zero_node, c2))
4044: /* The result is (C2%C3). */
4045: return omit_one_operand (type, const_binop (code, c2, arg1, 1),
4046: TREE_OPERAND (xarg0, 0));
4047: }
4048:
4049: goto binary;
4050:
4051: case LSHIFT_EXPR:
4052: case RSHIFT_EXPR:
4053: case LROTATE_EXPR:
4054: case RROTATE_EXPR:
4055: if (integer_zerop (arg1))
4056: return non_lvalue (convert (type, arg0));
4057: /* Since negative shift count is not well-defined,
4058: don't try to compute it in the compiler. */
4059: if (tree_int_cst_lt (arg1, integer_zero_node))
4060: return t;
4061: goto binary;
4062:
4063: case MIN_EXPR:
4064: if (operand_equal_p (arg0, arg1, 0))
4065: return arg0;
4066: if (INTEGRAL_TYPE_P (type)
4067: && operand_equal_p (arg1, TYPE_MIN_VALUE (type), 1))
4068: return omit_one_operand (type, arg1, arg0);
4069: goto associate;
4070:
4071: case MAX_EXPR:
4072: if (operand_equal_p (arg0, arg1, 0))
4073: return arg0;
4074: if (INTEGRAL_TYPE_P (type)
4075: && operand_equal_p (arg1, TYPE_MAX_VALUE (type), 1))
4076: return omit_one_operand (type, arg1, arg0);
4077: goto associate;
4078:
4079: case TRUTH_NOT_EXPR:
4080: /* Note that the operand of this must be an int
4081: and its values must be 0 or 1.
4082: ("true" is a fixed value perhaps depending on the language,
4083: but we don't handle values other than 1 correctly yet.) */
4084: return invert_truthvalue (arg0);
4085:
4086: case TRUTH_ANDIF_EXPR:
4087: /* Note that the operands of this must be ints
4088: and their values must be 0 or 1.
4089: ("true" is a fixed value perhaps depending on the language.) */
4090: /* If first arg is constant zero, return it. */
4091: if (integer_zerop (arg0))
4092: return arg0;
4093: case TRUTH_AND_EXPR:
4094: /* If either arg is constant true, drop it. */
4095: if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
4096: return non_lvalue (arg1);
4097: if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
4098: return non_lvalue (arg0);
4099: /* If second arg is constant zero, result is zero, but first arg
4100: must be evaluated. */
4101: if (integer_zerop (arg1))
4102: return omit_one_operand (type, arg1, arg0);
4103:
4104: truth_andor:
4105: /* Check for the possibility of merging component references. If our
4106: lhs is another similar operation, try to merge its rhs with our
4107: rhs. Then try to merge our lhs and rhs. */
4108: if (optimize)
4109: {
4110: if (TREE_CODE (arg0) == code)
4111: {
4112: tem = fold_truthop (code, type,
4113: TREE_OPERAND (arg0, 1), arg1);
4114: if (tem)
4115: return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
4116: }
4117:
4118: tem = fold_truthop (code, type, arg0, arg1);
4119: if (tem)
4120: return tem;
4121: }
4122: return t;
4123:
4124: case TRUTH_ORIF_EXPR:
4125: /* Note that the operands of this must be ints
4126: and their values must be 0 or true.
4127: ("true" is a fixed value perhaps depending on the language.) */
4128: /* If first arg is constant true, return it. */
4129: if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
4130: return arg0;
4131: case TRUTH_OR_EXPR:
4132: /* If either arg is constant zero, drop it. */
4133: if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
4134: return non_lvalue (arg1);
4135: if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1))
4136: return non_lvalue (arg0);
4137: /* If second arg is constant true, result is true, but we must
4138: evaluate first arg. */
4139: if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
4140: return omit_one_operand (type, arg1, arg0);
4141: goto truth_andor;
4142:
4143: case TRUTH_XOR_EXPR:
4144: /* If either arg is constant zero, drop it. */
4145: if (integer_zerop (arg0))
4146: return non_lvalue (arg1);
4147: if (integer_zerop (arg1))
4148: return non_lvalue (arg0);
4149: /* If either arg is constant true, this is a logical inversion. */
4150: if (integer_onep (arg0))
4151: return non_lvalue (invert_truthvalue (arg1));
4152: if (integer_onep (arg1))
4153: return non_lvalue (invert_truthvalue (arg0));
4154: return t;
4155:
4156: case EQ_EXPR:
4157: case NE_EXPR:
4158: case LT_EXPR:
4159: case GT_EXPR:
4160: case LE_EXPR:
4161: case GE_EXPR:
4162: /* If one arg is a constant integer, put it last. */
4163: if (TREE_CODE (arg0) == INTEGER_CST
4164: && TREE_CODE (arg1) != INTEGER_CST)
4165: {
4166: TREE_OPERAND (t, 0) = arg1;
4167: TREE_OPERAND (t, 1) = arg0;
4168: arg0 = TREE_OPERAND (t, 0);
4169: arg1 = TREE_OPERAND (t, 1);
4170: code = swap_tree_comparison (code);
4171: TREE_SET_CODE (t, code);
4172: }
4173:
4174: /* Convert foo++ == CONST into ++foo == CONST + INCR.
4175: First, see if one arg is constant; find the constant arg
4176: and the other one. */
4177: {
4178: tree constop = 0, varop;
4179: tree *constoploc;
4180:
4181: if (TREE_CONSTANT (arg1))
4182: constoploc = &TREE_OPERAND (t, 1), constop = arg1, varop = arg0;
4183: if (TREE_CONSTANT (arg0))
4184: constoploc = &TREE_OPERAND (t, 0), constop = arg0, varop = arg1;
4185:
4186: if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR)
4187: {
4188: /* This optimization is invalid for ordered comparisons
4189: if CONST+INCR overflows or if foo+incr might overflow.
4190: This optimization is invalid for floating point due to rounding.
4191: For pointer types we assume overflow doesn't happen. */
4192: if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
4193: || (! FLOAT_TYPE_P (TREE_TYPE (varop))
4194: && (code == EQ_EXPR || code == NE_EXPR)))
4195: {
4196: tree newconst
4197: = fold (build (PLUS_EXPR, TREE_TYPE (varop),
4198: constop, TREE_OPERAND (varop, 1)));
4199: TREE_SET_CODE (varop, PREINCREMENT_EXPR);
4200: *constoploc = newconst;
4201: return t;
4202: }
4203: }
4204: else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
4205: {
4206: if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
4207: || (! FLOAT_TYPE_P (TREE_TYPE (varop))
4208: && (code == EQ_EXPR || code == NE_EXPR)))
4209: {
4210: tree newconst
4211: = fold (build (MINUS_EXPR, TREE_TYPE (varop),
4212: constop, TREE_OPERAND (varop, 1)));
4213: TREE_SET_CODE (varop, PREDECREMENT_EXPR);
4214: *constoploc = newconst;
4215: return t;
4216: }
4217: }
4218: }
4219:
4220: /* Change X >= CST to X > (CST - 1) if CST is positive. */
4221: if (TREE_CODE (arg1) == INTEGER_CST
4222: && TREE_CODE (arg0) != INTEGER_CST
4223: && ! tree_int_cst_lt (arg1, integer_one_node))
4224: {
4225: switch (TREE_CODE (t))
4226: {
4227: case GE_EXPR:
4228: code = GT_EXPR;
4229: TREE_SET_CODE (t, code);
4230: arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
4231: TREE_OPERAND (t, 1) = arg1;
4232: break;
4233:
4234: case LT_EXPR:
4235: code = LE_EXPR;
4236: TREE_SET_CODE (t, code);
4237: arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
4238: TREE_OPERAND (t, 1) = arg1;
4239: }
4240: }
4241:
4242: /* If this is an EQ or NE comparison with zero and ARG0 is
4243: (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
4244: two operations, but the latter can be done in one less insn
4245: one machine that have only two-operand insns or on which a
4246: constant cannot be the first operand. */
4247: if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
4248: && TREE_CODE (arg0) == BIT_AND_EXPR)
4249: {
4250: if (TREE_CODE (TREE_OPERAND (arg0, 0)) == LSHIFT_EXPR
4251: && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)))
4252: return
4253: fold (build (code, type,
4254: build (BIT_AND_EXPR, TREE_TYPE (arg0),
4255: build (RSHIFT_EXPR,
4256: TREE_TYPE (TREE_OPERAND (arg0, 0)),
4257: TREE_OPERAND (arg0, 1),
4258: TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)),
4259: convert (TREE_TYPE (arg0),
4260: integer_one_node)),
4261: arg1));
4262: else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
4263: && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
4264: return
4265: fold (build (code, type,
4266: build (BIT_AND_EXPR, TREE_TYPE (arg0),
4267: build (RSHIFT_EXPR,
4268: TREE_TYPE (TREE_OPERAND (arg0, 1)),
4269: TREE_OPERAND (arg0, 0),
4270: TREE_OPERAND (TREE_OPERAND (arg0, 1), 1)),
4271: convert (TREE_TYPE (arg0),
4272: integer_one_node)),
4273: arg1));
4274: }
4275:
4276: /* If this is an NE or EQ comparison of zero against the result of a
4277: signed MOD operation whose second operand is a power of 2, make
4278: the MOD operation unsigned since it is simpler and equivalent. */
4279: if ((code == NE_EXPR || code == EQ_EXPR)
4280: && integer_zerop (arg1)
4281: && ! TREE_UNSIGNED (TREE_TYPE (arg0))
4282: && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
4283: || TREE_CODE (arg0) == CEIL_MOD_EXPR
4284: || TREE_CODE (arg0) == FLOOR_MOD_EXPR
4285: || TREE_CODE (arg0) == ROUND_MOD_EXPR)
4286: && integer_pow2p (TREE_OPERAND (arg0, 1)))
4287: {
4288: tree newtype = unsigned_type (TREE_TYPE (arg0));
4289: tree newmod = build (TREE_CODE (arg0), newtype,
4290: convert (newtype, TREE_OPERAND (arg0, 0)),
4291: convert (newtype, TREE_OPERAND (arg0, 1)));
4292:
4293: return build (code, type, newmod, convert (newtype, arg1));
4294: }
4295:
4296: /* If this is an NE comparison of zero with an AND of one, remove the
4297: comparison since the AND will give the correct value. */
4298: if (code == NE_EXPR && integer_zerop (arg1)
4299: && TREE_CODE (arg0) == BIT_AND_EXPR
4300: && integer_onep (TREE_OPERAND (arg0, 1)))
4301: return convert (type, arg0);
4302:
4303: /* If we have (A & C) == C where C is a power of 2, convert this into
4304: (A & C) != 0. Similarly for NE_EXPR. */
4305: if ((code == EQ_EXPR || code == NE_EXPR)
4306: && TREE_CODE (arg0) == BIT_AND_EXPR
4307: && integer_pow2p (TREE_OPERAND (arg0, 1))
4308: && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
4309: return build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
4310: arg0, integer_zero_node);
4311:
4312: /* Simplify comparison of something with itself. (For IEEE
4313: floating-point, we can only do some of these simplifications.) */
4314: if (operand_equal_p (arg0, arg1, 0))
4315: {
4316: switch (code)
4317: {
4318: case EQ_EXPR:
4319: case GE_EXPR:
4320: case LE_EXPR:
4321: if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
4322: {
4323: t = build_int_2 (1, 0);
4324: TREE_TYPE (t) = type;
4325: return t;
4326: }
4327: code = EQ_EXPR;
4328: TREE_SET_CODE (t, code);
4329: break;
4330:
4331: case NE_EXPR:
4332: /* For NE, we can only do this simplification if integer. */
4333: if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
4334: break;
4335: /* ... fall through ... */
4336: case GT_EXPR:
4337: case LT_EXPR:
4338: t = build_int_2 (0, 0);
4339: TREE_TYPE (t) = type;
4340: return t;
4341: }
4342: }
4343:
4344: /* An unsigned comparison against 0 can be simplified. */
4345: if (integer_zerop (arg1)
4346: && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
4347: || TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE)
4348: && TREE_UNSIGNED (TREE_TYPE (arg1)))
4349: {
4350: switch (TREE_CODE (t))
4351: {
4352: case GT_EXPR:
4353: code = NE_EXPR;
4354: TREE_SET_CODE (t, NE_EXPR);
4355: break;
4356: case LE_EXPR:
4357: code = EQ_EXPR;
4358: TREE_SET_CODE (t, EQ_EXPR);
4359: break;
4360: case GE_EXPR:
4361: return omit_one_operand (type,
4362: convert (type, integer_one_node),
4363: arg0);
4364: case LT_EXPR:
4365: return omit_one_operand (type,
4366: convert (type, integer_zero_node),
4367: arg0);
4368: }
4369: }
4370:
4371: /* If we are comparing an expression that just has comparisons
4372: of two integer values, arithmetic expressions of those comparisons,
4373: and constants, we can simplify it. There are only three cases
4374: to check: the two values can either be equal, the first can be
4375: greater, or the second can be greater. Fold the expression for
4376: those three values. Since each value must be 0 or 1, we have
4377: eight possibilities, each of which corresponds to the constant 0
4378: or 1 or one of the six possible comparisons.
4379:
4380: This handles common cases like (a > b) == 0 but also handles
4381: expressions like ((x > y) - (y > x)) > 0, which supposedly
4382: occur in macroized code. */
4383:
4384: if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
4385: {
4386: tree cval1 = 0, cval2 = 0;
4387: int save_p = 0;
4388:
4389: if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
4390: /* Don't handle degenerate cases here; they should already
4391: have been handled anyway. */
4392: && cval1 != 0 && cval2 != 0
4393: && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
4394: && TREE_TYPE (cval1) == TREE_TYPE (cval2)
4395: && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
4396: && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
4397: TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
4398: {
4399: tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
4400: tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
4401:
4402: /* We can't just pass T to eval_subst in case cval1 or cval2
4403: was the same as ARG1. */
4404:
4405: tree high_result
4406: = fold (build (code, type,
4407: eval_subst (arg0, cval1, maxval, cval2, minval),
4408: arg1));
4409: tree equal_result
4410: = fold (build (code, type,
4411: eval_subst (arg0, cval1, maxval, cval2, maxval),
4412: arg1));
4413: tree low_result
4414: = fold (build (code, type,
4415: eval_subst (arg0, cval1, minval, cval2, maxval),
4416: arg1));
4417:
4418: /* All three of these results should be 0 or 1. Confirm they
4419: are. Then use those values to select the proper code
4420: to use. */
4421:
4422: if ((integer_zerop (high_result)
4423: || integer_onep (high_result))
4424: && (integer_zerop (equal_result)
4425: || integer_onep (equal_result))
4426: && (integer_zerop (low_result)
4427: || integer_onep (low_result)))
4428: {
4429: /* Make a 3-bit mask with the high-order bit being the
4430: value for `>', the next for '=', and the low for '<'. */
4431: switch ((integer_onep (high_result) * 4)
4432: + (integer_onep (equal_result) * 2)
4433: + integer_onep (low_result))
4434: {
4435: case 0:
4436: /* Always false. */
4437: return omit_one_operand (type, integer_zero_node, arg0);
4438: case 1:
4439: code = LT_EXPR;
4440: break;
4441: case 2:
4442: code = EQ_EXPR;
4443: break;
4444: case 3:
4445: code = LE_EXPR;
4446: break;
4447: case 4:
4448: code = GT_EXPR;
4449: break;
4450: case 5:
4451: code = NE_EXPR;
4452: break;
4453: case 6:
4454: code = GE_EXPR;
4455: break;
4456: case 7:
4457: /* Always true. */
4458: return omit_one_operand (type, integer_one_node, arg0);
4459: }
4460:
4461: t = build (code, type, cval1, cval2);
4462: if (save_p)
4463: return save_expr (t);
4464: else
4465: return fold (t);
4466: }
4467: }
4468: }
4469:
4470: /* If this is a comparison of a field, we may be able to simplify it. */
4471: if ((TREE_CODE (arg0) == COMPONENT_REF
4472: || TREE_CODE (arg0) == BIT_FIELD_REF)
4473: && (code == EQ_EXPR || code == NE_EXPR)
4474: /* Handle the constant case even without -O
4475: to make sure the warnings are given. */
4476: && (optimize || TREE_CODE (arg1) == INTEGER_CST))
4477: {
4478: t1 = optimize_bit_field_compare (code, type, arg0, arg1);
4479: return t1 ? t1 : t;
4480: }
4481:
4482: /* From here on, the only cases we handle are when the result is
4483: known to be a constant.
4484:
4485: To compute GT, swap the arguments and do LT.
4486: To compute GE, do LT and invert the result.
4487: To compute LE, swap the arguments, do LT and invert the result.
4488: To compute NE, do EQ and invert the result.
4489:
4490: Therefore, the code below must handle only EQ and LT. */
4491:
4492: if (code == LE_EXPR || code == GT_EXPR)
4493: {
4494: tem = arg0, arg0 = arg1, arg1 = tem;
4495: code = swap_tree_comparison (code);
4496: }
4497:
4498: /* Note that it is safe to invert for real values here because we
4499: will check below in the one case that it matters. */
4500:
4501: invert = 0;
4502: if (code == NE_EXPR || code == GE_EXPR)
4503: {
4504: invert = 1;
4505: code = invert_tree_comparison (code);
4506: }
4507:
4508: /* Compute a result for LT or EQ if args permit;
4509: otherwise return T. */
4510: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
4511: {
4512: if (code == EQ_EXPR)
4513: t1 = build_int_2 ((TREE_INT_CST_LOW (arg0)
4514: == TREE_INT_CST_LOW (arg1))
4515: && (TREE_INT_CST_HIGH (arg0)
4516: == TREE_INT_CST_HIGH (arg1)),
4517: 0);
4518: else
4519: t1 = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0))
4520: ? INT_CST_LT_UNSIGNED (arg0, arg1)
4521: : INT_CST_LT (arg0, arg1)),
4522: 0);
4523: }
4524:
4525: /* Assume a nonexplicit constant cannot equal an explicit one,
4526: since such code would be undefined anyway.
4527: Exception: on sysvr4, using #pragma weak,
4528: a label can come out as 0. */
4529: else if (TREE_CODE (arg1) == INTEGER_CST
4530: && !integer_zerop (arg1)
4531: && TREE_CONSTANT (arg0)
4532: && TREE_CODE (arg0) == ADDR_EXPR
4533: && code == EQ_EXPR)
4534: t1 = build_int_2 (0, 0);
4535:
4536: /* Two real constants can be compared explicitly. */
4537: else if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
4538: {
4539: /* If either operand is a NaN, the result is false with two
4540: exceptions: First, an NE_EXPR is true on NaNs, but that case
4541: is already handled correctly since we will be inverting the
4542: result for NE_EXPR. Second, if we had inverted a LE_EXPR
4543: or a GE_EXPR into a LT_EXPR, we must return true so that it
4544: will be inverted into false. */
4545:
4546: if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
4547: || REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
4548: t1 = build_int_2 (invert && code == LT_EXPR, 0);
4549:
4550: else if (code == EQ_EXPR)
4551: t1 = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
4552: TREE_REAL_CST (arg1)),
4553: 0);
4554: else
4555: t1 = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0),
4556: TREE_REAL_CST (arg1)),
4557: 0);
4558: }
4559:
4560: if (t1 == NULL_TREE)
4561: return t;
4562:
4563: if (invert)
4564: TREE_INT_CST_LOW (t1) ^= 1;
4565:
4566: TREE_TYPE (t1) = type;
4567: return t1;
4568:
4569: case COND_EXPR:
4570: /* Pedantic ANSI C says that a conditional expression is never an lvalue,
4571: so all simple results must be passed through pedantic_non_lvalue. */
4572: if (TREE_CODE (arg0) == INTEGER_CST)
4573: return pedantic_non_lvalue
4574: (TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1)));
4575: else if (operand_equal_p (arg1, TREE_OPERAND (expr, 2), 0))
4576: return pedantic_non_lvalue (omit_one_operand (type, arg1, arg0));
4577:
4578: /* If the second operand is zero, invert the comparison and swap
4579: the second and third operands. Likewise if the second operand
4580: is constant and the third is not or if the third operand is
4581: equivalent to the first operand of the comparison. */
4582:
4583: if (integer_zerop (arg1)
4584: || (TREE_CONSTANT (arg1) && ! TREE_CONSTANT (TREE_OPERAND (t, 2)))
4585: || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
4586: && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
4587: TREE_OPERAND (t, 2),
4588: TREE_OPERAND (arg0, 1))))
4589: {
4590: /* See if this can be inverted. If it can't, possibly because
4591: it was a floating-point inequality comparison, don't do
4592: anything. */
4593: tem = invert_truthvalue (arg0);
4594:
4595: if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
4596: {
4597: arg0 = TREE_OPERAND (t, 0) = tem;
4598: TREE_OPERAND (t, 1) = TREE_OPERAND (t, 2);
4599: TREE_OPERAND (t, 2) = arg1;
4600: arg1 = TREE_OPERAND (t, 1);
4601: }
4602: }
4603:
4604: /* If we have A op B ? A : C, we may be able to convert this to a
4605: simpler expression, depending on the operation and the values
4606: of B and C. IEEE floating point prevents this though,
4607: because A or B might be -0.0 or a NaN. */
4608:
4609: if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
4610: && (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4611: || ! FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
4612: && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
4613: arg1, TREE_OPERAND (arg0, 1)))
4614: {
4615: tree arg2 = TREE_OPERAND (t, 2);
4616: enum tree_code comp_code = TREE_CODE (arg0);
4617:
4618: /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or abs (-A),
4619: depending on the comparison operation. */
4620: if (integer_zerop (TREE_OPERAND (arg0, 1))
4621: && TREE_CODE (arg2) == NEGATE_EXPR
4622: && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4623: switch (comp_code)
4624: {
4625: case EQ_EXPR:
4626: return pedantic_non_lvalue
4627: (fold (build1 (NEGATE_EXPR, type, arg1)));
4628: case NE_EXPR:
4629: return pedantic_non_lvalue (convert (type, arg1));
4630: case GE_EXPR:
4631: case GT_EXPR:
4632: return pedantic_non_lvalue
4633: (fold (build1 (ABS_EXPR, type, arg1)));
4634: case LE_EXPR:
4635: case LT_EXPR:
4636: return pedantic_non_lvalue
4637: (fold (build1 (NEGATE_EXPR, type,
4638: fold (build1 (ABS_EXPR, type, arg1)))));
4639: }
4640:
4641: /* If this is A != 0 ? A : 0, this is simply A. For ==, it is
4642: always zero. */
4643:
4644: if (integer_zerop (TREE_OPERAND (arg0, 1)) && integer_zerop (arg2))
4645: {
4646: if (comp_code == NE_EXPR)
4647: return pedantic_non_lvalue (convert (type, arg1));
4648: else if (comp_code == EQ_EXPR)
4649: return pedantic_non_lvalue (convert (type, integer_zero_node));
4650: }
4651:
4652: /* If this is A op B ? A : B, this is either A, B, min (A, B),
4653: or max (A, B), depending on the operation. */
4654:
4655: if (operand_equal_for_comparison_p (TREE_OPERAND (arg0, 1),
4656: arg2, TREE_OPERAND (arg0, 0)))
4657: switch (comp_code)
4658: {
4659: case EQ_EXPR:
4660: return pedantic_non_lvalue (convert (type, arg2));
4661: case NE_EXPR:
4662: return pedantic_non_lvalue (convert (type, arg1));
4663: case LE_EXPR:
4664: case LT_EXPR:
4665: return pedantic_non_lvalue
4666: (fold (build (MIN_EXPR, type, arg1, arg2)));
4667: case GE_EXPR:
4668: case GT_EXPR:
4669: return pedantic_non_lvalue
4670: (fold (build (MAX_EXPR, type, arg1, arg2)));
4671: }
4672:
4673: /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4674: we might still be able to simplify this. For example,
4675: if C1 is one less or one more than C2, this might have started
4676: out as a MIN or MAX and been transformed by this function.
4677: Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
4678:
4679: if (INTEGRAL_TYPE_P (type)
4680: && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
4681: && TREE_CODE (arg2) == INTEGER_CST)
4682: switch (comp_code)
4683: {
4684: case EQ_EXPR:
4685: /* We can replace A with C1 in this case. */
4686: arg1 = TREE_OPERAND (t, 1)
4687: = convert (type, TREE_OPERAND (arg0, 1));
4688: break;
4689:
4690: case LT_EXPR:
4691: /* If C1 is C2 + 1, this is min(A, C2). */
4692: if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
4693: && operand_equal_p (TREE_OPERAND (arg0, 1),
4694: const_binop (PLUS_EXPR, arg2,
4695: integer_one_node, 0), 1))
4696: return pedantic_non_lvalue
4697: (fold (build (MIN_EXPR, type, arg1, arg2)));
4698: break;
4699:
4700: case LE_EXPR:
4701: /* If C1 is C2 - 1, this is min(A, C2). */
4702: if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
4703: && operand_equal_p (TREE_OPERAND (arg0, 1),
4704: const_binop (MINUS_EXPR, arg2,
4705: integer_one_node, 0), 1))
4706: return pedantic_non_lvalue
4707: (fold (build (MIN_EXPR, type, arg1, arg2)));
4708: break;
4709:
4710: case GT_EXPR:
4711: /* If C1 is C2 - 1, this is max(A, C2). */
4712: if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
4713: && operand_equal_p (TREE_OPERAND (arg0, 1),
4714: const_binop (MINUS_EXPR, arg2,
4715: integer_one_node, 0), 1))
4716: return pedantic_non_lvalue
4717: (fold (build (MAX_EXPR, type, arg1, arg2)));
4718: break;
4719:
4720: case GE_EXPR:
4721: /* If C1 is C2 + 1, this is max(A, C2). */
4722: if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
4723: && operand_equal_p (TREE_OPERAND (arg0, 1),
4724: const_binop (PLUS_EXPR, arg2,
4725: integer_one_node, 0), 1))
4726: return pedantic_non_lvalue
4727: (fold (build (MAX_EXPR, type, arg1, arg2)));
4728: break;
4729: }
4730: }
4731:
4732: /* Convert A ? 1 : 0 to simply A. */
4733: if (integer_onep (TREE_OPERAND (t, 1))
4734: && integer_zerop (TREE_OPERAND (t, 2))
4735: /* If we try to convert TREE_OPERAND (t, 0) to our type, the
4736: call to fold will try to move the conversion inside
4737: a COND, which will recurse. In that case, the COND_EXPR
4738: is probably the best choice, so leave it alone. */
4739: && type == TREE_TYPE (arg0))
4740: return pedantic_non_lvalue (arg0);
4741:
4742:
4743: /* Look for expressions of the form A & 2 ? 2 : 0. The result of this
4744: operation is simply A & 2. */
4745:
4746: if (integer_zerop (TREE_OPERAND (t, 2))
4747: && TREE_CODE (arg0) == NE_EXPR
4748: && integer_zerop (TREE_OPERAND (arg0, 1))
4749: && integer_pow2p (arg1)
4750: && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
4751: && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
4752: arg1, 1))
4753: return pedantic_non_lvalue (convert (type, TREE_OPERAND (arg0, 0)));
4754:
4755: return t;
4756:
4757: case COMPOUND_EXPR:
4758: /* When pedantic, a compound expression can be neither an lvalue
4759: nor an integer constant expression. */
4760: if (TREE_SIDE_EFFECTS (arg0) || pedantic)
4761: return t;
4762: /* Don't let (0, 0) be null pointer constant. */
4763: if (integer_zerop (arg1))
4764: return non_lvalue (arg1);
4765: return arg1;
4766:
4767: case COMPLEX_EXPR:
4768: if (wins)
4769: return build_complex (arg0, arg1);
4770: return t;
4771:
4772: case REALPART_EXPR:
4773: if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
4774: return t;
4775: else if (TREE_CODE (arg0) == COMPLEX_EXPR)
4776: return omit_one_operand (type, TREE_OPERAND (arg0, 0),
4777: TREE_OPERAND (arg0, 1));
4778: else if (TREE_CODE (arg0) == COMPLEX_CST)
4779: return TREE_REALPART (arg0);
4780: else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
4781: return fold (build (TREE_CODE (arg0), type,
4782: fold (build1 (REALPART_EXPR, type,
4783: TREE_OPERAND (arg0, 0))),
4784: fold (build1 (REALPART_EXPR,
4785: type, TREE_OPERAND (arg0, 1)))));
4786: return t;
4787:
4788: case IMAGPART_EXPR:
4789: if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
4790: return convert (type, integer_zero_node);
4791: else if (TREE_CODE (arg0) == COMPLEX_EXPR)
4792: return omit_one_operand (type, TREE_OPERAND (arg0, 1),
4793: TREE_OPERAND (arg0, 0));
4794: else if (TREE_CODE (arg0) == COMPLEX_CST)
4795: return TREE_IMAGPART (arg0);
4796: else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
4797: return fold (build (TREE_CODE (arg0), type,
4798: fold (build1 (IMAGPART_EXPR, type,
4799: TREE_OPERAND (arg0, 0))),
4800: fold (build1 (IMAGPART_EXPR, type,
4801: TREE_OPERAND (arg0, 1)))));
4802: return t;
4803:
4804: default:
4805: return t;
4806: } /* switch (code) */
4807: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.