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