Annotation of gcc/fold-const.c, revision 1.1.1.4

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.