OSDN Git Service

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