|
|
1.1 root 1: /* Fold a constant sub-tree into a single node for C-compiler
2: Copyright (C) 1987, 1988, 1992 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 arbitary 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: void lshift_double ();
49: void rshift_double ();
50: void lrotate_double ();
51: void rrotate_double ();
52: static tree const_binop ();
53:
54: /* To do constant folding on INTEGER_CST nodes requires 64-bit arithmetic.
55: We do that by representing the 64-bit integer as 8 shorts,
56: with only 8 bits stored in each short, as a positive number. */
57:
58: /* Unpack a 64-bit integer into 8 shorts.
59: LOW and HI are the integer, as two `int' pieces.
60: SHORTS points to the array of shorts. */
61:
62: static void
63: encode (shorts, low, hi)
64: short *shorts;
65: int low, hi;
66: {
67: shorts[0] = low & 0xff;
68: shorts[1] = (low >> 8) & 0xff;
69: shorts[2] = (low >> 16) & 0xff;
70: shorts[3] = (low >> 24) & 0xff;
71: shorts[4] = hi & 0xff;
72: shorts[5] = (hi >> 8) & 0xff;
73: shorts[6] = (hi >> 16) & 0xff;
74: shorts[7] = (hi >> 24) & 0xff;
75: }
76:
77: /* Pack an array of 8 shorts into a 64-bit integer.
78: SHORTS points to the array of shorts.
79: The integer is stored into *LOW and *HI as two `int' pieces. */
80:
81: static void
82: decode (shorts, low, hi)
83: short *shorts;
84: int *low, *hi;
85: {
86: /* The casts in the following statement should not be
87: needed, but they get around bugs in some C compilers. */
88: *low = (((long)shorts[3] << 24) | ((long)shorts[2] << 16)
89: | ((long)shorts[1] << 8) | (long)shorts[0]);
90: *hi = (((long)shorts[7] << 24) | ((long)shorts[6] << 16)
91: | ((long)shorts[5] << 8) | (long)shorts[4]);
92: }
93:
94: /* Make the integer constant T valid for its type
95: by setting to 0 or 1 all the bits in the constant
96: that don't belong in the type. */
97:
98: static void
99: force_fit_type (t)
100: tree t;
101: {
102: register int prec = TYPE_PRECISION (TREE_TYPE (t));
103:
104: if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
105: prec = POINTER_SIZE;
106:
107: /* First clear all bits that are beyond the type's precision. */
108:
109: if (prec == 2 * HOST_BITS_PER_INT)
110: ;
111: else if (prec > HOST_BITS_PER_INT)
112: {
113: TREE_INT_CST_HIGH (t)
114: &= ~((-1) << (prec - HOST_BITS_PER_INT));
115: }
116: else
117: {
118: TREE_INT_CST_HIGH (t) = 0;
119: if (prec < HOST_BITS_PER_INT)
120: TREE_INT_CST_LOW (t)
121: &= ~((-1) << prec);
122: }
123:
124: /* If it's a signed type and value's sign bit is set, extend the sign. */
125:
126: if (! TREE_UNSIGNED (TREE_TYPE (t))
127: && prec != 2 * HOST_BITS_PER_INT
128: && (prec > HOST_BITS_PER_INT
129: ? TREE_INT_CST_HIGH (t) & (1 << (prec - HOST_BITS_PER_INT - 1))
130: : TREE_INT_CST_LOW (t) & (1 << (prec - 1))))
131: {
132: /* Value is negative:
133: set to 1 all the bits that are outside this type's precision. */
134: if (prec > HOST_BITS_PER_INT)
135: {
136: TREE_INT_CST_HIGH (t)
137: |= ((-1) << (prec - HOST_BITS_PER_INT));
138: }
139: else
140: {
141: TREE_INT_CST_HIGH (t) = -1;
142: if (prec < HOST_BITS_PER_INT)
143: TREE_INT_CST_LOW (t)
144: |= ((-1) << prec);
145: }
146: }
147: }
148:
149: /* Add two 64-bit integers with 64-bit result.
150: Each argument is given as two `int' pieces.
151: One argument is L1 and H1; the other, L2 and H2.
152: The value is stored as two `int' pieces in *LV and *HV.
153: We use the 8-shorts representation internally. */
154:
155: void
156: add_double (l1, h1, l2, h2, lv, hv)
157: int l1, h1, l2, h2;
158: int *lv, *hv;
159: {
160: short arg1[8];
161: short arg2[8];
162: register int carry = 0;
163: register int i;
164:
165: encode (arg1, l1, h1);
166: encode (arg2, l2, h2);
167:
168: for (i = 0; i < 8; i++)
169: {
170: carry += arg1[i] + arg2[i];
171: arg1[i] = carry & 0xff;
172: carry >>= 8;
173: }
174:
175: decode (arg1, lv, hv);
176: }
177:
178: /* Negate a 64-bit integers with 64-bit result.
179: The argument is given as two `int' pieces in L1 and H1.
180: The value is stored as two `int' pieces in *LV and *HV.
181: We use the 8-shorts representation internally. */
182:
183: void
184: neg_double (l1, h1, lv, hv)
185: int l1, h1;
186: int *lv, *hv;
187: {
188: if (l1 == 0)
189: {
190: *lv = 0;
191: *hv = - h1;
192: }
193: else
194: {
195: *lv = - l1;
196: *hv = ~ h1;
197: }
198: }
199:
200: /* Multiply two 64-bit integers with 64-bit result.
201: Each argument is given as two `int' pieces.
202: One argument is L1 and H1; the other, L2 and H2.
203: The value is stored as two `int' pieces in *LV and *HV.
204: We use the 8-shorts representation internally. */
205:
206: void
207: mul_double (l1, h1, l2, h2, lv, hv)
208: int l1, h1, l2, h2;
209: int *lv, *hv;
210: {
211: short arg1[8];
212: short arg2[8];
213: short prod[16];
214: register int carry = 0;
215: register int i, j, k;
216:
217: /* These two cases are used extensively, arising from pointer
218: combinations. */
219: if (h2 == 0)
220: {
221: if (l2 == 2)
222: {
223: unsigned temp = l1 + l1;
224: *hv = h1 * 2 + (temp < l1);
225: *lv = temp;
226: return;
227: }
228: if (l2 == 4)
229: {
230: unsigned temp = l1 + l1;
231: h1 = h1 * 4 + ((temp < l1) << 1);
232: l1 = temp;
233: temp += temp;
234: h1 += (temp < l1);
235: *lv = temp;
236: *hv = h1;
237: return;
238: }
239: if (l2 == 8)
240: {
241: unsigned temp = l1 + l1;
242: h1 = h1 * 8 + ((temp < l1) << 2);
243: l1 = temp;
244: temp += temp;
245: h1 += (temp < l1) << 1;
246: l1 = temp;
247: temp += temp;
248: h1 += (temp < l1);
249: *lv = temp;
250: *hv = h1;
251: return;
252: }
253: }
254:
255: encode (arg1, l1, h1);
256: encode (arg2, l2, h2);
257:
258: bzero (prod, sizeof prod);
259:
260: for (i = 0; i < 8; i++)
261: for (j = 0; j < 8; j++)
262: {
263: k = i + j;
264: carry = arg1[i] * arg2[j];
265: while (carry)
266: {
267: carry += prod[k];
268: prod[k] = carry & 0xff;
269: carry >>= 8;
270: k++;
271: }
272: }
273:
274: decode (prod, lv, hv); /* @@decode ignores prod[8] -> prod[15] */
275: }
276:
277: /* Shift the 64-bit integer in L1, H1 left by COUNT places
278: keeping only PREC bits of result.
279: Shift right if COUNT is negative.
280: ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
281: Store the value as two `int' pieces in *LV and *HV. */
282:
283: void
284: lshift_double (l1, h1, count, prec, lv, hv, arith)
285: int l1, h1, count, prec;
286: int *lv, *hv;
287: int arith;
288: {
289: short arg1[8];
290: register int i;
291: register int carry;
292:
293: if (count < 0)
294: {
295: rshift_double (l1, h1, - count, prec, lv, hv, arith);
296: return;
297: }
298:
299: encode (arg1, l1, h1);
300:
301: if (count > prec)
302: count = prec;
303:
304: while (count > 0)
305: {
306: carry = 0;
307: for (i = 0; i < 8; i++)
308: {
309: carry += arg1[i] << 1;
310: arg1[i] = carry & 0xff;
311: carry >>= 8;
312: }
313: count--;
314: }
315:
316: decode (arg1, lv, hv);
317: }
318:
319: /* Shift the 64-bit integer in L1, H1 right by COUNT places
320: keeping only PREC bits of result. COUNT must be positive.
321: ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
322: Store the value as two `int' pieces in *LV and *HV. */
323:
324: void
325: rshift_double (l1, h1, count, prec, lv, hv, arith)
326: int l1, h1, count, prec;
327: int *lv, *hv;
328: int arith;
329: {
330: short arg1[8];
331: register int i;
332: register int carry;
333:
334: encode (arg1, l1, h1);
335:
336: if (count > prec)
337: count = prec;
338:
339: while (count > 0)
340: {
341: carry = arith && arg1[7] >> 7;
342: for (i = 7; i >= 0; i--)
343: {
344: carry <<= 8;
345: carry += arg1[i];
346: arg1[i] = (carry >> 1) & 0xff;
347: }
348: count--;
349: }
350:
351: decode (arg1, lv, hv);
352: }
353:
354: /* Rotate the 64-bit integer in L1, H1 left by COUNT places
355: keeping only PREC bits of result.
356: Rotate right if COUNT is negative.
357: Store the value as two `int' pieces in *LV and *HV. */
358:
359: void
360: lrotate_double (l1, h1, count, prec, lv, hv)
361: int l1, h1, count, prec;
362: int *lv, *hv;
363: {
364: short arg1[8];
365: register int i;
366: register int carry;
367:
368: if (count < 0)
369: {
370: rrotate_double (l1, h1, - count, prec, lv, hv);
371: return;
372: }
373:
374: encode (arg1, l1, h1);
375:
376: if (count > prec)
377: count = prec;
378:
379: carry = arg1[7] >> 7;
380: while (count > 0)
381: {
382: for (i = 0; i < 8; i++)
383: {
384: carry += arg1[i] << 1;
385: arg1[i] = carry & 0xff;
386: carry >>= 8;
387: }
388: count--;
389: }
390:
391: decode (arg1, lv, hv);
392: }
393:
394: /* Rotate the 64-bit integer in L1, H1 left by COUNT places
395: keeping only PREC bits of result. COUNT must be positive.
396: Store the value as two `int' pieces in *LV and *HV. */
397:
398: void
399: rrotate_double (l1, h1, count, prec, lv, hv)
400: int l1, h1, count, prec;
401: int *lv, *hv;
402: {
403: short arg1[8];
404: register int i;
405: register int carry;
406:
407: encode (arg1, l1, h1);
408:
409: if (count > prec)
410: count = prec;
411:
412: carry = arg1[0] & 1;
413: while (count > 0)
414: {
415: for (i = 7; i >= 0; i--)
416: {
417: carry <<= 8;
418: carry += arg1[i];
419: arg1[i] = (carry >> 1) & 0xff;
420: }
421: count--;
422: }
423:
424: decode (arg1, lv, hv);
425: }
426:
427: /* Divide 64 bit integer LNUM, HNUM by 64 bit integer LDEN, HDEN
428: for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
429: CODE is a tree code for a kind of division, one of
430: TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
431: or EXACT_DIV_EXPR
432: It controls how the quotient is rounded to a integer.
433: UNS nonzero says do unsigned division. */
434:
435: static void
436: div_and_round_double (code, uns,
437: lnum_orig, hnum_orig, lden_orig, hden_orig,
438: lquo, hquo, lrem, hrem)
439: enum tree_code code;
440: int uns;
441: int lnum_orig, hnum_orig; /* num == numerator == dividend */
442: int lden_orig, hden_orig; /* den == denominator == divisor */
443: int *lquo, *hquo, *lrem, *hrem;
444: {
445: int quo_neg = 0;
446: short num[9], den[8], quo[8]; /* extra element for scaling. */
447: register int i, j, work;
448: register int carry = 0;
449: unsigned int lnum = lnum_orig;
450: int hnum = hnum_orig;
451: unsigned int lden = lden_orig;
452: int hden = hden_orig;
453:
454: if ((hden == 0) && (lden == 0))
455: abort ();
456:
457: /* calculate quotient sign and convert operands to unsigned. */
458: if (!uns)
459: {
460: if (hden < 0)
461: {
462: quo_neg = ~ quo_neg;
463: neg_double (lden, hden, &lden, &hden);
464: }
465: if (hnum < 0)
466: {
467: quo_neg = ~ quo_neg;
468: neg_double (lnum, hnum, &lnum, &hnum);
469: }
470: }
471:
472: if (hnum == 0 && hden == 0)
473: { /* single precision */
474: *hquo = *hrem = 0;
475: *lquo = lnum / lden; /* rounds toward zero since positive args */
476: goto finish_up;
477: }
478:
479: if (hnum == 0)
480: { /* trivial case: dividend < divisor */
481: /* hden != 0 already checked. */
482: *hquo = *lquo = 0;
483: *hrem = hnum;
484: *lrem = lnum;
485: goto finish_up;
486: }
487:
488: bzero (quo, sizeof quo);
489:
490: bzero (num, sizeof num); /* to zero 9th element */
491: bzero (den, sizeof den);
492:
493: encode (num, lnum, hnum);
494: encode (den, lden, hden);
495:
496: /* This code requires more than just hden == 0.
497: We also have to require that we don't need more than three bytes
498: to hold CARRY. If we ever did need four bytes to hold it, we
499: would lose part of it when computing WORK on the next round. */
500: if (hden == 0 && ((lden << 8) >> 8) == lden)
501: { /* simpler algorithm */
502: /* hnum != 0 already checked. */
503: for (i = 7; i >= 0; i--)
504: {
505: work = num[i] + (carry << 8);
506: quo[i] = work / lden;
507: carry = work % lden;
508: }
509: }
510: else { /* full double precision,
511: with thanks to Don Knuth's
512: "Semi-Numericial Algorithms". */
513: #define BASE 256
514: int quo_est, scale, num_hi_sig, den_hi_sig, quo_hi_sig;
515:
516: /* Find the highest non-zero divisor digit. */
517: for (i = 7; ; i--)
518: if (den[i] != 0) {
519: den_hi_sig = i;
520: break;
521: }
522: for (i = 7; ; i--)
523: if (num[i] != 0) {
524: num_hi_sig = i;
525: break;
526: }
527: quo_hi_sig = num_hi_sig - den_hi_sig + 1;
528:
529: /* Insure that the first digit of the divisor is at least BASE/2.
530: This is required by the quotient digit estimation algorithm. */
531:
532: scale = BASE / (den[den_hi_sig] + 1);
533: if (scale > 1) { /* scale divisor and dividend */
534: carry = 0;
535: for (i = 0; i <= 8; i++) {
536: work = (num[i] * scale) + carry;
537: num[i] = work & 0xff;
538: carry = work >> 8;
539: if (num[i] != 0) num_hi_sig = i;
540: }
541: carry = 0;
542: for (i = 0; i <= 7; i++) {
543: work = (den[i] * scale) + carry;
544: den[i] = work & 0xff;
545: carry = work >> 8;
546: if (den[i] != 0) den_hi_sig = i;
547: }
548: }
549:
550: /* Main loop */
551: for (i = quo_hi_sig; i > 0; i--) {
552: /* quess the next quotient digit, quo_est, by dividing the first
553: two remaining dividend digits by the high order quotient digit.
554: quo_est is never low and is at most 2 high. */
555:
556: int num_hi; /* index of highest remaining dividend digit */
557:
558: num_hi = i + den_hi_sig;
559:
560: work = (num[num_hi] * BASE) + (num_hi > 0 ? num[num_hi - 1] : 0);
561: if (num[num_hi] != den[den_hi_sig]) {
562: quo_est = work / den[den_hi_sig];
563: }
564: else {
565: quo_est = BASE - 1;
566: }
567:
568: /* refine quo_est so it's usually correct, and at most one high. */
569: while ((den[den_hi_sig - 1] * quo_est)
570: > (((work - (quo_est * den[den_hi_sig])) * BASE)
571: + ((num_hi - 1) > 0 ? num[num_hi - 2] : 0)))
572: quo_est--;
573:
574: /* Try QUO_EST as the quotient digit, by multiplying the
575: divisor by QUO_EST and subtracting from the remaining dividend.
576: Keep in mind that QUO_EST is the I - 1st digit. */
577:
578: carry = 0;
579:
580: for (j = 0; j <= den_hi_sig; j++)
581: {
582: int digit;
583:
584: work = num[i + j - 1] - (quo_est * den[j]) + carry;
585: digit = work & 0xff;
586: carry = work >> 8;
587: if (digit < 0)
588: {
589: digit += BASE;
590: carry--;
591: }
592: num[i + j - 1] = digit;
593: }
594:
595: /* if quo_est was high by one, then num[i] went negative and
596: we need to correct things. */
597:
598: if (num[num_hi] < 0)
599: {
600: quo_est--;
601: carry = 0; /* add divisor back in */
602: for (j = 0; j <= den_hi_sig; j++)
603: {
604: work = num[i + j - 1] + den[j] + carry;
605: if (work > BASE)
606: {
607: work -= BASE;
608: carry = 1;
609: }
610: else
611: {
612: carry = 0;
613: }
614: num[i + j - 1] = work;
615: }
616: num [num_hi] += carry;
617: }
618:
619: /* store the quotient digit. */
620: quo[i - 1] = quo_est;
621: }
622: }
623:
624: decode (quo, lquo, hquo);
625:
626: finish_up:
627: /* if result is negative, make it so. */
628: if (quo_neg)
629: neg_double (*lquo, *hquo, lquo, hquo);
630:
631: /* compute trial remainder: rem = num - (quo * den) */
632: mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
633: neg_double (*lrem, *hrem, lrem, hrem);
634: add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
635:
636: switch (code)
637: {
638: case TRUNC_DIV_EXPR:
639: case TRUNC_MOD_EXPR: /* round toward zero */
640: case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
641: return;
642:
643: case FLOOR_DIV_EXPR:
644: case FLOOR_MOD_EXPR: /* round toward negative infinity */
645: if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
646: {
647: /* quo = quo - 1; */
648: add_double (*lquo, *hquo, -1, -1, lquo, hquo);
649: }
650: else return;
651: break;
652:
653: case CEIL_DIV_EXPR:
654: case CEIL_MOD_EXPR: /* round toward positive infinity */
655: if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
656: {
657: add_double (*lquo, *hquo, 1, 0, lquo, hquo);
658: }
659: else return;
660: break;
661:
662: case ROUND_DIV_EXPR:
663: case ROUND_MOD_EXPR: /* round to closest integer */
664: {
665: int labs_rem = *lrem, habs_rem = *hrem;
666: int labs_den = lden, habs_den = hden, ltwice, htwice;
667:
668: /* get absolute values */
669: if (*hrem < 0) neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
670: if (hden < 0) neg_double (lden, hden, &labs_den, &habs_den);
671:
672: /* if (2 * abs (lrem) >= abs (lden)) */
673: mul_double (2, 0, labs_rem, habs_rem, <wice, &htwice);
674: if (((unsigned) habs_den < (unsigned) htwice)
675: || (((unsigned) habs_den == (unsigned) htwice)
676: && ((unsigned) labs_den < (unsigned) ltwice)))
677: {
678: if (*hquo < 0)
679: /* quo = quo - 1; */
680: add_double (*lquo, *hquo, -1, -1, lquo, hquo);
681: else
682: /* quo = quo + 1; */
683: add_double (*lquo, *hquo, 1, 0, lquo, hquo);
684: }
685: else return;
686: }
687: break;
688:
689: default:
690: abort ();
691: }
692:
693: /* compute true remainder: rem = num - (quo * den) */
694: mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
695: neg_double (*lrem, *hrem, lrem, hrem);
696: add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
697: }
698:
699: #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
700:
701: /* Check for infinity in an IEEE double precision number. */
702:
703: int
704: target_isinf (x)
705: REAL_VALUE_TYPE x;
706: {
707: /* The IEEE 64-bit double format. */
708: union {
709: REAL_VALUE_TYPE d;
710: struct {
711: unsigned sign : 1;
712: unsigned exponent : 11;
713: unsigned mantissa1 : 20;
714: unsigned mantissa2;
715: } little_endian;
716: struct {
717: unsigned mantissa2;
718: unsigned mantissa1 : 20;
719: unsigned exponent : 11;
720: unsigned sign : 1;
721: } big_endian;
722: } u;
723:
724: u.d = dconstm1;
725: if (u.big_endian.sign == 1)
726: {
727: u.d = x;
728: return (u.big_endian.exponent == 2047
729: && u.big_endian.mantissa1 == 0
730: && u.big_endian.mantissa2 == 0);
731: }
732: else
733: {
734: u.d = x;
735: return (u.little_endian.exponent == 2047
736: && u.little_endian.mantissa1 == 0
737: && u.little_endian.mantissa2 == 0);
738: }
739: }
740:
1.1.1.2 ! root 741: /* Check whether an IEEE double precision number is a NaN. */
! 742:
! 743: int
! 744: target_isnan (x)
! 745: REAL_VALUE_TYPE x;
! 746: {
! 747: /* The IEEE 64-bit double format. */
! 748: union {
! 749: REAL_VALUE_TYPE d;
! 750: struct {
! 751: unsigned sign : 1;
! 752: unsigned exponent : 11;
! 753: unsigned mantissa1 : 20;
! 754: unsigned mantissa2;
! 755: } little_endian;
! 756: struct {
! 757: unsigned mantissa2;
! 758: unsigned mantissa1 : 20;
! 759: unsigned exponent : 11;
! 760: unsigned sign : 1;
! 761: } big_endian;
! 762: } u;
! 763:
! 764: u.d = dconstm1;
! 765: if (u.big_endian.sign == 1)
! 766: {
! 767: u.d = x;
! 768: return (u.big_endian.exponent == 2047
! 769: && (u.big_endian.mantissa1 != 0
! 770: || u.big_endian.mantissa2 != 0));
! 771: }
! 772: else
! 773: {
! 774: u.d = x;
! 775: return (u.little_endian.exponent == 2047
! 776: && (u.little_endian.mantissa1 != 0
! 777: || u.little_endian.mantissa2 != 0));
! 778: }
! 779: }
! 780:
1.1 root 781: /* Check for minus zero in an IEEE double precision number. */
782:
783: int
784: target_minus_zero (x)
785: REAL_VALUE_TYPE x;
786: {
787: REAL_VALUE_TYPE d1, d2;
788:
789: d1 = REAL_VALUE_NEGATE (x);
790: d2 = dconst0;
791:
792: return !bcmp (&d1, &d2, sizeof (d1));
793: }
794: #else /* Target not IEEE */
795:
796: /* Let's assume other float formats don't have infinity.
797: (This can be overridden by redefining REAL_VALUE_ISINF.) */
798:
799: target_isinf (x)
800: REAL_VALUE_TYPE x;
801: {
802: return 0;
803: }
804:
1.1.1.2 ! root 805: /* Let's assume other float formats don't have NaNs.
! 806: (This can be overridden by redefining REAL_VALUE_ISNAN.) */
! 807:
! 808: target_isnan (x)
! 809: REAL_VALUE_TYPE x;
! 810: {
! 811: return 0;
! 812: }
! 813:
1.1 root 814: /* Let's assume other float formats don't have minus zero.
815: (This can be overridden by redefining REAL_VALUE_MINUS_ZERO.) */
816:
817: target_minus_zero (x)
818: REAL_VALUE_TYPE x;
819: {
820: return 0;
821: }
822: #endif /* Target not IEEE */
823:
824: /* Split a tree IN into a constant and a variable part
825: that could be combined with CODE to make IN.
826: CODE must be a commutative arithmetic operation.
827: Store the constant part into *CONP and the variable in &VARP.
828: Return 1 if this was done; zero means the tree IN did not decompose
829: this way.
830:
831: If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.
832: Therefore, we must tell the caller whether the variable part
833: was subtracted. We do this by storing 1 or -1 into *VARSIGNP.
834: The value stored is the coefficient for the variable term.
835: The constant term we return should always be added;
836: we negate it if necessary. */
837:
838: static int
839: split_tree (in, code, varp, conp, varsignp)
840: tree in;
841: enum tree_code code;
842: tree *varp, *conp;
843: int *varsignp;
844: {
845: register tree outtype = TREE_TYPE (in);
846: *varp = 0;
847: *conp = 0;
848:
849: /* Strip any conversions that don't change the machine mode. */
850: while ((TREE_CODE (in) == NOP_EXPR
851: || TREE_CODE (in) == CONVERT_EXPR)
852: && (TYPE_MODE (TREE_TYPE (in))
853: == TYPE_MODE (TREE_TYPE (TREE_OPERAND (in, 0)))))
854: in = TREE_OPERAND (in, 0);
855:
856: if (TREE_CODE (in) == code
857: || (TREE_CODE (TREE_TYPE (in)) != REAL_TYPE
858: /* We can associate addition and subtraction together
859: (even though the C standard doesn't say so)
860: for integers because the value is not affected.
861: For reals, the value might be affected, so we can't. */
862: &&
863: ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
864: || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
865: {
866: enum tree_code code = TREE_CODE (TREE_OPERAND (in, 0));
867: if (code == INTEGER_CST)
868: {
869: *conp = TREE_OPERAND (in, 0);
870: *varp = TREE_OPERAND (in, 1);
871: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
872: && TREE_TYPE (*varp) != outtype)
873: *varp = convert (outtype, *varp);
874: *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
875: return 1;
876: }
877: if (TREE_CONSTANT (TREE_OPERAND (in, 1)))
878: {
879: *conp = TREE_OPERAND (in, 1);
880: *varp = TREE_OPERAND (in, 0);
881: *varsignp = 1;
882: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
883: && TREE_TYPE (*varp) != outtype)
884: *varp = convert (outtype, *varp);
885: if (TREE_CODE (in) == MINUS_EXPR)
886: {
887: /* If operation is subtraction and constant is second,
888: must negate it to get an additive constant.
889: And this cannot be done unless it is a manifest constant.
890: It could also be the address of a static variable.
891: We cannot negate that, so give up. */
892: if (TREE_CODE (*conp) == INTEGER_CST)
893: /* Subtracting from integer_zero_node loses for long long. */
894: *conp = fold (build1 (NEGATE_EXPR, TREE_TYPE (*conp), *conp));
895: else
896: return 0;
897: }
898: return 1;
899: }
900: if (TREE_CONSTANT (TREE_OPERAND (in, 0)))
901: {
902: *conp = TREE_OPERAND (in, 0);
903: *varp = TREE_OPERAND (in, 1);
904: if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
905: && TREE_TYPE (*varp) != outtype)
906: *varp = convert (outtype, *varp);
907: *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
908: return 1;
909: }
910: }
911: return 0;
912: }
913:
914: /* Combine two constants NUM and ARG2 under operation CODE
915: to produce a new constant.
916: We assume ARG1 and ARG2 have the same data type,
917: or at least are the same kind of constant and the same machine mode. */
918:
919: /* Handle floating overflow for `const_binop'. */
920: static jmp_buf const_binop_error;
921:
922: static tree
923: const_binop (code, arg1, arg2)
924: enum tree_code code;
925: register tree arg1, arg2;
926: {
927: if (TREE_CODE (arg1) == INTEGER_CST)
928: {
929: register int int1l = TREE_INT_CST_LOW (arg1);
930: register int int1h = TREE_INT_CST_HIGH (arg1);
931: int int2l = TREE_INT_CST_LOW (arg2);
932: int int2h = TREE_INT_CST_HIGH (arg2);
933: int low, hi;
934: int garbagel, garbageh;
935: register tree t;
936: int uns = TREE_UNSIGNED (TREE_TYPE (arg1));
937:
938: switch (code)
939: {
940: case BIT_IOR_EXPR:
941: t = build_int_2 (int1l | int2l, int1h | int2h);
942: break;
943:
944: case BIT_XOR_EXPR:
945: t = build_int_2 (int1l ^ int2l, int1h ^ int2h);
946: break;
947:
948: case BIT_AND_EXPR:
949: t = build_int_2 (int1l & int2l, int1h & int2h);
950: break;
951:
952: case BIT_ANDTC_EXPR:
953: t = build_int_2 (int1l & ~int2l, int1h & ~int2h);
954: break;
955:
956: case RSHIFT_EXPR:
957: int2l = - int2l;
958: case LSHIFT_EXPR:
959: lshift_double (int1l, int1h, int2l,
960: TYPE_PRECISION (TREE_TYPE (arg1)),
961: &low, &hi,
962: !uns);
963: t = build_int_2 (low, hi);
964: break;
965:
966: case RROTATE_EXPR:
967: int2l = - int2l;
968: case LROTATE_EXPR:
969: lrotate_double (int1l, int1h, int2l,
970: TYPE_PRECISION (TREE_TYPE (arg1)),
971: &low, &hi);
972: t = build_int_2 (low, hi);
973: break;
974:
975: case PLUS_EXPR:
976: if (int1h == 0)
977: {
978: int2l += int1l;
979: if ((unsigned) int2l < int1l)
980: int2h += 1;
981: t = build_int_2 (int2l, int2h);
982: break;
983: }
984: if (int2h == 0)
985: {
986: int1l += int2l;
987: if ((unsigned) int1l < int2l)
988: int1h += 1;
989: t = build_int_2 (int1l, int1h);
990: break;
991: }
992: add_double (int1l, int1h, int2l, int2h, &low, &hi);
993: t = build_int_2 (low, hi);
994: break;
995:
996: case MINUS_EXPR:
997: if (int2h == 0 && int2l == 0)
998: {
999: t = build_int_2 (int1l, int1h);
1000: break;
1001: }
1002: neg_double (int2l, int2h, &int2l, &int2h);
1003: add_double (int1l, int1h, int2l, int2h, &low, &hi);
1004: t = build_int_2 (low, hi);
1005: break;
1006:
1007: case MULT_EXPR:
1008: /* Optimize simple cases. */
1009: if (int1h == 0)
1010: {
1011: unsigned temp;
1012:
1013: switch (int1l)
1014: {
1015: case 0:
1016: t = build_int_2 (0, 0);
1017: goto got_it;
1018: case 1:
1019: t = build_int_2 (int2l, int2h);
1020: goto got_it;
1021: case 2:
1022: temp = int2l + int2l;
1023: int2h = int2h * 2 + (temp < int2l);
1024: t = build_int_2 (temp, int2h);
1025: goto got_it;
1026: case 3:
1027: temp = int2l + int2l + int2l;
1028: int2h = int2h * 3 + (temp < int2l);
1029: t = build_int_2 (temp, int2h);
1030: goto got_it;
1031: case 4:
1032: temp = int2l + int2l;
1033: int2h = int2h * 4 + ((temp < int2l) << 1);
1034: int2l = temp;
1035: temp += temp;
1036: int2h += (temp < int2l);
1037: t = build_int_2 (temp, int2h);
1038: goto got_it;
1039: case 8:
1040: temp = int2l + int2l;
1041: int2h = int2h * 8 + ((temp < int2l) << 2);
1042: int2l = temp;
1043: temp += temp;
1044: int2h += (temp < int2l) << 1;
1045: int2l = temp;
1046: temp += temp;
1047: int2h += (temp < int2l);
1048: t = build_int_2 (temp, int2h);
1049: goto got_it;
1050: default:
1051: break;
1052: }
1053: }
1054:
1055: if (int2h == 0)
1056: {
1057: if (int2l == 0)
1058: {
1059: t = build_int_2 (0, 0);
1060: break;
1061: }
1062: if (int2l == 1)
1063: {
1064: t = build_int_2 (int1l, int1h);
1065: break;
1066: }
1067: }
1068:
1069: mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1070: t = build_int_2 (low, hi);
1071: break;
1072:
1073: case TRUNC_DIV_EXPR:
1074: case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1075: case EXACT_DIV_EXPR:
1076: /* This is a shortcut for a common special case.
1077: It reduces the number of tree nodes generated
1078: and saves time. */
1079: if (int2h == 0 && int2l > 0
1080: && TREE_TYPE (arg1) == sizetype
1081: && int1h == 0 && int1l >= 0)
1082: {
1083: if (code == CEIL_DIV_EXPR)
1084: int1l += int2l-1;
1085: return size_int (int1l / int2l);
1086: }
1087: case ROUND_DIV_EXPR:
1088: if (int2h == 0 && int2l == 1)
1089: {
1090: t = build_int_2 (int1l, int1h);
1091: break;
1092: }
1093: if (int1l == int2l && int1h == int2h)
1094: {
1095: if ((int1l | int1h) == 0)
1096: abort ();
1097: t = build_int_2 (1, 0);
1098: break;
1099: }
1100: div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1101: &low, &hi, &garbagel, &garbageh);
1102: t = build_int_2 (low, hi);
1103: break;
1104:
1105: case TRUNC_MOD_EXPR: case ROUND_MOD_EXPR:
1106: case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1107: div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
1108: &garbagel, &garbageh, &low, &hi);
1109: t = build_int_2 (low, hi);
1110: break;
1111:
1112: case MIN_EXPR:
1113: case MAX_EXPR:
1114: if (uns)
1115: {
1116: low = (((unsigned) int1h < (unsigned) int2h)
1117: || (((unsigned) int1h == (unsigned) int2h)
1118: && ((unsigned) int1l < (unsigned) int2l)));
1119: }
1120: else
1121: {
1122: low = ((int1h < int2h)
1123: || ((int1h == int2h)
1124: && ((unsigned) int1l < (unsigned) int2l)));
1125: }
1126: if (low == (code == MIN_EXPR))
1127: t = build_int_2 (int1l, int1h);
1128: else
1129: t = build_int_2 (int2l, int2h);
1130: break;
1131:
1132: default:
1133: abort ();
1134: }
1135: got_it:
1136: TREE_TYPE (t) = TREE_TYPE (arg1);
1137: force_fit_type (t);
1138: return t;
1139: }
1140: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1141: if (TREE_CODE (arg1) == REAL_CST)
1142: {
1143: register REAL_VALUE_TYPE d1;
1144: register REAL_VALUE_TYPE d2;
1145: register REAL_VALUE_TYPE value;
1146:
1147: d1 = TREE_REAL_CST (arg1);
1148: d2 = TREE_REAL_CST (arg2);
1149: if (setjmp (const_binop_error))
1150: {
1151: warning ("floating overflow in constant folding");
1152: return build (code, TREE_TYPE (arg1), arg1, arg2);
1153: }
1154: set_float_handler (const_binop_error);
1155:
1156: #ifdef REAL_ARITHMETIC
1157: REAL_ARITHMETIC (value, code, d1, d2);
1158: #else
1159: switch (code)
1160: {
1161: case PLUS_EXPR:
1162: value = d1 + d2;
1163: break;
1164:
1165: case MINUS_EXPR:
1166: value = d1 - d2;
1167: break;
1168:
1169: case MULT_EXPR:
1170: value = d1 * d2;
1171: break;
1172:
1173: case RDIV_EXPR:
1174: #ifndef REAL_INFINITY
1175: if (d2 == 0)
1176: abort ();
1177: #endif
1178:
1179: value = d1 / d2;
1180: break;
1181:
1182: case MIN_EXPR:
1183: value = MIN (d1, d2);
1184: break;
1185:
1186: case MAX_EXPR:
1187: value = MAX (d1, d2);
1188: break;
1189:
1190: default:
1191: abort ();
1192: }
1193: #endif /* no REAL_ARITHMETIC */
1194: set_float_handler (0);
1.1.1.2 ! root 1195: return build_real (TREE_TYPE (arg1),
! 1196: REAL_VALUE_TRUNCATE (TYPE_MODE (TREE_TYPE (arg1)), value));
1.1 root 1197: }
1198: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1199: if (TREE_CODE (arg1) == COMPLEX_CST)
1200: {
1201: register tree r1 = TREE_REALPART (arg1);
1202: register tree i1 = TREE_IMAGPART (arg1);
1203: register tree r2 = TREE_REALPART (arg2);
1204: register tree i2 = TREE_IMAGPART (arg2);
1205: register tree t;
1206:
1207: switch (code)
1208: {
1209: case PLUS_EXPR:
1210: t = build_complex (const_binop (PLUS_EXPR, r1, r2),
1211: const_binop (PLUS_EXPR, i1, i2));
1212: break;
1213:
1214: case MINUS_EXPR:
1215: t = build_complex (const_binop (MINUS_EXPR, r1, r2),
1216: const_binop (MINUS_EXPR, i1, i2));
1217: break;
1218:
1219: case MULT_EXPR:
1220: t = build_complex (const_binop (MINUS_EXPR,
1221: const_binop (MULT_EXPR, r1, r2),
1222: const_binop (MULT_EXPR, i1, i2)),
1223: const_binop (PLUS_EXPR,
1224: const_binop (MULT_EXPR, r1, i2),
1225: const_binop (MULT_EXPR, i1, r2)));
1226: break;
1227:
1228: case RDIV_EXPR:
1229: {
1230: register tree magsquared
1231: = const_binop (PLUS_EXPR,
1232: const_binop (MULT_EXPR, r2, r2),
1233: const_binop (MULT_EXPR, i2, i2));
1234: t = build_complex (const_binop (RDIV_EXPR,
1235: const_binop (PLUS_EXPR,
1236: const_binop (MULT_EXPR, r1, r2),
1237: const_binop (MULT_EXPR, i1, i2)),
1238: magsquared),
1239: const_binop (RDIV_EXPR,
1240: const_binop (MINUS_EXPR,
1241: const_binop (MULT_EXPR, i1, r2),
1242: const_binop (MULT_EXPR, r1, i2)),
1243: magsquared));
1244: }
1245: break;
1246:
1247: default:
1248: abort ();
1249: }
1250: TREE_TYPE (t) = TREE_TYPE (arg1);
1251: return t;
1252: }
1253: return 0;
1254: }
1255:
1256: /* Return an INTEGER_CST with value V and type from `sizetype'. */
1257:
1258: tree
1259: size_int (number)
1260: unsigned int number;
1261: {
1262: register tree t;
1263: /* Type-size nodes already made for small sizes. */
1264: static tree size_table[2*HOST_BITS_PER_INT+1];
1265:
1266: if (number >= 0 && number < 2*HOST_BITS_PER_INT+1 && size_table[number] != 0)
1267: return size_table[number];
1268: if (number >= 0 && number < 2*HOST_BITS_PER_INT+1)
1269: {
1270: int temp = allocation_temporary_p ();
1271:
1272: push_obstacks_nochange ();
1273: /* Make this a permanent node. */
1274: if (temp)
1275: end_temporary_allocation ();
1276: t = build_int_2 (number, 0);
1277: TREE_TYPE (t) = sizetype;
1278: size_table[number] = t;
1279: pop_obstacks ();
1280: }
1281: else
1282: {
1283: t = build_int_2 (number, 0);
1284: TREE_TYPE (t) = sizetype;
1285: }
1286: return t;
1287: }
1288:
1289: /* Combine operands OP1 and OP2 with arithmetic operation CODE.
1290: CODE is a tree code. Data type is taken from `sizetype',
1291: If the operands are constant, so is the result. */
1292:
1293: tree
1294: size_binop (code, arg0, arg1)
1295: enum tree_code code;
1296: tree arg0, arg1;
1297: {
1298: /* Handle the special case of two integer constants faster. */
1299: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1300: {
1301: /* And some specific cases even faster than that. */
1302: if (code == PLUS_EXPR
1303: && TREE_INT_CST_LOW (arg0) == 0
1304: && TREE_INT_CST_HIGH (arg0) == 0)
1305: return arg1;
1306: if (code == MINUS_EXPR
1307: && TREE_INT_CST_LOW (arg1) == 0
1308: && TREE_INT_CST_HIGH (arg1) == 0)
1309: return arg0;
1310: if (code == MULT_EXPR
1311: && TREE_INT_CST_LOW (arg0) == 1
1312: && TREE_INT_CST_HIGH (arg0) == 0)
1313: return arg1;
1314: /* Handle general case of two integer constants. */
1315: return const_binop (code, arg0, arg1);
1316: }
1317:
1318: if (arg0 == error_mark_node || arg1 == error_mark_node)
1319: return error_mark_node;
1320:
1321: return fold (build (code, sizetype, arg0, arg1));
1322: }
1323:
1324: /* Given T, a tree representing type conversion of ARG1, a constant,
1325: return a constant tree representing the result of conversion. */
1326:
1327: static tree
1328: fold_convert (t, arg1)
1329: register tree t;
1330: register tree arg1;
1331: {
1332: register tree type = TREE_TYPE (t);
1333:
1334: if (TREE_CODE (type) == POINTER_TYPE
1335: || TREE_CODE (type) == INTEGER_TYPE
1336: || TREE_CODE (type) == ENUMERAL_TYPE)
1337: {
1338: if (TREE_CODE (arg1) == INTEGER_CST)
1339: {
1340: /* Given an integer constant, make new constant with new type,
1341: appropriately sign-extended or truncated. */
1342: t = build_int_2 (TREE_INT_CST_LOW (arg1),
1343: TREE_INT_CST_HIGH (arg1));
1344: TREE_TYPE (t) = type;
1345: force_fit_type (t);
1346: }
1347: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1348: else if (TREE_CODE (arg1) == REAL_CST)
1349: {
1350: if (REAL_VALUES_LESS (real_value_from_int_cst (TYPE_MAX_VALUE (type)),
1351: TREE_REAL_CST (arg1))
1352: || REAL_VALUES_LESS (TREE_REAL_CST (arg1),
1353: real_value_from_int_cst (TYPE_MIN_VALUE (type))))
1354: {
1355: warning ("real constant out of range for integer conversion");
1356: return t;
1357: }
1358: #ifndef REAL_ARITHMETIC
1359: {
1360: REAL_VALUE_TYPE d;
1361: int low, high;
1362: int half_word = 1 << (HOST_BITS_PER_INT / 2);
1363:
1364: d = TREE_REAL_CST (arg1);
1365: if (d < 0)
1366: d = -d;
1367:
1368: high = (int) (d / half_word / half_word);
1369: d -= (REAL_VALUE_TYPE) high * half_word * half_word;
1370: low = (unsigned) d;
1371: if (TREE_REAL_CST (arg1) < 0)
1372: neg_double (low, high, &low, &high);
1373: t = build_int_2 (low, high);
1374: }
1375: #else
1376: {
1377: int low, high;
1378: REAL_VALUE_TO_INT (low, high, TREE_REAL_CST (arg1));
1379: t = build_int_2 (low, high);
1380: }
1381: #endif
1382: TREE_TYPE (t) = type;
1383: force_fit_type (t);
1384: }
1385: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1386: TREE_TYPE (t) = type;
1387: }
1388: else if (TREE_CODE (type) == REAL_TYPE)
1389: {
1390: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1391: if (TREE_CODE (arg1) == INTEGER_CST)
1392: return build_real_from_int_cst (type, arg1);
1393: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1394: if (TREE_CODE (arg1) == REAL_CST)
1395: return build_real (type, REAL_VALUE_TRUNCATE (TYPE_MODE (type),
1396: TREE_REAL_CST (arg1)));
1397: }
1398: TREE_CONSTANT (t) = 1;
1399: return t;
1400: }
1401:
1402: /* Return an expr equal to X but certainly not valid as an lvalue. */
1403:
1404: tree
1405: non_lvalue (x)
1406: tree x;
1407: {
1408: tree result;
1409:
1410: /* These things are certainly not lvalues. */
1411: if (TREE_CODE (x) == NON_LVALUE_EXPR
1412: || TREE_CODE (x) == INTEGER_CST
1413: || TREE_CODE (x) == REAL_CST
1414: || TREE_CODE (x) == STRING_CST
1415: || TREE_CODE (x) == ADDR_EXPR)
1416: return x;
1417:
1418: result = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
1419: TREE_CONSTANT (result) = TREE_CONSTANT (x);
1420: return result;
1421: }
1422:
1423: /* Return nonzero if two operands are necessarily equal.
1424: If ONLY_CONST is non-zero, only return non-zero for constants. */
1425:
1426: int
1427: operand_equal_p (arg0, arg1, only_const)
1428: tree arg0, arg1;
1429: int only_const;
1430: {
1431: /* If both types don't have the same signedness, then we can't consider
1432: them equal. We must check this before the STRIP_NOPS calls
1433: because they may change the signedness of the arguments. */
1434: if (TREE_UNSIGNED (TREE_TYPE (arg0)) != TREE_UNSIGNED (TREE_TYPE (arg1)))
1435: return 0;
1436:
1437: STRIP_NOPS (arg0);
1438: STRIP_NOPS (arg1);
1439:
1440: /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
1441: We don't care about side effects in that case because the SAVE_EXPR
1442: takes care of that for us. */
1443: if (TREE_CODE (arg0) == SAVE_EXPR && arg0 == arg1)
1444: return ! only_const;
1445:
1446: if (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))
1447: return 0;
1448:
1449: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1450: && TREE_CODE (arg0) == ADDR_EXPR
1451: && TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0))
1452: return 1;
1453:
1454: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1455: && TREE_CODE (arg0) == INTEGER_CST
1456: && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
1457: && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1))
1458: return 1;
1459:
1.1.1.2 ! root 1460: /* Detect when real constants are equal.
! 1461: But reject weird values because we can't be sure what to do with them. */
1.1 root 1462: if (TREE_CODE (arg0) == TREE_CODE (arg1)
1463: && TREE_CODE (arg0) == REAL_CST
1.1.1.2 ! root 1464: && REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), TREE_REAL_CST (arg1))
! 1465: && !REAL_VALUE_ISINF (TREE_REAL_CST (arg0))
! 1466: && !REAL_VALUE_ISNAN (TREE_REAL_CST (arg0)))
1.1 root 1467: return 1;
1468:
1469: if (only_const)
1470: return 0;
1471:
1472: if (arg0 == arg1)
1473: return 1;
1474:
1475: if (TREE_CODE (arg0) != TREE_CODE (arg1))
1476: return 0;
1477: /* This is needed for conversions and for COMPONENT_REF.
1478: Might as well play it safe and always test this. */
1479: if (TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
1480: return 0;
1481:
1482: switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
1483: {
1484: case '1':
1485: /* Two conversions are equal only if signedness and modes match. */
1486: if ((TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == CONVERT_EXPR)
1487: && (TREE_UNSIGNED (TREE_TYPE (arg0))
1488: != TREE_UNSIGNED (TREE_TYPE (arg1))))
1489: return 0;
1490:
1491: return operand_equal_p (TREE_OPERAND (arg0, 0),
1492: TREE_OPERAND (arg1, 0), 0);
1493:
1494: case '<':
1495: case '2':
1496: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1497: TREE_OPERAND (arg1, 0), 0)
1498: && operand_equal_p (TREE_OPERAND (arg0, 1),
1499: TREE_OPERAND (arg1, 1), 0));
1500:
1501: case 'r':
1502: switch (TREE_CODE (arg0))
1503: {
1504: case INDIRECT_REF:
1505: return operand_equal_p (TREE_OPERAND (arg0, 0),
1506: TREE_OPERAND (arg1, 0), 0);
1507:
1508: case COMPONENT_REF:
1509: case ARRAY_REF:
1510: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1511: TREE_OPERAND (arg1, 0), 0)
1512: && operand_equal_p (TREE_OPERAND (arg0, 1),
1513: TREE_OPERAND (arg1, 1), 0));
1514:
1515: case BIT_FIELD_REF:
1516: return (operand_equal_p (TREE_OPERAND (arg0, 0),
1517: TREE_OPERAND (arg1, 0), 0)
1518: && operand_equal_p (TREE_OPERAND (arg0, 1),
1519: TREE_OPERAND (arg1, 1), 0)
1520: && operand_equal_p (TREE_OPERAND (arg0, 2),
1521: TREE_OPERAND (arg1, 2), 0));
1522: }
1523: break;
1524: }
1525:
1526: return 0;
1527: }
1528:
1529: /* Return nonzero if comparing COMP1 with COMP2
1530: gives the same result as comparing OP1 with OP2.
1531: When in doubt, return 0. */
1532:
1533: static int
1534: comparison_equiv_p (comp1, comp2, op1, op2)
1535: tree comp1, comp2, op1, op2;
1536: {
1537: int unsignedp1, unsignedp2;
1538: tree primop1, primop2;
1539: int correct_width;
1540:
1541: if (operand_equal_p (comp1, op1, 0)
1542: && operand_equal_p (comp2, op2, 0))
1543: return 1;
1544:
1545: if (TREE_CODE (TREE_TYPE (op1)) != INTEGER_TYPE)
1546: return 0;
1547:
1548: if (TREE_TYPE (op1) != TREE_TYPE (op2))
1549: return 0;
1550:
1551: if (TREE_TYPE (comp1) != TREE_TYPE (comp2))
1552: return 0;
1553:
1554: /* Duplicate what shorten_compare does to the comparison operands,
1555: and see if that gives the actual comparison operands, COMP1 and COMP2. */
1556:
1557: /* Throw away any conversions to wider types
1558: already present in the operands. */
1559: primop1 = get_narrower (op1, &unsignedp1);
1560: primop2 = get_narrower (op2, &unsignedp2);
1561:
1562: correct_width = TYPE_PRECISION (TREE_TYPE (op2));
1563: if (unsignedp1 == unsignedp2
1564: && TYPE_PRECISION (TREE_TYPE (primop1)) < correct_width
1565: && TYPE_PRECISION (TREE_TYPE (primop2)) < correct_width)
1566: {
1567: tree type = TREE_TYPE (comp1);
1568:
1569: /* Make sure shorter operand is extended the right way
1570: to match the longer operand. */
1571: primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
1572: primop1);
1573: primop2 = convert (signed_or_unsigned_type (unsignedp2, TREE_TYPE (primop2)),
1574: primop2);
1575:
1576: primop1 = convert (type, primop1);
1577: primop2 = convert (type, primop2);
1578:
1579: if (operand_equal_p (comp1, primop1, 0)
1580: && operand_equal_p (comp2, primop2, 0))
1581: return 1;
1582: }
1583:
1584: return 0;
1585: }
1586:
1587: /* Return a tree for the case when the result of an expression is RESULT
1588: converted to TYPE and OMITTED was previously an operand of the expression
1589: but is now not needed (e.g., we folded OMITTED * 0).
1590:
1591: If OMITTED has side effects, we must evaluate it. Otherwise, just do
1592: the conversion of RESULT to TYPE. */
1593:
1594: static tree
1595: omit_one_operand (type, result, omitted)
1596: tree type, result, omitted;
1597: {
1598: tree t = convert (type, result);
1599:
1600: if (TREE_SIDE_EFFECTS (omitted))
1601: return build (COMPOUND_EXPR, type, omitted, t);
1602:
1603: return t;
1604: }
1605:
1606: /* Return a simplified tree node for the truth-negation of ARG
1607: (perhaps by altering ARG). It is known that ARG is an operation that
1608: returns a truth value (0 or 1). */
1609:
1610: tree
1611: invert_truthvalue (arg)
1612: tree arg;
1613: {
1614: tree type = TREE_TYPE (arg);
1615:
1616: /* For floating-point comparisons, it isn't safe to invert the condition.
1617: So just enclose a TRUTH_NOT_EXPR around what we have. */
1.1.1.2 ! root 1618: if (TREE_CODE_CLASS (TREE_CODE (arg)) == '<'
! 1619: && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REAL_TYPE)
1.1 root 1620: return build1 (TRUTH_NOT_EXPR, type, arg);
1621:
1622: switch (TREE_CODE (arg))
1623: {
1624: case NE_EXPR:
1625: TREE_SET_CODE (arg, EQ_EXPR);
1626: return arg;
1627:
1628: case EQ_EXPR:
1629: TREE_SET_CODE (arg, NE_EXPR);
1630: return arg;
1631:
1632: case GE_EXPR:
1633: TREE_SET_CODE (arg, LT_EXPR);
1634: return arg;
1635:
1636: case GT_EXPR:
1637: TREE_SET_CODE (arg, LE_EXPR);
1638: return arg;
1639:
1640: case LE_EXPR:
1641: TREE_SET_CODE (arg, GT_EXPR);
1642: return arg;
1643:
1644: case LT_EXPR:
1645: TREE_SET_CODE (arg, GE_EXPR);
1646: return arg;
1647:
1648: case INTEGER_CST:
1649: return convert (type, build_int_2 (TREE_INT_CST_LOW (arg) == 0
1650: && TREE_INT_CST_HIGH (arg) == 0, 0));
1651:
1652: case TRUTH_AND_EXPR:
1653: return build (TRUTH_OR_EXPR, type,
1654: invert_truthvalue (TREE_OPERAND (arg, 0)),
1655: invert_truthvalue (TREE_OPERAND (arg, 1)));
1656:
1657: case TRUTH_OR_EXPR:
1658: return build (TRUTH_AND_EXPR, type,
1659: invert_truthvalue (TREE_OPERAND (arg, 0)),
1660: invert_truthvalue (TREE_OPERAND (arg, 1)));
1661:
1662: case TRUTH_ANDIF_EXPR:
1663: return build (TRUTH_ORIF_EXPR, type,
1664: invert_truthvalue (TREE_OPERAND (arg, 0)),
1665: invert_truthvalue (TREE_OPERAND (arg, 1)));
1666:
1667: case TRUTH_ORIF_EXPR:
1668: return build (TRUTH_ANDIF_EXPR, type,
1669: invert_truthvalue (TREE_OPERAND (arg, 0)),
1670: invert_truthvalue (TREE_OPERAND (arg, 1)));
1671:
1672: case TRUTH_NOT_EXPR:
1673: return TREE_OPERAND (arg, 0);
1674:
1675: case COND_EXPR:
1676: return build (COND_EXPR, type, TREE_OPERAND (arg, 0),
1677: invert_truthvalue (TREE_OPERAND (arg, 1)),
1678: invert_truthvalue (TREE_OPERAND (arg, 2)));
1679:
1.1.1.2 ! root 1680: case COMPOUND_EXPR:
! 1681: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
! 1682: invert_truthvalue (TREE_OPERAND (arg, 1)));
! 1683:
1.1 root 1684: case NON_LVALUE_EXPR:
1685: return invert_truthvalue (TREE_OPERAND (arg, 0));
1686:
1687: case NOP_EXPR:
1688: case CONVERT_EXPR:
1689: case FLOAT_EXPR:
1690: return build1 (TREE_CODE (arg), type,
1691: invert_truthvalue (TREE_OPERAND (arg, 0)));
1692:
1693: case BIT_AND_EXPR:
1694: if (! integer_onep (TREE_OPERAND (arg, 1)))
1695: abort ();
1696: return build (EQ_EXPR, type, arg, convert (type, integer_zero_node));
1697: }
1698:
1699: abort ();
1700: }
1701:
1702: /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
1703: operands are another bit-wise operation with a common input. If so,
1704: distribute the bit operations to save an operation and possibly two if
1705: constants are involved. For example, convert
1706: (A | B) & (A | C) into A | (B & C)
1707: Further simplification will occur if B and C are constants.
1708:
1709: If this optimization cannot be done, 0 will be returned. */
1710:
1711: static tree
1712: distribute_bit_expr (code, type, arg0, arg1)
1713: enum tree_code code;
1714: tree type;
1715: tree arg0, arg1;
1716: {
1717: tree common;
1718: tree left, right;
1719:
1720: if (TREE_CODE (arg0) != TREE_CODE (arg1)
1721: || TREE_CODE (arg0) == code
1722: || (TREE_CODE (arg0) != BIT_AND_EXPR
1723: && TREE_CODE (arg0) != BIT_IOR_EXPR))
1724: return 0;
1725:
1726: if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
1727: {
1728: common = TREE_OPERAND (arg0, 0);
1729: left = TREE_OPERAND (arg0, 1);
1730: right = TREE_OPERAND (arg1, 1);
1731: }
1732: else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
1733: {
1734: common = TREE_OPERAND (arg0, 0);
1735: left = TREE_OPERAND (arg0, 1);
1736: right = TREE_OPERAND (arg1, 0);
1737: }
1738: else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
1739: {
1740: common = TREE_OPERAND (arg0, 1);
1741: left = TREE_OPERAND (arg0, 0);
1742: right = TREE_OPERAND (arg1, 1);
1743: }
1744: else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
1745: {
1746: common = TREE_OPERAND (arg0, 1);
1747: left = TREE_OPERAND (arg0, 0);
1748: right = TREE_OPERAND (arg1, 0);
1749: }
1750: else
1751: return 0;
1752:
1753: return fold (build (TREE_CODE (arg0), type, common,
1754: fold (build (code, type, left, right))));
1755: }
1756:
1757: /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
1758: starting at BITPOS. The field is unsigned if UNSIGNEDP is non-zero. */
1759:
1760: static tree
1761: make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
1762: tree inner;
1763: tree type;
1764: int bitsize, bitpos;
1765: int unsignedp;
1766: {
1767: tree result = build (BIT_FIELD_REF, type, inner,
1768: size_int (bitsize), size_int (bitpos));
1769:
1770: TREE_UNSIGNED (result) = unsignedp;
1771:
1772: return result;
1773: }
1774:
1775: /* Optimize a bit-field compare.
1776:
1777: There are two cases: First is a compare against a constant and the
1778: second is a comparison of two items where the fields are at the same
1779: bit position relative to the start of a chunk (byte, halfword, word)
1780: large enough to contain it. In these cases we can avoid the shift
1781: implicit in bitfield extractions.
1782:
1783: For constants, we emit a compare of the shifted constant with the
1784: BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
1785: compared. For two fields at the same position, we do the ANDs with the
1786: similar mask and compare the result of the ANDs.
1787:
1788: CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
1789: COMPARE_TYPE is the type of the comparison, and LHS and RHS
1790: are the left and right operands of the comparison, respectively.
1791:
1792: If the optimization described above can be done, we return the resuling
1793: tree. Otherwise we return zero. */
1794:
1795: static tree
1796: optimize_bit_field_compare (code, compare_type, lhs, rhs)
1797: enum tree_code code;
1798: tree compare_type;
1799: tree lhs, rhs;
1800: {
1801: int lbitpos, lbitsize, rbitpos, rbitsize;
1802: int lnbitpos, lnbitsize, rnbitpos, rnbitsize;
1803: tree type = TREE_TYPE (lhs);
1804: tree signed_type, unsigned_type;
1805: int const_p = TREE_CODE (rhs) == INTEGER_CST;
1806: enum machine_mode lmode, rmode, lnmode, rnmode;
1807: int lunsignedp, runsignedp;
1808: int lvolatilep = 0, rvolatilep = 0;
1809: tree linner, rinner;
1810: tree mask;
1811:
1812: /* Get all the information about the extractions being done. If the bit size
1813: if the same as the size of the underlying object, we aren't doing an
1814: extraction at all and so can do nothing. */
1815: linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &lmode,
1816: &lunsignedp, &lvolatilep);
1817: if (lbitsize == GET_MODE_BITSIZE (lmode))
1818: return 0;
1819:
1820: if (!const_p)
1821: {
1822: /* If this is not a constant, we can only do something if bit positions,
1823: sizes, and signedness are the same. */
1824: rinner = get_inner_reference (rhs, &rbitsize, &rbitpos,
1825: &rmode, &runsignedp, &rvolatilep);
1826:
1827: if (lbitpos != rbitpos || lbitsize != rbitsize
1828: || lunsignedp != runsignedp)
1829: return 0;
1830: }
1831:
1832: /* See if we can find a mode to refer to this field. We should be able to,
1833: but fail if we can't. */
1834: lnmode = get_best_mode (lbitsize, lbitpos,
1835: TYPE_ALIGN (TREE_TYPE (linner)), word_mode,
1836: lvolatilep);
1837: if (lnmode == VOIDmode)
1838: return 0;
1839:
1840: /* Set signed and unsigned types of the precision of this mode for the
1841: shifts below. */
1842: signed_type = type_for_mode (lnmode, 0);
1843: unsigned_type = type_for_mode (lnmode, 1);
1844:
1845: if (! const_p)
1846: {
1847: rnmode = get_best_mode (rbitsize, rbitpos,
1848: TYPE_ALIGN (TREE_TYPE (rinner)), word_mode,
1849: rvolatilep);
1850: if (rnmode == VOIDmode)
1851: return 0;
1852: }
1853:
1854: /* Compute the bit position and size for the new reference and our offset
1855: within it. If the new reference is the same size as the original, we
1856: won't optimize anything, so return zero. */
1857: lnbitsize = GET_MODE_BITSIZE (lnmode);
1858: lnbitpos = lbitpos & ~ (lnbitsize - 1);
1859: lbitpos -= lnbitpos;
1860: if (lnbitsize == lbitsize)
1861: return 0;
1862:
1863: if (! const_p)
1864: {
1865: rnbitsize = GET_MODE_BITSIZE (rnmode);
1866: rnbitpos = rbitpos & ~ (rnbitsize - 1);
1867: rbitpos -= rnbitpos;
1868: if (rnbitsize == rbitsize)
1869: return 0;
1870: }
1871:
1872: #if BYTES_BIG_ENDIAN
1873: lbitpos = lnbitsize - lbitsize - lbitpos;
1874: rbitpos = rnbitsize - rbitsize - rbitpos;
1875: #endif
1876:
1877: /* Make the mask to be used against the extracted field. */
1878: mask = convert (unsigned_type, build_int_2 (~0, ~0));
1879: mask = const_binop (LSHIFT_EXPR, mask, size_int (lnbitsize - lbitsize));
1880: mask = const_binop (RSHIFT_EXPR, mask,
1881: size_int (lnbitsize - lbitsize - lbitpos));
1882:
1883: if (! const_p)
1884: /* If not comparing with constant, just rework the comparison
1885: and return. */
1886: return build (code, compare_type,
1887: build (BIT_AND_EXPR, type,
1888: make_bit_field_ref (linner, type,
1889: lnbitsize, lnbitpos, lunsignedp),
1890: mask),
1891: build (BIT_AND_EXPR, type,
1892: make_bit_field_ref (rinner, type,
1893: rnbitsize, rnbitpos, runsignedp),
1894: mask));
1895:
1896: /* Otherwise, we are handling the constant case. See if the constant is too
1897: big for the field. Warn and return a tree of for 0 (false) if so. We do
1898: this not only for its own sake, but to avoid having to test for this
1899: error case below. If we didn't, we might generate wrong code.
1900:
1901: For unsigned fields, the constant shifted right by the field length should
1902: be all zero. For signed fields, the high-order bits should agree with
1903: the sign bit. */
1904:
1905: if (lunsignedp)
1906: {
1907: if (! integer_zerop (const_binop (RSHIFT_EXPR,
1908: convert (unsigned_type, rhs),
1909: size_int (lbitsize))))
1910: {
1911: warning ("comparison is always %s due to width of bitfield",
1912: code == NE_EXPR ? "one" : "zero");
1913: return convert (compare_type,
1914: (code == NE_EXPR
1915: ? integer_one_node : integer_zero_node));
1916: }
1917: }
1918: else
1919: {
1920: tree tem = const_binop (RSHIFT_EXPR, convert (signed_type, rhs),
1921: size_int (lbitsize - 1));
1922: if (! integer_zerop (tem) && ! integer_all_onesp (tem))
1923: {
1924: warning ("comparison is always %s due to width of bitfield",
1925: code == NE_EXPR ? "one" : "zero");
1926: return convert (compare_type,
1927: (code == NE_EXPR
1928: ? integer_one_node : integer_zero_node));
1929: }
1930: }
1931:
1932: /* Single-bit compares should always be against zero. */
1933: if (lbitsize == 1 && ! integer_zerop (rhs))
1934: {
1935: code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
1936: rhs = convert (type, integer_zero_node);
1937: }
1938:
1939: /* Make a new bitfield reference, shift the constant over the
1940: appropriate number of bits and mask it with the computed mask
1941: (in case this was a signed field). If we changed it, make a new one. */
1942: lhs = make_bit_field_ref (linner, TREE_TYPE (lhs), lnbitsize, lnbitpos,
1943: lunsignedp);
1944:
1945: rhs = fold (build1 (NOP_EXPR, type,
1946: const_binop (BIT_AND_EXPR,
1947: const_binop (LSHIFT_EXPR,
1948: convert (unsigned_type, rhs),
1949: size_int (lbitpos)), mask)));
1950:
1951: return build (code, compare_type,
1952: build (BIT_AND_EXPR, type, lhs, mask),
1953: rhs);
1954: }
1955:
1956: /* Subroutine for the following routine: decode a field reference.
1957:
1958: If EXP is a comparison reference, we return the innermost reference.
1959:
1960: *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
1961: set to the starting bit number.
1962:
1963: If the innermost field can be completely contained in a mode-sized
1964: unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
1965:
1966: *PVOLATILEP is set to 1 if the any expression encountered is volatile;
1967: otherwise it is not changed.
1968:
1969: *PUNSIGNEDP is set to the signedness of the field.
1970:
1971: *PMASK is set to the mask used. This is either contained in a
1972: BIT_AND_EXPR or derived from the width of the field.
1973:
1974: Return 0 if this is not a component reference or is one that we can't
1975: do anything with. */
1976:
1977: static tree
1978: decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp,
1979: pvolatilep, pmask)
1980: tree exp;
1981: int *pbitsize, *pbitpos;
1982: enum machine_mode *pmode;
1983: int *punsignedp, *pvolatilep;
1984: tree *pmask;
1985: {
1986: tree mask = 0;
1987: tree inner;
1988:
1989: STRIP_NOPS (exp);
1990:
1991: if (TREE_CODE (exp) == BIT_AND_EXPR)
1992: {
1993: mask = TREE_OPERAND (exp, 1);
1994: exp = TREE_OPERAND (exp, 0);
1995: STRIP_NOPS (exp); STRIP_NOPS (mask);
1996: if (TREE_CODE (mask) != INTEGER_CST)
1997: return 0;
1998: }
1999:
2000: if (TREE_CODE (exp) != COMPONENT_REF && TREE_CODE (exp) != ARRAY_REF
2001: && TREE_CODE (exp) != BIT_FIELD_REF)
2002: return 0;
2003:
2004: inner = get_inner_reference (exp, pbitsize, pbitpos, pmode,
2005: punsignedp, pvolatilep);
2006:
2007: if (mask == 0)
2008: {
2009: tree unsigned_type = type_for_size (*pbitsize, 1);
2010: int precision = TYPE_PRECISION (unsigned_type);
2011:
2012: mask = convert (unsigned_type, build_int_2 (~0, ~0));
2013: mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize));
2014: mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize));
2015: }
2016:
2017: *pmask = mask;
2018: return inner;
2019: }
2020:
2021: /* Return non-zero if MASK respresents a mask of SIZE ones in the low-order
2022: bit positions. */
2023:
2024: static int
2025: all_ones_mask_p (mask, size)
2026: tree mask;
2027: int size;
2028: {
2029: tree type = TREE_TYPE (mask);
2030: int precision = TYPE_PRECISION (type);
2031:
2032: return
2033: operand_equal_p (mask,
2034: const_binop (RSHIFT_EXPR,
2035: const_binop (LSHIFT_EXPR,
2036: convert (signed_type (type),
2037: build_int_2 (~0, ~0)),
2038: size_int (precision - size)),
2039: size_int (precision - size)), 0);
2040: }
2041:
2042: /* Try to merge two comparisons to the same innermost item.
2043:
2044: For example, if we have p->a == 2 && p->b == 4 and we can make an
2045: object large enough to span both A and B, we can do this with a comparison
2046: against the object ANDed with the a mask.
2047:
2048: If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
2049: operations to do this with one comparison.
2050:
2051: We check for both normal comparisons and the BIT_AND_EXPRs made this by
2052: function and the one above.
2053:
2054: CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
2055: TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
2056:
2057: TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
2058: two operands.
2059:
2060: We return the simplified tree or 0 if no optimization is possible. */
2061:
2062: static tree
2063: merge_component_references (code, truth_type, lhs, rhs)
2064: enum tree_code code;
2065: tree truth_type, lhs, rhs;
2066: {
2067: /* If this is the "or" of two comparisons, we can do something if we
2068: the comparisons are NE_EXPR. If this is the "and", we can do something
2069: if the comparisons are EQ_EXPR. I.e.,
2070: (a->b == 2 && a->c == 4) can become (a->new == NEW).
2071:
2072: WANTED_CODE is this operation code. For single bit fields, we can
2073: convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
2074: comparison for one-bit fields. */
2075:
2076: enum tree_code wanted_code
2077: = (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR) ? EQ_EXPR : NE_EXPR;
2078: enum tree_code lcode, rcode;
2079: tree ll_inner, lr_inner, rl_inner, rr_inner;
2080: int ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
2081: int rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
2082: int xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
2083: int lnbitsize, lnbitpos, rnbitsize, rnbitpos;
2084: int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
2085: enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
2086: enum machine_mode lnmode, rnmode;
2087: tree ll_mask, lr_mask, rl_mask, rr_mask;
2088: tree l_const = 0, r_const = 0;
2089: tree type, result;
2090: int first_bit, end_bit;
2091: int volatilep = 0;
2092:
2093: /* Start by getting the comparison codes and seeing if we may be able
2094: to do something. Then get all the parameters for each side. Fail
2095: if anything is volatile. */
2096:
2097: lcode = TREE_CODE (lhs);
2098: rcode = TREE_CODE (rhs);
2099: if ((lcode != EQ_EXPR && lcode != NE_EXPR)
2100: || (rcode != EQ_EXPR && rcode != NE_EXPR)
2101: || TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
2102: return 0;
2103:
2104: ll_inner = decode_field_reference (TREE_OPERAND (lhs, 0),
2105: &ll_bitsize, &ll_bitpos, &ll_mode,
2106: &ll_unsignedp, &volatilep, &ll_mask);
2107: lr_inner = decode_field_reference (TREE_OPERAND (lhs, 1),
2108: &lr_bitsize, &lr_bitpos, &lr_mode,
2109: &lr_unsignedp, &volatilep, &lr_mask);
2110: rl_inner = decode_field_reference (TREE_OPERAND (rhs, 0),
2111: &rl_bitsize, &rl_bitpos, &rl_mode,
2112: &rl_unsignedp, &volatilep, &rl_mask);
2113: rr_inner = decode_field_reference (TREE_OPERAND (rhs, 1),
2114: &rr_bitsize, &rr_bitpos, &rr_mode,
2115: &rr_unsignedp, &volatilep, &rr_mask);
2116:
2117: /* It must be true that the inner operation on the lhs of each
2118: comparison must be the same if we are to be able to do anything.
2119: Then see if we have constants. If not, the same must be true for
2120: the rhs's. */
2121: if (volatilep || ll_inner == 0 || rl_inner == 0
2122: || ! operand_equal_p (ll_inner, rl_inner, 0))
2123: return 0;
2124:
2125: if (TREE_CODE (TREE_OPERAND (lhs, 1)) == INTEGER_CST
2126: && TREE_CODE (TREE_OPERAND (rhs, 1)) == INTEGER_CST)
2127: l_const = TREE_OPERAND (lhs, 1), r_const = TREE_OPERAND (rhs, 1);
2128: else if (lr_inner == 0 || rr_inner == 0
2129: || ! operand_equal_p (lr_inner, rr_inner, 0))
2130: return 0;
2131:
2132: /* If either comparison code is not correct for our logical operation,
2133: fail. However, we can convert a one-bit comparison against zero into
2134: the opposite comparison against that bit being set in the field. */
2135: if (lcode != wanted_code)
2136: {
2137: if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
2138: l_const = ll_mask;
2139: else
2140: return 0;
2141: }
2142:
2143: if (rcode != wanted_code)
2144: {
2145: if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
2146: r_const = rl_mask;
2147: else
2148: return 0;
2149: }
2150:
2151: /* See if we can find a mode that contains both fields being compared on
2152: the left. If we can't, fail. Otherwise, update all constants and masks
2153: to be relative to a field of that size. */
2154: first_bit = MIN (ll_bitpos, rl_bitpos);
2155: end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
2156: lnmode = get_best_mode (end_bit - first_bit, first_bit,
2157: TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
2158: volatilep);
2159: if (lnmode == VOIDmode)
2160: return 0;
2161:
2162: lnbitsize = GET_MODE_BITSIZE (lnmode);
2163: lnbitpos = first_bit & ~ (lnbitsize - 1);
2164: type = type_for_size (lnbitsize, 1);
2165: xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
2166:
2167: #if BYTES_BIG_ENDIAN
2168: xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
2169: xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
2170: #endif
2171:
2172: ll_mask = const_binop (LSHIFT_EXPR, convert (type, ll_mask),
2173: size_int (xll_bitpos));
2174: rl_mask = const_binop (LSHIFT_EXPR, convert (type, rl_mask),
2175: size_int (xrl_bitpos));
2176:
2177: /* Make sure the constants are interpreted as unsigned, so we
2178: don't have sign bits outside the range of their type. */
2179:
2180: if (l_const)
2181: {
2182: l_const = convert (unsigned_type (TREE_TYPE (l_const)), l_const);
2183: l_const = const_binop (LSHIFT_EXPR, convert (type, l_const),
2184: size_int (xll_bitpos));
2185: }
2186: if (r_const)
2187: {
2188: r_const = convert (unsigned_type (TREE_TYPE (r_const)), r_const);
2189: r_const = const_binop (LSHIFT_EXPR, convert (type, r_const),
2190: size_int (xrl_bitpos));
2191: }
2192:
2193: /* If the right sides are not constant, do the same for it. Also,
2194: disallow this optimization if a size or signedness mismatch occurs
2195: between the left and right sides. */
2196: if (l_const == 0)
2197: {
2198: if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
2199: || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp)
2200: return 0;
2201:
2202: first_bit = MIN (lr_bitpos, rr_bitpos);
2203: end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
2204: rnmode = get_best_mode (end_bit - first_bit, first_bit,
2205: TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
2206: volatilep);
2207: if (rnmode == VOIDmode)
2208: return 0;
2209:
2210: rnbitsize = GET_MODE_BITSIZE (rnmode);
2211: rnbitpos = first_bit & ~ (rnbitsize - 1);
2212: xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
2213:
2214: #if BYTES_BIG_ENDIAN
2215: xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
2216: xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
2217: #endif
2218:
2219: lr_mask = const_binop (LSHIFT_EXPR, convert (type, lr_mask),
2220: size_int (xlr_bitpos));
2221: rr_mask = const_binop (LSHIFT_EXPR, convert (type, rr_mask),
2222: size_int (xrr_bitpos));
2223:
2224: /* Make a mask that corresponds to both fields being compared.
2225: Do this for both items being compared. If the masks agree,
2226: we can do this by masking both and comparing the masked
2227: results. */
2228: ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
2229: lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
2230: if (operand_equal_p (ll_mask, lr_mask, 0) && lnbitsize == rnbitsize)
2231: {
2232: lhs = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
2233: ll_unsignedp || rl_unsignedp);
2234: rhs = make_bit_field_ref (lr_inner, type, rnbitsize, rnbitpos,
2235: lr_unsignedp || rr_unsignedp);
2236: if (! all_ones_mask_p (ll_mask, lnbitsize))
2237: {
2238: lhs = build (BIT_AND_EXPR, type, lhs, ll_mask);
2239: rhs = build (BIT_AND_EXPR, type, rhs, ll_mask);
2240: }
2241: return build (wanted_code, truth_type, lhs, rhs);
2242: }
2243:
2244: /* There is still another way we can do something: If both pairs of
2245: fields being compared are adjacent, we may be able to make a wider
2246: field containing them both. */
2247: if ((ll_bitsize + ll_bitpos == rl_bitpos
2248: && lr_bitsize + lr_bitpos == rr_bitpos)
2249: || (ll_bitpos == rl_bitpos + rl_bitsize
2250: && lr_bitpos == rr_bitpos + rr_bitsize))
2251: return build (wanted_code, truth_type,
2252: make_bit_field_ref (ll_inner, type,
2253: ll_bitsize + rl_bitsize,
2254: MIN (ll_bitpos, rl_bitpos),
2255: ll_unsignedp),
2256: make_bit_field_ref (lr_inner, type,
2257: lr_bitsize + rr_bitsize,
2258: MIN (lr_bitpos, rr_bitpos),
2259: lr_unsignedp));
2260:
2261: return 0;
2262: }
2263:
2264: /* Handle the case of comparisons with constants. If there is something in
2265: common between the masks, those bits of the constants must be the same.
2266: If not, the condition is always false. Test for this to avoid generating
2267: incorrect code below. */
2268: result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask);
2269: if (! integer_zerop (result)
2270: && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const),
2271: const_binop (BIT_AND_EXPR, result, r_const)) != 1)
2272: {
2273: if (wanted_code == NE_EXPR)
2274: {
2275: warning ("`or' of unmatched not-equal tests is always 1");
2276: return convert (truth_type, integer_one_node);
2277: }
2278: else
2279: {
2280: warning ("`and' of mutually exclusive equal-tests is always zero");
2281: return convert (truth_type, integer_zero_node);
2282: }
2283: }
2284:
2285: /* Construct the expression we will return. First get the component
2286: reference we will make. Unless the mask is all ones the width of
2287: that field, perform the mask operation. Then compare with the
2288: merged constant. */
2289: result = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
2290: ll_unsignedp || rl_unsignedp);
2291:
2292: ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
2293: if (! all_ones_mask_p (ll_mask, lnbitsize))
2294: result = build (BIT_AND_EXPR, type, result, ll_mask);
2295:
2296: return build (wanted_code, truth_type, result,
2297: const_binop (BIT_IOR_EXPR, l_const, r_const));
2298: }
2299:
2300: /* Perform constant folding and related simplification of EXPR.
2301: The related simplifications include x*1 => x, x*0 => 0, etc.,
2302: and application of the associative law.
2303: NOP_EXPR conversions may be removed freely (as long as we
2304: are careful not to change the C type of the overall expression)
2305: We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
2306: but we can constant-fold them if they have constant operands. */
2307:
2308: tree
2309: fold (expr)
2310: tree expr;
2311: {
2312: register tree t = expr;
2313: tree t1 = NULL_TREE;
2314: tree type = TREE_TYPE (expr);
2315: register tree arg0, arg1;
2316: register enum tree_code code = TREE_CODE (t);
2317: register int kind;
2318:
2319: /* WINS will be nonzero when the switch is done
2320: if all operands are constant. */
2321:
2322: int wins = 1;
2323:
2324: /* Return right away if already constant. */
2325: if (TREE_CONSTANT (t))
2326: {
2327: if (code == CONST_DECL)
2328: return DECL_INITIAL (t);
2329: return t;
2330: }
2331:
2332: kind = TREE_CODE_CLASS (code);
2333: if (kind == 'e' || kind == '<' || kind == '1' || kind == '2' || kind == 'r')
2334: {
2335: register int len = tree_code_length[(int) code];
2336: register int i;
2337: for (i = 0; i < len; i++)
2338: {
2339: tree op = TREE_OPERAND (t, i);
2340:
2341: if (op == 0)
2342: continue; /* Valid for CALL_EXPR, at least. */
2343:
2344: /* Strip any conversions that don't change the mode. */
2345: STRIP_NOPS (op);
2346:
2347: if (TREE_CODE (op) != INTEGER_CST
2348: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
2349: && TREE_CODE (op) != REAL_CST
2350: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
2351: )
2352: /* Note that TREE_CONSTANT isn't enough:
2353: static var addresses are constant but we can't
2354: do arithmetic on them. */
2355: wins = 0;
2356:
2357: if (i == 0)
2358: arg0 = op;
2359: else if (i == 1)
2360: arg1 = op;
2361: }
2362: }
2363:
2364: /* If this is a commutative operation, and ARG0 is a constant, move it
2365: to ARG1 to reduce the number of tests below. */
2366: if ((code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
2367: || code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
2368: || code == BIT_AND_EXPR)
2369: && (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST))
2370: {
2371: tree tem = arg0;
2372: arg0 = arg1; arg1 = tem;
2373:
2374: TREE_OPERAND (t, 0) = arg0;
2375: TREE_OPERAND (t, 1) = arg1;
2376: }
2377:
2378: /* Now WINS is set as described above,
2379: ARG0 is the first operand of EXPR,
2380: and ARG1 is the second operand (if it has more than one operand).
2381:
2382: First check for cases where an arithmetic operation is applied to a
2383: compound, conditional, or comparison operation. Push the arithmetic
2384: operation inside the compound or conditional to see if any folding
2385: can then be done. Convert comparison to conditional for this purpose.
2386: The also optimizes non-constant cases that used to be done in
2387: expand_expr. */
2388: if (TREE_CODE_CLASS (code) == '1')
2389: {
2390: if (TREE_CODE (arg0) == COMPOUND_EXPR)
2391: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
2392: fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
2393: else if (TREE_CODE (arg0) == COND_EXPR)
2394: return fold (build (COND_EXPR, type, TREE_OPERAND (arg0, 0),
2395: fold (build1 (code, type, TREE_OPERAND (arg0, 1))),
2396: fold (build1 (code, type, TREE_OPERAND (arg0, 2)))));
2397: else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
2398: return fold (build (COND_EXPR, type, arg0,
2399: fold (build1 (code, type, integer_one_node)),
2400: fold (build1 (code, type, integer_zero_node))));
2401: }
2402: else if (TREE_CODE_CLASS (code) == '2')
2403: {
2404: if (TREE_CODE (arg1) == COMPOUND_EXPR)
2405: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
2406: fold (build (code, type, arg0, TREE_OPERAND (arg1, 1))));
2407: else if (TREE_CODE (arg1) == COND_EXPR
2408: || TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
2409: {
2410: tree test, true_value, false_value;
2411:
2412: if (TREE_CODE (arg1) == COND_EXPR)
2413: {
2414: test = TREE_OPERAND (arg1, 0);
2415: true_value = TREE_OPERAND (arg1, 1);
2416: false_value = TREE_OPERAND (arg1, 2);
2417: }
2418: else
2419: {
2420: test = arg1;
2421: true_value = integer_one_node;
2422: false_value = integer_zero_node;
2423: }
2424:
2425: if (TREE_CODE (arg0) != VAR_DECL && TREE_CODE (arg0) != PARM_DECL)
2426: arg0 = save_expr (arg0);
2427: test = fold (build (COND_EXPR, type, test,
2428: fold (build (code, type, arg0, true_value)),
2429: fold (build (code, type, arg0, false_value))));
2430: if (TREE_CODE (arg0) == SAVE_EXPR)
2431: return build (COMPOUND_EXPR, type,
2432: convert (void_type_node, arg0), test);
2433: else
2434: return convert (type, test);
2435: }
2436:
2437: else if (TREE_CODE (arg0) == COMPOUND_EXPR)
2438: return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
2439: fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
2440: else if (TREE_CODE (arg0) == COND_EXPR
2441: || TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
2442: {
2443: tree test, true_value, false_value;
2444:
2445: if (TREE_CODE (arg0) == COND_EXPR)
2446: {
2447: test = TREE_OPERAND (arg0, 0);
2448: true_value = TREE_OPERAND (arg0, 1);
2449: false_value = TREE_OPERAND (arg0, 2);
2450: }
2451: else
2452: {
2453: test = arg0;
2454: true_value = integer_one_node;
2455: false_value = integer_zero_node;
2456: }
2457:
2458: if (TREE_CODE (arg1) != VAR_DECL && TREE_CODE (arg1) != PARM_DECL)
2459: arg1 = save_expr (arg1);
2460: test = fold (build (COND_EXPR, type, test,
2461: fold (build (code, type, true_value, arg1)),
2462: fold (build (code, type, false_value, arg1))));
2463: if (TREE_CODE (arg1) == SAVE_EXPR)
2464: return build (COMPOUND_EXPR, type,
2465: convert (void_type_node, arg1), test);
2466: else
2467: return convert (type, test);
2468: }
2469: }
2470:
2471: switch (code)
2472: {
2473: case INTEGER_CST:
2474: case REAL_CST:
2475: case STRING_CST:
2476: case COMPLEX_CST:
2477: case CONSTRUCTOR:
2478: return t;
2479:
2480: case CONST_DECL:
2481: return fold (DECL_INITIAL (t));
2482:
2483: case NOP_EXPR:
2484: case FLOAT_EXPR:
2485: case CONVERT_EXPR:
2486: case FIX_TRUNC_EXPR:
2487: /* Other kinds of FIX are not handled properly by fold_convert. */
2488: /* Two conversions in a row are not needed unless:
2489: - the intermediate type is narrower than both initial and final, or
2490: - the initial type is a pointer type and the precisions of the
2491: intermediate and final types differ, or
2492: - the final type is a pointer type and the precisions of the
2493: initial and intermediate types differ. */
2494: if ((TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
2495: || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
2496: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
2497: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
2498: ||
2499: TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
2500: > TYPE_PRECISION (TREE_TYPE (t)))
2501: && ((TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
2502: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
2503: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))))
2504: ==
2505: (TREE_UNSIGNED (TREE_TYPE (t))
2506: && (TYPE_PRECISION (TREE_TYPE (t))
2507: > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0))))))
2508: && ! ((TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
2509: == POINTER_TYPE)
2510: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
2511: != TYPE_PRECISION (TREE_TYPE (t))))
2512: && ! (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
2513: && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
2514: != TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0))))))
2515: return convert (TREE_TYPE (t), TREE_OPERAND (TREE_OPERAND (t, 0), 0));
2516:
2517: if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
2518: && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1)))
2519: {
2520: /* Don't leave an assignment inside a conversion. */
2521: tree prev = TREE_OPERAND (t, 0);
2522: TREE_OPERAND (t, 0) = TREE_OPERAND (prev, 1);
2523: /* First do the assignment, then return converted constant. */
2524: t = build (COMPOUND_EXPR, TREE_TYPE (t), prev, fold (t));
2525: TREE_USED (t) = 1;
2526: return t;
2527: }
2528: if (!wins)
2529: {
2530: TREE_CONSTANT (t) = TREE_CONSTANT (arg0);
2531: return t;
2532: }
2533: return fold_convert (t, arg0);
2534:
2535: #if 0 /* This loses on &"foo"[0]. */
2536: case ARRAY_REF:
2537: {
2538: int i;
2539:
2540: /* Fold an expression like: "foo"[2] */
2541: if (TREE_CODE (arg0) == STRING_CST
2542: && TREE_CODE (arg1) == INTEGER_CST
2543: && !TREE_INT_CST_HIGH (arg1)
2544: && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0))
2545: {
2546: t = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0);
2547: TREE_TYPE (t) = TREE_TYPE (TREE_TYPE (arg0));
2548: force_fit_type (t);
2549: }
2550: }
2551: return t;
2552: #endif /* 0 */
2553:
2554: case RANGE_EXPR:
2555: TREE_CONSTANT (t) = wins;
2556: return t;
2557:
2558: case NEGATE_EXPR:
2559: if (wins)
2560: {
2561: if (TREE_CODE (arg0) == INTEGER_CST)
2562: {
2563: if (TREE_INT_CST_LOW (arg0) == 0)
2564: t = build_int_2 (0, - TREE_INT_CST_HIGH (arg0));
2565: else
2566: t = build_int_2 (- TREE_INT_CST_LOW (arg0),
2567: ~ TREE_INT_CST_HIGH (arg0));
2568: TREE_TYPE (t) = type;
2569: force_fit_type (t);
2570: }
2571: else if (TREE_CODE (arg0) == REAL_CST)
2572: t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
2573: TREE_TYPE (t) = type;
2574: }
2575: else if (TREE_CODE (arg0) == NEGATE_EXPR)
2576: return TREE_OPERAND (arg0, 0);
2577:
2578: /* Convert - (a - b) to (b - a) for non-floating-point. */
2579: else if (TREE_CODE (arg0) == MINUS_EXPR && TREE_CODE (type) != REAL_TYPE)
2580: return build (MINUS_EXPR, type, TREE_OPERAND (arg0, 1),
2581: TREE_OPERAND (arg0, 0));
2582:
2583: return t;
2584:
2585: case ABS_EXPR:
2586: if (wins)
2587: {
2588: if (TREE_CODE (arg0) == INTEGER_CST)
2589: {
2590: if (! TREE_UNSIGNED (type)
2591: && TREE_INT_CST_HIGH (arg0) < 0)
2592: {
2593: if (TREE_INT_CST_LOW (arg0) == 0)
2594: t = build_int_2 (0, - TREE_INT_CST_HIGH (arg0));
2595: else
2596: t = build_int_2 (- TREE_INT_CST_LOW (arg0),
2597: ~ TREE_INT_CST_HIGH (arg0));
2598: }
2599: }
2600: else if (TREE_CODE (arg0) == REAL_CST)
2601: {
2602: if (REAL_VALUES_LESS (TREE_REAL_CST (arg0), dconst0))
2603: t = build_real (type,
2604: REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
2605: }
2606: TREE_TYPE (t) = type;
2607: }
2608: else if (TREE_CODE (arg0) == ABS_EXPR || TREE_CODE (arg0) == NEGATE_EXPR)
2609: return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
2610: return t;
2611:
2612: case BIT_NOT_EXPR:
2613: if (wins)
2614: {
2615: if (TREE_CODE (arg0) == INTEGER_CST)
2616: t = build_int_2 (~ TREE_INT_CST_LOW (arg0),
2617: ~ TREE_INT_CST_HIGH (arg0));
2618: TREE_TYPE (t) = type;
2619: force_fit_type (t);
2620: }
2621: else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
2622: return TREE_OPERAND (arg0, 0);
2623: return t;
2624:
2625: case PLUS_EXPR:
2626: /* A + (-B) -> A - B */
2627: if (TREE_CODE (arg1) == NEGATE_EXPR)
2628: return fold (build (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
2629: else if (TREE_CODE (type) != REAL_TYPE)
2630: {
2631: if (integer_zerop (arg1))
2632: return non_lvalue (convert (type, arg0));
2633:
2634: /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
2635: with a constant, and the two constants have no bits in common,
2636: we should treat this as a BIT_IOR_EXPR since this may produce more
2637: simplifications. */
2638: if (TREE_CODE (arg0) == BIT_AND_EXPR
2639: && TREE_CODE (arg1) == BIT_AND_EXPR
2640: && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
2641: && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
2642: && integer_zerop (const_binop (BIT_AND_EXPR,
2643: TREE_OPERAND (arg0, 1),
2644: TREE_OPERAND (arg1, 1))))
2645: {
2646: code = BIT_IOR_EXPR;
2647: goto bit_ior;
2648: }
2649: }
2650: /* In IEEE floating point, x+0 may not equal x. */
2651: else if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
2652: && real_zerop (arg1))
2653: return non_lvalue (convert (type, arg0));
2654: associate:
2655: /* In most languages, can't associate operations on floats
2656: through parentheses. Rather than remember where the parentheses
2657: were, we don't associate floats at all. It shouldn't matter much. */
2658: if (TREE_CODE (type) == REAL_TYPE)
2659: goto binary;
2660: /* The varsign == -1 cases happen only for addition and subtraction.
2661: It says that the arg that was split was really CON minus VAR.
2662: The rest of the code applies to all associative operations. */
2663: if (!wins)
2664: {
2665: tree var, con, tem;
2666: int varsign;
2667:
2668: if (split_tree (arg0, code, &var, &con, &varsign))
2669: {
2670: if (varsign == -1)
2671: {
2672: /* EXPR is (CON-VAR) +- ARG1. */
2673: /* If it is + and VAR==ARG1, return just CONST. */
2674: if (code == PLUS_EXPR && operand_equal_p (var, arg1, 0))
2675: return convert (TREE_TYPE (t), con);
2676:
2677: /* Otherwise return (CON +- ARG1) - VAR. */
2678: TREE_SET_CODE (t, MINUS_EXPR);
2679: TREE_OPERAND (t, 1) = var;
2680: TREE_OPERAND (t, 0)
2681: = fold (build (code, TREE_TYPE (t), con, arg1));
2682: }
2683: else
2684: {
2685: /* EXPR is (VAR+CON) +- ARG1. */
2686: /* If it is - and VAR==ARG1, return just CONST. */
2687: if (code == MINUS_EXPR && operand_equal_p (var, arg1, 0))
2688: return convert (TREE_TYPE (t), con);
2689:
2690: /* Otherwise return VAR +- (ARG1 +- CON). */
2691: TREE_OPERAND (t, 1) = tem
2692: = fold (build (code, TREE_TYPE (t), arg1, con));
2693: TREE_OPERAND (t, 0) = var;
2694: if (integer_zerop (tem)
2695: && (code == PLUS_EXPR || code == MINUS_EXPR))
2696: return convert (type, var);
2697: /* If we have x +/- (c - d) [c an explicit integer]
2698: change it to x -/+ (d - c) since if d is relocatable
2699: then the latter can be a single immediate insn
2700: and the former cannot. */
2701: if (TREE_CODE (tem) == MINUS_EXPR
2702: && TREE_CODE (TREE_OPERAND (tem, 0)) == INTEGER_CST)
2703: {
2704: tree tem1 = TREE_OPERAND (tem, 1);
2705: TREE_OPERAND (tem, 1) = TREE_OPERAND (tem, 0);
2706: TREE_OPERAND (tem, 0) = tem1;
2707: TREE_SET_CODE (t,
2708: (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
2709: }
2710: }
2711: return t;
2712: }
2713:
2714: if (split_tree (arg1, code, &var, &con, &varsign))
2715: {
2716: /* EXPR is ARG0 +- (CON +- VAR). */
2717: if (varsign == -1)
2718: TREE_SET_CODE (t,
2719: (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
2720: if (TREE_CODE (t) == MINUS_EXPR
2721: && operand_equal_p (var, arg0, 0))
2722: {
2723: /* If VAR and ARG0 cancel, return just CON or -CON. */
2724: if (code == PLUS_EXPR)
2725: return convert (TREE_TYPE (t), con);
2726: return fold (build1 (NEGATE_EXPR, TREE_TYPE (t),
2727: convert (TREE_TYPE (t), con)));
2728: }
2729: TREE_OPERAND (t, 0)
2730: = fold (build (code, TREE_TYPE (t), arg0, con));
2731: TREE_OPERAND (t, 1) = var;
2732: if (integer_zerop (TREE_OPERAND (t, 0))
2733: && TREE_CODE (t) == PLUS_EXPR)
2734: return convert (TREE_TYPE (t), var);
2735: return t;
2736: }
2737: }
2738: binary:
2739: #if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC)
2740: if (TREE_CODE (arg1) == REAL_CST)
2741: return t;
2742: #endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */
2743: if (wins)
2744: t1 = const_binop (code, arg0, arg1);
2745: if (t1 != NULL_TREE)
2746: {
2747: /* The return value should always have
2748: the same type as the original expression. */
2749: TREE_TYPE (t1) = TREE_TYPE (t);
2750: return t1;
2751: }
2752: return t;
2753:
2754: case MINUS_EXPR:
2755: if (TREE_CODE (type) != REAL_TYPE)
2756: {
2757: if (! wins && integer_zerop (arg0))
2758: return build1 (NEGATE_EXPR, type, arg1);
2759: if (integer_zerop (arg1))
2760: return non_lvalue (convert (type, arg0));
2761: }
2762: /* Convert A - (-B) to A + B. */
2763: else if (TREE_CODE (arg1) == NEGATE_EXPR)
2764: return fold (build (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
2765: else
2766: {
2767: if (! wins && real_zerop (arg0))
2768: return build1 (NEGATE_EXPR, type, arg1);
2769: /* In IEEE floating point, x-0 may not equal x. */
2770: if (real_zerop (arg1) && TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
2771: return non_lvalue (convert (type, arg0));
2772: }
2773: /* Fold &x - &x. This can happen from &x.foo - &x.
2774: Note that can't be done for certain floats even in non-IEEE formats.
2775: Also note that operand_equal_p is always false is an operand
2776: is volatile. */
2777:
2778: if (operand_equal_p (arg0, arg1,
2779: TREE_CODE (type) == REAL_TYPE))
2780: return convert (type, integer_zero_node);
2781: goto associate;
2782:
2783: case MULT_EXPR:
2784: if (TREE_CODE (type) != REAL_TYPE)
2785: {
2786: if (integer_zerop (arg1))
2787: return omit_one_operand (type, arg1, arg0);
2788: if (integer_onep (arg1))
2789: return non_lvalue (convert (type, arg0));
2790:
2791: /* (a * (1 << b)) is (a << b) */
2792: if (TREE_CODE (arg1) == LSHIFT_EXPR
2793: && integer_onep (TREE_OPERAND (arg1, 0)))
2794: return fold (build (LSHIFT_EXPR, type, arg0,
2795: TREE_OPERAND (arg1, 1)));
2796: if (TREE_CODE (arg0) == LSHIFT_EXPR
2797: && integer_onep (TREE_OPERAND (arg0, 0)))
2798: return fold (build (LSHIFT_EXPR, type, arg1,
2799: TREE_OPERAND (arg0, 1)));
2800: }
2801: /* In IEEE floating point, these optimizations are not correct. */
2802: else
2803: {
2804: if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
2805: && real_zerop (arg1))
2806: return omit_one_operand (type, arg1, arg0);
2807: /* In IEEE floating point, x*1 is not equivalent to x for nans.
2808: However, ANSI says we can drop signals,
2809: so we can do this anyway. */
2810: if (real_onep (arg1))
2811: return non_lvalue (convert (type, arg0));
2812: /* x*2 is x+x */
2813: if (! wins && real_twop (arg1))
2814: {
2815: tree arg = save_expr (arg0);
2816: return build (PLUS_EXPR, type, arg, arg);
2817: }
2818: }
2819: goto associate;
2820:
2821: case BIT_IOR_EXPR:
2822: bit_ior:
2823: if (integer_all_onesp (arg1))
2824: return omit_one_operand (type, arg1, arg0);
2825: if (integer_zerop (arg1))
2826: return non_lvalue (convert (type, arg0));
2827: t1 = distribute_bit_expr (code, type, arg0, arg1);
2828: if (t1 != NULL_TREE)
2829: return t1;
2830: goto associate;
2831:
2832: case BIT_XOR_EXPR:
2833: if (integer_zerop (arg1))
2834: return non_lvalue (convert (type, arg0));
2835: if (integer_all_onesp (arg1))
2836: return fold (build1 (BIT_NOT_EXPR, type, arg0));
2837: goto associate;
2838:
2839: case BIT_AND_EXPR:
2840: bit_and:
2841: if (integer_all_onesp (arg1))
2842: return non_lvalue (convert (type, arg0));
2843: if (integer_zerop (arg1))
2844: return omit_one_operand (type, arg1, arg0);
2845: t1 = distribute_bit_expr (code, type, arg0, arg1);
2846: if (t1 != NULL_TREE)
2847: return t1;
2848: /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */
2849: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR
2850: && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0))))
2851: {
2852: int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)));
2853: if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_INT
2854: && (~TREE_INT_CST_LOW (arg0) & ((1 << prec) - 1)) == 0)
2855: return build1 (NOP_EXPR, type, TREE_OPERAND (arg1, 0));
2856: }
2857: if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
2858: && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
2859: {
2860: int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
2861: if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_INT
2862: && (~TREE_INT_CST_LOW (arg1) & ((1 << prec) - 1)) == 0)
2863: return build1 (NOP_EXPR, type, TREE_OPERAND (arg0, 0));
2864: }
2865: goto associate;
2866:
2867: case BIT_ANDTC_EXPR:
2868: if (integer_all_onesp (arg0))
2869: return non_lvalue (convert (type, arg1));
2870: if (integer_zerop (arg0))
2871: return omit_one_operand (type, arg0, arg1);
2872: if (TREE_CODE (arg1) == INTEGER_CST)
2873: {
2874: arg1 = fold (build1 (BIT_NOT_EXPR, type, arg1));
2875: code = BIT_AND_EXPR;
2876: goto bit_and;
2877: }
2878: goto binary;
2879:
2880: case TRUNC_DIV_EXPR:
2881: case ROUND_DIV_EXPR:
2882: case FLOOR_DIV_EXPR:
2883: case CEIL_DIV_EXPR:
2884: case EXACT_DIV_EXPR:
2885: case RDIV_EXPR:
2886: if (integer_onep (arg1))
2887: return non_lvalue (convert (type, arg0));
2888: if (integer_zerop (arg1))
2889: return t;
2890: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
2891: #ifndef REAL_INFINITY
2892: if (TREE_CODE (arg1) == REAL_CST
2893: && real_zerop (arg1))
2894: return t;
2895: #endif
2896: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
2897:
2898: goto binary;
2899:
2900: case CEIL_MOD_EXPR:
2901: case FLOOR_MOD_EXPR:
2902: case ROUND_MOD_EXPR:
2903: case TRUNC_MOD_EXPR:
2904: if (integer_onep (arg1))
2905: return omit_one_operand (type, integer_zero_node, arg0);
2906: if (integer_zerop (arg1))
2907: return t;
2908: goto binary;
2909:
2910: case LSHIFT_EXPR:
2911: case RSHIFT_EXPR:
2912: case LROTATE_EXPR:
2913: case RROTATE_EXPR:
2914: if (integer_zerop (arg1))
2915: return non_lvalue (convert (type, arg0));
2916: /* Since negative shift count is not well-defined,
2917: don't try to compute it in the compiler. */
2918: if (tree_int_cst_lt (arg1, integer_zero_node))
2919: return t;
2920: goto binary;
2921:
2922: case MIN_EXPR:
2923: if (operand_equal_p (arg0, arg1, 0))
2924: return arg0;
2925: if (TREE_CODE (type) == INTEGER_TYPE
2926: && operand_equal_p (arg1, TYPE_MIN_VALUE (type), 1))
2927: return omit_one_operand (type, arg1, arg0);
2928: goto associate;
2929:
2930: case MAX_EXPR:
2931: if (operand_equal_p (arg0, arg1, 0))
2932: return arg0;
2933: if (TREE_CODE (type) == INTEGER_TYPE
2934: && operand_equal_p (arg1, TYPE_MAX_VALUE (type), 1))
2935: return omit_one_operand (type, arg1, arg0);
2936: goto associate;
2937:
2938: case TRUTH_NOT_EXPR:
2939: /* Note that the operand of this must be an int
2940: and its values must be 0 or 1.
2941: ("true" is a fixed value perhaps depending on the language,
2942: but we don't handle values other than 1 correctly yet.) */
2943: return invert_truthvalue (arg0);
2944:
2945: case TRUTH_ANDIF_EXPR:
2946: /* Note that the operands of this must be ints
2947: and their values must be 0 or 1.
2948: ("true" is a fixed value perhaps depending on the language.) */
2949: /* If first arg is constant zero, return it. */
2950: if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
2951: return arg0;
2952: case TRUTH_AND_EXPR:
2953: /* If either arg is constant true, drop it. */
2954: if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
2955: return non_lvalue (arg1);
2956: if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
2957: return non_lvalue (arg0);
2958: /* Both known to be zero => return zero. */
2959: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2960: return arg0;
2961:
2962: truth_andor:
2963: /* Check for the possibility of merging component references. If our
2964: lhs is another similar operation, try to merge its rhs with our
2965: rhs. Then try to merge our lhs and rhs. */
2966: if (optimize)
2967: {
2968: tree tem;
2969:
2970: if (TREE_CODE (arg0) == code)
2971: {
2972: tem = merge_component_references (code, type,
2973: TREE_OPERAND (arg0, 1), arg1);
2974: if (tem)
2975: return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
2976: }
2977:
2978: tem = merge_component_references (code, type, arg0, arg1);
2979: if (tem)
2980: return tem;
2981: }
2982: return t;
2983:
2984: case TRUTH_ORIF_EXPR:
2985: /* Note that the operands of this must be ints
2986: and their values must be 0 or true.
2987: ("true" is a fixed value perhaps depending on the language.) */
2988: /* If first arg is constant true, return it. */
2989: if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
2990: return arg0;
2991: case TRUTH_OR_EXPR:
2992: /* If either arg is constant zero, drop it. */
2993: if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
2994: return non_lvalue (arg1);
2995: if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1))
2996: return non_lvalue (arg0);
2997: /* Both known to be true => return true. */
2998: if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2999: return arg0;
3000: goto truth_andor;
3001:
3002: case EQ_EXPR:
3003: case NE_EXPR:
3004: case LT_EXPR:
3005: case GT_EXPR:
3006: case LE_EXPR:
3007: case GE_EXPR:
3008: /* If one arg is a constant integer, put it last. */
3009: if (TREE_CODE (arg0) == INTEGER_CST
3010: && TREE_CODE (arg1) != INTEGER_CST)
3011: {
3012: TREE_OPERAND (t, 0) = arg1;
3013: TREE_OPERAND (t, 1) = arg0;
3014: arg0 = TREE_OPERAND (t, 0);
3015: arg1 = TREE_OPERAND (t, 1);
3016: switch (code)
3017: {
3018: case GT_EXPR:
3019: code = LT_EXPR;
3020: break;
3021: case GE_EXPR:
3022: code = LE_EXPR;
3023: break;
3024: case LT_EXPR:
3025: code = GT_EXPR;
3026: break;
3027: case LE_EXPR:
3028: code = GE_EXPR;
3029: break;
3030: }
3031: TREE_SET_CODE (t, code);
3032: }
3033:
3034: /* Convert foo++ == CONST into ++foo == CONST + INCR.
3035: First, see if one arg is constant; find the constant arg
3036: and the other one. */
3037: {
3038: tree constop = 0, varop;
3039: tree *constoploc;
3040:
3041: if (TREE_CONSTANT (arg1))
3042: constoploc = &TREE_OPERAND (t, 1), constop = arg1, varop = arg0;
3043: if (TREE_CONSTANT (arg0))
3044: constoploc = &TREE_OPERAND (t, 0), constop = arg0, varop = arg1;
3045:
3046: if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR)
3047: {
3048: tree newconst
3049: = fold (build (PLUS_EXPR, TREE_TYPE (varop),
3050: constop, TREE_OPERAND (varop, 1)));
3051: /* This optimization is invalid for ordered comparisons
3052: if CONST+INCR overflows or if foo+incr might overflow.
3053: For pointer types we assume overflow doesn't happen. */
3054: if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
3055: || code == EQ_EXPR || code == NE_EXPR)
3056: {
3057: /* This optimization is invalid for floating point
3058: if adding one to the constant does not change it. */
3059: if (TREE_CODE (TREE_TYPE (newconst)) != REAL_TYPE
3060: || !REAL_VALUES_EQUAL (TREE_REAL_CST (newconst),
3061: TREE_REAL_CST (constop)))
3062: {
3063: TREE_SET_CODE (varop, PREINCREMENT_EXPR);
3064: *constoploc = newconst;
3065: return t;
3066: }
3067: }
3068: }
3069: else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
3070: {
3071: tree newconst
3072: = fold (build (MINUS_EXPR, TREE_TYPE (varop),
3073: constop, TREE_OPERAND (varop, 1)));
3074: if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
3075: || code == EQ_EXPR || code == NE_EXPR)
3076: {
3077: if (TREE_CODE (TREE_TYPE (newconst)) != REAL_TYPE
3078: || !REAL_VALUES_EQUAL (TREE_REAL_CST (newconst),
3079: TREE_REAL_CST (constop)))
3080: {
3081: TREE_SET_CODE (varop, PREDECREMENT_EXPR);
3082: *constoploc = newconst;
3083: return t;
3084: }
3085: }
3086: }
3087: }
3088:
3089: /* Change X >= CST to X > (CST - 1) if CST is positive. */
3090: if (TREE_CODE (arg1) == INTEGER_CST
3091: && TREE_CODE (arg0) != INTEGER_CST
3092: && ! tree_int_cst_lt (arg1, integer_one_node))
3093: {
3094: switch (TREE_CODE (t))
3095: {
3096: case GE_EXPR:
3097: code = GT_EXPR;
3098: TREE_SET_CODE (t, code);
3099: arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node);
3100: TREE_OPERAND (t, 1) = arg1;
3101: break;
3102:
3103: case LT_EXPR:
3104: code = LE_EXPR;
3105: TREE_SET_CODE (t, code);
3106: arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node);
3107: TREE_OPERAND (t, 1) = arg1;
3108: }
3109: }
3110:
3111: /* If we are comparing the result of a comparison to a constant,
3112: we can often simplify this, since the comparison result is known to
3113: be either 0 or 1. We can ignore conversions if the LHS is a
3114: comparison. */
3115:
3116: if (TREE_CODE (arg1) == INTEGER_CST)
3117: {
3118: tree comparison = arg0;
3119:
3120: while (TREE_CODE (comparison) == NOP_EXPR
3121: || TREE_CODE (comparison) == CONVERT_EXPR)
3122: comparison = TREE_OPERAND (comparison, 0);
3123:
3124: if (TREE_CODE_CLASS (TREE_CODE (comparison)) == '<'
3125: || TREE_CODE (comparison) == TRUTH_ANDIF_EXPR
3126: || TREE_CODE (comparison) == TRUTH_ORIF_EXPR
3127: || TREE_CODE (comparison) == TRUTH_AND_EXPR
3128: || TREE_CODE (comparison) == TRUTH_OR_EXPR
3129: || TREE_CODE (comparison) == TRUTH_NOT_EXPR)
3130: {
3131: /* We do different things depending on whether the
3132: constant being compared against is < 0, == 0, == 1, or > 1.
3133: Each of those cases, in order, corresponds to one
3134: character in a string. The value of the character is
3135: the result to return. A '0' or '1' means return always true
3136: or always false, respectively; 'c' means return the result
3137: of the comparison, and 'i' means return the result of the
3138: inverted comparison. */
3139:
3140: char *actions, action;
3141:
3142: switch (code)
3143: {
3144: case EQ_EXPR:
3145: actions = "0ic0";
3146: break;
3147: case NE_EXPR:
3148: actions = "1ci1";
3149: break;
3150: case LE_EXPR:
3151: actions = "0i11";
3152: break;
3153: case LT_EXPR:
3154: actions = "00i1";
3155: break;
3156: case GE_EXPR:
3157: actions = "11c0";
3158: break;
3159: case GT_EXPR:
3160: actions = "1c00";
3161: break;
3162: }
3163:
3164: if (tree_int_cst_lt (arg1, integer_zero_node))
3165: action = actions[0];
3166: else if (integer_zerop (arg1))
3167: action = actions[1];
3168: else if (integer_onep (arg1))
3169: action = actions[2];
3170: else
3171: action = actions[3];
3172:
3173: switch (action)
3174: {
3175: case '0':
3176: return omit_one_operand (type, integer_zero_node,
3177: comparison);
3178:
3179: case '1':
3180: return omit_one_operand (type, integer_one_node, comparison);
3181:
3182: case 'c':
3183: return convert (type, comparison);
3184:
3185: case 'i':
3186: return convert (type, invert_truthvalue (comparison));
3187:
3188: default:
3189: abort ();
3190: }
3191: }
3192: }
3193:
3194: /* If this is an EQ or NE comparison with zero and ARG0 is
3195: (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
3196: two operations, but the latter can be done in one less insn
3197: one machine that have only two-operand insns or on which a
3198: constant cannot be the first operand. */
3199: if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
3200: && TREE_CODE (arg0) == BIT_AND_EXPR)
3201: {
3202: if (TREE_CODE (TREE_OPERAND (arg0, 0)) == LSHIFT_EXPR
3203: && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)))
3204: return
3205: fold (build (code, type,
3206: build (BIT_AND_EXPR, TREE_TYPE (arg0),
3207: build (RSHIFT_EXPR,
3208: TREE_TYPE (TREE_OPERAND (arg0, 0)),
3209: TREE_OPERAND (arg0, 1),
3210: TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)),
3211: convert (TREE_TYPE (arg0),
3212: integer_one_node)),
3213: arg1));
3214: else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
3215: && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
3216: return
3217: fold (build (code, type,
3218: build (BIT_AND_EXPR, TREE_TYPE (arg0),
3219: build (RSHIFT_EXPR,
3220: TREE_TYPE (TREE_OPERAND (arg0, 1)),
3221: TREE_OPERAND (arg0, 0),
3222: TREE_OPERAND (TREE_OPERAND (arg0, 1), 1)),
3223: convert (TREE_TYPE (arg0),
3224: integer_one_node)),
3225: arg1));
3226: }
3227:
3228: /* If this is an NE comparison of zero with an AND of one, remove the
3229: comparison since the AND will give the correct value. */
3230: if (code == NE_EXPR && integer_zerop (arg1)
3231: && TREE_CODE (arg0) == BIT_AND_EXPR
3232: && integer_onep (TREE_OPERAND (arg0, 1)))
3233: return convert (type, arg0);
3234:
3235: /* If we have (A & C) == C where C is a power of 2, convert this into
3236: (A & C) != 0. Similarly for NE_EXPR. */
3237: if ((code == EQ_EXPR || code == NE_EXPR)
3238: && TREE_CODE (arg0) == BIT_AND_EXPR
3239: && integer_pow2p (TREE_OPERAND (arg0, 1))
3240: && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
3241: return build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
3242: arg0, integer_zero_node);
3243:
3244: /* Simplify comparison of an integer with itself.
3245: (This may not be safe with IEEE floats if they are nans.) */
3246: if (operand_equal_p (arg0, arg1, 0)
3247: && TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE)
3248: {
3249: switch (code)
3250: {
3251: case EQ_EXPR:
3252: case GE_EXPR:
3253: case LE_EXPR:
3254: t = build_int_2 (1, 0);
3255: TREE_TYPE (t) = type;
3256: return t;
3257: case NE_EXPR:
3258: case GT_EXPR:
3259: case LT_EXPR:
3260: t = build_int_2 (0, 0);
3261: TREE_TYPE (t) = type;
3262: return t;
3263: }
3264: }
3265:
3266: /* An unsigned comparison against 0 can be simplified. */
3267: if (integer_zerop (arg1)
3268: && (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
3269: || TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE)
3270: && TREE_UNSIGNED (TREE_TYPE (arg1)))
3271: {
3272: switch (TREE_CODE (t))
3273: {
3274: case GT_EXPR:
3275: TREE_SET_CODE (t, NE_EXPR);
3276: break;
3277: case LE_EXPR:
3278: TREE_SET_CODE (t, EQ_EXPR);
3279: break;
3280: case GE_EXPR:
3281: return omit_one_operand (integer_type_node,
3282: integer_one_node, arg0);
3283: case LT_EXPR:
3284: return omit_one_operand (integer_type_node,
3285: integer_zero_node, arg0);
3286: }
3287: }
3288:
3289: /* To compute GT, swap the arguments and do LT.
3290: To compute GE, do LT and invert the result.
3291: To compute LE, swap the arguments, do LT and invert the result.
3292: To compute NE, do EQ and invert the result. */
3293: if (code == LE_EXPR || code == GT_EXPR)
3294: {
3295: register tree temp = arg0;
3296: arg0 = arg1;
3297: arg1 = temp;
3298: }
3299:
3300: /* Compute a result for LT or EQ if args permit;
3301: otherwise return T. */
3302: if (TREE_CODE (arg0) == INTEGER_CST
3303: && TREE_CODE (arg1) == INTEGER_CST)
3304: {
3305: if (code == EQ_EXPR || code == NE_EXPR)
3306: t = build_int_2
3307: (TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
3308: && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1),
3309: 0);
3310: else
3311: t = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0))
3312: ? INT_CST_LT_UNSIGNED (arg0, arg1)
3313: : INT_CST_LT (arg0, arg1)),
3314: 0);
3315: }
3316: /* Assume a nonexplicit constant cannot equal an explicit one,
3317: since such code would be undefined anyway.
3318: Exception: on sysvr4, using #pragma weak,
3319: a label can come out as 0. */
3320: else if (TREE_CODE (arg1) == INTEGER_CST
3321: && !integer_zerop (arg1)
3322: && TREE_CONSTANT (arg0)
3323: && TREE_CODE (arg0) == ADDR_EXPR
3324: && (code == EQ_EXPR || code == NE_EXPR))
3325: {
3326: t = build_int_2 (0, 0);
3327: }
3328: /* Two real constants can be compared explicitly. */
3329: else if (TREE_CODE (arg0) == REAL_CST
3330: && TREE_CODE (arg1) == REAL_CST)
3331: {
3332: if (code == EQ_EXPR || code == NE_EXPR)
3333: t = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
3334: TREE_REAL_CST (arg1)),
3335: 0);
3336: else
3337: t = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0),
3338: TREE_REAL_CST (arg1)),
3339: 0);
3340: }
3341: else if ((TREE_CODE (arg0) == COMPONENT_REF
3342: || TREE_CODE (arg0) == BIT_FIELD_REF)
3343: && (code == EQ_EXPR || code == NE_EXPR)
3344: /* Handle the constant case even without -O
3345: to make sure the warnings are given. */
3346: && (optimize || TREE_CODE (arg1) == INTEGER_CST))
3347: {
3348: tree tem = optimize_bit_field_compare (code, type, arg0, arg1);
3349: return tem ? tem : t;
3350: }
3351:
3352: /* If what we want is other than LT or EQ, invert the result. */
1.1.1.2 ! root 3353: if ((code == GE_EXPR || code == LE_EXPR || code == NE_EXPR)
! 3354: && TREE_CODE (t) == INTEGER_CST)
1.1 root 3355: TREE_INT_CST_LOW (t) ^= 1;
3356: TREE_TYPE (t) = type;
3357: return t;
3358:
3359: case COND_EXPR:
3360: if (TREE_CODE (arg0) == INTEGER_CST)
3361: return TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1));
3362: else if (operand_equal_p (arg1, TREE_OPERAND (expr, 2), 0))
3363: return omit_one_operand (type, arg1, arg0);
3364: else if (integer_onep (TREE_OPERAND (t, 1))
3365: && integer_zerop (TREE_OPERAND (t, 2))
3366: /* If we try to convert TREE_OPERAND (t, 0) to our type, the
3367: call to fold will try to move the conversion inside
3368: a COND, which will recurse. In that case, the COND_EXPR
3369: is probably the best choice, so leave it alone. */
3370: && type == TREE_TYPE (arg0))
3371: return arg0;
3372: else if (integer_zerop (arg1) && integer_onep (TREE_OPERAND (t, 2)))
3373: return convert (type, invert_truthvalue (arg0));
3374:
3375: /* If we have (a >= 0 ? a : -a) or the same with ">", this is an
3376: absolute value expression. */
3377:
3378: if ((TREE_CODE (arg0) == GE_EXPR || TREE_CODE (arg0) == GT_EXPR)
3379: && integer_zerop (TREE_OPERAND (arg0, 1))
3380: && TREE_CODE (TREE_OPERAND (t, 2)) == NEGATE_EXPR
3381: && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
3382: && operand_equal_p (TREE_OPERAND (TREE_OPERAND (t, 2), 0), arg1, 0))
3383: return fold (build1 (ABS_EXPR, type, arg1));
3384:
3385: /* Similarly for (a <= 0 ? -a : a). */
3386:
3387: if ((TREE_CODE (arg0) == LE_EXPR || TREE_CODE (arg0) == LT_EXPR)
3388: && integer_zerop (TREE_OPERAND (arg0, 1))
3389: && TREE_CODE (arg1) == NEGATE_EXPR
3390: && operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (t, 2), 0)
3391: && operand_equal_p (TREE_OPERAND (arg1, 0), TREE_OPERAND (t, 2), 0))
3392: return fold (build1 (ABS_EXPR, type, TREE_OPERAND (t, 2)));
3393:
3394: /* If we have a GT, GE, LT, or LE comparison, this might be a MIN or
3395: MAX test. If so, make a MIN_EXPR or MAX_EXPR. */
3396:
3397: if (TREE_CODE (arg0) == GT_EXPR || TREE_CODE (arg0) == GE_EXPR
3398: || TREE_CODE (arg0) == LT_EXPR || TREE_CODE (arg0) == LE_EXPR)
3399: {
3400: tree hi_true, lo_true;
3401:
3402: if (TREE_CODE (arg0) == GT_EXPR || TREE_CODE (arg0) == GE_EXPR)
3403: hi_true = TREE_OPERAND (arg0, 0), lo_true = TREE_OPERAND (arg0, 1);
3404: else
3405: hi_true = TREE_OPERAND (arg0, 1), lo_true = TREE_OPERAND (arg0, 0);
3406:
3407: if (comparison_equiv_p (hi_true, lo_true, arg1, TREE_OPERAND (t, 2)))
3408: /* We use arg1 and the other arg because they must have the same
3409: type as the intended result.
3410: The values being compared might have a narrower type. */
3411: return fold (build (MAX_EXPR, type, arg1, TREE_OPERAND (t, 2)));
3412: else if (comparison_equiv_p (lo_true, hi_true,
3413: arg1, TREE_OPERAND (t, 2)))
3414: return fold (build (MIN_EXPR, type, arg1, TREE_OPERAND (t, 2)));
3415: }
3416:
3417: /* Look for cases when we are comparing some expression A for equality
3418: with zero and the result is to be zero if A is zero. In that case,
3419: check to see if the value of A is the same as the value to be
3420: returned when A is non-zero.
3421:
3422: There are two cases: One is where we have (A ? A : 0) and the
3423: other is when a single bit is tested (e.g., A & 2 ? 2 : 0).
3424: In these cases, the result of the conditional is simply A.
3425:
3426: Start by setting ARG1 to be the true value and ARG0 to be the thing
3427: compared with zero. Then check for the two cases above. */
3428:
3429: if (integer_zerop (TREE_OPERAND (t, 2))
3430: && TREE_CODE (arg0) == NE_EXPR
3431: && integer_zerop (TREE_OPERAND (arg0, 1))
3432: && ! TREE_SIDE_EFFECTS (arg1))
3433: ;
3434: else if (integer_zerop (arg1)
3435: && TREE_CODE (arg0) == EQ_EXPR
3436: && integer_zerop (TREE_OPERAND (arg0, 1))
3437: && ! TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
3438: arg1 = TREE_OPERAND (t, 2);
3439: else
3440: return t;
3441:
3442: arg0 = TREE_OPERAND (arg0, 0);
3443:
3444: STRIP_NOPS (arg1);
3445: if (operand_equal_p (arg0, arg1, 0)
3446: || (TREE_CODE (arg1) == INTEGER_CST
3447: && integer_pow2p (arg1)
3448: && TREE_CODE (arg0) == BIT_AND_EXPR
3449: && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)))
3450: return convert (type, arg0);
3451: return t;
3452:
3453: case COMPOUND_EXPR:
3454: if (!TREE_SIDE_EFFECTS (arg0))
3455: return arg1;
3456: return t;
3457:
3458: default:
3459: return t;
3460: } /* switch (code) */
3461: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.