OSDN Git Service

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