OSDN Git Service

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