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