]> gcc.gnu.org Git - gcc.git/blame - gcc/fold-const.c
If errorcount nonzero, don't call abort if the function is already defined.
[gcc.git] / gcc / fold-const.c
CommitLineData
6d716ca8 1/* Fold a constant sub-tree into a single node for C-compiler
f8dac6eb 2 Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc.
6d716ca8
RS
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
a35311b0
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
6d716ca8 20
6dc42e49 21/*@@ This file should be rewritten to use an arbitrary precision
6d716ca8
RS
22 @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
23 @@ Perhaps the routines could also be used for bc/dc, and made a lib.
24 @@ The routines that translate from the ap rep should
25 @@ warn if precision et. al. is lost.
26 @@ This would also make life easier when this technology is used
27 @@ for cross-compilers. */
28
29
f8dac6eb 30/* The entry points in this file are fold, size_int_wide, size_binop
0da6f3db 31 and force_fit_type.
6d716ca8
RS
32
33 fold takes a tree as argument and returns a simplified tree.
34
35 size_binop takes a tree code for an arithmetic operation
36 and two operands that are trees, and produces a tree for the
37 result, assuming the type comes from `sizetype'.
38
39 size_int takes an integer value, and creates a tree constant
0da6f3db
DE
40 with type from `sizetype'.
41
42 force_fit_type takes a constant and prior overflow indicator, and
43 forces the value to fit the type. It returns an overflow indicator. */
44
e9a25f70 45#include "config.h"
2fde567e 46#include "system.h"
6d716ca8 47#include <setjmp.h>
6d716ca8
RS
48#include "flags.h"
49#include "tree.h"
efe3eb65 50#include "rtl.h"
10f0ad3d 51#include "toplev.h"
6d716ca8 52
7c7b029d
RS
53/* Handle floating overflow for `const_binop'. */
54static jmp_buf float_error;
55
ebde8a27
RK
56static void encode PROTO((HOST_WIDE_INT *,
57 HOST_WIDE_INT, HOST_WIDE_INT));
58static void decode PROTO((HOST_WIDE_INT *,
59 HOST_WIDE_INT *, HOST_WIDE_INT *));
60int div_and_round_double PROTO((enum tree_code, int, HOST_WIDE_INT,
6dc7571d
RK
61 HOST_WIDE_INT, HOST_WIDE_INT,
62 HOST_WIDE_INT, HOST_WIDE_INT *,
63 HOST_WIDE_INT *, HOST_WIDE_INT *,
64 HOST_WIDE_INT *));
ebde8a27
RK
65static int split_tree PROTO((tree, enum tree_code, tree *,
66 tree *, int *));
e9a25f70 67static tree int_const_binop PROTO((enum tree_code, tree, tree, int, int));
ebde8a27
RK
68static tree const_binop PROTO((enum tree_code, tree, tree, int));
69static tree fold_convert PROTO((tree, tree));
6dc7571d
RK
70static enum tree_code invert_tree_comparison PROTO((enum tree_code));
71static enum tree_code swap_tree_comparison PROTO((enum tree_code));
ebde8a27 72static int truth_value_p PROTO((enum tree_code));
6dc7571d 73static int operand_equal_for_comparison_p PROTO((tree, tree, tree));
ebde8a27
RK
74static int twoval_comparison_p PROTO((tree, tree *, tree *, int *));
75static tree eval_subst PROTO((tree, tree, tree, tree, tree));
76static tree omit_one_operand PROTO((tree, tree, tree));
4ab3cb65 77static tree pedantic_omit_one_operand PROTO((tree, tree, tree));
6dc7571d 78static tree distribute_bit_expr PROTO((enum tree_code, tree, tree, tree));
ebde8a27 79static tree make_bit_field_ref PROTO((tree, tree, int, int, int));
6dc7571d
RK
80static tree optimize_bit_field_compare PROTO((enum tree_code, tree,
81 tree, tree));
82static tree decode_field_reference PROTO((tree, int *, int *,
83 enum machine_mode *, int *,
d4453ee5 84 int *, tree *, tree *));
ebde8a27
RK
85static int all_ones_mask_p PROTO((tree, int));
86static int simple_operand_p PROTO((tree));
87static tree range_binop PROTO((enum tree_code, tree, tree, int,
88 tree, int));
89static tree make_range PROTO((tree, int *, tree *, tree *));
90static tree build_range_check PROTO((tree, tree, int, tree, tree));
91static int merge_ranges PROTO((int *, tree *, tree *, int, tree, tree,
92 int, tree, tree));
93static tree fold_range_test PROTO((tree));
94static tree unextend PROTO((tree, int, int, tree));
95static tree fold_truthop PROTO((enum tree_code, tree, tree, tree));
b5f3b6b6 96static tree strip_compound_expr PROTO((tree, tree));
39dfb55a 97static int multiple_of_p PROTO((tree, tree, tree));
f628873f 98static tree constant_boolean_node PROTO((int, tree));
d35357ed
RS
99
100#ifndef BRANCH_COST
101#define BRANCH_COST 1
102#endif
fe3e8e40 103
fe3e8e40
RS
104/* Suppose A1 + B1 = SUM1, using 2's complement arithmetic ignoring overflow.
105 Suppose A, B and SUM have the same respective signs as A1, B1, and SUM1.
106 Then this yields nonzero if overflow occurred during the addition.
107 Overflow occurs if A and B have the same sign, but A and SUM differ in sign.
108 Use `^' to test whether signs differ, and `< 0' to isolate the sign. */
109#define overflow_sum_sign(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
6d716ca8 110\f
906c4e36 111/* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
37bdb7e3
TG
112 We do that by representing the two-word integer in 4 words, with only
113 HOST_BITS_PER_WIDE_INT/2 bits stored in each word, as a positive number. */
114
115#define LOWPART(x) \
116 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT/2)) - 1))
117#define HIGHPART(x) \
118 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT/2)
119#define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT/2)
6d716ca8 120
37bdb7e3 121/* Unpack a two-word integer into 4 words.
906c4e36 122 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
37bdb7e3 123 WORDS points to the array of HOST_WIDE_INTs. */
6d716ca8
RS
124
125static void
37bdb7e3
TG
126encode (words, low, hi)
127 HOST_WIDE_INT *words;
906c4e36 128 HOST_WIDE_INT low, hi;
6d716ca8 129{
37bdb7e3
TG
130 words[0] = LOWPART (low);
131 words[1] = HIGHPART (low);
132 words[2] = LOWPART (hi);
133 words[3] = HIGHPART (hi);
6d716ca8
RS
134}
135
37bdb7e3
TG
136/* Pack an array of 4 words into a two-word integer.
137 WORDS points to the array of words.
906c4e36 138 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
6d716ca8
RS
139
140static void
37bdb7e3
TG
141decode (words, low, hi)
142 HOST_WIDE_INT *words;
906c4e36 143 HOST_WIDE_INT *low, *hi;
6d716ca8 144{
37bdb7e3
TG
145 *low = words[0] | words[1] * BASE;
146 *hi = words[2] | words[3] * BASE;
6d716ca8
RS
147}
148\f
149/* Make the integer constant T valid for its type
150 by setting to 0 or 1 all the bits in the constant
e0f776fb
RS
151 that don't belong in the type.
152 Yield 1 if a signed overflow occurs, 0 otherwise.
a4d8855c 153 If OVERFLOW is nonzero, a signed overflow has already occurred
649ff3b4
RK
154 in calculating T, so propagate it.
155
156 Make the real constant T valid for its type by calling CHECK_FLOAT_VALUE,
157 if it exists. */
6d716ca8 158
e0f776fb
RS
159int
160force_fit_type (t, overflow)
6d716ca8 161 tree t;
e0f776fb 162 int overflow;
6d716ca8 163{
ef2bf0c0
RS
164 HOST_WIDE_INT low, high;
165 register int prec;
6d716ca8 166
649ff3b4
RK
167 if (TREE_CODE (t) == REAL_CST)
168 {
169#ifdef CHECK_FLOAT_VALUE
170 CHECK_FLOAT_VALUE (TYPE_MODE (TREE_TYPE (t)), TREE_REAL_CST (t),
171 overflow);
172#endif
173 return overflow;
174 }
175
176 else if (TREE_CODE (t) != INTEGER_CST)
ef2bf0c0
RS
177 return overflow;
178
179 low = TREE_INT_CST_LOW (t);
180 high = TREE_INT_CST_HIGH (t);
42f769c1 181
e5e809f4 182 if (POINTER_TYPE_P (TREE_TYPE (t)))
6d716ca8 183 prec = POINTER_SIZE;
ef2bf0c0
RS
184 else
185 prec = TYPE_PRECISION (TREE_TYPE (t));
6d716ca8
RS
186
187 /* First clear all bits that are beyond the type's precision. */
188
906c4e36 189 if (prec == 2 * HOST_BITS_PER_WIDE_INT)
6d716ca8 190 ;
906c4e36 191 else if (prec > HOST_BITS_PER_WIDE_INT)
6d716ca8
RS
192 {
193 TREE_INT_CST_HIGH (t)
906c4e36 194 &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
6d716ca8
RS
195 }
196 else
197 {
198 TREE_INT_CST_HIGH (t) = 0;
906c4e36
RK
199 if (prec < HOST_BITS_PER_WIDE_INT)
200 TREE_INT_CST_LOW (t) &= ~((HOST_WIDE_INT) (-1) << prec);
6d716ca8
RS
201 }
202
e0f776fb
RS
203 /* Unsigned types do not suffer sign extension or overflow. */
204 if (TREE_UNSIGNED (TREE_TYPE (t)))
a7a05640 205 return overflow;
6d716ca8 206
e0f776fb
RS
207 /* If the value's sign bit is set, extend the sign. */
208 if (prec != 2 * HOST_BITS_PER_WIDE_INT
906c4e36
RK
209 && (prec > HOST_BITS_PER_WIDE_INT
210 ? (TREE_INT_CST_HIGH (t)
211 & ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
212 : TREE_INT_CST_LOW (t) & ((HOST_WIDE_INT) 1 << (prec - 1))))
6d716ca8
RS
213 {
214 /* Value is negative:
215 set to 1 all the bits that are outside this type's precision. */
906c4e36 216 if (prec > HOST_BITS_PER_WIDE_INT)
6d716ca8
RS
217 {
218 TREE_INT_CST_HIGH (t)
906c4e36 219 |= ((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
6d716ca8
RS
220 }
221 else
222 {
223 TREE_INT_CST_HIGH (t) = -1;
906c4e36
RK
224 if (prec < HOST_BITS_PER_WIDE_INT)
225 TREE_INT_CST_LOW (t) |= ((HOST_WIDE_INT) (-1) << prec);
6d716ca8
RS
226 }
227 }
e0f776fb
RS
228
229 /* Yield nonzero if signed overflow occurred. */
230 return
231 ((overflow | (low ^ TREE_INT_CST_LOW (t)) | (high ^ TREE_INT_CST_HIGH (t)))
232 != 0);
6d716ca8
RS
233}
234\f
906c4e36
RK
235/* Add two doubleword integers with doubleword result.
236 Each argument is given as two `HOST_WIDE_INT' pieces.
6d716ca8 237 One argument is L1 and H1; the other, L2 and H2.
37bdb7e3 238 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8 239
fe3e8e40 240int
6d716ca8 241add_double (l1, h1, l2, h2, lv, hv)
906c4e36
RK
242 HOST_WIDE_INT l1, h1, l2, h2;
243 HOST_WIDE_INT *lv, *hv;
6d716ca8 244{
37bdb7e3 245 HOST_WIDE_INT l, h;
6d716ca8 246
37bdb7e3
TG
247 l = l1 + l2;
248 h = h1 + h2 + ((unsigned HOST_WIDE_INT) l < l1);
6d716ca8 249
37bdb7e3
TG
250 *lv = l;
251 *hv = h;
252 return overflow_sum_sign (h1, h2, h);
6d716ca8
RS
253}
254
906c4e36 255/* Negate a doubleword integer with doubleword result.
fe3e8e40 256 Return nonzero if the operation overflows, assuming it's signed.
906c4e36 257 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
37bdb7e3 258 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8 259
fe3e8e40 260int
6d716ca8 261neg_double (l1, h1, lv, hv)
906c4e36
RK
262 HOST_WIDE_INT l1, h1;
263 HOST_WIDE_INT *lv, *hv;
6d716ca8
RS
264{
265 if (l1 == 0)
266 {
267 *lv = 0;
268 *hv = - h1;
e0f776fb 269 return (*hv & h1) < 0;
6d716ca8
RS
270 }
271 else
272 {
273 *lv = - l1;
274 *hv = ~ h1;
fe3e8e40 275 return 0;
6d716ca8
RS
276 }
277}
278\f
906c4e36 279/* Multiply two doubleword integers with doubleword result.
fe3e8e40 280 Return nonzero if the operation overflows, assuming it's signed.
906c4e36 281 Each argument is given as two `HOST_WIDE_INT' pieces.
6d716ca8 282 One argument is L1 and H1; the other, L2 and H2.
37bdb7e3 283 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8 284
fe3e8e40 285int
6d716ca8 286mul_double (l1, h1, l2, h2, lv, hv)
906c4e36
RK
287 HOST_WIDE_INT l1, h1, l2, h2;
288 HOST_WIDE_INT *lv, *hv;
6d716ca8 289{
37bdb7e3
TG
290 HOST_WIDE_INT arg1[4];
291 HOST_WIDE_INT arg2[4];
292 HOST_WIDE_INT prod[4 * 2];
293 register unsigned HOST_WIDE_INT carry;
6d716ca8 294 register int i, j, k;
fe3e8e40 295 HOST_WIDE_INT toplow, tophigh, neglow, neghigh;
6d716ca8 296
6d716ca8
RS
297 encode (arg1, l1, h1);
298 encode (arg2, l2, h2);
299
4c9a05bc 300 bzero ((char *) prod, sizeof prod);
6d716ca8 301
37bdb7e3
TG
302 for (i = 0; i < 4; i++)
303 {
304 carry = 0;
305 for (j = 0; j < 4; j++)
306 {
307 k = i + j;
308 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
309 carry += arg1[i] * arg2[j];
310 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
311 carry += prod[k];
312 prod[k] = LOWPART (carry);
313 carry = HIGHPART (carry);
314 }
315 prod[i + 4] = carry;
316 }
6d716ca8 317
37bdb7e3 318 decode (prod, lv, hv); /* This ignores prod[4] through prod[4*2-1] */
fe3e8e40
RS
319
320 /* Check for overflow by calculating the top half of the answer in full;
321 it should agree with the low half's sign bit. */
37bdb7e3 322 decode (prod+4, &toplow, &tophigh);
fe3e8e40
RS
323 if (h1 < 0)
324 {
325 neg_double (l2, h2, &neglow, &neghigh);
326 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
327 }
328 if (h2 < 0)
329 {
330 neg_double (l1, h1, &neglow, &neghigh);
331 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
332 }
333 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
6d716ca8
RS
334}
335\f
906c4e36 336/* Shift the doubleword integer in L1, H1 left by COUNT places
6d716ca8
RS
337 keeping only PREC bits of result.
338 Shift right if COUNT is negative.
339 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
906c4e36 340 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8 341
e0f776fb 342void
6d716ca8 343lshift_double (l1, h1, count, prec, lv, hv, arith)
6dc7571d
RK
344 HOST_WIDE_INT l1, h1, count;
345 int prec;
906c4e36 346 HOST_WIDE_INT *lv, *hv;
6d716ca8
RS
347 int arith;
348{
6d716ca8
RS
349 if (count < 0)
350 {
351 rshift_double (l1, h1, - count, prec, lv, hv, arith);
e0f776fb 352 return;
6d716ca8 353 }
37bdb7e3 354
3d1877b1
RK
355#ifdef SHIFT_COUNT_TRUNCATED
356 if (SHIFT_COUNT_TRUNCATED)
357 count %= prec;
358#endif
6d716ca8 359
37bdb7e3 360 if (count >= HOST_BITS_PER_WIDE_INT)
6d716ca8 361 {
2fde567e 362 *hv = (unsigned HOST_WIDE_INT) l1 << (count - HOST_BITS_PER_WIDE_INT);
37bdb7e3
TG
363 *lv = 0;
364 }
365 else
366 {
367 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
2fde567e 368 | ((unsigned HOST_WIDE_INT) l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
37bdb7e3 369 *lv = (unsigned HOST_WIDE_INT) l1 << count;
6d716ca8 370 }
6d716ca8
RS
371}
372
906c4e36 373/* Shift the doubleword integer in L1, H1 right by COUNT places
6d716ca8
RS
374 keeping only PREC bits of result. COUNT must be positive.
375 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
906c4e36 376 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8
RS
377
378void
379rshift_double (l1, h1, count, prec, lv, hv, arith)
6dc7571d
RK
380 HOST_WIDE_INT l1, h1, count;
381 int prec;
906c4e36 382 HOST_WIDE_INT *lv, *hv;
6d716ca8
RS
383 int arith;
384{
37bdb7e3
TG
385 unsigned HOST_WIDE_INT signmask;
386 signmask = (arith
387 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
388 : 0);
6d716ca8 389
3d1877b1
RK
390#ifdef SHIFT_COUNT_TRUNCATED
391 if (SHIFT_COUNT_TRUNCATED)
392 count %= prec;
393#endif
6d716ca8 394
37bdb7e3 395 if (count >= HOST_BITS_PER_WIDE_INT)
6d716ca8 396 {
37bdb7e3 397 *hv = signmask;
2fde567e
KG
398 *lv = ((signmask << (2 * HOST_BITS_PER_WIDE_INT - count - 1) << 1)
399 | ((unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT)));
37bdb7e3
TG
400 }
401 else
402 {
403 *lv = (((unsigned HOST_WIDE_INT) l1 >> count)
2fde567e
KG
404 | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
405 *hv = ((signmask << (HOST_BITS_PER_WIDE_INT - count))
37bdb7e3 406 | ((unsigned HOST_WIDE_INT) h1 >> count));
6d716ca8 407 }
6d716ca8
RS
408}
409\f
37bdb7e3 410/* Rotate the doubleword integer in L1, H1 left by COUNT places
6d716ca8
RS
411 keeping only PREC bits of result.
412 Rotate right if COUNT is negative.
906c4e36 413 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8
RS
414
415void
416lrotate_double (l1, h1, count, prec, lv, hv)
6dc7571d
RK
417 HOST_WIDE_INT l1, h1, count;
418 int prec;
906c4e36 419 HOST_WIDE_INT *lv, *hv;
6d716ca8 420{
4d39710e 421 HOST_WIDE_INT s1l, s1h, s2l, s2h;
6d716ca8 422
4d39710e 423 count %= prec;
6d716ca8 424 if (count < 0)
4d39710e 425 count += prec;
6d716ca8 426
4d39710e
RK
427 lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
428 rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
429 *lv = s1l | s2l;
430 *hv = s1h | s2h;
6d716ca8
RS
431}
432
906c4e36 433/* Rotate the doubleword integer in L1, H1 left by COUNT places
6d716ca8 434 keeping only PREC bits of result. COUNT must be positive.
906c4e36 435 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
6d716ca8
RS
436
437void
438rrotate_double (l1, h1, count, prec, lv, hv)
6dc7571d
RK
439 HOST_WIDE_INT l1, h1, count;
440 int prec;
906c4e36 441 HOST_WIDE_INT *lv, *hv;
6d716ca8 442{
4d39710e 443 HOST_WIDE_INT s1l, s1h, s2l, s2h;
6d716ca8 444
4d39710e
RK
445 count %= prec;
446 if (count < 0)
447 count += prec;
6d716ca8 448
4d39710e
RK
449 rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
450 lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
451 *lv = s1l | s2l;
452 *hv = s1h | s2h;
6d716ca8
RS
453}
454\f
906c4e36 455/* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
6d716ca8
RS
456 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
457 CODE is a tree code for a kind of division, one of
458 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
459 or EXACT_DIV_EXPR
fe3e8e40
RS
460 It controls how the quotient is rounded to a integer.
461 Return nonzero if the operation overflows.
6d716ca8
RS
462 UNS nonzero says do unsigned division. */
463
dbb5b3ce 464int
6d716ca8
RS
465div_and_round_double (code, uns,
466 lnum_orig, hnum_orig, lden_orig, hden_orig,
467 lquo, hquo, lrem, hrem)
468 enum tree_code code;
469 int uns;
906c4e36
RK
470 HOST_WIDE_INT lnum_orig, hnum_orig; /* num == numerator == dividend */
471 HOST_WIDE_INT lden_orig, hden_orig; /* den == denominator == divisor */
472 HOST_WIDE_INT *lquo, *hquo, *lrem, *hrem;
6d716ca8
RS
473{
474 int quo_neg = 0;
37bdb7e3
TG
475 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
476 HOST_WIDE_INT den[4], quo[4];
477 register int i, j;
478 unsigned HOST_WIDE_INT work;
10fa1ee2 479 register unsigned HOST_WIDE_INT carry = 0;
88ee2651 480 HOST_WIDE_INT lnum = lnum_orig;
b8eb43a2 481 HOST_WIDE_INT hnum = hnum_orig;
88ee2651 482 HOST_WIDE_INT lden = lden_orig;
b8eb43a2 483 HOST_WIDE_INT hden = hden_orig;
fe3e8e40 484 int overflow = 0;
6d716ca8
RS
485
486 if ((hden == 0) && (lden == 0))
956d6950 487 overflow = 1, lden = 1;
6d716ca8
RS
488
489 /* calculate quotient sign and convert operands to unsigned. */
490 if (!uns)
491 {
fe3e8e40 492 if (hnum < 0)
6d716ca8
RS
493 {
494 quo_neg = ~ quo_neg;
fe3e8e40
RS
495 /* (minimum integer) / (-1) is the only overflow case. */
496 if (neg_double (lnum, hnum, &lnum, &hnum) && (lden & hden) == -1)
497 overflow = 1;
6d716ca8 498 }
fe3e8e40 499 if (hden < 0)
6d716ca8
RS
500 {
501 quo_neg = ~ quo_neg;
fe3e8e40 502 neg_double (lden, hden, &lden, &hden);
6d716ca8
RS
503 }
504 }
505
506 if (hnum == 0 && hden == 0)
507 { /* single precision */
508 *hquo = *hrem = 0;
88ee2651
RK
509 /* This unsigned division rounds toward zero. */
510 *lquo = lnum / (unsigned HOST_WIDE_INT) lden;
6d716ca8
RS
511 goto finish_up;
512 }
513
514 if (hnum == 0)
515 { /* trivial case: dividend < divisor */
516 /* hden != 0 already checked. */
517 *hquo = *lquo = 0;
518 *hrem = hnum;
519 *lrem = lnum;
520 goto finish_up;
521 }
522
4c9a05bc 523 bzero ((char *) quo, sizeof quo);
6d716ca8 524
4c9a05bc
RK
525 bzero ((char *) num, sizeof num); /* to zero 9th element */
526 bzero ((char *) den, sizeof den);
6d716ca8
RS
527
528 encode (num, lnum, hnum);
529 encode (den, lden, hden);
530
37bdb7e3
TG
531 /* Special code for when the divisor < BASE. */
532 if (hden == 0 && lden < BASE)
533 {
6d716ca8 534 /* hnum != 0 already checked. */
37bdb7e3 535 for (i = 4 - 1; i >= 0; i--)
6d716ca8 536 {
37bdb7e3 537 work = num[i] + carry * BASE;
88ee2651
RK
538 quo[i] = work / (unsigned HOST_WIDE_INT) lden;
539 carry = work % (unsigned HOST_WIDE_INT) lden;
6d716ca8
RS
540 }
541 }
37bdb7e3
TG
542 else
543 {
544 /* Full double precision division,
545 with thanks to Don Knuth's "Seminumerical Algorithms". */
10fa1ee2
RK
546 int num_hi_sig, den_hi_sig;
547 unsigned HOST_WIDE_INT quo_est, scale;
6d716ca8
RS
548
549 /* Find the highest non-zero divisor digit. */
37bdb7e3 550 for (i = 4 - 1; ; i--)
6d716ca8
RS
551 if (den[i] != 0) {
552 den_hi_sig = i;
553 break;
554 }
6d716ca8
RS
555
556 /* Insure that the first digit of the divisor is at least BASE/2.
557 This is required by the quotient digit estimation algorithm. */
558
559 scale = BASE / (den[den_hi_sig] + 1);
560 if (scale > 1) { /* scale divisor and dividend */
561 carry = 0;
37bdb7e3 562 for (i = 0; i <= 4 - 1; i++) {
6d716ca8 563 work = (num[i] * scale) + carry;
37bdb7e3
TG
564 num[i] = LOWPART (work);
565 carry = HIGHPART (work);
566 } num[4] = carry;
6d716ca8 567 carry = 0;
37bdb7e3 568 for (i = 0; i <= 4 - 1; i++) {
6d716ca8 569 work = (den[i] * scale) + carry;
37bdb7e3
TG
570 den[i] = LOWPART (work);
571 carry = HIGHPART (work);
6d716ca8
RS
572 if (den[i] != 0) den_hi_sig = i;
573 }
574 }
575
37bdb7e3
TG
576 num_hi_sig = 4;
577
6d716ca8 578 /* Main loop */
37bdb7e3 579 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--) {
6dc42e49 580 /* guess the next quotient digit, quo_est, by dividing the first
6d716ca8
RS
581 two remaining dividend digits by the high order quotient digit.
582 quo_est is never low and is at most 2 high. */
37bdb7e3 583 unsigned HOST_WIDE_INT tmp;
6d716ca8 584
37bdb7e3
TG
585 num_hi_sig = i + den_hi_sig + 1;
586 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
587 if (num[num_hi_sig] != den[den_hi_sig])
6d716ca8 588 quo_est = work / den[den_hi_sig];
37bdb7e3 589 else
6d716ca8 590 quo_est = BASE - 1;
6d716ca8
RS
591
592 /* refine quo_est so it's usually correct, and at most one high. */
37bdb7e3
TG
593 tmp = work - quo_est * den[den_hi_sig];
594 if (tmp < BASE
595 && den[den_hi_sig - 1] * quo_est > (tmp * BASE + num[num_hi_sig - 2]))
6d716ca8
RS
596 quo_est--;
597
598 /* Try QUO_EST as the quotient digit, by multiplying the
599 divisor by QUO_EST and subtracting from the remaining dividend.
600 Keep in mind that QUO_EST is the I - 1st digit. */
601
602 carry = 0;
6d716ca8
RS
603 for (j = 0; j <= den_hi_sig; j++)
604 {
37bdb7e3
TG
605 work = quo_est * den[j] + carry;
606 carry = HIGHPART (work);
607 work = num[i + j] - LOWPART (work);
608 num[i + j] = LOWPART (work);
609 carry += HIGHPART (work) != 0;
6d716ca8
RS
610 }
611
612 /* if quo_est was high by one, then num[i] went negative and
613 we need to correct things. */
614
37bdb7e3 615 if (num[num_hi_sig] < carry)
6d716ca8
RS
616 {
617 quo_est--;
618 carry = 0; /* add divisor back in */
619 for (j = 0; j <= den_hi_sig; j++)
620 {
37bdb7e3
TG
621 work = num[i + j] + den[j] + carry;
622 carry = HIGHPART (work);
623 num[i + j] = LOWPART (work);
6d716ca8 624 }
37bdb7e3 625 num [num_hi_sig] += carry;
6d716ca8
RS
626 }
627
628 /* store the quotient digit. */
37bdb7e3 629 quo[i] = quo_est;
6d716ca8
RS
630 }
631 }
632
633 decode (quo, lquo, hquo);
634
635 finish_up:
636 /* if result is negative, make it so. */
637 if (quo_neg)
638 neg_double (*lquo, *hquo, lquo, hquo);
639
640 /* compute trial remainder: rem = num - (quo * den) */
641 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
642 neg_double (*lrem, *hrem, lrem, hrem);
643 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
644
645 switch (code)
646 {
647 case TRUNC_DIV_EXPR:
648 case TRUNC_MOD_EXPR: /* round toward zero */
649 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
fe3e8e40 650 return overflow;
6d716ca8
RS
651
652 case FLOOR_DIV_EXPR:
653 case FLOOR_MOD_EXPR: /* round toward negative infinity */
654 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
655 {
656 /* quo = quo - 1; */
906c4e36
RK
657 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
658 lquo, hquo);
6d716ca8 659 }
fe3e8e40 660 else return overflow;
6d716ca8
RS
661 break;
662
663 case CEIL_DIV_EXPR:
664 case CEIL_MOD_EXPR: /* round toward positive infinity */
665 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
666 {
906c4e36
RK
667 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
668 lquo, hquo);
6d716ca8 669 }
fe3e8e40 670 else return overflow;
6d716ca8
RS
671 break;
672
673 case ROUND_DIV_EXPR:
674 case ROUND_MOD_EXPR: /* round to closest integer */
675 {
906c4e36
RK
676 HOST_WIDE_INT labs_rem = *lrem, habs_rem = *hrem;
677 HOST_WIDE_INT labs_den = lden, habs_den = hden, ltwice, htwice;
6d716ca8
RS
678
679 /* get absolute values */
680 if (*hrem < 0) neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
681 if (hden < 0) neg_double (lden, hden, &labs_den, &habs_den);
682
683 /* if (2 * abs (lrem) >= abs (lden)) */
906c4e36
RK
684 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
685 labs_rem, habs_rem, &ltwice, &htwice);
686 if (((unsigned HOST_WIDE_INT) habs_den
687 < (unsigned HOST_WIDE_INT) htwice)
688 || (((unsigned HOST_WIDE_INT) habs_den
689 == (unsigned HOST_WIDE_INT) htwice)
690 && ((HOST_WIDE_INT unsigned) labs_den
691 < (unsigned HOST_WIDE_INT) ltwice)))
6d716ca8
RS
692 {
693 if (*hquo < 0)
694 /* quo = quo - 1; */
906c4e36
RK
695 add_double (*lquo, *hquo,
696 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
6d716ca8
RS
697 else
698 /* quo = quo + 1; */
906c4e36
RK
699 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
700 lquo, hquo);
6d716ca8 701 }
fe3e8e40 702 else return overflow;
6d716ca8
RS
703 }
704 break;
705
706 default:
707 abort ();
708 }
709
710 /* compute true remainder: rem = num - (quo * den) */
711 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
712 neg_double (*lrem, *hrem, lrem, hrem);
713 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
fe3e8e40 714 return overflow;
6d716ca8
RS
715}
716\f
5008b8ae 717#ifndef REAL_ARITHMETIC
649ff3b4
RK
718/* Effectively truncate a real value to represent the nearest possible value
719 in a narrower mode. The result is actually represented in the same data
720 type as the argument, but its value is usually different.
721
722 A trap may occur during the FP operations and it is the responsibility
723 of the calling function to have a handler established. */
5352b11a
RS
724
725REAL_VALUE_TYPE
726real_value_truncate (mode, arg)
727 enum machine_mode mode;
728 REAL_VALUE_TYPE arg;
729{
649ff3b4 730 return REAL_VALUE_TRUNCATE (mode, arg);
5352b11a
RS
731}
732
6d716ca8
RS
733#if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
734
735/* Check for infinity in an IEEE double precision number. */
736
737int
738target_isinf (x)
739 REAL_VALUE_TYPE x;
740{
741 /* The IEEE 64-bit double format. */
742 union {
743 REAL_VALUE_TYPE d;
744 struct {
745 unsigned sign : 1;
746 unsigned exponent : 11;
747 unsigned mantissa1 : 20;
748 unsigned mantissa2;
749 } little_endian;
750 struct {
751 unsigned mantissa2;
752 unsigned mantissa1 : 20;
753 unsigned exponent : 11;
754 unsigned sign : 1;
755 } big_endian;
756 } u;
757
758 u.d = dconstm1;
759 if (u.big_endian.sign == 1)
760 {
761 u.d = x;
762 return (u.big_endian.exponent == 2047
763 && u.big_endian.mantissa1 == 0
764 && u.big_endian.mantissa2 == 0);
765 }
766 else
767 {
768 u.d = x;
769 return (u.little_endian.exponent == 2047
770 && u.little_endian.mantissa1 == 0
771 && u.little_endian.mantissa2 == 0);
772 }
773}
774
7d4d4d22
RS
775/* Check whether an IEEE double precision number is a NaN. */
776
777int
778target_isnan (x)
779 REAL_VALUE_TYPE x;
780{
781 /* The IEEE 64-bit double format. */
782 union {
783 REAL_VALUE_TYPE d;
784 struct {
785 unsigned sign : 1;
786 unsigned exponent : 11;
787 unsigned mantissa1 : 20;
788 unsigned mantissa2;
789 } little_endian;
790 struct {
791 unsigned mantissa2;
792 unsigned mantissa1 : 20;
793 unsigned exponent : 11;
794 unsigned sign : 1;
795 } big_endian;
796 } u;
797
798 u.d = dconstm1;
799 if (u.big_endian.sign == 1)
800 {
801 u.d = x;
802 return (u.big_endian.exponent == 2047
803 && (u.big_endian.mantissa1 != 0
804 || u.big_endian.mantissa2 != 0));
805 }
806 else
807 {
808 u.d = x;
809 return (u.little_endian.exponent == 2047
810 && (u.little_endian.mantissa1 != 0
811 || u.little_endian.mantissa2 != 0));
812 }
813}
814
c05a9b68 815/* Check for a negative IEEE double precision number. */
6d716ca8
RS
816
817int
c05a9b68 818target_negative (x)
6d716ca8
RS
819 REAL_VALUE_TYPE x;
820{
c05a9b68
RS
821 /* The IEEE 64-bit double format. */
822 union {
823 REAL_VALUE_TYPE d;
824 struct {
825 unsigned sign : 1;
826 unsigned exponent : 11;
827 unsigned mantissa1 : 20;
828 unsigned mantissa2;
829 } little_endian;
830 struct {
831 unsigned mantissa2;
832 unsigned mantissa1 : 20;
833 unsigned exponent : 11;
834 unsigned sign : 1;
835 } big_endian;
836 } u;
6d716ca8 837
c05a9b68
RS
838 u.d = dconstm1;
839 if (u.big_endian.sign == 1)
840 {
841 u.d = x;
842 return u.big_endian.sign;
843 }
844 else
845 {
846 u.d = x;
847 return u.little_endian.sign;
848 }
6d716ca8
RS
849}
850#else /* Target not IEEE */
851
852/* Let's assume other float formats don't have infinity.
853 (This can be overridden by redefining REAL_VALUE_ISINF.) */
854
855target_isinf (x)
856 REAL_VALUE_TYPE x;
857{
858 return 0;
859}
860
7d4d4d22
RS
861/* Let's assume other float formats don't have NaNs.
862 (This can be overridden by redefining REAL_VALUE_ISNAN.) */
863
864target_isnan (x)
865 REAL_VALUE_TYPE x;
866{
867 return 0;
868}
869
6d716ca8 870/* Let's assume other float formats don't have minus zero.
c05a9b68 871 (This can be overridden by redefining REAL_VALUE_NEGATIVE.) */
6d716ca8 872
c05a9b68 873target_negative (x)
6d716ca8
RS
874 REAL_VALUE_TYPE x;
875{
c05a9b68 876 return x < 0;
6d716ca8
RS
877}
878#endif /* Target not IEEE */
39647dcb
RK
879
880/* Try to change R into its exact multiplicative inverse in machine mode
881 MODE. Return nonzero function value if successful. */
882
883int
884exact_real_inverse (mode, r)
885 enum machine_mode mode;
886 REAL_VALUE_TYPE *r;
887{
888 union
889 {
890 double d;
891 unsigned short i[4];
892 }x, t, y;
893 int i;
894
895 /* Usually disable if bounds checks are not reliable. */
896 if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT) && !flag_pretend_float)
897 return 0;
898
899 /* Set array index to the less significant bits in the unions, depending
900 on the endian-ness of the host doubles.
901 Disable if insufficient information on the data structure. */
902#if HOST_FLOAT_FORMAT == UNKNOWN_FLOAT_FORMAT
903 return 0;
904#else
905#if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
906#define K 2
907#else
908#if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT
909#define K 2
910#else
911#define K (2 * HOST_FLOAT_WORDS_BIG_ENDIAN)
912#endif
913#endif
914#endif
915
916 if (setjmp (float_error))
917 {
918 /* Don't do the optimization if there was an arithmetic error. */
919fail:
920 set_float_handler (NULL_PTR);
921 return 0;
922 }
923 set_float_handler (float_error);
924
925 /* Domain check the argument. */
926 x.d = *r;
927 if (x.d == 0.0)
928 goto fail;
929
930#ifdef REAL_INFINITY
931 if (REAL_VALUE_ISINF (x.d) || REAL_VALUE_ISNAN (x.d))
932 goto fail;
933#endif
934
935 /* Compute the reciprocal and check for numerical exactness.
936 It is unnecessary to check all the significand bits to determine
937 whether X is a power of 2. If X is not, then it is impossible for
938 the bottom half significand of both X and 1/X to be all zero bits.
939 Hence we ignore the data structure of the top half and examine only
940 the low order bits of the two significands. */
941 t.d = 1.0 / x.d;
942 if (x.i[K] != 0 || x.i[K + 1] != 0 || t.i[K] != 0 || t.i[K + 1] != 0)
943 goto fail;
944
945 /* Truncate to the required mode and range-check the result. */
946 y.d = REAL_VALUE_TRUNCATE (mode, t.d);
947#ifdef CHECK_FLOAT_VALUE
948 i = 0;
949 if (CHECK_FLOAT_VALUE (mode, y.d, i))
950 goto fail;
951#endif
952
953 /* Fail if truncation changed the value. */
954 if (y.d != t.d || y.d == 0.0)
955 goto fail;
956
957#ifdef REAL_INFINITY
958 if (REAL_VALUE_ISINF (y.d) || REAL_VALUE_ISNAN (y.d))
959 goto fail;
960#endif
961
962 /* Output the reciprocal and return success flag. */
963 set_float_handler (NULL_PTR);
964 *r = y.d;
965 return 1;
966}
5008b8ae 967#endif /* no REAL_ARITHMETIC */
6d716ca8
RS
968\f
969/* Split a tree IN into a constant and a variable part
970 that could be combined with CODE to make IN.
971 CODE must be a commutative arithmetic operation.
972 Store the constant part into *CONP and the variable in &VARP.
973 Return 1 if this was done; zero means the tree IN did not decompose
974 this way.
975
976 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.
977 Therefore, we must tell the caller whether the variable part
978 was subtracted. We do this by storing 1 or -1 into *VARSIGNP.
979 The value stored is the coefficient for the variable term.
980 The constant term we return should always be added;
981 we negate it if necessary. */
982
983static int
984split_tree (in, code, varp, conp, varsignp)
985 tree in;
986 enum tree_code code;
987 tree *varp, *conp;
988 int *varsignp;
989{
990 register tree outtype = TREE_TYPE (in);
991 *varp = 0;
992 *conp = 0;
993
994 /* Strip any conversions that don't change the machine mode. */
995 while ((TREE_CODE (in) == NOP_EXPR
996 || TREE_CODE (in) == CONVERT_EXPR)
997 && (TYPE_MODE (TREE_TYPE (in))
998 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (in, 0)))))
999 in = TREE_OPERAND (in, 0);
1000
1001 if (TREE_CODE (in) == code
7178e3af 1002 || (! FLOAT_TYPE_P (TREE_TYPE (in))
6d716ca8
RS
1003 /* We can associate addition and subtraction together
1004 (even though the C standard doesn't say so)
1005 for integers because the value is not affected.
1006 For reals, the value might be affected, so we can't. */
7178e3af
RK
1007 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1008 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
6d716ca8
RS
1009 {
1010 enum tree_code code = TREE_CODE (TREE_OPERAND (in, 0));
1011 if (code == INTEGER_CST)
1012 {
1013 *conp = TREE_OPERAND (in, 0);
1014 *varp = TREE_OPERAND (in, 1);
1015 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1016 && TREE_TYPE (*varp) != outtype)
1017 *varp = convert (outtype, *varp);
1018 *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1019 return 1;
1020 }
1021 if (TREE_CONSTANT (TREE_OPERAND (in, 1)))
1022 {
1023 *conp = TREE_OPERAND (in, 1);
1024 *varp = TREE_OPERAND (in, 0);
1025 *varsignp = 1;
1026 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1027 && TREE_TYPE (*varp) != outtype)
1028 *varp = convert (outtype, *varp);
1029 if (TREE_CODE (in) == MINUS_EXPR)
1030 {
1031 /* If operation is subtraction and constant is second,
1032 must negate it to get an additive constant.
1033 And this cannot be done unless it is a manifest constant.
1034 It could also be the address of a static variable.
1035 We cannot negate that, so give up. */
1036 if (TREE_CODE (*conp) == INTEGER_CST)
1037 /* Subtracting from integer_zero_node loses for long long. */
1038 *conp = fold (build1 (NEGATE_EXPR, TREE_TYPE (*conp), *conp));
1039 else
1040 return 0;
1041 }
1042 return 1;
1043 }
1044 if (TREE_CONSTANT (TREE_OPERAND (in, 0)))
1045 {
1046 *conp = TREE_OPERAND (in, 0);
1047 *varp = TREE_OPERAND (in, 1);
1048 if (TYPE_MODE (TREE_TYPE (*varp)) != TYPE_MODE (outtype)
1049 && TREE_TYPE (*varp) != outtype)
1050 *varp = convert (outtype, *varp);
1051 *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1;
1052 return 1;
1053 }
1054 }
1055 return 0;
1056}
1057\f
e9a25f70 1058/* Combine two integer constants ARG1 and ARG2 under operation CODE
6d716ca8 1059 to produce a new constant.
91d33e36 1060
e9a25f70
JL
1061 If NOTRUNC is nonzero, do not truncate the result to fit the data type.
1062 If FORSIZE is nonzero, compute overflow for unsigned types. */
6d716ca8 1063
6d716ca8 1064static tree
e9a25f70 1065int_const_binop (code, arg1, arg2, notrunc, forsize)
6d716ca8
RS
1066 enum tree_code code;
1067 register tree arg1, arg2;
e9a25f70 1068 int notrunc, forsize;
6d716ca8 1069{
e9a25f70
JL
1070 HOST_WIDE_INT int1l, int1h, int2l, int2h;
1071 HOST_WIDE_INT low, hi;
1072 HOST_WIDE_INT garbagel, garbageh;
1073 register tree t;
1074 int uns = TREE_UNSIGNED (TREE_TYPE (arg1));
1075 int overflow = 0;
1076 int no_overflow = 0;
3dedc65a 1077
e9a25f70
JL
1078 int1l = TREE_INT_CST_LOW (arg1);
1079 int1h = TREE_INT_CST_HIGH (arg1);
1080 int2l = TREE_INT_CST_LOW (arg2);
1081 int2h = TREE_INT_CST_HIGH (arg2);
1082
1083 switch (code)
6d716ca8 1084 {
e9a25f70
JL
1085 case BIT_IOR_EXPR:
1086 low = int1l | int2l, hi = int1h | int2h;
1087 break;
6d716ca8 1088
e9a25f70
JL
1089 case BIT_XOR_EXPR:
1090 low = int1l ^ int2l, hi = int1h ^ int2h;
1091 break;
6d716ca8 1092
e9a25f70
JL
1093 case BIT_AND_EXPR:
1094 low = int1l & int2l, hi = int1h & int2h;
1095 break;
6d716ca8 1096
e9a25f70
JL
1097 case BIT_ANDTC_EXPR:
1098 low = int1l & ~int2l, hi = int1h & ~int2h;
1099 break;
6d716ca8 1100
e9a25f70
JL
1101 case RSHIFT_EXPR:
1102 int2l = - int2l;
1103 case LSHIFT_EXPR:
1104 /* It's unclear from the C standard whether shifts can overflow.
1105 The following code ignores overflow; perhaps a C standard
1106 interpretation ruling is needed. */
1107 lshift_double (int1l, int1h, int2l,
1108 TYPE_PRECISION (TREE_TYPE (arg1)),
1109 &low, &hi,
1110 !uns);
1111 no_overflow = 1;
1112 break;
6d716ca8 1113
e9a25f70
JL
1114 case RROTATE_EXPR:
1115 int2l = - int2l;
1116 case LROTATE_EXPR:
1117 lrotate_double (int1l, int1h, int2l,
1118 TYPE_PRECISION (TREE_TYPE (arg1)),
1119 &low, &hi);
1120 break;
6d716ca8 1121
e9a25f70
JL
1122 case PLUS_EXPR:
1123 overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1124 break;
6d716ca8 1125
e9a25f70
JL
1126 case MINUS_EXPR:
1127 neg_double (int2l, int2h, &low, &hi);
1128 add_double (int1l, int1h, low, hi, &low, &hi);
1129 overflow = overflow_sum_sign (hi, int2h, int1h);
1130 break;
6d716ca8 1131
e9a25f70
JL
1132 case MULT_EXPR:
1133 overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1134 break;
6d716ca8 1135
e9a25f70
JL
1136 case TRUNC_DIV_EXPR:
1137 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1138 case EXACT_DIV_EXPR:
1139 /* This is a shortcut for a common special case. */
1140 if (int2h == 0 && int2l > 0
1141 && ! TREE_CONSTANT_OVERFLOW (arg1)
1142 && ! TREE_CONSTANT_OVERFLOW (arg2)
1143 && int1h == 0 && int1l >= 0)
1144 {
1145 if (code == CEIL_DIV_EXPR)
1146 int1l += int2l - 1;
1147 low = int1l / int2l, hi = 0;
6d716ca8 1148 break;
e9a25f70 1149 }
6d716ca8 1150
e9a25f70 1151 /* ... fall through ... */
6d716ca8 1152
e9a25f70
JL
1153 case ROUND_DIV_EXPR:
1154 if (int2h == 0 && int2l == 1)
1155 {
1156 low = int1l, hi = int1h;
6d716ca8 1157 break;
e9a25f70
JL
1158 }
1159 if (int1l == int2l && int1h == int2h
1160 && ! (int1l == 0 && int1h == 0))
1161 {
1162 low = 1, hi = 0;
63e7fe9b 1163 break;
e9a25f70
JL
1164 }
1165 overflow = div_and_round_double (code, uns,
1166 int1l, int1h, int2l, int2h,
1167 &low, &hi, &garbagel, &garbageh);
1168 break;
63e7fe9b 1169
e9a25f70
JL
1170 case TRUNC_MOD_EXPR:
1171 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1172 /* This is a shortcut for a common special case. */
1173 if (int2h == 0 && int2l > 0
1174 && ! TREE_CONSTANT_OVERFLOW (arg1)
1175 && ! TREE_CONSTANT_OVERFLOW (arg2)
1176 && int1h == 0 && int1l >= 0)
1177 {
1178 if (code == CEIL_MOD_EXPR)
1179 int1l += int2l - 1;
1180 low = int1l % int2l, hi = 0;
63e7fe9b 1181 break;
e9a25f70 1182 }
63e7fe9b 1183
e9a25f70
JL
1184 /* ... fall through ... */
1185
1186 case ROUND_MOD_EXPR:
1187 overflow = div_and_round_double (code, uns,
1188 int1l, int1h, int2l, int2h,
1189 &garbagel, &garbageh, &low, &hi);
1190 break;
1191
1192 case MIN_EXPR:
1193 case MAX_EXPR:
1194 if (uns)
1195 {
1196 low = (((unsigned HOST_WIDE_INT) int1h
1197 < (unsigned HOST_WIDE_INT) int2h)
1198 || (((unsigned HOST_WIDE_INT) int1h
1199 == (unsigned HOST_WIDE_INT) int2h)
1200 && ((unsigned HOST_WIDE_INT) int1l
1201 < (unsigned HOST_WIDE_INT) int2l)));
6d716ca8 1202 }
380ff34a
RK
1203 else
1204 {
e9a25f70
JL
1205 low = ((int1h < int2h)
1206 || ((int1h == int2h)
1207 && ((unsigned HOST_WIDE_INT) int1l
1208 < (unsigned HOST_WIDE_INT) int2l)));
380ff34a 1209 }
e9a25f70
JL
1210 if (low == (code == MIN_EXPR))
1211 low = int1l, hi = int1h;
1212 else
1213 low = int2l, hi = int2h;
1214 break;
3dedc65a 1215
e9a25f70
JL
1216 default:
1217 abort ();
3dedc65a 1218 }
e9a25f70
JL
1219
1220 if (TREE_TYPE (arg1) == sizetype && hi == 0
e1ee5cdc
RH
1221 && low >= 0
1222 && (TYPE_MAX_VALUE (sizetype) == NULL
1223 || low <= TREE_INT_CST_LOW (TYPE_MAX_VALUE (sizetype)))
e9a25f70
JL
1224 && ! overflow
1225 && ! TREE_OVERFLOW (arg1) && ! TREE_OVERFLOW (arg2))
1226 t = size_int (low);
1227 else
1228 {
1229 t = build_int_2 (low, hi);
1230 TREE_TYPE (t) = TREE_TYPE (arg1);
1231 }
1232
1233 TREE_OVERFLOW (t)
1234 = ((notrunc ? (!uns || forsize) && overflow
1235 : force_fit_type (t, (!uns || forsize) && overflow) && ! no_overflow)
1236 | TREE_OVERFLOW (arg1)
1237 | TREE_OVERFLOW (arg2));
1238 /* If we're doing a size calculation, unsigned arithmetic does overflow.
1239 So check if force_fit_type truncated the value. */
1240 if (forsize
1241 && ! TREE_OVERFLOW (t)
1242 && (TREE_INT_CST_HIGH (t) != hi
1243 || TREE_INT_CST_LOW (t) != low))
1244 TREE_OVERFLOW (t) = 1;
1245 TREE_CONSTANT_OVERFLOW (t) = (TREE_OVERFLOW (t)
1246 | TREE_CONSTANT_OVERFLOW (arg1)
1247 | TREE_CONSTANT_OVERFLOW (arg2));
1248 return t;
1249}
1250
1251/* Combine two constants ARG1 and ARG2 under operation CODE
1252 to produce a new constant.
1253 We assume ARG1 and ARG2 have the same data type,
1254 or at least are the same kind of constant and the same machine mode.
1255
1256 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1257
1258static tree
1259const_binop (code, arg1, arg2, notrunc)
1260 enum tree_code code;
1261 register tree arg1, arg2;
1262 int notrunc;
1263{
1264 STRIP_NOPS (arg1); STRIP_NOPS (arg2);
1265
1266 if (TREE_CODE (arg1) == INTEGER_CST)
1267 return int_const_binop (code, arg1, arg2, notrunc, 0);
1268
6d716ca8
RS
1269#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1270 if (TREE_CODE (arg1) == REAL_CST)
1271 {
79c844cd
RK
1272 REAL_VALUE_TYPE d1;
1273 REAL_VALUE_TYPE d2;
649ff3b4 1274 int overflow = 0;
5008b8ae 1275 REAL_VALUE_TYPE value;
7c7b029d 1276 tree t;
6d716ca8 1277
79c844cd
RK
1278 d1 = TREE_REAL_CST (arg1);
1279 d2 = TREE_REAL_CST (arg2);
5f610074
RK
1280
1281 /* If either operand is a NaN, just return it. Otherwise, set up
1282 for floating-point trap; we return an overflow. */
1283 if (REAL_VALUE_ISNAN (d1))
1284 return arg1;
1285 else if (REAL_VALUE_ISNAN (d2))
1286 return arg2;
1287 else if (setjmp (float_error))
6d716ca8 1288 {
649ff3b4
RK
1289 t = copy_node (arg1);
1290 overflow = 1;
1291 goto got_float;
6d716ca8 1292 }
649ff3b4 1293
7c7b029d 1294 set_float_handler (float_error);
6d716ca8
RS
1295
1296#ifdef REAL_ARITHMETIC
1297 REAL_ARITHMETIC (value, code, d1, d2);
1298#else
1299 switch (code)
1300 {
1301 case PLUS_EXPR:
1302 value = d1 + d2;
1303 break;
1304
1305 case MINUS_EXPR:
1306 value = d1 - d2;
1307 break;
1308
1309 case MULT_EXPR:
1310 value = d1 * d2;
1311 break;
1312
1313 case RDIV_EXPR:
1314#ifndef REAL_INFINITY
1315 if (d2 == 0)
1316 abort ();
1317#endif
1318
1319 value = d1 / d2;
1320 break;
1321
1322 case MIN_EXPR:
1323 value = MIN (d1, d2);
1324 break;
1325
1326 case MAX_EXPR:
1327 value = MAX (d1, d2);
1328 break;
1329
1330 default:
1331 abort ();
1332 }
1333#endif /* no REAL_ARITHMETIC */
7c7b029d 1334 t = build_real (TREE_TYPE (arg1),
5352b11a 1335 real_value_truncate (TYPE_MODE (TREE_TYPE (arg1)), value));
649ff3b4 1336 got_float:
906c4e36 1337 set_float_handler (NULL_PTR);
649ff3b4
RK
1338
1339 TREE_OVERFLOW (t)
1340 = (force_fit_type (t, overflow)
1341 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1342 TREE_CONSTANT_OVERFLOW (t)
1343 = TREE_OVERFLOW (t)
1344 | TREE_CONSTANT_OVERFLOW (arg1)
1345 | TREE_CONSTANT_OVERFLOW (arg2);
7c7b029d 1346 return t;
6d716ca8
RS
1347 }
1348#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1349 if (TREE_CODE (arg1) == COMPLEX_CST)
1350 {
214d5b84 1351 register tree type = TREE_TYPE (arg1);
6d716ca8
RS
1352 register tree r1 = TREE_REALPART (arg1);
1353 register tree i1 = TREE_IMAGPART (arg1);
1354 register tree r2 = TREE_REALPART (arg2);
1355 register tree i2 = TREE_IMAGPART (arg2);
1356 register tree t;
1357
1358 switch (code)
1359 {
1360 case PLUS_EXPR:
214d5b84
RK
1361 t = build_complex (type,
1362 const_binop (PLUS_EXPR, r1, r2, notrunc),
91d33e36 1363 const_binop (PLUS_EXPR, i1, i2, notrunc));
6d716ca8
RS
1364 break;
1365
1366 case MINUS_EXPR:
214d5b84
RK
1367 t = build_complex (type,
1368 const_binop (MINUS_EXPR, r1, r2, notrunc),
91d33e36 1369 const_binop (MINUS_EXPR, i1, i2, notrunc));
6d716ca8
RS
1370 break;
1371
1372 case MULT_EXPR:
214d5b84
RK
1373 t = build_complex (type,
1374 const_binop (MINUS_EXPR,
91d33e36
RS
1375 const_binop (MULT_EXPR,
1376 r1, r2, notrunc),
1377 const_binop (MULT_EXPR,
1378 i1, i2, notrunc),
1379 notrunc),
6d716ca8 1380 const_binop (PLUS_EXPR,
91d33e36
RS
1381 const_binop (MULT_EXPR,
1382 r1, i2, notrunc),
1383 const_binop (MULT_EXPR,
1384 i1, r2, notrunc),
1385 notrunc));
6d716ca8
RS
1386 break;
1387
1388 case RDIV_EXPR:
1389 {
1390 register tree magsquared
1391 = const_binop (PLUS_EXPR,
91d33e36
RS
1392 const_binop (MULT_EXPR, r2, r2, notrunc),
1393 const_binop (MULT_EXPR, i2, i2, notrunc),
1394 notrunc);
58633be8 1395
214d5b84
RK
1396 t = build_complex (type,
1397 const_binop
1398 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1399 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1400 const_binop (PLUS_EXPR,
1401 const_binop (MULT_EXPR, r1, r2,
1402 notrunc),
1403 const_binop (MULT_EXPR, i1, i2,
1404 notrunc),
1405 notrunc),
1406 magsquared, notrunc),
1407 const_binop
1408 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1409 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1410 const_binop (MINUS_EXPR,
1411 const_binop (MULT_EXPR, i1, r2,
1412 notrunc),
1413 const_binop (MULT_EXPR, r1, i2,
1414 notrunc),
1415 notrunc),
1416 magsquared, notrunc));
6d716ca8
RS
1417 }
1418 break;
1419
1420 default:
1421 abort ();
1422 }
6d716ca8
RS
1423 return t;
1424 }
1425 return 0;
1426}
1427\f
f8dac6eb
R
1428/* Return an INTEGER_CST with value V . The type is determined by bit_p:
1429 if it is zero, the type is taken from sizetype; if it is one, the type
1430 is taken from bitsizetype. */
6d716ca8
RS
1431
1432tree
f8dac6eb
R
1433size_int_wide (number, high, bit_p)
1434 unsigned HOST_WIDE_INT number, high;
2fde567e 1435 int bit_p;
6d716ca8
RS
1436{
1437 register tree t;
1438 /* Type-size nodes already made for small sizes. */
f8dac6eb 1439 static tree size_table[2*HOST_BITS_PER_WIDE_INT + 1][2];
6d716ca8 1440
f8dac6eb
R
1441 if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && ! high
1442 && size_table[number][bit_p] != 0)
1443 return size_table[number][bit_p];
1444 if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && ! high)
6d716ca8 1445 {
6d716ca8
RS
1446 push_obstacks_nochange ();
1447 /* Make this a permanent node. */
c05a9b68 1448 end_temporary_allocation ();
6d716ca8 1449 t = build_int_2 (number, 0);
896cced4 1450 TREE_TYPE (t) = bit_p ? bitsizetype : sizetype;
f8dac6eb 1451 size_table[number][bit_p] = t;
6d716ca8
RS
1452 pop_obstacks ();
1453 }
1454 else
1455 {
f8dac6eb 1456 t = build_int_2 (number, high);
896cced4 1457 TREE_TYPE (t) = bit_p ? bitsizetype : sizetype;
380ff34a 1458 TREE_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (t) = force_fit_type (t, 0);
6d716ca8
RS
1459 }
1460 return t;
1461}
1462
1463/* Combine operands OP1 and OP2 with arithmetic operation CODE.
1464 CODE is a tree code. Data type is taken from `sizetype',
1465 If the operands are constant, so is the result. */
1466
1467tree
1468size_binop (code, arg0, arg1)
1469 enum tree_code code;
1470 tree arg0, arg1;
1471{
1472 /* Handle the special case of two integer constants faster. */
1473 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1474 {
1475 /* And some specific cases even faster than that. */
9898deac 1476 if (code == PLUS_EXPR && integer_zerop (arg0))
6d716ca8 1477 return arg1;
9898deac
RK
1478 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1479 && integer_zerop (arg1))
6d716ca8 1480 return arg0;
9898deac 1481 else if (code == MULT_EXPR && integer_onep (arg0))
6d716ca8 1482 return arg1;
9898deac 1483
6d716ca8 1484 /* Handle general case of two integer constants. */
e9a25f70 1485 return int_const_binop (code, arg0, arg1, 0, 1);
6d716ca8
RS
1486 }
1487
1488 if (arg0 == error_mark_node || arg1 == error_mark_node)
1489 return error_mark_node;
1490
1491 return fold (build (code, sizetype, arg0, arg1));
1492}
697073d9
JM
1493
1494/* Combine operands OP1 and OP2 with arithmetic operation CODE.
1495 CODE is a tree code. Data type is taken from `ssizetype',
1496 If the operands are constant, so is the result. */
1497
1498tree
1499ssize_binop (code, arg0, arg1)
1500 enum tree_code code;
1501 tree arg0, arg1;
1502{
1503 /* Handle the special case of two integer constants faster. */
1504 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1505 {
1506 /* And some specific cases even faster than that. */
1507 if (code == PLUS_EXPR && integer_zerop (arg0))
1508 return arg1;
1509 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1510 && integer_zerop (arg1))
1511 return arg0;
1512 else if (code == MULT_EXPR && integer_onep (arg0))
1513 return arg1;
1514
1515 /* Handle general case of two integer constants. We convert
1516 arg0 to ssizetype because int_const_binop uses its type for the
1517 return value. */
1518 arg0 = convert (ssizetype, arg0);
1519 return int_const_binop (code, arg0, arg1, 0, 0);
1520 }
1521
1522 if (arg0 == error_mark_node || arg1 == error_mark_node)
1523 return error_mark_node;
1524
1525 return fold (build (code, ssizetype, arg0, arg1));
1526}
6d716ca8
RS
1527\f
1528/* Given T, a tree representing type conversion of ARG1, a constant,
1529 return a constant tree representing the result of conversion. */
1530
1531static tree
1532fold_convert (t, arg1)
1533 register tree t;
1534 register tree arg1;
1535{
1536 register tree type = TREE_TYPE (t);
649ff3b4 1537 int overflow = 0;
6d716ca8 1538
e5e809f4 1539 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
6d716ca8
RS
1540 {
1541 if (TREE_CODE (arg1) == INTEGER_CST)
1542 {
e3374525
RK
1543 /* If we would build a constant wider than GCC supports,
1544 leave the conversion unfolded. */
1545 if (TYPE_PRECISION (type) > 2 * HOST_BITS_PER_WIDE_INT)
1546 return t;
1547
6d716ca8
RS
1548 /* Given an integer constant, make new constant with new type,
1549 appropriately sign-extended or truncated. */
1550 t = build_int_2 (TREE_INT_CST_LOW (arg1),
1551 TREE_INT_CST_HIGH (arg1));
1552 TREE_TYPE (t) = type;
e0f776fb 1553 /* Indicate an overflow if (1) ARG1 already overflowed,
dc3907c5
PE
1554 or (2) force_fit_type indicates an overflow.
1555 Tell force_fit_type that an overflow has already occurred
b472527b
JL
1556 if ARG1 is a too-large unsigned value and T is signed.
1557 But don't indicate an overflow if converting a pointer. */
dc3907c5 1558 TREE_OVERFLOW (t)
e5e809f4
JL
1559 = ((force_fit_type (t,
1560 (TREE_INT_CST_HIGH (arg1) < 0
4f242db3 1561 && (TREE_UNSIGNED (type)
e5e809f4
JL
1562 < TREE_UNSIGNED (TREE_TYPE (arg1)))))
1563 && ! POINTER_TYPE_P (TREE_TYPE (arg1)))
1564 || TREE_OVERFLOW (arg1));
dc3907c5
PE
1565 TREE_CONSTANT_OVERFLOW (t)
1566 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
6d716ca8
RS
1567 }
1568#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1569 else if (TREE_CODE (arg1) == REAL_CST)
1570 {
4b8a0062
RK
1571 /* Don't initialize these, use assignments.
1572 Initialized local aggregates don't work on old compilers. */
1573 REAL_VALUE_TYPE x;
1574 REAL_VALUE_TYPE l;
1575 REAL_VALUE_TYPE u;
7cb6a121 1576 tree type1 = TREE_TYPE (arg1);
e1ee5cdc 1577 int no_upper_bound;
4b8a0062
RK
1578
1579 x = TREE_REAL_CST (arg1);
7cb6a121 1580 l = real_value_from_int_cst (type1, TYPE_MIN_VALUE (type));
e1ee5cdc
RH
1581
1582 no_upper_bound = (TYPE_MAX_VALUE (type) == NULL);
1583 if (!no_upper_bound)
1584 u = real_value_from_int_cst (type1, TYPE_MAX_VALUE (type));
1585
4b3d5ea0
RS
1586 /* See if X will be in range after truncation towards 0.
1587 To compensate for truncation, move the bounds away from 0,
1588 but reject if X exactly equals the adjusted bounds. */
1589#ifdef REAL_ARITHMETIC
1590 REAL_ARITHMETIC (l, MINUS_EXPR, l, dconst1);
e1ee5cdc
RH
1591 if (!no_upper_bound)
1592 REAL_ARITHMETIC (u, PLUS_EXPR, u, dconst1);
4b3d5ea0
RS
1593#else
1594 l--;
e1ee5cdc
RH
1595 if (!no_upper_bound)
1596 u++;
4b3d5ea0 1597#endif
5f610074
RK
1598 /* If X is a NaN, use zero instead and show we have an overflow.
1599 Otherwise, range check. */
1600 if (REAL_VALUE_ISNAN (x))
1601 overflow = 1, x = dconst0;
e1ee5cdc
RH
1602 else if (! (REAL_VALUES_LESS (l, x)
1603 && !no_upper_bound
1604 && REAL_VALUES_LESS (x, u)))
649ff3b4
RK
1605 overflow = 1;
1606
6d716ca8
RS
1607#ifndef REAL_ARITHMETIC
1608 {
906c4e36
RK
1609 HOST_WIDE_INT low, high;
1610 HOST_WIDE_INT half_word
1611 = (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2);
6d716ca8 1612
5f610074
RK
1613 if (x < 0)
1614 x = -x;
6d716ca8 1615
5f610074
RK
1616 high = (HOST_WIDE_INT) (x / half_word / half_word);
1617 x -= (REAL_VALUE_TYPE) high * half_word * half_word;
1618 if (x >= (REAL_VALUE_TYPE) half_word * half_word / 2)
b6b19f41 1619 {
5f610074 1620 low = x - (REAL_VALUE_TYPE) half_word * half_word / 2;
e0f776fb 1621 low |= (HOST_WIDE_INT) -1 << (HOST_BITS_PER_WIDE_INT - 1);
b6b19f41
RS
1622 }
1623 else
5f610074 1624 low = (HOST_WIDE_INT) x;
6d716ca8
RS
1625 if (TREE_REAL_CST (arg1) < 0)
1626 neg_double (low, high, &low, &high);
1627 t = build_int_2 (low, high);
1628 }
1629#else
1630 {
906c4e36 1631 HOST_WIDE_INT low, high;
5f610074 1632 REAL_VALUE_TO_INT (&low, &high, x);
6d716ca8
RS
1633 t = build_int_2 (low, high);
1634 }
1635#endif
1636 TREE_TYPE (t) = type;
649ff3b4
RK
1637 TREE_OVERFLOW (t)
1638 = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow);
1639 TREE_CONSTANT_OVERFLOW (t)
1640 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
6d716ca8
RS
1641 }
1642#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1643 TREE_TYPE (t) = type;
1644 }
1645 else if (TREE_CODE (type) == REAL_TYPE)
1646 {
1647#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1648 if (TREE_CODE (arg1) == INTEGER_CST)
1649 return build_real_from_int_cst (type, arg1);
1650#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
1651 if (TREE_CODE (arg1) == REAL_CST)
7c7b029d 1652 {
5f610074 1653 if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
a377ff85
RK
1654 {
1655 t = arg1;
1656 TREE_TYPE (arg1) = type;
1657 return t;
1658 }
5f610074 1659 else if (setjmp (float_error))
7c7b029d 1660 {
649ff3b4
RK
1661 overflow = 1;
1662 t = copy_node (arg1);
1663 goto got_it;
7c7b029d
RS
1664 }
1665 set_float_handler (float_error);
1666
5352b11a 1667 t = build_real (type, real_value_truncate (TYPE_MODE (type),
7c7b029d 1668 TREE_REAL_CST (arg1)));
906c4e36 1669 set_float_handler (NULL_PTR);
649ff3b4
RK
1670
1671 got_it:
1672 TREE_OVERFLOW (t)
1673 = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow);
1674 TREE_CONSTANT_OVERFLOW (t)
1675 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
7c7b029d
RS
1676 return t;
1677 }
6d716ca8
RS
1678 }
1679 TREE_CONSTANT (t) = 1;
1680 return t;
1681}
1682\f
ff59bfe6 1683/* Return an expr equal to X but certainly not valid as an lvalue. */
6d716ca8
RS
1684
1685tree
1686non_lvalue (x)
1687 tree x;
1688{
1689 tree result;
1690
1691 /* These things are certainly not lvalues. */
1692 if (TREE_CODE (x) == NON_LVALUE_EXPR
1693 || TREE_CODE (x) == INTEGER_CST
1694 || TREE_CODE (x) == REAL_CST
1695 || TREE_CODE (x) == STRING_CST
1696 || TREE_CODE (x) == ADDR_EXPR)
ff59bfe6 1697 return x;
6d716ca8
RS
1698
1699 result = build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
1700 TREE_CONSTANT (result) = TREE_CONSTANT (x);
1701 return result;
1702}
a5e9b124 1703
e9866da3
JM
1704/* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
1705 Zero means allow extended lvalues. */
1706
1707int pedantic_lvalues;
1708
a5e9b124
JW
1709/* When pedantic, return an expr equal to X but certainly not valid as a
1710 pedantic lvalue. Otherwise, return X. */
1711
1712tree
1713pedantic_non_lvalue (x)
1714 tree x;
1715{
e9866da3 1716 if (pedantic_lvalues)
a5e9b124
JW
1717 return non_lvalue (x);
1718 else
1719 return x;
1720}
c05a9b68
RS
1721\f
1722/* Given a tree comparison code, return the code that is the logical inverse
1723 of the given code. It is not safe to do this for floating-point
1724 comparisons, except for NE_EXPR and EQ_EXPR. */
6d716ca8 1725
c05a9b68
RS
1726static enum tree_code
1727invert_tree_comparison (code)
1728 enum tree_code code;
1729{
1730 switch (code)
1731 {
1732 case EQ_EXPR:
1733 return NE_EXPR;
1734 case NE_EXPR:
1735 return EQ_EXPR;
1736 case GT_EXPR:
1737 return LE_EXPR;
1738 case GE_EXPR:
1739 return LT_EXPR;
1740 case LT_EXPR:
1741 return GE_EXPR;
1742 case LE_EXPR:
1743 return GT_EXPR;
1744 default:
1745 abort ();
1746 }
1747}
1748
1749/* Similar, but return the comparison that results if the operands are
1750 swapped. This is safe for floating-point. */
1751
1752static enum tree_code
1753swap_tree_comparison (code)
1754 enum tree_code code;
1755{
1756 switch (code)
1757 {
1758 case EQ_EXPR:
1759 case NE_EXPR:
1760 return code;
1761 case GT_EXPR:
1762 return LT_EXPR;
1763 case GE_EXPR:
1764 return LE_EXPR;
1765 case LT_EXPR:
1766 return GT_EXPR;
1767 case LE_EXPR:
1768 return GE_EXPR;
1769 default:
1770 abort ();
1771 }
1772}
61f275ff
RK
1773
1774/* Return nonzero if CODE is a tree code that represents a truth value. */
1775
1776static int
1777truth_value_p (code)
1778 enum tree_code code;
1779{
1780 return (TREE_CODE_CLASS (code) == '<'
1781 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
1782 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
1783 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
1784}
c05a9b68 1785\f
6a1746af
RS
1786/* Return nonzero if two operands are necessarily equal.
1787 If ONLY_CONST is non-zero, only return non-zero for constants.
1788 This function tests whether the operands are indistinguishable;
1789 it does not test whether they are equal using C's == operation.
1790 The distinction is important for IEEE floating point, because
1791 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
1792 (2) two NaNs may be indistinguishable, but NaN!=NaN. */
6d716ca8
RS
1793
1794int
1795operand_equal_p (arg0, arg1, only_const)
1796 tree arg0, arg1;
1797 int only_const;
1798{
1799 /* If both types don't have the same signedness, then we can't consider
1800 them equal. We must check this before the STRIP_NOPS calls
1801 because they may change the signedness of the arguments. */
1802 if (TREE_UNSIGNED (TREE_TYPE (arg0)) != TREE_UNSIGNED (TREE_TYPE (arg1)))
1803 return 0;
1804
1805 STRIP_NOPS (arg0);
1806 STRIP_NOPS (arg1);
1807
c7cfe938
RK
1808 if (TREE_CODE (arg0) != TREE_CODE (arg1)
1809 /* This is needed for conversions and for COMPONENT_REF.
1810 Might as well play it safe and always test this. */
1811 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
6d716ca8
RS
1812 return 0;
1813
c7cfe938
RK
1814 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
1815 We don't care about side effects in that case because the SAVE_EXPR
1816 takes care of that for us. In all other cases, two expressions are
1817 equal if they have no side effects. If we have two identical
1818 expressions with side effects that should be treated the same due
1819 to the only side effects being identical SAVE_EXPR's, that will
1820 be detected in the recursive calls below. */
1821 if (arg0 == arg1 && ! only_const
1822 && (TREE_CODE (arg0) == SAVE_EXPR
1823 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
6d716ca8
RS
1824 return 1;
1825
c7cfe938
RK
1826 /* Next handle constant cases, those for which we can return 1 even
1827 if ONLY_CONST is set. */
1828 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
1829 switch (TREE_CODE (arg0))
1830 {
1831 case INTEGER_CST:
3c9b0091
RK
1832 return (! TREE_CONSTANT_OVERFLOW (arg0)
1833 && ! TREE_CONSTANT_OVERFLOW (arg1)
1834 && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
c7cfe938
RK
1835 && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1));
1836
1837 case REAL_CST:
3c9b0091
RK
1838 return (! TREE_CONSTANT_OVERFLOW (arg0)
1839 && ! TREE_CONSTANT_OVERFLOW (arg1)
41c9120b
PE
1840 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
1841 TREE_REAL_CST (arg1)));
c7cfe938
RK
1842
1843 case COMPLEX_CST:
1844 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
1845 only_const)
1846 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
1847 only_const));
1848
1849 case STRING_CST:
1850 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
1851 && ! strncmp (TREE_STRING_POINTER (arg0),
1852 TREE_STRING_POINTER (arg1),
1853 TREE_STRING_LENGTH (arg0)));
1854
1855 case ADDR_EXPR:
1856 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
1857 0);
e9a25f70
JL
1858 default:
1859 break;
c7cfe938 1860 }
6d716ca8
RS
1861
1862 if (only_const)
1863 return 0;
1864
6d716ca8
RS
1865 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
1866 {
1867 case '1':
1868 /* Two conversions are equal only if signedness and modes match. */
1869 if ((TREE_CODE (arg0) == NOP_EXPR || TREE_CODE (arg0) == CONVERT_EXPR)
1870 && (TREE_UNSIGNED (TREE_TYPE (arg0))
1871 != TREE_UNSIGNED (TREE_TYPE (arg1))))
1872 return 0;
1873
1874 return operand_equal_p (TREE_OPERAND (arg0, 0),
1875 TREE_OPERAND (arg1, 0), 0);
1876
1877 case '<':
1878 case '2':
c7cfe938
RK
1879 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)
1880 && operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1),
1881 0))
1882 return 1;
1883
1884 /* For commutative ops, allow the other order. */
1885 return ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MULT_EXPR
1886 || TREE_CODE (arg0) == MIN_EXPR || TREE_CODE (arg0) == MAX_EXPR
1887 || TREE_CODE (arg0) == BIT_IOR_EXPR
1888 || TREE_CODE (arg0) == BIT_XOR_EXPR
1889 || TREE_CODE (arg0) == BIT_AND_EXPR
1890 || TREE_CODE (arg0) == NE_EXPR || TREE_CODE (arg0) == EQ_EXPR)
1891 && operand_equal_p (TREE_OPERAND (arg0, 0),
1892 TREE_OPERAND (arg1, 1), 0)
6d716ca8 1893 && operand_equal_p (TREE_OPERAND (arg0, 1),
c7cfe938 1894 TREE_OPERAND (arg1, 0), 0));
6d716ca8
RS
1895
1896 case 'r':
1897 switch (TREE_CODE (arg0))
1898 {
1899 case INDIRECT_REF:
1900 return operand_equal_p (TREE_OPERAND (arg0, 0),
1901 TREE_OPERAND (arg1, 0), 0);
1902
1903 case COMPONENT_REF:
1904 case ARRAY_REF:
1905 return (operand_equal_p (TREE_OPERAND (arg0, 0),
1906 TREE_OPERAND (arg1, 0), 0)
1907 && operand_equal_p (TREE_OPERAND (arg0, 1),
1908 TREE_OPERAND (arg1, 1), 0));
1909
1910 case BIT_FIELD_REF:
1911 return (operand_equal_p (TREE_OPERAND (arg0, 0),
1912 TREE_OPERAND (arg1, 0), 0)
1913 && operand_equal_p (TREE_OPERAND (arg0, 1),
1914 TREE_OPERAND (arg1, 1), 0)
1915 && operand_equal_p (TREE_OPERAND (arg0, 2),
1916 TREE_OPERAND (arg1, 2), 0));
e9a25f70
JL
1917 default:
1918 return 0;
6d716ca8 1919 }
45f97e2e
RH
1920
1921 case 'e':
1922 if (TREE_CODE (arg0) == RTL_EXPR)
1923 return rtx_equal_p (RTL_EXPR_RTL (arg0), RTL_EXPR_RTL (arg1));
1924 return 0;
e9a25f70
JL
1925
1926 default:
1927 return 0;
6d716ca8 1928 }
6d716ca8 1929}
c05a9b68
RS
1930\f
1931/* Similar to operand_equal_p, but see if ARG0 might have been made by
1932 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
6d716ca8 1933
6d716ca8
RS
1934 When in doubt, return 0. */
1935
1936static int
c05a9b68
RS
1937operand_equal_for_comparison_p (arg0, arg1, other)
1938 tree arg0, arg1;
1939 tree other;
6d716ca8 1940{
c05a9b68 1941 int unsignedp1, unsignedpo;
52de9b6c 1942 tree primarg0, primarg1, primother;
7a75868d 1943 unsigned correct_width;
6d716ca8 1944
c05a9b68 1945 if (operand_equal_p (arg0, arg1, 0))
6d716ca8
RS
1946 return 1;
1947
0982a4b8
JM
1948 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
1949 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
6d716ca8
RS
1950 return 0;
1951
52de9b6c
RK
1952 /* Discard any conversions that don't change the modes of ARG0 and ARG1
1953 and see if the inner values are the same. This removes any
1954 signedness comparison, which doesn't matter here. */
1955 primarg0 = arg0, primarg1 = arg1;
1956 STRIP_NOPS (primarg0); STRIP_NOPS (primarg1);
1957 if (operand_equal_p (primarg0, primarg1, 0))
1958 return 1;
1959
c05a9b68
RS
1960 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
1961 actual comparison operand, ARG0.
6d716ca8 1962
c05a9b68 1963 First throw away any conversions to wider types
6d716ca8 1964 already present in the operands. */
6d716ca8 1965
c05a9b68
RS
1966 primarg1 = get_narrower (arg1, &unsignedp1);
1967 primother = get_narrower (other, &unsignedpo);
1968
1969 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
1970 if (unsignedp1 == unsignedpo
1971 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
1972 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
6d716ca8 1973 {
c05a9b68 1974 tree type = TREE_TYPE (arg0);
6d716ca8
RS
1975
1976 /* Make sure shorter operand is extended the right way
1977 to match the longer operand. */
c05a9b68
RS
1978 primarg1 = convert (signed_or_unsigned_type (unsignedp1,
1979 TREE_TYPE (primarg1)),
1980 primarg1);
6d716ca8 1981
c05a9b68 1982 if (operand_equal_p (arg0, convert (type, primarg1), 0))
6d716ca8
RS
1983 return 1;
1984 }
1985
1986 return 0;
1987}
1988\f
f72aed24 1989/* See if ARG is an expression that is either a comparison or is performing
c05a9b68
RS
1990 arithmetic on comparisons. The comparisons must only be comparing
1991 two different values, which will be stored in *CVAL1 and *CVAL2; if
1992 they are non-zero it means that some operands have already been found.
1993 No variables may be used anywhere else in the expression except in the
35e66bd1
RK
1994 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
1995 the expression and save_expr needs to be called with CVAL1 and CVAL2.
c05a9b68
RS
1996
1997 If this is true, return 1. Otherwise, return zero. */
1998
1999static int
35e66bd1 2000twoval_comparison_p (arg, cval1, cval2, save_p)
c05a9b68
RS
2001 tree arg;
2002 tree *cval1, *cval2;
35e66bd1 2003 int *save_p;
c05a9b68
RS
2004{
2005 enum tree_code code = TREE_CODE (arg);
2006 char class = TREE_CODE_CLASS (code);
2007
2008 /* We can handle some of the 'e' cases here. */
35e66bd1 2009 if (class == 'e' && code == TRUTH_NOT_EXPR)
c05a9b68
RS
2010 class = '1';
2011 else if (class == 'e'
2012 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2013 || code == COMPOUND_EXPR))
2014 class = '2';
2315a5db
RS
2015
2016 /* ??? Disable this since the SAVE_EXPR might already be in use outside
2017 the expression. There may be no way to make this work, but it needs
2018 to be looked at again for 2.6. */
2019#if 0
35e66bd1
RK
2020 else if (class == 'e' && code == SAVE_EXPR && SAVE_EXPR_RTL (arg) == 0)
2021 {
2022 /* If we've already found a CVAL1 or CVAL2, this expression is
2023 two complex to handle. */
2024 if (*cval1 || *cval2)
2025 return 0;
2026
2027 class = '1';
2028 *save_p = 1;
2029 }
2315a5db 2030#endif
c05a9b68
RS
2031
2032 switch (class)
2033 {
2034 case '1':
35e66bd1 2035 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
c05a9b68
RS
2036
2037 case '2':
35e66bd1
RK
2038 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2039 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2040 cval1, cval2, save_p));
c05a9b68
RS
2041
2042 case 'c':
2043 return 1;
2044
2045 case 'e':
2046 if (code == COND_EXPR)
35e66bd1
RK
2047 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2048 cval1, cval2, save_p)
2049 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2050 cval1, cval2, save_p)
c05a9b68 2051 && twoval_comparison_p (TREE_OPERAND (arg, 2),
35e66bd1 2052 cval1, cval2, save_p));
c05a9b68
RS
2053 return 0;
2054
2055 case '<':
2056 /* First see if we can handle the first operand, then the second. For
2057 the second operand, we know *CVAL1 can't be zero. It must be that
2058 one side of the comparison is each of the values; test for the
2059 case where this isn't true by failing if the two operands
2060 are the same. */
2061
2062 if (operand_equal_p (TREE_OPERAND (arg, 0),
2063 TREE_OPERAND (arg, 1), 0))
2064 return 0;
2065
2066 if (*cval1 == 0)
2067 *cval1 = TREE_OPERAND (arg, 0);
2068 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2069 ;
2070 else if (*cval2 == 0)
2071 *cval2 = TREE_OPERAND (arg, 0);
2072 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2073 ;
2074 else
2075 return 0;
2076
2077 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2078 ;
2079 else if (*cval2 == 0)
2080 *cval2 = TREE_OPERAND (arg, 1);
2081 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2082 ;
2083 else
2084 return 0;
2085
2086 return 1;
c05a9b68 2087
e9a25f70
JL
2088 default:
2089 return 0;
2090 }
c05a9b68
RS
2091}
2092\f
2093/* ARG is a tree that is known to contain just arithmetic operations and
2094 comparisons. Evaluate the operations in the tree substituting NEW0 for
f72aed24 2095 any occurrence of OLD0 as an operand of a comparison and likewise for
c05a9b68
RS
2096 NEW1 and OLD1. */
2097
2098static tree
2099eval_subst (arg, old0, new0, old1, new1)
2100 tree arg;
2101 tree old0, new0, old1, new1;
2102{
2103 tree type = TREE_TYPE (arg);
2104 enum tree_code code = TREE_CODE (arg);
2105 char class = TREE_CODE_CLASS (code);
2106
2107 /* We can handle some of the 'e' cases here. */
2108 if (class == 'e' && code == TRUTH_NOT_EXPR)
2109 class = '1';
2110 else if (class == 'e'
2111 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2112 class = '2';
2113
2114 switch (class)
2115 {
2116 case '1':
2117 return fold (build1 (code, type,
2118 eval_subst (TREE_OPERAND (arg, 0),
2119 old0, new0, old1, new1)));
2120
2121 case '2':
2122 return fold (build (code, type,
2123 eval_subst (TREE_OPERAND (arg, 0),
2124 old0, new0, old1, new1),
2125 eval_subst (TREE_OPERAND (arg, 1),
2126 old0, new0, old1, new1)));
2127
2128 case 'e':
2129 switch (code)
2130 {
2131 case SAVE_EXPR:
2132 return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2133
2134 case COMPOUND_EXPR:
2135 return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2136
2137 case COND_EXPR:
2138 return fold (build (code, type,
2139 eval_subst (TREE_OPERAND (arg, 0),
2140 old0, new0, old1, new1),
2141 eval_subst (TREE_OPERAND (arg, 1),
2142 old0, new0, old1, new1),
2143 eval_subst (TREE_OPERAND (arg, 2),
2144 old0, new0, old1, new1)));
e9a25f70
JL
2145 default:
2146 break;
c05a9b68 2147 }
e9a25f70 2148 /* fall through (???) */
c05a9b68
RS
2149
2150 case '<':
2151 {
2152 tree arg0 = TREE_OPERAND (arg, 0);
2153 tree arg1 = TREE_OPERAND (arg, 1);
2154
2155 /* We need to check both for exact equality and tree equality. The
2156 former will be true if the operand has a side-effect. In that
2157 case, we know the operand occurred exactly once. */
2158
2159 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2160 arg0 = new0;
2161 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2162 arg0 = new1;
2163
2164 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2165 arg1 = new0;
2166 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2167 arg1 = new1;
2168
2169 return fold (build (code, type, arg0, arg1));
2170 }
c05a9b68 2171
e9a25f70
JL
2172 default:
2173 return arg;
2174 }
c05a9b68
RS
2175}
2176\f
6d716ca8
RS
2177/* Return a tree for the case when the result of an expression is RESULT
2178 converted to TYPE and OMITTED was previously an operand of the expression
2179 but is now not needed (e.g., we folded OMITTED * 0).
2180
2181 If OMITTED has side effects, we must evaluate it. Otherwise, just do
2182 the conversion of RESULT to TYPE. */
2183
2184static tree
2185omit_one_operand (type, result, omitted)
2186 tree type, result, omitted;
2187{
2188 tree t = convert (type, result);
2189
2190 if (TREE_SIDE_EFFECTS (omitted))
2191 return build (COMPOUND_EXPR, type, omitted, t);
2192
d023bff9 2193 return non_lvalue (t);
6d716ca8 2194}
4ab3cb65
RK
2195
2196/* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
2197
2198static tree
2199pedantic_omit_one_operand (type, result, omitted)
2200 tree type, result, omitted;
2201{
2202 tree t = convert (type, result);
2203
2204 if (TREE_SIDE_EFFECTS (omitted))
2205 return build (COMPOUND_EXPR, type, omitted, t);
2206
2207 return pedantic_non_lvalue (t);
2208}
2209
2210
6d716ca8 2211\f
3f783329
RS
2212/* Return a simplified tree node for the truth-negation of ARG. This
2213 never alters ARG itself. We assume that ARG is an operation that
6d716ca8
RS
2214 returns a truth value (0 or 1). */
2215
2216tree
2217invert_truthvalue (arg)
2218 tree arg;
2219{
2220 tree type = TREE_TYPE (arg);
c05a9b68 2221 enum tree_code code = TREE_CODE (arg);
6d716ca8 2222
8ac1abdf
JW
2223 if (code == ERROR_MARK)
2224 return arg;
2225
c05a9b68
RS
2226 /* If this is a comparison, we can simply invert it, except for
2227 floating-point non-equality comparisons, in which case we just
2228 enclose a TRUTH_NOT_EXPR around what we have. */
6d716ca8 2229
c05a9b68 2230 if (TREE_CODE_CLASS (code) == '<')
6d716ca8 2231 {
7178e3af 2232 if (FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg, 0)))
a58bd508 2233 && !flag_fast_math && code != NE_EXPR && code != EQ_EXPR)
c05a9b68
RS
2234 return build1 (TRUTH_NOT_EXPR, type, arg);
2235 else
ca46db87 2236 return build (invert_tree_comparison (code), type,
3f783329 2237 TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
c05a9b68 2238 }
6d716ca8 2239
c05a9b68
RS
2240 switch (code)
2241 {
6d716ca8
RS
2242 case INTEGER_CST:
2243 return convert (type, build_int_2 (TREE_INT_CST_LOW (arg) == 0
2244 && TREE_INT_CST_HIGH (arg) == 0, 0));
2245
2246 case TRUTH_AND_EXPR:
2247 return build (TRUTH_OR_EXPR, type,
2248 invert_truthvalue (TREE_OPERAND (arg, 0)),
2249 invert_truthvalue (TREE_OPERAND (arg, 1)));
2250
2251 case TRUTH_OR_EXPR:
2252 return build (TRUTH_AND_EXPR, type,
2253 invert_truthvalue (TREE_OPERAND (arg, 0)),
2254 invert_truthvalue (TREE_OPERAND (arg, 1)));
2255
772447c5
RK
2256 case TRUTH_XOR_EXPR:
2257 /* Here we can invert either operand. We invert the first operand
2258 unless the second operand is a TRUTH_NOT_EXPR in which case our
2259 result is the XOR of the first operand with the inside of the
2260 negation of the second operand. */
2261
2262 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
2263 return build (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2264 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
2265 else
2266 return build (TRUTH_XOR_EXPR, type,
2267 invert_truthvalue (TREE_OPERAND (arg, 0)),
2268 TREE_OPERAND (arg, 1));
2269
6d716ca8
RS
2270 case TRUTH_ANDIF_EXPR:
2271 return build (TRUTH_ORIF_EXPR, type,
2272 invert_truthvalue (TREE_OPERAND (arg, 0)),
2273 invert_truthvalue (TREE_OPERAND (arg, 1)));
2274
2275 case TRUTH_ORIF_EXPR:
2276 return build (TRUTH_ANDIF_EXPR, type,
2277 invert_truthvalue (TREE_OPERAND (arg, 0)),
2278 invert_truthvalue (TREE_OPERAND (arg, 1)));
2279
2280 case TRUTH_NOT_EXPR:
2281 return TREE_OPERAND (arg, 0);
2282
2283 case COND_EXPR:
2284 return build (COND_EXPR, type, TREE_OPERAND (arg, 0),
2285 invert_truthvalue (TREE_OPERAND (arg, 1)),
2286 invert_truthvalue (TREE_OPERAND (arg, 2)));
2287
ef9fe0da
RK
2288 case COMPOUND_EXPR:
2289 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2290 invert_truthvalue (TREE_OPERAND (arg, 1)));
2291
6d716ca8
RS
2292 case NON_LVALUE_EXPR:
2293 return invert_truthvalue (TREE_OPERAND (arg, 0));
2294
2295 case NOP_EXPR:
2296 case CONVERT_EXPR:
2297 case FLOAT_EXPR:
2298 return build1 (TREE_CODE (arg), type,
2299 invert_truthvalue (TREE_OPERAND (arg, 0)));
2300
2301 case BIT_AND_EXPR:
efc1a4d9
PB
2302 if (!integer_onep (TREE_OPERAND (arg, 1)))
2303 break;
6d716ca8 2304 return build (EQ_EXPR, type, arg, convert (type, integer_zero_node));
6d716ca8 2305
dfa90b42
RS
2306 case SAVE_EXPR:
2307 return build1 (TRUTH_NOT_EXPR, type, arg);
a25ee332
RK
2308
2309 case CLEANUP_POINT_EXPR:
2310 return build1 (CLEANUP_POINT_EXPR, type,
2311 invert_truthvalue (TREE_OPERAND (arg, 0)));
e9a25f70
JL
2312
2313 default:
2314 break;
efc1a4d9
PB
2315 }
2316 if (TREE_CODE (TREE_TYPE (arg)) != BOOLEAN_TYPE)
dfa90b42 2317 abort ();
efc1a4d9 2318 return build1 (TRUTH_NOT_EXPR, type, arg);
6d716ca8
RS
2319}
2320
2321/* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
2322 operands are another bit-wise operation with a common input. If so,
2323 distribute the bit operations to save an operation and possibly two if
2324 constants are involved. For example, convert
2325 (A | B) & (A | C) into A | (B & C)
2326 Further simplification will occur if B and C are constants.
2327
2328 If this optimization cannot be done, 0 will be returned. */
2329
2330static tree
2331distribute_bit_expr (code, type, arg0, arg1)
2332 enum tree_code code;
2333 tree type;
2334 tree arg0, arg1;
2335{
2336 tree common;
2337 tree left, right;
2338
2339 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2340 || TREE_CODE (arg0) == code
fced8ba3
RS
2341 || (TREE_CODE (arg0) != BIT_AND_EXPR
2342 && TREE_CODE (arg0) != BIT_IOR_EXPR))
6d716ca8
RS
2343 return 0;
2344
2345 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
2346 {
2347 common = TREE_OPERAND (arg0, 0);
2348 left = TREE_OPERAND (arg0, 1);
2349 right = TREE_OPERAND (arg1, 1);
2350 }
2351 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
2352 {
2353 common = TREE_OPERAND (arg0, 0);
2354 left = TREE_OPERAND (arg0, 1);
2355 right = TREE_OPERAND (arg1, 0);
2356 }
2357 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
2358 {
2359 common = TREE_OPERAND (arg0, 1);
2360 left = TREE_OPERAND (arg0, 0);
2361 right = TREE_OPERAND (arg1, 1);
2362 }
2363 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
2364 {
2365 common = TREE_OPERAND (arg0, 1);
2366 left = TREE_OPERAND (arg0, 0);
2367 right = TREE_OPERAND (arg1, 0);
2368 }
2369 else
2370 return 0;
2371
2372 return fold (build (TREE_CODE (arg0), type, common,
2373 fold (build (code, type, left, right))));
2374}
2375\f
2376/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
2377 starting at BITPOS. The field is unsigned if UNSIGNEDP is non-zero. */
2378
2379static tree
2380make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
2381 tree inner;
2382 tree type;
2383 int bitsize, bitpos;
2384 int unsignedp;
2385{
2386 tree result = build (BIT_FIELD_REF, type, inner,
f8dac6eb 2387 size_int (bitsize), bitsize_int (bitpos, 0L));
6d716ca8
RS
2388
2389 TREE_UNSIGNED (result) = unsignedp;
2390
2391 return result;
2392}
2393
2394/* Optimize a bit-field compare.
2395
2396 There are two cases: First is a compare against a constant and the
2397 second is a comparison of two items where the fields are at the same
2398 bit position relative to the start of a chunk (byte, halfword, word)
2399 large enough to contain it. In these cases we can avoid the shift
2400 implicit in bitfield extractions.
2401
2402 For constants, we emit a compare of the shifted constant with the
2403 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
2404 compared. For two fields at the same position, we do the ANDs with the
2405 similar mask and compare the result of the ANDs.
2406
2407 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
2408 COMPARE_TYPE is the type of the comparison, and LHS and RHS
2409 are the left and right operands of the comparison, respectively.
2410
6dc42e49 2411 If the optimization described above can be done, we return the resulting
6d716ca8
RS
2412 tree. Otherwise we return zero. */
2413
2414static tree
2415optimize_bit_field_compare (code, compare_type, lhs, rhs)
2416 enum tree_code code;
2417 tree compare_type;
2418 tree lhs, rhs;
2419{
2420 int lbitpos, lbitsize, rbitpos, rbitsize;
4e86caed 2421 int lnbitpos, lnbitsize, rnbitpos = 0, rnbitsize = 0;
6d716ca8
RS
2422 tree type = TREE_TYPE (lhs);
2423 tree signed_type, unsigned_type;
2424 int const_p = TREE_CODE (rhs) == INTEGER_CST;
4e86caed 2425 enum machine_mode lmode, rmode, lnmode, rnmode = VOIDmode;
6d716ca8
RS
2426 int lunsignedp, runsignedp;
2427 int lvolatilep = 0, rvolatilep = 0;
23bd99ae 2428 int alignment;
4e86caed 2429 tree linner, rinner = NULL_TREE;
6d716ca8 2430 tree mask;
f1e60ec6 2431 tree offset;
6d716ca8
RS
2432
2433 /* Get all the information about the extractions being done. If the bit size
2434 if the same as the size of the underlying object, we aren't doing an
2435 extraction at all and so can do nothing. */
f1e60ec6 2436 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
23bd99ae 2437 &lunsignedp, &lvolatilep, &alignment);
9f5e873c 2438 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
f1e60ec6 2439 || offset != 0)
6d716ca8
RS
2440 return 0;
2441
2442 if (!const_p)
2443 {
2444 /* If this is not a constant, we can only do something if bit positions,
2445 sizes, and signedness are the same. */
23bd99ae
RK
2446 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
2447 &runsignedp, &rvolatilep, &alignment);
6d716ca8 2448
9f5e873c 2449 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
f1e60ec6 2450 || lunsignedp != runsignedp || offset != 0)
6d716ca8
RS
2451 return 0;
2452 }
2453
2454 /* See if we can find a mode to refer to this field. We should be able to,
2455 but fail if we can't. */
2456 lnmode = get_best_mode (lbitsize, lbitpos,
2457 TYPE_ALIGN (TREE_TYPE (linner)), word_mode,
2458 lvolatilep);
2459 if (lnmode == VOIDmode)
2460 return 0;
2461
2462 /* Set signed and unsigned types of the precision of this mode for the
2463 shifts below. */
2464 signed_type = type_for_mode (lnmode, 0);
2465 unsigned_type = type_for_mode (lnmode, 1);
2466
2467 if (! const_p)
2468 {
2469 rnmode = get_best_mode (rbitsize, rbitpos,
2470 TYPE_ALIGN (TREE_TYPE (rinner)), word_mode,
2471 rvolatilep);
2472 if (rnmode == VOIDmode)
2473 return 0;
2474 }
2475
2476 /* Compute the bit position and size for the new reference and our offset
2477 within it. If the new reference is the same size as the original, we
2478 won't optimize anything, so return zero. */
2479 lnbitsize = GET_MODE_BITSIZE (lnmode);
2480 lnbitpos = lbitpos & ~ (lnbitsize - 1);
2481 lbitpos -= lnbitpos;
2482 if (lnbitsize == lbitsize)
2483 return 0;
2484
2485 if (! const_p)
2486 {
2487 rnbitsize = GET_MODE_BITSIZE (rnmode);
2488 rnbitpos = rbitpos & ~ (rnbitsize - 1);
2489 rbitpos -= rnbitpos;
2490 if (rnbitsize == rbitsize)
2491 return 0;
2492 }
2493
f76b9db2
ILT
2494 if (BYTES_BIG_ENDIAN)
2495 lbitpos = lnbitsize - lbitsize - lbitpos;
6d716ca8
RS
2496
2497 /* Make the mask to be used against the extracted field. */
13af526d
RS
2498 mask = build_int_2 (~0, ~0);
2499 TREE_TYPE (mask) = unsigned_type;
aa830baf 2500 force_fit_type (mask, 0);
13af526d 2501 mask = convert (unsigned_type, mask);
91d33e36 2502 mask = const_binop (LSHIFT_EXPR, mask, size_int (lnbitsize - lbitsize), 0);
6d716ca8 2503 mask = const_binop (RSHIFT_EXPR, mask,
91d33e36 2504 size_int (lnbitsize - lbitsize - lbitpos), 0);
6d716ca8
RS
2505
2506 if (! const_p)
2507 /* If not comparing with constant, just rework the comparison
2508 and return. */
2509 return build (code, compare_type,
c0b9d4c8
RK
2510 build (BIT_AND_EXPR, unsigned_type,
2511 make_bit_field_ref (linner, unsigned_type,
2512 lnbitsize, lnbitpos, 1),
6d716ca8 2513 mask),
c0b9d4c8
RK
2514 build (BIT_AND_EXPR, unsigned_type,
2515 make_bit_field_ref (rinner, unsigned_type,
2516 rnbitsize, rnbitpos, 1),
6d716ca8
RS
2517 mask));
2518
2519 /* Otherwise, we are handling the constant case. See if the constant is too
2520 big for the field. Warn and return a tree of for 0 (false) if so. We do
2521 this not only for its own sake, but to avoid having to test for this
2522 error case below. If we didn't, we might generate wrong code.
2523
2524 For unsigned fields, the constant shifted right by the field length should
2525 be all zero. For signed fields, the high-order bits should agree with
2526 the sign bit. */
2527
2528 if (lunsignedp)
2529 {
2530 if (! integer_zerop (const_binop (RSHIFT_EXPR,
2531 convert (unsigned_type, rhs),
91d33e36 2532 size_int (lbitsize), 0)))
6d716ca8
RS
2533 {
2534 warning ("comparison is always %s due to width of bitfield",
2535 code == NE_EXPR ? "one" : "zero");
2536 return convert (compare_type,
2537 (code == NE_EXPR
2538 ? integer_one_node : integer_zero_node));
2539 }
2540 }
2541 else
2542 {
2543 tree tem = const_binop (RSHIFT_EXPR, convert (signed_type, rhs),
91d33e36 2544 size_int (lbitsize - 1), 0);
6d716ca8
RS
2545 if (! integer_zerop (tem) && ! integer_all_onesp (tem))
2546 {
2547 warning ("comparison is always %s due to width of bitfield",
2548 code == NE_EXPR ? "one" : "zero");
2549 return convert (compare_type,
2550 (code == NE_EXPR
2551 ? integer_one_node : integer_zero_node));
2552 }
2553 }
2554
2555 /* Single-bit compares should always be against zero. */
2556 if (lbitsize == 1 && ! integer_zerop (rhs))
2557 {
2558 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
2559 rhs = convert (type, integer_zero_node);
2560 }
2561
2562 /* Make a new bitfield reference, shift the constant over the
2563 appropriate number of bits and mask it with the computed mask
2564 (in case this was a signed field). If we changed it, make a new one. */
c0b9d4c8 2565 lhs = make_bit_field_ref (linner, unsigned_type, lnbitsize, lnbitpos, 1);
9db73acb
RK
2566 if (lvolatilep)
2567 {
2568 TREE_SIDE_EFFECTS (lhs) = 1;
2569 TREE_THIS_VOLATILE (lhs) = 1;
2570 }
6d716ca8 2571
c0b9d4c8
RK
2572 rhs = fold (const_binop (BIT_AND_EXPR,
2573 const_binop (LSHIFT_EXPR,
2574 convert (unsigned_type, rhs),
194c082f 2575 size_int (lbitpos), 0),
91d33e36 2576 mask, 0));
6d716ca8
RS
2577
2578 return build (code, compare_type,
c0b9d4c8 2579 build (BIT_AND_EXPR, unsigned_type, lhs, mask),
6d716ca8
RS
2580 rhs);
2581}
2582\f
b2215d83 2583/* Subroutine for fold_truthop: decode a field reference.
6d716ca8
RS
2584
2585 If EXP is a comparison reference, we return the innermost reference.
2586
2587 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
2588 set to the starting bit number.
2589
2590 If the innermost field can be completely contained in a mode-sized
2591 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
2592
2593 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
2594 otherwise it is not changed.
2595
2596 *PUNSIGNEDP is set to the signedness of the field.
2597
2598 *PMASK is set to the mask used. This is either contained in a
2599 BIT_AND_EXPR or derived from the width of the field.
2600
38e01259 2601 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
d4453ee5 2602
6d716ca8
RS
2603 Return 0 if this is not a component reference or is one that we can't
2604 do anything with. */
2605
2606static tree
2607decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp,
d4453ee5 2608 pvolatilep, pmask, pand_mask)
6d716ca8
RS
2609 tree exp;
2610 int *pbitsize, *pbitpos;
2611 enum machine_mode *pmode;
2612 int *punsignedp, *pvolatilep;
2613 tree *pmask;
d4453ee5 2614 tree *pand_mask;
6d716ca8 2615{
6d9f1f5f
RK
2616 tree and_mask = 0;
2617 tree mask, inner, offset;
2618 tree unsigned_type;
2619 int precision;
23bd99ae 2620 int alignment;
6d716ca8 2621
772ae9f0
RK
2622 /* All the optimizations using this function assume integer fields.
2623 There are problems with FP fields since the type_for_size call
2624 below can fail for, e.g., XFmode. */
2625 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
2626 return 0;
2627
6d716ca8
RS
2628 STRIP_NOPS (exp);
2629
2630 if (TREE_CODE (exp) == BIT_AND_EXPR)
2631 {
6d9f1f5f 2632 and_mask = TREE_OPERAND (exp, 1);
6d716ca8 2633 exp = TREE_OPERAND (exp, 0);
6d9f1f5f
RK
2634 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
2635 if (TREE_CODE (and_mask) != INTEGER_CST)
6d716ca8
RS
2636 return 0;
2637 }
2638
6d716ca8 2639
f1e60ec6 2640 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
23bd99ae 2641 punsignedp, pvolatilep, &alignment);
02103577
RK
2642 if ((inner == exp && and_mask == 0)
2643 || *pbitsize < 0 || offset != 0)
c05a9b68 2644 return 0;
6d716ca8 2645
6d9f1f5f
RK
2646 /* Compute the mask to access the bitfield. */
2647 unsigned_type = type_for_size (*pbitsize, 1);
2648 precision = TYPE_PRECISION (unsigned_type);
2649
2650 mask = build_int_2 (~0, ~0);
2651 TREE_TYPE (mask) = unsigned_type;
2652 force_fit_type (mask, 0);
2653 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2654 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
2655
2656 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
2657 if (and_mask != 0)
2658 mask = fold (build (BIT_AND_EXPR, unsigned_type,
2659 convert (unsigned_type, and_mask), mask));
6d716ca8
RS
2660
2661 *pmask = mask;
d4453ee5 2662 *pand_mask = and_mask;
6d716ca8
RS
2663 return inner;
2664}
2665
6dc42e49 2666/* Return non-zero if MASK represents a mask of SIZE ones in the low-order
6d716ca8
RS
2667 bit positions. */
2668
2669static int
2670all_ones_mask_p (mask, size)
2671 tree mask;
2672 int size;
2673{
2674 tree type = TREE_TYPE (mask);
2675 int precision = TYPE_PRECISION (type);
13af526d 2676 tree tmask;
6d716ca8 2677
13af526d
RS
2678 tmask = build_int_2 (~0, ~0);
2679 TREE_TYPE (tmask) = signed_type (type);
aa830baf 2680 force_fit_type (tmask, 0);
6d716ca8 2681 return
02103577
RK
2682 tree_int_cst_equal (mask,
2683 const_binop (RSHIFT_EXPR,
2684 const_binop (LSHIFT_EXPR, tmask,
2685 size_int (precision - size),
2686 0),
2687 size_int (precision - size), 0));
6d716ca8 2688}
b2215d83
TW
2689
2690/* Subroutine for fold_truthop: determine if an operand is simple enough
2691 to be evaluated unconditionally. */
2692
b2215d83
TW
2693static int
2694simple_operand_p (exp)
2695 tree exp;
2696{
2697 /* Strip any conversions that don't change the machine mode. */
2698 while ((TREE_CODE (exp) == NOP_EXPR
2699 || TREE_CODE (exp) == CONVERT_EXPR)
2700 && (TYPE_MODE (TREE_TYPE (exp))
2701 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
2702 exp = TREE_OPERAND (exp, 0);
2703
2704 return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
2705 || (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
2706 && ! TREE_ADDRESSABLE (exp)
2707 && ! TREE_THIS_VOLATILE (exp)
8227896c
TW
2708 && ! DECL_NONLOCAL (exp)
2709 /* Don't regard global variables as simple. They may be
2710 allocated in ways unknown to the compiler (shared memory,
2711 #pragma weak, etc). */
2712 && ! TREE_PUBLIC (exp)
2713 && ! DECL_EXTERNAL (exp)
2714 /* Loading a static variable is unduly expensive, but global
2715 registers aren't expensive. */
2716 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
b2215d83 2717}
6d716ca8 2718\f
ebde8a27
RK
2719/* The following functions are subroutines to fold_range_test and allow it to
2720 try to change a logical combination of comparisons into a range test.
2721
2722 For example, both
2723 X == 2 && X == 3 && X == 4 && X == 5
2724 and
2725 X >= 2 && X <= 5
2726 are converted to
2727 (unsigned) (X - 2) <= 3
2728
956d6950 2729 We describe each set of comparisons as being either inside or outside
ebde8a27
RK
2730 a range, using a variable named like IN_P, and then describe the
2731 range with a lower and upper bound. If one of the bounds is omitted,
2732 it represents either the highest or lowest value of the type.
2733
2734 In the comments below, we represent a range by two numbers in brackets
956d6950 2735 preceded by a "+" to designate being inside that range, or a "-" to
ebde8a27
RK
2736 designate being outside that range, so the condition can be inverted by
2737 flipping the prefix. An omitted bound is represented by a "-". For
2738 example, "- [-, 10]" means being outside the range starting at the lowest
2739 possible value and ending at 10, in other words, being greater than 10.
2740 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
2741 always false.
2742
2743 We set up things so that the missing bounds are handled in a consistent
2744 manner so neither a missing bound nor "true" and "false" need to be
2745 handled using a special case. */
2746
2747/* Return the result of applying CODE to ARG0 and ARG1, but handle the case
2748 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
2749 and UPPER1_P are nonzero if the respective argument is an upper bound
2750 and zero for a lower. TYPE, if nonzero, is the type of the result; it
2751 must be specified for a comparison. ARG1 will be converted to ARG0's
2752 type if both are specified. */
ef659ec0 2753
ebde8a27
RK
2754static tree
2755range_binop (code, type, arg0, upper0_p, arg1, upper1_p)
2756 enum tree_code code;
2757 tree type;
2758 tree arg0, arg1;
2759 int upper0_p, upper1_p;
2760{
27bae8e5 2761 tree tem;
ebde8a27
RK
2762 int result;
2763 int sgn0, sgn1;
ef659ec0 2764
ebde8a27
RK
2765 /* If neither arg represents infinity, do the normal operation.
2766 Else, if not a comparison, return infinity. Else handle the special
2767 comparison rules. Note that most of the cases below won't occur, but
2768 are handled for consistency. */
ef659ec0 2769
ebde8a27 2770 if (arg0 != 0 && arg1 != 0)
27bae8e5
RK
2771 {
2772 tem = fold (build (code, type != 0 ? type : TREE_TYPE (arg0),
2773 arg0, convert (TREE_TYPE (arg0), arg1)));
2774 STRIP_NOPS (tem);
2775 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
2776 }
ef659ec0 2777
ebde8a27
RK
2778 if (TREE_CODE_CLASS (code) != '<')
2779 return 0;
2780
2781 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
2782 for neither. Then compute our result treating them as never equal
2783 and comparing bounds to non-bounds as above. */
2784 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4e644c93 2785 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
ebde8a27
RK
2786 switch (code)
2787 {
2788 case EQ_EXPR: case NE_EXPR:
2789 result = (code == NE_EXPR);
2790 break;
2791 case LT_EXPR: case LE_EXPR:
2792 result = sgn0 < sgn1;
2793 break;
2794 case GT_EXPR: case GE_EXPR:
2795 result = sgn0 > sgn1;
2796 break;
e9a25f70
JL
2797 default:
2798 abort ();
ebde8a27
RK
2799 }
2800
2801 return convert (type, result ? integer_one_node : integer_zero_node);
2802}
2803\f
2804/* Given EXP, a logical expression, set the range it is testing into
2805 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
2806 actually being tested. *PLOW and *PHIGH will have be made the same type
2807 as the returned expression. If EXP is not a comparison, we will most
2808 likely not be returning a useful value and range. */
ef659ec0 2809
6dc7571d 2810static tree
ebde8a27
RK
2811make_range (exp, pin_p, plow, phigh)
2812 tree exp;
2813 int *pin_p;
2814 tree *plow, *phigh;
ef659ec0 2815{
ebde8a27 2816 enum tree_code code;
4e86caed 2817 tree arg0, arg1, type = NULL_TREE;
7d12cee1 2818 tree orig_type = NULL_TREE;
ebde8a27
RK
2819 int in_p, n_in_p;
2820 tree low, high, n_low, n_high;
ef659ec0 2821
ebde8a27
RK
2822 /* Start with simply saying "EXP != 0" and then look at the code of EXP
2823 and see if we can refine the range. Some of the cases below may not
2824 happen, but it doesn't seem worth worrying about this. We "continue"
2825 the outer loop when we've changed something; otherwise we "break"
2826 the switch, which will "break" the while. */
ef659ec0 2827
ebde8a27
RK
2828 in_p = 0, low = high = convert (TREE_TYPE (exp), integer_zero_node);
2829
2830 while (1)
ef659ec0 2831 {
ebde8a27 2832 code = TREE_CODE (exp);
30d68b86
MM
2833
2834 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
2835 {
2836 arg0 = TREE_OPERAND (exp, 0);
2837 if (TREE_CODE_CLASS (code) == '<'
2838 || TREE_CODE_CLASS (code) == '1'
2839 || TREE_CODE_CLASS (code) == '2')
2840 type = TREE_TYPE (arg0);
2841 if (TREE_CODE_CLASS (code) == '2'
2842 || TREE_CODE_CLASS (code) == '<'
2843 || (TREE_CODE_CLASS (code) == 'e'
2844 && tree_code_length[(int) code] > 1))
2845 arg1 = TREE_OPERAND (exp, 1);
2846 }
ef659ec0 2847
ebde8a27
RK
2848 switch (code)
2849 {
2850 case TRUTH_NOT_EXPR:
2851 in_p = ! in_p, exp = arg0;
2852 continue;
2853
2854 case EQ_EXPR: case NE_EXPR:
2855 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
2856 /* We can only do something if the range is testing for zero
2857 and if the second operand is an integer constant. Note that
2858 saying something is "in" the range we make is done by
2859 complementing IN_P since it will set in the initial case of
2860 being not equal to zero; "out" is leaving it alone. */
2861 if (low == 0 || high == 0
2862 || ! integer_zerop (low) || ! integer_zerop (high)
2863 || TREE_CODE (arg1) != INTEGER_CST)
2864 break;
ef659ec0 2865
ebde8a27
RK
2866 switch (code)
2867 {
2868 case NE_EXPR: /* - [c, c] */
2869 low = high = arg1;
2870 break;
2871 case EQ_EXPR: /* + [c, c] */
2872 in_p = ! in_p, low = high = arg1;
2873 break;
2874 case GT_EXPR: /* - [-, c] */
2875 low = 0, high = arg1;
2876 break;
2877 case GE_EXPR: /* + [c, -] */
2878 in_p = ! in_p, low = arg1, high = 0;
2879 break;
2880 case LT_EXPR: /* - [c, -] */
2881 low = arg1, high = 0;
2882 break;
2883 case LE_EXPR: /* + [-, c] */
2884 in_p = ! in_p, low = 0, high = arg1;
2885 break;
e9a25f70
JL
2886 default:
2887 abort ();
ebde8a27 2888 }
ef659ec0 2889
ebde8a27 2890 exp = arg0;
ef659ec0 2891
7f423031 2892 /* If this is an unsigned comparison, we also know that EXP is
0e1c7fc7
RK
2893 greater than or equal to zero. We base the range tests we make
2894 on that fact, so we record it here so we can parse existing
2895 range tests. */
7f423031 2896 if (TREE_UNSIGNED (type) && (low == 0 || high == 0))
ebde8a27
RK
2897 {
2898 if (! merge_ranges (&n_in_p, &n_low, &n_high, in_p, low, high,
2899 1, convert (type, integer_zero_node),
0e1c7fc7 2900 NULL_TREE))
ebde8a27 2901 break;
ef659ec0 2902
ebde8a27 2903 in_p = n_in_p, low = n_low, high = n_high;
0e1c7fc7
RK
2904
2905 /* If the high bound is missing, reverse the range so it
2906 goes from zero to the low bound minus 1. */
2907 if (high == 0)
2908 {
2909 in_p = ! in_p;
2910 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
2911 integer_one_node, 0);
2912 low = convert (type, integer_zero_node);
2913 }
ebde8a27
RK
2914 }
2915 continue;
2916
2917 case NEGATE_EXPR:
2918 /* (-x) IN [a,b] -> x in [-b, -a] */
2919 n_low = range_binop (MINUS_EXPR, type,
2920 convert (type, integer_zero_node), 0, high, 1);
2921 n_high = range_binop (MINUS_EXPR, type,
2922 convert (type, integer_zero_node), 0, low, 0);
2923 low = n_low, high = n_high;
2924 exp = arg0;
2925 continue;
2926
2927 case BIT_NOT_EXPR:
2928 /* ~ X -> -X - 1 */
2929 exp = build (MINUS_EXPR, type, build1 (NEGATE_EXPR, type, arg0),
27bae8e5 2930 convert (type, integer_one_node));
ebde8a27
RK
2931 continue;
2932
2933 case PLUS_EXPR: case MINUS_EXPR:
2934 if (TREE_CODE (arg1) != INTEGER_CST)
2935 break;
2936
2937 /* If EXP is signed, any overflow in the computation is undefined,
2938 so we don't worry about it so long as our computations on
2939 the bounds don't overflow. For unsigned, overflow is defined
2940 and this is exactly the right thing. */
2941 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
2942 type, low, 0, arg1, 0);
2943 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
2944 type, high, 1, arg1, 0);
2945 if ((n_low != 0 && TREE_OVERFLOW (n_low))
2946 || (n_high != 0 && TREE_OVERFLOW (n_high)))
2947 break;
2948
3c00684e
JL
2949 /* Check for an unsigned range which has wrapped around the maximum
2950 value thus making n_high < n_low, and normalize it. */
5a9d82a6 2951 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
3c00684e
JL
2952 {
2953 low = range_binop (PLUS_EXPR, type, n_high, 0,
0e1c7fc7 2954 integer_one_node, 0);
3c00684e 2955 high = range_binop (MINUS_EXPR, type, n_low, 0,
0e1c7fc7 2956 integer_one_node, 0);
3c00684e
JL
2957 in_p = ! in_p;
2958 }
5a9d82a6
JW
2959 else
2960 low = n_low, high = n_high;
27bae8e5 2961
ebde8a27
RK
2962 exp = arg0;
2963 continue;
2964
2965 case NOP_EXPR: case NON_LVALUE_EXPR: case CONVERT_EXPR:
7d12cee1
JL
2966 if (orig_type == NULL_TREE)
2967 orig_type = type;
2968 if (TYPE_PRECISION (type) > TYPE_PRECISION (orig_type))
2969 break;
2970
ebde8a27
RK
2971 if (! INTEGRAL_TYPE_P (type)
2972 || (low != 0 && ! int_fits_type_p (low, type))
2973 || (high != 0 && ! int_fits_type_p (high, type)))
2974 break;
2975
ce2157a1 2976 n_low = low, n_high = high;
ebde8a27 2977
ce2157a1
JL
2978 if (n_low != 0)
2979 n_low = convert (type, n_low);
2980
2981 if (n_high != 0)
2982 n_high = convert (type, n_high);
2983
2984 /* If we're converting from an unsigned to a signed type,
2985 we will be doing the comparison as unsigned. The tests above
2986 have already verified that LOW and HIGH are both positive.
2987
2988 So we have to make sure that the original unsigned value will
2989 be interpreted as positive. */
2990 if (TREE_UNSIGNED (type) && ! TREE_UNSIGNED (TREE_TYPE (exp)))
2991 {
2992 tree equiv_type = type_for_mode (TYPE_MODE (type), 1);
e1ee5cdc
RH
2993 tree high_positive;
2994
2995 /* A range without an upper bound is, naturally, unbounded.
2996 Since convert would have cropped a very large value, use
2997 the max value for the destination type. */
2998
2999 high_positive = TYPE_MAX_VALUE (equiv_type);
3000 if (!high_positive)
3001 {
3002 high_positive = TYPE_MAX_VALUE (type);
3003 if (!high_positive)
3004 abort();
3005 }
3006 high_positive = fold (build (RSHIFT_EXPR, type,
3007 convert (type, high_positive),
3008 convert (type, integer_one_node)));
ce2157a1
JL
3009
3010 /* If the low bound is specified, "and" the range with the
3011 range for which the original unsigned value will be
3012 positive. */
3013 if (low != 0)
3014 {
3015 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3016 1, n_low, n_high,
3017 1, convert (type, integer_zero_node),
3018 high_positive))
3019 break;
3020
3021 in_p = (n_in_p == in_p);
3022 }
3023 else
3024 {
3025 /* Otherwise, "or" the range with the range of the input
3026 that will be interpreted as negative. */
3027 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3028 0, n_low, n_high,
3029 1, convert (type, integer_zero_node),
3030 high_positive))
3031 break;
3032
3033 in_p = (in_p != n_in_p);
3034 }
3035 }
ebde8a27
RK
3036
3037 exp = arg0;
ce2157a1 3038 low = n_low, high = n_high;
ebde8a27 3039 continue;
ce2157a1
JL
3040
3041 default:
3042 break;
ef659ec0 3043 }
ebde8a27
RK
3044
3045 break;
ef659ec0 3046 }
ebde8a27 3047
80906567
RK
3048 /* If EXP is a constant, we can evaluate whether this is true or false. */
3049 if (TREE_CODE (exp) == INTEGER_CST)
3050 {
3051 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
3052 exp, 0, low, 0))
3053 && integer_onep (range_binop (LE_EXPR, integer_type_node,
3054 exp, 1, high, 1)));
3055 low = high = 0;
3056 exp = 0;
3057 }
3058
ebde8a27
RK
3059 *pin_p = in_p, *plow = low, *phigh = high;
3060 return exp;
3061}
3062\f
3063/* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
3064 type, TYPE, return an expression to test if EXP is in (or out of, depending
3065 on IN_P) the range. */
3066
3067static tree
3068build_range_check (type, exp, in_p, low, high)
3069 tree type;
3070 tree exp;
3071 int in_p;
3072 tree low, high;
3073{
3074 tree etype = TREE_TYPE (exp);
3075 tree utype, value;
3076
3077 if (! in_p
3078 && (0 != (value = build_range_check (type, exp, 1, low, high))))
3079 return invert_truthvalue (value);
3080
3081 else if (low == 0 && high == 0)
3082 return convert (type, integer_one_node);
3083
3084 else if (low == 0)
3085 return fold (build (LE_EXPR, type, exp, high));
3086
3087 else if (high == 0)
3088 return fold (build (GE_EXPR, type, exp, low));
3089
3090 else if (operand_equal_p (low, high, 0))
3091 return fold (build (EQ_EXPR, type, exp, low));
3092
3093 else if (TREE_UNSIGNED (etype) && integer_zerop (low))
3094 return build_range_check (type, exp, 1, 0, high);
3095
3096 else if (integer_zerop (low))
ef659ec0 3097 {
ebde8a27
RK
3098 utype = unsigned_type (etype);
3099 return build_range_check (type, convert (utype, exp), 1, 0,
3100 convert (utype, high));
3101 }
ef659ec0 3102
ebde8a27
RK
3103 else if (0 != (value = const_binop (MINUS_EXPR, high, low, 0))
3104 && ! TREE_OVERFLOW (value))
3105 return build_range_check (type,
3106 fold (build (MINUS_EXPR, etype, exp, low)),
3107 1, convert (etype, integer_zero_node), value);
3108 else
3109 return 0;
3110}
3111\f
3112/* Given two ranges, see if we can merge them into one. Return 1 if we
3113 can, 0 if we can't. Set the output range into the specified parameters. */
ef659ec0 3114
ebde8a27
RK
3115static int
3116merge_ranges (pin_p, plow, phigh, in0_p, low0, high0, in1_p, low1, high1)
3117 int *pin_p;
3118 tree *plow, *phigh;
3119 int in0_p, in1_p;
3120 tree low0, high0, low1, high1;
3121{
3122 int no_overlap;
3123 int subset;
3124 int temp;
3125 tree tem;
3126 int in_p;
3127 tree low, high;
ce2157a1
JL
3128 int lowequal = ((low0 == 0 && low1 == 0)
3129 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3130 low0, 0, low1, 0)));
3131 int highequal = ((high0 == 0 && high1 == 0)
3132 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3133 high0, 1, high1, 1)));
3134
3135 /* Make range 0 be the range that starts first, or ends last if they
3136 start at the same value. Swap them if it isn't. */
ebde8a27
RK
3137 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
3138 low0, 0, low1, 0))
ce2157a1 3139 || (lowequal
ebde8a27 3140 && integer_onep (range_binop (GT_EXPR, integer_type_node,
ce2157a1 3141 high1, 1, high0, 1))))
ebde8a27
RK
3142 {
3143 temp = in0_p, in0_p = in1_p, in1_p = temp;
3144 tem = low0, low0 = low1, low1 = tem;
3145 tem = high0, high0 = high1, high1 = tem;
3146 }
ef659ec0 3147
ebde8a27
RK
3148 /* Now flag two cases, whether the ranges are disjoint or whether the
3149 second range is totally subsumed in the first. Note that the tests
3150 below are simplified by the ones above. */
3151 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
3152 high0, 1, low1, 0));
5df8a1f2 3153 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
ebde8a27
RK
3154 high1, 1, high0, 1));
3155
3156 /* We now have four cases, depending on whether we are including or
3157 excluding the two ranges. */
3158 if (in0_p && in1_p)
3159 {
3160 /* If they don't overlap, the result is false. If the second range
3161 is a subset it is the result. Otherwise, the range is from the start
3162 of the second to the end of the first. */
3163 if (no_overlap)
3164 in_p = 0, low = high = 0;
3165 else if (subset)
3166 in_p = 1, low = low1, high = high1;
3167 else
3168 in_p = 1, low = low1, high = high0;
3169 }
ef659ec0 3170
ebde8a27
RK
3171 else if (in0_p && ! in1_p)
3172 {
ce2157a1
JL
3173 /* If they don't overlap, the result is the first range. If they are
3174 equal, the result is false. If the second range is a subset of the
3175 first, and the ranges begin at the same place, we go from just after
3176 the end of the first range to the end of the second. If the second
3177 range is not a subset of the first, or if it is a subset and both
3178 ranges end at the same place, the range starts at the start of the
3179 first range and ends just before the second range.
3180 Otherwise, we can't describe this as a single range. */
ebde8a27
RK
3181 if (no_overlap)
3182 in_p = 1, low = low0, high = high0;
ce2157a1 3183 else if (lowequal && highequal)
405862dd 3184 in_p = 0, low = high = 0;
ce2157a1
JL
3185 else if (subset && lowequal)
3186 {
3187 in_p = 1, high = high0;
3188 low = range_binop (PLUS_EXPR, NULL_TREE, high1, 0,
3189 integer_one_node, 0);
3190 }
3191 else if (! subset || highequal)
ebde8a27
RK
3192 {
3193 in_p = 1, low = low0;
3194 high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
0e1c7fc7 3195 integer_one_node, 0);
ebde8a27 3196 }
ce2157a1
JL
3197 else
3198 return 0;
ebde8a27 3199 }
ef659ec0 3200
ebde8a27
RK
3201 else if (! in0_p && in1_p)
3202 {
3203 /* If they don't overlap, the result is the second range. If the second
3204 is a subset of the first, the result is false. Otherwise,
3205 the range starts just after the first range and ends at the
3206 end of the second. */
3207 if (no_overlap)
3208 in_p = 1, low = low1, high = high1;
3209 else if (subset)
3210 in_p = 0, low = high = 0;
3211 else
3212 {
3213 in_p = 1, high = high1;
3214 low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
3215 integer_one_node, 0);
ef659ec0
TW
3216 }
3217 }
3218
ebde8a27
RK
3219 else
3220 {
3221 /* The case where we are excluding both ranges. Here the complex case
3222 is if they don't overlap. In that case, the only time we have a
3223 range is if they are adjacent. If the second is a subset of the
3224 first, the result is the first. Otherwise, the range to exclude
3225 starts at the beginning of the first range and ends at the end of the
3226 second. */
3227 if (no_overlap)
3228 {
3229 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
3230 range_binop (PLUS_EXPR, NULL_TREE,
3231 high0, 1,
3232 integer_one_node, 1),
3233 1, low1, 0)))
3234 in_p = 0, low = low0, high = high1;
3235 else
3236 return 0;
3237 }
3238 else if (subset)
3239 in_p = 0, low = low0, high = high0;
3240 else
3241 in_p = 0, low = low0, high = high1;
3242 }
f5902869 3243
ebde8a27
RK
3244 *pin_p = in_p, *plow = low, *phigh = high;
3245 return 1;
3246}
3247\f
3248/* EXP is some logical combination of boolean tests. See if we can
3249 merge it into some range test. Return the new tree if so. */
ef659ec0 3250
ebde8a27
RK
3251static tree
3252fold_range_test (exp)
3253 tree exp;
3254{
3255 int or_op = (TREE_CODE (exp) == TRUTH_ORIF_EXPR
3256 || TREE_CODE (exp) == TRUTH_OR_EXPR);
3257 int in0_p, in1_p, in_p;
3258 tree low0, low1, low, high0, high1, high;
3259 tree lhs = make_range (TREE_OPERAND (exp, 0), &in0_p, &low0, &high0);
3260 tree rhs = make_range (TREE_OPERAND (exp, 1), &in1_p, &low1, &high1);
3261 tree tem;
ef659ec0 3262
ebde8a27
RK
3263 /* If this is an OR operation, invert both sides; we will invert
3264 again at the end. */
3265 if (or_op)
3266 in0_p = ! in0_p, in1_p = ! in1_p;
3267
3268 /* If both expressions are the same, if we can merge the ranges, and we
80906567
RK
3269 can build the range test, return it or it inverted. If one of the
3270 ranges is always true or always false, consider it to be the same
3271 expression as the other. */
3272 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
ebde8a27
RK
3273 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
3274 in1_p, low1, high1)
80906567
RK
3275 && 0 != (tem = (build_range_check (TREE_TYPE (exp),
3276 lhs != 0 ? lhs
3277 : rhs != 0 ? rhs : integer_zero_node,
ebde8a27
RK
3278 in_p, low, high))))
3279 return or_op ? invert_truthvalue (tem) : tem;
3280
3281 /* On machines where the branch cost is expensive, if this is a
3282 short-circuited branch and the underlying object on both sides
3283 is the same, make a non-short-circuit operation. */
3284 else if (BRANCH_COST >= 2
3285 && (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3286 || TREE_CODE (exp) == TRUTH_ORIF_EXPR)
3287 && operand_equal_p (lhs, rhs, 0))
ef659ec0 3288 {
f0eebf28 3289 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
9ec36da5
JL
3290 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
3291 which cases we can't do this. */
ebde8a27
RK
3292 if (simple_operand_p (lhs))
3293 return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3294 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3295 TREE_TYPE (exp), TREE_OPERAND (exp, 0),
3296 TREE_OPERAND (exp, 1));
f0eebf28 3297
9ec36da5
JL
3298 else if (current_function_decl != 0
3299 && ! contains_placeholder_p (lhs))
ebde8a27
RK
3300 {
3301 tree common = save_expr (lhs);
3302
3303 if (0 != (lhs = build_range_check (TREE_TYPE (exp), common,
3304 or_op ? ! in0_p : in0_p,
3305 low0, high0))
3306 && (0 != (rhs = build_range_check (TREE_TYPE (exp), common,
3307 or_op ? ! in1_p : in1_p,
3308 low1, high1))))
3309 return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
3310 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
3311 TREE_TYPE (exp), lhs, rhs);
3312 }
ef659ec0 3313 }
de153e82
JL
3314
3315
3316 return 0;
ef659ec0
TW
3317}
3318\f
02103577 3319/* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
25216284 3320 bit value. Arrange things so the extra bits will be set to zero if and
d4453ee5
RK
3321 only if C is signed-extended to its full width. If MASK is nonzero,
3322 it is an INTEGER_CST that should be AND'ed with the extra bits. */
02103577
RK
3323
3324static tree
d4453ee5 3325unextend (c, p, unsignedp, mask)
02103577
RK
3326 tree c;
3327 int p;
3328 int unsignedp;
d4453ee5 3329 tree mask;
02103577
RK
3330{
3331 tree type = TREE_TYPE (c);
3332 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
3333 tree temp;
3334
3335 if (p == modesize || unsignedp)
3336 return c;
3337
02103577 3338 /* We work by getting just the sign bit into the low-order bit, then
9faa82d8 3339 into the high-order bit, then sign-extend. We then XOR that value
02103577
RK
3340 with C. */
3341 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
3342 temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
cf85c69b
JW
3343
3344 /* We must use a signed type in order to get an arithmetic right shift.
3345 However, we must also avoid introducing accidental overflows, so that
3346 a subsequent call to integer_zerop will work. Hence we must
3347 do the type conversion here. At this point, the constant is either
3348 zero or one, and the conversion to a signed type can never overflow.
3349 We could get an overflow if this conversion is done anywhere else. */
3350 if (TREE_UNSIGNED (type))
3351 temp = convert (signed_type (type), temp);
3352
02103577
RK
3353 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
3354 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
d4453ee5
RK
3355 if (mask != 0)
3356 temp = const_binop (BIT_AND_EXPR, temp, convert (TREE_TYPE (c), mask), 0);
cf85c69b
JW
3357 /* If necessary, convert the type back to match the type of C. */
3358 if (TREE_UNSIGNED (type))
3359 temp = convert (type, temp);
d4453ee5 3360
02103577
RK
3361 return convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
3362}
3363\f
b2215d83
TW
3364/* Find ways of folding logical expressions of LHS and RHS:
3365 Try to merge two comparisons to the same innermost item.
3366 Look for range tests like "ch >= '0' && ch <= '9'".
3367 Look for combinations of simple terms on machines with expensive branches
3368 and evaluate the RHS unconditionally.
6d716ca8
RS
3369
3370 For example, if we have p->a == 2 && p->b == 4 and we can make an
3371 object large enough to span both A and B, we can do this with a comparison
3372 against the object ANDed with the a mask.
3373
3374 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
3375 operations to do this with one comparison.
3376
3377 We check for both normal comparisons and the BIT_AND_EXPRs made this by
3378 function and the one above.
3379
3380 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
3381 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
3382
3383 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
3384 two operands.
3385
3386 We return the simplified tree or 0 if no optimization is possible. */
3387
3388static tree
b2215d83 3389fold_truthop (code, truth_type, lhs, rhs)
6d716ca8
RS
3390 enum tree_code code;
3391 tree truth_type, lhs, rhs;
3392{
3393 /* If this is the "or" of two comparisons, we can do something if we
3394 the comparisons are NE_EXPR. If this is the "and", we can do something
3395 if the comparisons are EQ_EXPR. I.e.,
3396 (a->b == 2 && a->c == 4) can become (a->new == NEW).
3397
3398 WANTED_CODE is this operation code. For single bit fields, we can
3399 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
3400 comparison for one-bit fields. */
3401
b2215d83 3402 enum tree_code wanted_code;
6d716ca8 3403 enum tree_code lcode, rcode;
b2215d83 3404 tree ll_arg, lr_arg, rl_arg, rr_arg;
6d716ca8
RS
3405 tree ll_inner, lr_inner, rl_inner, rr_inner;
3406 int ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
3407 int rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
3408 int xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
3409 int lnbitsize, lnbitpos, rnbitsize, rnbitpos;
3410 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
3411 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
3412 enum machine_mode lnmode, rnmode;
3413 tree ll_mask, lr_mask, rl_mask, rr_mask;
d4453ee5 3414 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
b2215d83 3415 tree l_const, r_const;
6d716ca8
RS
3416 tree type, result;
3417 int first_bit, end_bit;
b2215d83 3418 int volatilep;
6d716ca8 3419
ebde8a27
RK
3420 /* Start by getting the comparison codes. Fail if anything is volatile.
3421 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
3422 it were surrounded with a NE_EXPR. */
6d716ca8 3423
ebde8a27 3424 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
b2215d83
TW
3425 return 0;
3426
6d716ca8
RS
3427 lcode = TREE_CODE (lhs);
3428 rcode = TREE_CODE (rhs);
ef659ec0 3429
96d4cf0a
RK
3430 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
3431 lcode = NE_EXPR, lhs = build (NE_EXPR, truth_type, lhs, integer_zero_node);
3432
3433 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
3434 rcode = NE_EXPR, rhs = build (NE_EXPR, truth_type, rhs, integer_zero_node);
3435
ebde8a27 3436 if (TREE_CODE_CLASS (lcode) != '<' || TREE_CODE_CLASS (rcode) != '<')
ef659ec0
TW
3437 return 0;
3438
b2215d83 3439 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
9c0ae98b 3440 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
b2215d83
TW
3441
3442 ll_arg = TREE_OPERAND (lhs, 0);
3443 lr_arg = TREE_OPERAND (lhs, 1);
3444 rl_arg = TREE_OPERAND (rhs, 0);
3445 rr_arg = TREE_OPERAND (rhs, 1);
3446
8227896c 3447 /* If the RHS can be evaluated unconditionally and its operands are
b2215d83
TW
3448 simple, it wins to evaluate the RHS unconditionally on machines
3449 with expensive branches. In this case, this isn't a comparison
3450 that can be merged. */
3451
3452 /* @@ I'm not sure it wins on the m88110 to do this if the comparisons
3453 are with zero (tmw). */
3454
3455 if (BRANCH_COST >= 2
7178e3af 3456 && INTEGRAL_TYPE_P (TREE_TYPE (rhs))
b2215d83 3457 && simple_operand_p (rl_arg)
8227896c 3458 && simple_operand_p (rr_arg))
b2215d83
TW
3459 return build (code, truth_type, lhs, rhs);
3460
ef659ec0
TW
3461 /* See if the comparisons can be merged. Then get all the parameters for
3462 each side. */
3463
6d716ca8 3464 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
ef659ec0 3465 || (rcode != EQ_EXPR && rcode != NE_EXPR))
6d716ca8
RS
3466 return 0;
3467
b2215d83
TW
3468 volatilep = 0;
3469 ll_inner = decode_field_reference (ll_arg,
6d716ca8 3470 &ll_bitsize, &ll_bitpos, &ll_mode,
d4453ee5
RK
3471 &ll_unsignedp, &volatilep, &ll_mask,
3472 &ll_and_mask);
b2215d83 3473 lr_inner = decode_field_reference (lr_arg,
6d716ca8 3474 &lr_bitsize, &lr_bitpos, &lr_mode,
d4453ee5
RK
3475 &lr_unsignedp, &volatilep, &lr_mask,
3476 &lr_and_mask);
b2215d83 3477 rl_inner = decode_field_reference (rl_arg,
6d716ca8 3478 &rl_bitsize, &rl_bitpos, &rl_mode,
d4453ee5
RK
3479 &rl_unsignedp, &volatilep, &rl_mask,
3480 &rl_and_mask);
b2215d83 3481 rr_inner = decode_field_reference (rr_arg,
6d716ca8 3482 &rr_bitsize, &rr_bitpos, &rr_mode,
d4453ee5
RK
3483 &rr_unsignedp, &volatilep, &rr_mask,
3484 &rr_and_mask);
6d716ca8
RS
3485
3486 /* It must be true that the inner operation on the lhs of each
3487 comparison must be the same if we are to be able to do anything.
3488 Then see if we have constants. If not, the same must be true for
3489 the rhs's. */
3490 if (volatilep || ll_inner == 0 || rl_inner == 0
3491 || ! operand_equal_p (ll_inner, rl_inner, 0))
3492 return 0;
3493
b2215d83
TW
3494 if (TREE_CODE (lr_arg) == INTEGER_CST
3495 && TREE_CODE (rr_arg) == INTEGER_CST)
3496 l_const = lr_arg, r_const = rr_arg;
6d716ca8
RS
3497 else if (lr_inner == 0 || rr_inner == 0
3498 || ! operand_equal_p (lr_inner, rr_inner, 0))
3499 return 0;
b2215d83
TW
3500 else
3501 l_const = r_const = 0;
6d716ca8
RS
3502
3503 /* If either comparison code is not correct for our logical operation,
3504 fail. However, we can convert a one-bit comparison against zero into
3505 the opposite comparison against that bit being set in the field. */
b2215d83 3506
9c0ae98b 3507 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
6d716ca8
RS
3508 if (lcode != wanted_code)
3509 {
3510 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5a6b3365 3511 {
9f29ca78 3512 if (ll_unsignedp || tree_log2 (ll_mask) + 1 < ll_bitsize)
5a6b3365
R
3513 l_const = ll_mask;
3514 else
3515 /* Since ll_arg is a single bit bit mask, we can sign extend
3516 it appropriately with a NEGATE_EXPR.
3517 l_const is made a signed value here, but since for l_const != NULL
3518 lr_unsignedp is not used, we don't need to clear the latter. */
3519 l_const = fold (build1 (NEGATE_EXPR, TREE_TYPE (ll_arg),
3520 convert (TREE_TYPE (ll_arg), ll_mask)));
3521 }
6d716ca8
RS
3522 else
3523 return 0;
3524 }
3525
3526 if (rcode != wanted_code)
3527 {
3528 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5a6b3365 3529 {
9f29ca78 3530 if (rl_unsignedp || tree_log2 (rl_mask) + 1 < rl_bitsize)
5a6b3365
R
3531 r_const = rl_mask;
3532 else
3533 /* This is analogous to the code for l_const above. */
3534 r_const = fold (build1 (NEGATE_EXPR, TREE_TYPE (rl_arg),
3535 convert (TREE_TYPE (rl_arg), rl_mask)));
3536 }
6d716ca8
RS
3537 else
3538 return 0;
3539 }
3540
3541 /* See if we can find a mode that contains both fields being compared on
3542 the left. If we can't, fail. Otherwise, update all constants and masks
3543 to be relative to a field of that size. */
3544 first_bit = MIN (ll_bitpos, rl_bitpos);
3545 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
3546 lnmode = get_best_mode (end_bit - first_bit, first_bit,
3547 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
3548 volatilep);
3549 if (lnmode == VOIDmode)
3550 return 0;
3551
3552 lnbitsize = GET_MODE_BITSIZE (lnmode);
3553 lnbitpos = first_bit & ~ (lnbitsize - 1);
3554 type = type_for_size (lnbitsize, 1);
3555 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
3556
f76b9db2
ILT
3557 if (BYTES_BIG_ENDIAN)
3558 {
3559 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
3560 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
3561 }
6d716ca8
RS
3562
3563 ll_mask = const_binop (LSHIFT_EXPR, convert (type, ll_mask),
91d33e36 3564 size_int (xll_bitpos), 0);
6d716ca8 3565 rl_mask = const_binop (LSHIFT_EXPR, convert (type, rl_mask),
91d33e36 3566 size_int (xrl_bitpos), 0);
6d716ca8 3567
6d716ca8
RS
3568 if (l_const)
3569 {
d4453ee5
RK
3570 l_const = convert (type, l_const);
3571 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
02103577
RK
3572 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
3573 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
3574 fold (build1 (BIT_NOT_EXPR,
3575 type, ll_mask)),
3576 0)))
3577 {
3578 warning ("comparison is always %s",
3579 wanted_code == NE_EXPR ? "one" : "zero");
3580
3581 return convert (truth_type,
3582 wanted_code == NE_EXPR
3583 ? integer_one_node : integer_zero_node);
3584 }
6d716ca8
RS
3585 }
3586 if (r_const)
3587 {
d4453ee5
RK
3588 r_const = convert (type, r_const);
3589 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
02103577
RK
3590 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
3591 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
3592 fold (build1 (BIT_NOT_EXPR,
3593 type, rl_mask)),
3594 0)))
3595 {
3596 warning ("comparison is always %s",
3597 wanted_code == NE_EXPR ? "one" : "zero");
3598
3599 return convert (truth_type,
3600 wanted_code == NE_EXPR
3601 ? integer_one_node : integer_zero_node);
3602 }
6d716ca8
RS
3603 }
3604
3605 /* If the right sides are not constant, do the same for it. Also,
3606 disallow this optimization if a size or signedness mismatch occurs
3607 between the left and right sides. */
3608 if (l_const == 0)
3609 {
3610 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
e6a28f26
RS
3611 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
3612 /* Make sure the two fields on the right
3613 correspond to the left without being swapped. */
3614 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
6d716ca8
RS
3615 return 0;
3616
3617 first_bit = MIN (lr_bitpos, rr_bitpos);
3618 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
3619 rnmode = get_best_mode (end_bit - first_bit, first_bit,
3620 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
3621 volatilep);
3622 if (rnmode == VOIDmode)
3623 return 0;
3624
3625 rnbitsize = GET_MODE_BITSIZE (rnmode);
3626 rnbitpos = first_bit & ~ (rnbitsize - 1);
3627 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
3628
f76b9db2
ILT
3629 if (BYTES_BIG_ENDIAN)
3630 {
3631 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
3632 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
3633 }
6d716ca8
RS
3634
3635 lr_mask = const_binop (LSHIFT_EXPR, convert (type, lr_mask),
91d33e36 3636 size_int (xlr_bitpos), 0);
6d716ca8 3637 rr_mask = const_binop (LSHIFT_EXPR, convert (type, rr_mask),
91d33e36 3638 size_int (xrr_bitpos), 0);
6d716ca8
RS
3639
3640 /* Make a mask that corresponds to both fields being compared.
3641 Do this for both items being compared. If the masks agree,
3642 we can do this by masking both and comparing the masked
3643 results. */
91d33e36
RS
3644 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
3645 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
6d716ca8
RS
3646 if (operand_equal_p (ll_mask, lr_mask, 0) && lnbitsize == rnbitsize)
3647 {
3648 lhs = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
3649 ll_unsignedp || rl_unsignedp);
3650 rhs = make_bit_field_ref (lr_inner, type, rnbitsize, rnbitpos,
3651 lr_unsignedp || rr_unsignedp);
3652 if (! all_ones_mask_p (ll_mask, lnbitsize))
3653 {
3654 lhs = build (BIT_AND_EXPR, type, lhs, ll_mask);
3655 rhs = build (BIT_AND_EXPR, type, rhs, ll_mask);
3656 }
3657 return build (wanted_code, truth_type, lhs, rhs);
3658 }
3659
3660 /* There is still another way we can do something: If both pairs of
3661 fields being compared are adjacent, we may be able to make a wider
3662 field containing them both. */
3663 if ((ll_bitsize + ll_bitpos == rl_bitpos
3664 && lr_bitsize + lr_bitpos == rr_bitpos)
3665 || (ll_bitpos == rl_bitpos + rl_bitsize
3666 && lr_bitpos == rr_bitpos + rr_bitsize))
3667 return build (wanted_code, truth_type,
3668 make_bit_field_ref (ll_inner, type,
3669 ll_bitsize + rl_bitsize,
3670 MIN (ll_bitpos, rl_bitpos),
3671 ll_unsignedp),
3672 make_bit_field_ref (lr_inner, type,
3673 lr_bitsize + rr_bitsize,
3674 MIN (lr_bitpos, rr_bitpos),
3675 lr_unsignedp));
3676
3677 return 0;
3678 }
3679
3680 /* Handle the case of comparisons with constants. If there is something in
3681 common between the masks, those bits of the constants must be the same.
3682 If not, the condition is always false. Test for this to avoid generating
3683 incorrect code below. */
91d33e36 3684 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
6d716ca8 3685 if (! integer_zerop (result)
91d33e36
RS
3686 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
3687 const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
6d716ca8
RS
3688 {
3689 if (wanted_code == NE_EXPR)
3690 {
3691 warning ("`or' of unmatched not-equal tests is always 1");
3692 return convert (truth_type, integer_one_node);
3693 }
3694 else
3695 {
3696 warning ("`and' of mutually exclusive equal-tests is always zero");
3697 return convert (truth_type, integer_zero_node);
3698 }
3699 }
3700
3701 /* Construct the expression we will return. First get the component
3702 reference we will make. Unless the mask is all ones the width of
3703 that field, perform the mask operation. Then compare with the
3704 merged constant. */
3705 result = make_bit_field_ref (ll_inner, type, lnbitsize, lnbitpos,
3706 ll_unsignedp || rl_unsignedp);
3707
91d33e36 3708 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
6d716ca8
RS
3709 if (! all_ones_mask_p (ll_mask, lnbitsize))
3710 result = build (BIT_AND_EXPR, type, result, ll_mask);
3711
3712 return build (wanted_code, truth_type, result,
91d33e36 3713 const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
6d716ca8
RS
3714}
3715\f
b5f3b6b6
RK
3716/* If T contains a COMPOUND_EXPR which was inserted merely to evaluate
3717 S, a SAVE_EXPR, return the expression actually being evaluated. Note
3718 that we may sometimes modify the tree. */
3719
3720static tree
3721strip_compound_expr (t, s)
3722 tree t;
3723 tree s;
3724{
b5f3b6b6
RK
3725 enum tree_code code = TREE_CODE (t);
3726
3727 /* See if this is the COMPOUND_EXPR we want to eliminate. */
3728 if (code == COMPOUND_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR
3729 && TREE_OPERAND (TREE_OPERAND (t, 0), 0) == s)
3730 return TREE_OPERAND (t, 1);
3731
3732 /* See if this is a COND_EXPR or a simple arithmetic operator. We
3733 don't bother handling any other types. */
3734 else if (code == COND_EXPR)
3735 {
3736 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3737 TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
3738 TREE_OPERAND (t, 2) = strip_compound_expr (TREE_OPERAND (t, 2), s);
3739 }
3740 else if (TREE_CODE_CLASS (code) == '1')
3741 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3742 else if (TREE_CODE_CLASS (code) == '<'
3743 || TREE_CODE_CLASS (code) == '2')
3744 {
3745 TREE_OPERAND (t, 0) = strip_compound_expr (TREE_OPERAND (t, 0), s);
3746 TREE_OPERAND (t, 1) = strip_compound_expr (TREE_OPERAND (t, 1), s);
3747 }
3748
3749 return t;
3750}
3751\f
f628873f
MM
3752/* Return a node which has the indicated constant VALUE (either 0 or
3753 1), and is of the indicated TYPE. */
3754
83e0821b 3755static tree
f628873f
MM
3756constant_boolean_node (value, type)
3757 int value;
3758 tree type;
3759{
3760 if (type == integer_type_node)
3761 return value ? integer_one_node : integer_zero_node;
3762 else if (TREE_CODE (type) == BOOLEAN_TYPE)
3763 return truthvalue_conversion (value ? integer_one_node :
3764 integer_zero_node);
3765 else
3766 {
3767 tree t = build_int_2 (value, 0);
3768 TREE_TYPE (t) = type;
3769 return t;
3770 }
3771}
3772
6d716ca8
RS
3773/* Perform constant folding and related simplification of EXPR.
3774 The related simplifications include x*1 => x, x*0 => 0, etc.,
3775 and application of the associative law.
3776 NOP_EXPR conversions may be removed freely (as long as we
3777 are careful not to change the C type of the overall expression)
3778 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
3779 but we can constant-fold them if they have constant operands. */
3780
3781tree
3782fold (expr)
3783 tree expr;
3784{
3785 register tree t = expr;
3786 tree t1 = NULL_TREE;
c05a9b68 3787 tree tem;
6d716ca8 3788 tree type = TREE_TYPE (expr);
4e86caed 3789 register tree arg0 = NULL_TREE, arg1 = NULL_TREE;
6d716ca8
RS
3790 register enum tree_code code = TREE_CODE (t);
3791 register int kind;
c05a9b68 3792 int invert;
6d716ca8
RS
3793
3794 /* WINS will be nonzero when the switch is done
3795 if all operands are constant. */
3796
3797 int wins = 1;
3798
5fd7f37d
RK
3799 /* Don't try to process an RTL_EXPR since its operands aren't trees.
3800 Likewise for a SAVE_EXPR that's already been evaluated. */
3801 if (code == RTL_EXPR || (code == SAVE_EXPR && SAVE_EXPR_RTL (t)) != 0)
ac27d589
RK
3802 return t;
3803
6d716ca8
RS
3804 /* Return right away if already constant. */
3805 if (TREE_CONSTANT (t))
3806 {
3807 if (code == CONST_DECL)
3808 return DECL_INITIAL (t);
3809 return t;
3810 }
3811
dbecbbe4
JL
3812#ifdef MAX_INTEGER_COMPUTATION_MODE
3813 check_max_integer_computation_mode (expr);
3814#endif
3815
6d716ca8 3816 kind = TREE_CODE_CLASS (code);
1b81aa14
RS
3817 if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
3818 {
1cc1b11a
RS
3819 tree subop;
3820
1b81aa14
RS
3821 /* Special case for conversion ops that can have fixed point args. */
3822 arg0 = TREE_OPERAND (t, 0);
3823
3824 /* Don't use STRIP_NOPS, because signedness of argument type matters. */
3825 if (arg0 != 0)
3826 STRIP_TYPE_NOPS (arg0);
3827
1cc1b11a
RS
3828 if (arg0 != 0 && TREE_CODE (arg0) == COMPLEX_CST)
3829 subop = TREE_REALPART (arg0);
3830 else
3831 subop = arg0;
3832
3833 if (subop != 0 && TREE_CODE (subop) != INTEGER_CST
1b81aa14 3834#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1cc1b11a 3835 && TREE_CODE (subop) != REAL_CST
1b81aa14
RS
3836#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3837 )
3838 /* Note that TREE_CONSTANT isn't enough:
3839 static var addresses are constant but we can't
3840 do arithmetic on them. */
3841 wins = 0;
3842 }
3843 else if (kind == 'e' || kind == '<'
3844 || kind == '1' || kind == '2' || kind == 'r')
6d716ca8
RS
3845 {
3846 register int len = tree_code_length[(int) code];
3847 register int i;
3848 for (i = 0; i < len; i++)
3849 {
3850 tree op = TREE_OPERAND (t, i);
1cc1b11a 3851 tree subop;
6d716ca8
RS
3852
3853 if (op == 0)
3854 continue; /* Valid for CALL_EXPR, at least. */
3855
b8a91430
RK
3856 if (kind == '<' || code == RSHIFT_EXPR)
3857 {
3858 /* Signedness matters here. Perhaps we can refine this
3859 later. */
3860 STRIP_TYPE_NOPS (op);
3861 }
3862 else
3863 {
3864 /* Strip any conversions that don't change the mode. */
3865 STRIP_NOPS (op);
3866 }
6d716ca8 3867
1cc1b11a
RS
3868 if (TREE_CODE (op) == COMPLEX_CST)
3869 subop = TREE_REALPART (op);
3870 else
3871 subop = op;
3872
3873 if (TREE_CODE (subop) != INTEGER_CST
6d716ca8 3874#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
1cc1b11a 3875 && TREE_CODE (subop) != REAL_CST
6d716ca8
RS
3876#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3877 )
3878 /* Note that TREE_CONSTANT isn't enough:
3879 static var addresses are constant but we can't
3880 do arithmetic on them. */
3881 wins = 0;
3882
3883 if (i == 0)
3884 arg0 = op;
3885 else if (i == 1)
3886 arg1 = op;
3887 }
3888 }
3889
3890 /* If this is a commutative operation, and ARG0 is a constant, move it
3891 to ARG1 to reduce the number of tests below. */
3892 if ((code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
3893 || code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
3894 || code == BIT_AND_EXPR)
3895 && (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST))
3896 {
c05a9b68 3897 tem = arg0; arg0 = arg1; arg1 = tem;
6d716ca8 3898
c05a9b68
RS
3899 tem = TREE_OPERAND (t, 0); TREE_OPERAND (t, 0) = TREE_OPERAND (t, 1);
3900 TREE_OPERAND (t, 1) = tem;
6d716ca8
RS
3901 }
3902
3903 /* Now WINS is set as described above,
3904 ARG0 is the first operand of EXPR,
3905 and ARG1 is the second operand (if it has more than one operand).
3906
3907 First check for cases where an arithmetic operation is applied to a
3908 compound, conditional, or comparison operation. Push the arithmetic
3909 operation inside the compound or conditional to see if any folding
3910 can then be done. Convert comparison to conditional for this purpose.
3911 The also optimizes non-constant cases that used to be done in
96d4cf0a
RK
3912 expand_expr.
3913
3914 Before we do that, see if this is a BIT_AND_EXPR or a BIT_OR_EXPR,
61f275ff
RK
3915 one of the operands is a comparison and the other is a comparison, a
3916 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
3917 code below would make the expression more complex. Change it to a
2df46b06
RK
3918 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
3919 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
96d4cf0a 3920
2df46b06
RK
3921 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
3922 || code == EQ_EXPR || code == NE_EXPR)
61f275ff
RK
3923 && ((truth_value_p (TREE_CODE (arg0))
3924 && (truth_value_p (TREE_CODE (arg1))
96d4cf0a
RK
3925 || (TREE_CODE (arg1) == BIT_AND_EXPR
3926 && integer_onep (TREE_OPERAND (arg1, 1)))))
61f275ff
RK
3927 || (truth_value_p (TREE_CODE (arg1))
3928 && (truth_value_p (TREE_CODE (arg0))
96d4cf0a
RK
3929 || (TREE_CODE (arg0) == BIT_AND_EXPR
3930 && integer_onep (TREE_OPERAND (arg0, 1)))))))
2df46b06
RK
3931 {
3932 t = fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
3933 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
3934 : TRUTH_XOR_EXPR,
3935 type, arg0, arg1));
3936
3937 if (code == EQ_EXPR)
3938 t = invert_truthvalue (t);
3939
3940 return t;
3941 }
96d4cf0a 3942
6d716ca8
RS
3943 if (TREE_CODE_CLASS (code) == '1')
3944 {
3945 if (TREE_CODE (arg0) == COMPOUND_EXPR)
3946 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
3947 fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
3948 else if (TREE_CODE (arg0) == COND_EXPR)
b8eb43a2
RK
3949 {
3950 t = fold (build (COND_EXPR, type, TREE_OPERAND (arg0, 0),
3951 fold (build1 (code, type, TREE_OPERAND (arg0, 1))),
3952 fold (build1 (code, type, TREE_OPERAND (arg0, 2)))));
3953
3954 /* If this was a conversion, and all we did was to move into
e1f56f62
RK
3955 inside the COND_EXPR, bring it back out. But leave it if
3956 it is a conversion from integer to integer and the
3957 result precision is no wider than a word since such a
3958 conversion is cheap and may be optimized away by combine,
3959 while it couldn't if it were outside the COND_EXPR. Then return
3960 so we don't get into an infinite recursion loop taking the
3961 conversion out and then back in. */
b8eb43a2
RK
3962
3963 if ((code == NOP_EXPR || code == CONVERT_EXPR
3964 || code == NON_LVALUE_EXPR)
3965 && TREE_CODE (t) == COND_EXPR
3966 && TREE_CODE (TREE_OPERAND (t, 1)) == code
459a2653
RK
3967 && TREE_CODE (TREE_OPERAND (t, 2)) == code
3968 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0))
e1f56f62
RK
3969 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 2), 0)))
3970 && ! (INTEGRAL_TYPE_P (TREE_TYPE (t))
3971 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0)))
3972 && TYPE_PRECISION (TREE_TYPE (t)) <= BITS_PER_WORD))
b8eb43a2
RK
3973 t = build1 (code, type,
3974 build (COND_EXPR,
3975 TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0)),
3976 TREE_OPERAND (t, 0),
3977 TREE_OPERAND (TREE_OPERAND (t, 1), 0),
3978 TREE_OPERAND (TREE_OPERAND (t, 2), 0)));
3979 return t;
3980 }
6d716ca8
RS
3981 else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
3982 return fold (build (COND_EXPR, type, arg0,
3983 fold (build1 (code, type, integer_one_node)),
3984 fold (build1 (code, type, integer_zero_node))));
3985 }
96d4cf0a
RK
3986 else if (TREE_CODE_CLASS (code) == '2'
3987 || TREE_CODE_CLASS (code) == '<')
6d716ca8
RS
3988 {
3989 if (TREE_CODE (arg1) == COMPOUND_EXPR)
3990 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
96d4cf0a
RK
3991 fold (build (code, type,
3992 arg0, TREE_OPERAND (arg1, 1))));
f0eebf28
RK
3993 else if ((TREE_CODE (arg1) == COND_EXPR
3994 || (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
3995 && TREE_CODE_CLASS (code) != '<'))
9ec36da5
JL
3996 && (! TREE_SIDE_EFFECTS (arg0)
3997 || (current_function_decl != 0
3998 && ! contains_placeholder_p (arg0))))
6d716ca8
RS
3999 {
4000 tree test, true_value, false_value;
f5963e61 4001 tree lhs = 0, rhs = 0;
6d716ca8
RS
4002
4003 if (TREE_CODE (arg1) == COND_EXPR)
4004 {
4005 test = TREE_OPERAND (arg1, 0);
4006 true_value = TREE_OPERAND (arg1, 1);
4007 false_value = TREE_OPERAND (arg1, 2);
4008 }
4009 else
4010 {
25216284 4011 tree testtype = TREE_TYPE (arg1);
6d716ca8 4012 test = arg1;
25216284
RK
4013 true_value = convert (testtype, integer_one_node);
4014 false_value = convert (testtype, integer_zero_node);
6d716ca8
RS
4015 }
4016
96d4cf0a
RK
4017 /* If ARG0 is complex we want to make sure we only evaluate
4018 it once. Though this is only required if it is volatile, it
4019 might be more efficient even if it is not. However, if we
4020 succeed in folding one part to a constant, we do not need
4021 to make this SAVE_EXPR. Since we do this optimization
4022 primarily to see if we do end up with constant and this
9faa82d8 4023 SAVE_EXPR interferes with later optimizations, suppressing
f5963e61 4024 it when we can is important.
96d4cf0a 4025
f5963e61
JL
4026 If we are not in a function, we can't make a SAVE_EXPR, so don't
4027 try to do so. Don't try to see if the result is a constant
4028 if an arm is a COND_EXPR since we get exponential behavior
4029 in that case. */
4030
4031 if (TREE_CODE (arg0) != SAVE_EXPR && ! TREE_CONSTANT (arg0)
4032 && current_function_decl != 0
b5f3b6b6
RK
4033 && ((TREE_CODE (arg0) != VAR_DECL
4034 && TREE_CODE (arg0) != PARM_DECL)
4035 || TREE_SIDE_EFFECTS (arg0)))
96d4cf0a 4036 {
f5963e61
JL
4037 if (TREE_CODE (true_value) != COND_EXPR)
4038 lhs = fold (build (code, type, arg0, true_value));
96d4cf0a 4039
f5963e61
JL
4040 if (TREE_CODE (false_value) != COND_EXPR)
4041 rhs = fold (build (code, type, arg0, false_value));
96d4cf0a 4042
f5963e61
JL
4043 if ((lhs == 0 || ! TREE_CONSTANT (lhs))
4044 && (rhs == 0 || !TREE_CONSTANT (rhs)))
4045 arg0 = save_expr (arg0), lhs = rhs = 0;
96d4cf0a
RK
4046 }
4047
f5963e61
JL
4048 if (lhs == 0)
4049 lhs = fold (build (code, type, arg0, true_value));
4050 if (rhs == 0)
4051 rhs = fold (build (code, type, arg0, false_value));
4052
4053 test = fold (build (COND_EXPR, type, test, lhs, rhs));
4054
6d716ca8
RS
4055 if (TREE_CODE (arg0) == SAVE_EXPR)
4056 return build (COMPOUND_EXPR, type,
b5f3b6b6
RK
4057 convert (void_type_node, arg0),
4058 strip_compound_expr (test, arg0));
6d716ca8
RS
4059 else
4060 return convert (type, test);
4061 }
4062
4063 else if (TREE_CODE (arg0) == COMPOUND_EXPR)
4064 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
4065 fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
f0eebf28
RK
4066 else if ((TREE_CODE (arg0) == COND_EXPR
4067 || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
4068 && TREE_CODE_CLASS (code) != '<'))
9ec36da5
JL
4069 && (! TREE_SIDE_EFFECTS (arg1)
4070 || (current_function_decl != 0
4071 && ! contains_placeholder_p (arg1))))
6d716ca8
RS
4072 {
4073 tree test, true_value, false_value;
f5963e61 4074 tree lhs = 0, rhs = 0;
6d716ca8
RS
4075
4076 if (TREE_CODE (arg0) == COND_EXPR)
4077 {
4078 test = TREE_OPERAND (arg0, 0);
4079 true_value = TREE_OPERAND (arg0, 1);
4080 false_value = TREE_OPERAND (arg0, 2);
4081 }
4082 else
4083 {
25216284 4084 tree testtype = TREE_TYPE (arg0);
6d716ca8 4085 test = arg0;
25216284
RK
4086 true_value = convert (testtype, integer_one_node);
4087 false_value = convert (testtype, integer_zero_node);
6d716ca8
RS
4088 }
4089
f5963e61
JL
4090 if (TREE_CODE (arg1) != SAVE_EXPR && ! TREE_CONSTANT (arg0)
4091 && current_function_decl != 0
b5f3b6b6
RK
4092 && ((TREE_CODE (arg1) != VAR_DECL
4093 && TREE_CODE (arg1) != PARM_DECL)
4094 || TREE_SIDE_EFFECTS (arg1)))
96d4cf0a 4095 {
f5963e61
JL
4096 if (TREE_CODE (true_value) != COND_EXPR)
4097 lhs = fold (build (code, type, true_value, arg1));
96d4cf0a 4098
f5963e61
JL
4099 if (TREE_CODE (false_value) != COND_EXPR)
4100 rhs = fold (build (code, type, false_value, arg1));
96d4cf0a 4101
f5963e61
JL
4102 if ((lhs == 0 || ! TREE_CONSTANT (lhs))
4103 && (rhs == 0 || !TREE_CONSTANT (rhs)))
4104 arg1 = save_expr (arg1), lhs = rhs = 0;
96d4cf0a
RK
4105 }
4106
f5963e61
JL
4107 if (lhs == 0)
4108 lhs = fold (build (code, type, true_value, arg1));
4109
4110 if (rhs == 0)
4111 rhs = fold (build (code, type, false_value, arg1));
4112
4113 test = fold (build (COND_EXPR, type, test, lhs, rhs));
6d716ca8
RS
4114 if (TREE_CODE (arg1) == SAVE_EXPR)
4115 return build (COMPOUND_EXPR, type,
b5f3b6b6
RK
4116 convert (void_type_node, arg1),
4117 strip_compound_expr (test, arg1));
6d716ca8
RS
4118 else
4119 return convert (type, test);
4120 }
4121 }
c05a9b68
RS
4122 else if (TREE_CODE_CLASS (code) == '<'
4123 && TREE_CODE (arg0) == COMPOUND_EXPR)
4124 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
4125 fold (build (code, type, TREE_OPERAND (arg0, 1), arg1)));
4126 else if (TREE_CODE_CLASS (code) == '<'
4127 && TREE_CODE (arg1) == COMPOUND_EXPR)
4128 return build (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
4129 fold (build (code, type, arg0, TREE_OPERAND (arg1, 1))));
6d716ca8
RS
4130
4131 switch (code)
4132 {
4133 case INTEGER_CST:
4134 case REAL_CST:
4135 case STRING_CST:
4136 case COMPLEX_CST:
4137 case CONSTRUCTOR:
4138 return t;
4139
4140 case CONST_DECL:
4141 return fold (DECL_INITIAL (t));
4142
4143 case NOP_EXPR:
4144 case FLOAT_EXPR:
4145 case CONVERT_EXPR:
4146 case FIX_TRUNC_EXPR:
4147 /* Other kinds of FIX are not handled properly by fold_convert. */
33558beb 4148
e1f56f62
RK
4149 if (TREE_TYPE (TREE_OPERAND (t, 0)) == TREE_TYPE (t))
4150 return TREE_OPERAND (t, 0);
4151
7e139075
RK
4152 /* Handle cases of two conversions in a row. */
4153 if (TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
4154 || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
4155 {
4156 tree inside_type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4157 tree inter_type = TREE_TYPE (TREE_OPERAND (t, 0));
4158 tree final_type = TREE_TYPE (t);
4159 int inside_int = INTEGRAL_TYPE_P (inside_type);
7f0b305c 4160 int inside_ptr = POINTER_TYPE_P (inside_type);
7e139075
RK
4161 int inside_float = FLOAT_TYPE_P (inside_type);
4162 int inside_prec = TYPE_PRECISION (inside_type);
4163 int inside_unsignedp = TREE_UNSIGNED (inside_type);
4164 int inter_int = INTEGRAL_TYPE_P (inter_type);
7f0b305c 4165 int inter_ptr = POINTER_TYPE_P (inter_type);
7e139075
RK
4166 int inter_float = FLOAT_TYPE_P (inter_type);
4167 int inter_prec = TYPE_PRECISION (inter_type);
4168 int inter_unsignedp = TREE_UNSIGNED (inter_type);
4169 int final_int = INTEGRAL_TYPE_P (final_type);
7f0b305c 4170 int final_ptr = POINTER_TYPE_P (final_type);
7e139075
RK
4171 int final_float = FLOAT_TYPE_P (final_type);
4172 int final_prec = TYPE_PRECISION (final_type);
4173 int final_unsignedp = TREE_UNSIGNED (final_type);
4174
4175 /* In addition to the cases of two conversions in a row
4176 handled below, if we are converting something to its own
4177 type via an object of identical or wider precision, neither
4178 conversion is needed. */
4179 if (inside_type == final_type
4180 && ((inter_int && final_int) || (inter_float && final_float))
4181 && inter_prec >= final_prec)
4182 return TREE_OPERAND (TREE_OPERAND (t, 0), 0);
4183
4184 /* Likewise, if the intermediate and final types are either both
4185 float or both integer, we don't need the middle conversion if
4186 it is wider than the final type and doesn't change the signedness
7f0b305c 4187 (for integers). Avoid this if the final type is a pointer
410d3f5d
RK
4188 since then we sometimes need the inner conversion. Likewise if
4189 the outer has a precision not equal to the size of its mode. */
7e139075
RK
4190 if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
4191 || (inter_float && inside_float))
4192 && inter_prec >= inside_prec
7f0b305c 4193 && (inter_float || inter_unsignedp == inside_unsignedp)
410d3f5d
RK
4194 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
4195 && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
7f0b305c 4196 && ! final_ptr)
7e139075
RK
4197 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4198
ba3ad5e0
PDM
4199 /* If we have a sign-extension of a zero-extended value, we can
4200 replace that by a single zero-extension. */
4201 if (inside_int && inter_int && final_int
4202 && inside_prec < inter_prec && inter_prec < final_prec
4203 && inside_unsignedp && !inter_unsignedp)
4204 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4205
7e139075
RK
4206 /* Two conversions in a row are not needed unless:
4207 - some conversion is floating-point (overstrict for now), or
4208 - the intermediate type is narrower than both initial and
4209 final, or
4210 - the intermediate type and innermost type differ in signedness,
4211 and the outermost type is wider than the intermediate, or
4212 - the initial type is a pointer type and the precisions of the
4213 intermediate and final types differ, or
4214 - the final type is a pointer type and the precisions of the
4215 initial and intermediate types differ. */
4216 if (! inside_float && ! inter_float && ! final_float
4217 && (inter_prec > inside_prec || inter_prec > final_prec)
4218 && ! (inside_int && inter_int
4219 && inter_unsignedp != inside_unsignedp
4220 && inter_prec < final_prec)
4221 && ((inter_unsignedp && inter_prec > inside_prec)
4222 == (final_unsignedp && final_prec > inter_prec))
4223 && ! (inside_ptr && inter_prec != final_prec)
410d3f5d
RK
4224 && ! (final_ptr && inside_prec != inter_prec)
4225 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (final_type))
4226 && TYPE_MODE (final_type) == TYPE_MODE (inter_type))
4227 && ! final_ptr)
7e139075
RK
4228 return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
4229 }
6d716ca8
RS
4230
4231 if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
d8f6dbb9
RS
4232 && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1))
4233 /* Detect assigning a bitfield. */
4234 && !(TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == COMPONENT_REF
4235 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 1))))
6d716ca8 4236 {
d8f6dbb9 4237 /* Don't leave an assignment inside a conversion
f72aed24 4238 unless assigning a bitfield. */
6d716ca8
RS
4239 tree prev = TREE_OPERAND (t, 0);
4240 TREE_OPERAND (t, 0) = TREE_OPERAND (prev, 1);
4241 /* First do the assignment, then return converted constant. */
4242 t = build (COMPOUND_EXPR, TREE_TYPE (t), prev, fold (t));
4243 TREE_USED (t) = 1;
4244 return t;
4245 }
4246 if (!wins)
4247 {
4248 TREE_CONSTANT (t) = TREE_CONSTANT (arg0);
4249 return t;
4250 }
4251 return fold_convert (t, arg0);
4252
4253#if 0 /* This loses on &"foo"[0]. */
4254 case ARRAY_REF:
4255 {
4256 int i;
4257
4258 /* Fold an expression like: "foo"[2] */
4259 if (TREE_CODE (arg0) == STRING_CST
4260 && TREE_CODE (arg1) == INTEGER_CST
4261 && !TREE_INT_CST_HIGH (arg1)
4262 && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0))
4263 {
4264 t = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0);
4265 TREE_TYPE (t) = TREE_TYPE (TREE_TYPE (arg0));
ef2bf0c0 4266 force_fit_type (t, 0);
6d716ca8
RS
4267 }
4268 }
4269 return t;
4270#endif /* 0 */
4271
e082358b
JM
4272 case COMPONENT_REF:
4273 if (TREE_CODE (arg0) == CONSTRUCTOR)
3ac4f0e6
JM
4274 {
4275 tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
4276 if (m)
4277 t = TREE_VALUE (m);
4278 }
e082358b
JM
4279 return t;
4280
6d716ca8
RS
4281 case RANGE_EXPR:
4282 TREE_CONSTANT (t) = wins;
4283 return t;
4284
4285 case NEGATE_EXPR:
4286 if (wins)
4287 {
4288 if (TREE_CODE (arg0) == INTEGER_CST)
4289 {
fe3e8e40
RS
4290 HOST_WIDE_INT low, high;
4291 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
4292 TREE_INT_CST_HIGH (arg0),
4293 &low, &high);
4294 t = build_int_2 (low, high);
6d716ca8 4295 TREE_TYPE (t) = type;
dc3907c5
PE
4296 TREE_OVERFLOW (t)
4297 = (TREE_OVERFLOW (arg0)
0c9cabe7 4298 | force_fit_type (t, overflow && !TREE_UNSIGNED (type)));
dc3907c5
PE
4299 TREE_CONSTANT_OVERFLOW (t)
4300 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
6d716ca8
RS
4301 }
4302 else if (TREE_CODE (arg0) == REAL_CST)
4303 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
6d716ca8
RS
4304 }
4305 else if (TREE_CODE (arg0) == NEGATE_EXPR)
4306 return TREE_OPERAND (arg0, 0);
4307
4308 /* Convert - (a - b) to (b - a) for non-floating-point. */
7178e3af 4309 else if (TREE_CODE (arg0) == MINUS_EXPR && ! FLOAT_TYPE_P (type))
6d716ca8
RS
4310 return build (MINUS_EXPR, type, TREE_OPERAND (arg0, 1),
4311 TREE_OPERAND (arg0, 0));
4312
4313 return t;
4314
4315 case ABS_EXPR:
4316 if (wins)
4317 {
4318 if (TREE_CODE (arg0) == INTEGER_CST)
4319 {
4320 if (! TREE_UNSIGNED (type)
4321 && TREE_INT_CST_HIGH (arg0) < 0)
4322 {
2a23183e
RS
4323 HOST_WIDE_INT low, high;
4324 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
4325 TREE_INT_CST_HIGH (arg0),
4326 &low, &high);
4327 t = build_int_2 (low, high);
4328 TREE_TYPE (t) = type;
dc3907c5
PE
4329 TREE_OVERFLOW (t)
4330 = (TREE_OVERFLOW (arg0)
e0f776fb 4331 | force_fit_type (t, overflow));
dc3907c5
PE
4332 TREE_CONSTANT_OVERFLOW (t)
4333 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
6d716ca8
RS
4334 }
4335 }
4336 else if (TREE_CODE (arg0) == REAL_CST)
4337 {
c05a9b68 4338 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
6d716ca8
RS
4339 t = build_real (type,
4340 REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
4341 }
6d716ca8
RS
4342 }
4343 else if (TREE_CODE (arg0) == ABS_EXPR || TREE_CODE (arg0) == NEGATE_EXPR)
4344 return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
4345 return t;
4346
551064b1
RS
4347 case CONJ_EXPR:
4348 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
4349 return arg0;
4350 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
4351 return build (COMPLEX_EXPR, TREE_TYPE (arg0),
4352 TREE_OPERAND (arg0, 0),
4353 fold (build1 (NEGATE_EXPR,
4354 TREE_TYPE (TREE_TYPE (arg0)),
4355 TREE_OPERAND (arg0, 1))));
4356 else if (TREE_CODE (arg0) == COMPLEX_CST)
214d5b84 4357 return build_complex (type, TREE_OPERAND (arg0, 0),
551064b1
RS
4358 fold (build1 (NEGATE_EXPR,
4359 TREE_TYPE (TREE_TYPE (arg0)),
4360 TREE_OPERAND (arg0, 1))));
4361 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
4362 return fold (build (TREE_CODE (arg0), type,
4363 fold (build1 (CONJ_EXPR, type,
4364 TREE_OPERAND (arg0, 0))),
4365 fold (build1 (CONJ_EXPR,
4366 type, TREE_OPERAND (arg0, 1)))));
4367 else if (TREE_CODE (arg0) == CONJ_EXPR)
4368 return TREE_OPERAND (arg0, 0);
4369 return t;
4370
6d716ca8
RS
4371 case BIT_NOT_EXPR:
4372 if (wins)
4373 {
380ff34a
RK
4374 t = build_int_2 (~ TREE_INT_CST_LOW (arg0),
4375 ~ TREE_INT_CST_HIGH (arg0));
6d716ca8 4376 TREE_TYPE (t) = type;
e0f776fb 4377 force_fit_type (t, 0);
dc3907c5 4378 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg0);
fe3e8e40 4379 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (arg0);
6d716ca8
RS
4380 }
4381 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
4382 return TREE_OPERAND (arg0, 0);
4383 return t;
4384
4385 case PLUS_EXPR:
4386 /* A + (-B) -> A - B */
4387 if (TREE_CODE (arg1) == NEGATE_EXPR)
4388 return fold (build (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
7178e3af 4389 else if (! FLOAT_TYPE_P (type))
6d716ca8
RS
4390 {
4391 if (integer_zerop (arg1))
4392 return non_lvalue (convert (type, arg0));
4393
4394 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
4395 with a constant, and the two constants have no bits in common,
4396 we should treat this as a BIT_IOR_EXPR since this may produce more
4397 simplifications. */
4398 if (TREE_CODE (arg0) == BIT_AND_EXPR
4399 && TREE_CODE (arg1) == BIT_AND_EXPR
4400 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
4401 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
4402 && integer_zerop (const_binop (BIT_AND_EXPR,
4403 TREE_OPERAND (arg0, 1),
91d33e36 4404 TREE_OPERAND (arg1, 1), 0)))
6d716ca8
RS
4405 {
4406 code = BIT_IOR_EXPR;
4407 goto bit_ior;
4408 }
6a96fcb4 4409
45f97e2e
RH
4410 if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
4411 {
4412 tree arg00, arg01, arg10, arg11;
4413 tree alt0, alt1, same;
4414
4415 /* (A * C) + (B * C) -> (A+B) * C.
4416 We are most concerned about the case where C is a constant,
4417 but other combinations show up during loop reduction. Since
4418 it is not difficult, try all four possibilities. */
4419
4420 arg00 = TREE_OPERAND (arg0, 0);
4421 arg01 = TREE_OPERAND (arg0, 1);
4422 arg10 = TREE_OPERAND (arg1, 0);
4423 arg11 = TREE_OPERAND (arg1, 1);
4424 same = NULL_TREE;
4425
4426 if (operand_equal_p (arg01, arg11, 0))
4427 same = arg01, alt0 = arg00, alt1 = arg10;
4428 else if (operand_equal_p (arg00, arg10, 0))
4429 same = arg00, alt0 = arg01, alt1 = arg11;
4430 else if (operand_equal_p (arg00, arg11, 0))
4431 same = arg00, alt0 = arg01, alt1 = arg10;
4432 else if (operand_equal_p (arg01, arg10, 0))
4433 same = arg01, alt0 = arg00, alt1 = arg11;
4434
4435 if (same)
4436 return fold (build (MULT_EXPR, type,
4437 fold (build (PLUS_EXPR, type, alt0, alt1)),
4438 same));
4439 }
6d716ca8
RS
4440 }
4441 /* In IEEE floating point, x+0 may not equal x. */
996c63d3
RK
4442 else if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4443 || flag_fast_math)
6d716ca8
RS
4444 && real_zerop (arg1))
4445 return non_lvalue (convert (type, arg0));
4446 associate:
4447 /* In most languages, can't associate operations on floats
4448 through parentheses. Rather than remember where the parentheses
e9aaa5a5
RK
4449 were, we don't associate floats at all. It shouldn't matter much.
4450 However, associating multiplications is only very slightly
4451 inaccurate, so do that if -ffast-math is specified. */
4452 if (FLOAT_TYPE_P (type)
4453 && ! (flag_fast_math && code == MULT_EXPR))
6d716ca8 4454 goto binary;
e9aaa5a5 4455
6d716ca8
RS
4456 /* The varsign == -1 cases happen only for addition and subtraction.
4457 It says that the arg that was split was really CON minus VAR.
4458 The rest of the code applies to all associative operations. */
4459 if (!wins)
4460 {
c05a9b68 4461 tree var, con;
6d716ca8
RS
4462 int varsign;
4463
4464 if (split_tree (arg0, code, &var, &con, &varsign))
4465 {
4466 if (varsign == -1)
4467 {
4468 /* EXPR is (CON-VAR) +- ARG1. */
4469 /* If it is + and VAR==ARG1, return just CONST. */
4470 if (code == PLUS_EXPR && operand_equal_p (var, arg1, 0))
4471 return convert (TREE_TYPE (t), con);
4472
ca86a57a 4473 /* If ARG0 is a constant, don't change things around;
77a45a2e 4474 instead keep all the constant computations together. */
ca86a57a 4475
77a45a2e 4476 if (TREE_CONSTANT (arg0))
ca86a57a
RK
4477 return t;
4478
6d716ca8 4479 /* Otherwise return (CON +- ARG1) - VAR. */
cd7ece66
RK
4480 t = build (MINUS_EXPR, type,
4481 fold (build (code, type, con, arg1)), var);
6d716ca8
RS
4482 }
4483 else
4484 {
4485 /* EXPR is (VAR+CON) +- ARG1. */
4486 /* If it is - and VAR==ARG1, return just CONST. */
4487 if (code == MINUS_EXPR && operand_equal_p (var, arg1, 0))
4488 return convert (TREE_TYPE (t), con);
4489
ca86a57a 4490 /* If ARG0 is a constant, don't change things around;
77a45a2e 4491 instead keep all the constant computations together. */
ca86a57a 4492
77a45a2e 4493 if (TREE_CONSTANT (arg0))
ca86a57a
RK
4494 return t;
4495
6d716ca8 4496 /* Otherwise return VAR +- (ARG1 +- CON). */
cd7ece66
RK
4497 tem = fold (build (code, type, arg1, con));
4498 t = build (code, type, var, tem);
4499
6d716ca8
RS
4500 if (integer_zerop (tem)
4501 && (code == PLUS_EXPR || code == MINUS_EXPR))
4502 return convert (type, var);
4503 /* If we have x +/- (c - d) [c an explicit integer]
4504 change it to x -/+ (d - c) since if d is relocatable
4505 then the latter can be a single immediate insn
4506 and the former cannot. */
4507 if (TREE_CODE (tem) == MINUS_EXPR
4508 && TREE_CODE (TREE_OPERAND (tem, 0)) == INTEGER_CST)
4509 {
4510 tree tem1 = TREE_OPERAND (tem, 1);
4511 TREE_OPERAND (tem, 1) = TREE_OPERAND (tem, 0);
4512 TREE_OPERAND (tem, 0) = tem1;
4513 TREE_SET_CODE (t,
4514 (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
4515 }
4516 }
4517 return t;
4518 }
4519
4520 if (split_tree (arg1, code, &var, &con, &varsign))
4521 {
77a45a2e 4522 if (TREE_CONSTANT (arg1))
cc5edac6
RK
4523 return t;
4524
4525 if (varsign == -1)
4526 TREE_SET_CODE (t,
4527 (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR));
4528
6d716ca8 4529 /* EXPR is ARG0 +- (CON +- VAR). */
6d716ca8
RS
4530 if (TREE_CODE (t) == MINUS_EXPR
4531 && operand_equal_p (var, arg0, 0))
4532 {
4533 /* If VAR and ARG0 cancel, return just CON or -CON. */
4534 if (code == PLUS_EXPR)
4535 return convert (TREE_TYPE (t), con);
4536 return fold (build1 (NEGATE_EXPR, TREE_TYPE (t),
4537 convert (TREE_TYPE (t), con)));
4538 }
cc5edac6 4539
cd7ece66
RK
4540 t = build (TREE_CODE (t), type,
4541 fold (build (code, TREE_TYPE (t), arg0, con)), var);
4542
6d716ca8
RS
4543 if (integer_zerop (TREE_OPERAND (t, 0))
4544 && TREE_CODE (t) == PLUS_EXPR)
4545 return convert (TREE_TYPE (t), var);
4546 return t;
4547 }
4548 }
4549 binary:
4550#if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC)
4551 if (TREE_CODE (arg1) == REAL_CST)
4552 return t;
4553#endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */
4554 if (wins)
91d33e36 4555 t1 = const_binop (code, arg0, arg1, 0);
6d716ca8
RS
4556 if (t1 != NULL_TREE)
4557 {
4558 /* The return value should always have
4559 the same type as the original expression. */
380ff34a
RK
4560 if (TREE_TYPE (t1) != TREE_TYPE (t))
4561 t1 = convert (TREE_TYPE (t), t1);
4562
6d716ca8
RS
4563 return t1;
4564 }
4565 return t;
4566
4567 case MINUS_EXPR:
7178e3af 4568 if (! FLOAT_TYPE_P (type))
6d716ca8
RS
4569 {
4570 if (! wins && integer_zerop (arg0))
4571 return build1 (NEGATE_EXPR, type, arg1);
4572 if (integer_zerop (arg1))
4573 return non_lvalue (convert (type, arg0));
6a96fcb4
RK
4574
4575 /* (A * C) - (B * C) -> (A-B) * C. Since we are most concerned
4576 about the case where C is a constant, just try one of the
4577 four possibilities. */
4578
4579 if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR
4580 && operand_equal_p (TREE_OPERAND (arg0, 1),
4581 TREE_OPERAND (arg1, 1), 0))
4582 return fold (build (MULT_EXPR, type,
4583 fold (build (MINUS_EXPR, type,
4584 TREE_OPERAND (arg0, 0),
4585 TREE_OPERAND (arg1, 0))),
4586 TREE_OPERAND (arg0, 1)));
6d716ca8
RS
4587 }
4588 /* Convert A - (-B) to A + B. */
4589 else if (TREE_CODE (arg1) == NEGATE_EXPR)
4590 return fold (build (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
fab446b8
RK
4591
4592 else if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4593 || flag_fast_math)
6d716ca8 4594 {
c05a9b68 4595 /* Except with IEEE floating point, 0-x equals -x. */
6d716ca8
RS
4596 if (! wins && real_zerop (arg0))
4597 return build1 (NEGATE_EXPR, type, arg1);
c05a9b68
RS
4598 /* Except with IEEE floating point, x-0 equals x. */
4599 if (real_zerop (arg1))
6d716ca8 4600 return non_lvalue (convert (type, arg0));
fab446b8 4601 }
a6acbe15 4602
fab446b8
RK
4603 /* Fold &x - &x. This can happen from &x.foo - &x.
4604 This is unsafe for certain floats even in non-IEEE formats.
4605 In IEEE, it is unsafe because it does wrong for NaNs.
4606 Also note that operand_equal_p is always false if an operand
4607 is volatile. */
4608
59d90212
JW
4609 if ((! FLOAT_TYPE_P (type) || flag_fast_math)
4610 && operand_equal_p (arg0, arg1, 0))
fab446b8 4611 return convert (type, integer_zero_node);
a6acbe15 4612
6d716ca8
RS
4613 goto associate;
4614
4615 case MULT_EXPR:
7178e3af 4616 if (! FLOAT_TYPE_P (type))
6d716ca8
RS
4617 {
4618 if (integer_zerop (arg1))
4619 return omit_one_operand (type, arg1, arg0);
4620 if (integer_onep (arg1))
4621 return non_lvalue (convert (type, arg0));
4622
b9b5c1b3
RK
4623 /* ((A / C) * C) is A if the division is an
4624 EXACT_DIV_EXPR. Since C is normally a constant,
4625 just check for one of the four possibilities. */
4626
4627 if (TREE_CODE (arg0) == EXACT_DIV_EXPR
4628 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
4629 return TREE_OPERAND (arg0, 0);
4630
6d716ca8
RS
4631 /* (a * (1 << b)) is (a << b) */
4632 if (TREE_CODE (arg1) == LSHIFT_EXPR
4633 && integer_onep (TREE_OPERAND (arg1, 0)))
4634 return fold (build (LSHIFT_EXPR, type, arg0,
4635 TREE_OPERAND (arg1, 1)));
4636 if (TREE_CODE (arg0) == LSHIFT_EXPR
4637 && integer_onep (TREE_OPERAND (arg0, 0)))
4638 return fold (build (LSHIFT_EXPR, type, arg1,
4639 TREE_OPERAND (arg0, 1)));
4640 }
6d716ca8
RS
4641 else
4642 {
c05a9b68 4643 /* x*0 is 0, except for IEEE floating point. */
fab446b8
RK
4644 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4645 || flag_fast_math)
6d716ca8
RS
4646 && real_zerop (arg1))
4647 return omit_one_operand (type, arg1, arg0);
c05a9b68 4648 /* In IEEE floating point, x*1 is not equivalent to x for snans.
6d716ca8
RS
4649 However, ANSI says we can drop signals,
4650 so we can do this anyway. */
4651 if (real_onep (arg1))
4652 return non_lvalue (convert (type, arg0));
4653 /* x*2 is x+x */
9ec36da5
JL
4654 if (! wins && real_twop (arg1) && current_function_decl != 0
4655 && ! contains_placeholder_p (arg0))
6d716ca8
RS
4656 {
4657 tree arg = save_expr (arg0);
4658 return build (PLUS_EXPR, type, arg, arg);
4659 }
4660 }
4661 goto associate;
4662
4663 case BIT_IOR_EXPR:
4664 bit_ior:
65d8b1ce
RK
4665 {
4666 register enum tree_code code0, code1;
4667
6d716ca8
RS
4668 if (integer_all_onesp (arg1))
4669 return omit_one_operand (type, arg1, arg0);
4670 if (integer_zerop (arg1))
4671 return non_lvalue (convert (type, arg0));
4672 t1 = distribute_bit_expr (code, type, arg0, arg1);
4673 if (t1 != NULL_TREE)
4674 return t1;
85d2e16c 4675
65d8b1ce 4676 /* (A << C1) | (A >> C2) if A is unsigned and C1+C2 is the size of A
85d2e16c 4677 is a rotate of A by C1 bits. */
65d8b1ce
RK
4678 /* (A << B) | (A >> (Z - B)) if A is unsigned and Z is the size of A
4679 is a rotate of A by B bits. */
85d2e16c 4680
65d8b1ce
RK
4681 code0 = TREE_CODE (arg0);
4682 code1 = TREE_CODE (arg1);
4683 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
4684 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
85d2e16c 4685 && operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1,0), 0)
65d8b1ce
RK
4686 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
4687 {
4688 register tree tree01, tree11;
4689 register enum tree_code code01, code11;
4690
4691 tree01 = TREE_OPERAND (arg0, 1);
4692 tree11 = TREE_OPERAND (arg1, 1);
4693 code01 = TREE_CODE (tree01);
4694 code11 = TREE_CODE (tree11);
4695 if (code01 == INTEGER_CST
4696 && code11 == INTEGER_CST
4697 && TREE_INT_CST_HIGH (tree01) == 0
4698 && TREE_INT_CST_HIGH (tree11) == 0
4699 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
85d2e16c 4700 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
65d8b1ce
RK
4701 return build (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
4702 code0 == LSHIFT_EXPR ? tree01 : tree11);
4703 else if (code11 == MINUS_EXPR
4704 && TREE_CODE (TREE_OPERAND (tree11, 0)) == INTEGER_CST
4705 && TREE_INT_CST_HIGH (TREE_OPERAND (tree11, 0)) == 0
4706 && TREE_INT_CST_LOW (TREE_OPERAND (tree11, 0))
4707 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))
4708 && operand_equal_p (tree01, TREE_OPERAND (tree11, 1), 0))
4709 return build (code0 == LSHIFT_EXPR ? LROTATE_EXPR : RROTATE_EXPR,
4710 type, TREE_OPERAND (arg0, 0), tree01);
4711 else if (code01 == MINUS_EXPR
4712 && TREE_CODE (TREE_OPERAND (tree01, 0)) == INTEGER_CST
4713 && TREE_INT_CST_HIGH (TREE_OPERAND (tree01, 0)) == 0
4714 && TREE_INT_CST_LOW (TREE_OPERAND (tree01, 0))
4715 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))
4716 && operand_equal_p (tree11, TREE_OPERAND (tree01, 1), 0))
4717 return build (code0 != LSHIFT_EXPR ? LROTATE_EXPR : RROTATE_EXPR,
4718 type, TREE_OPERAND (arg0, 0), tree11);
4719 }
85d2e16c 4720
6d716ca8 4721 goto associate;
65d8b1ce 4722 }
6d716ca8
RS
4723
4724 case BIT_XOR_EXPR:
4725 if (integer_zerop (arg1))
4726 return non_lvalue (convert (type, arg0));
4727 if (integer_all_onesp (arg1))
4728 return fold (build1 (BIT_NOT_EXPR, type, arg0));
4729 goto associate;
4730
4731 case BIT_AND_EXPR:
4732 bit_and:
4733 if (integer_all_onesp (arg1))
4734 return non_lvalue (convert (type, arg0));
4735 if (integer_zerop (arg1))
4736 return omit_one_operand (type, arg1, arg0);
4737 t1 = distribute_bit_expr (code, type, arg0, arg1);
4738 if (t1 != NULL_TREE)
4739 return t1;
4740 /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */
4741 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR
4742 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0))))
4743 {
4744 int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)));
906c4e36
RK
4745 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
4746 && (~TREE_INT_CST_LOW (arg0)
4747 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
6d716ca8
RS
4748 return build1 (NOP_EXPR, type, TREE_OPERAND (arg1, 0));
4749 }
4750 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
4751 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
4752 {
4753 int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
906c4e36
RK
4754 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
4755 && (~TREE_INT_CST_LOW (arg1)
4756 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
6d716ca8
RS
4757 return build1 (NOP_EXPR, type, TREE_OPERAND (arg0, 0));
4758 }
4759 goto associate;
4760
4761 case BIT_ANDTC_EXPR:
4762 if (integer_all_onesp (arg0))
4763 return non_lvalue (convert (type, arg1));
4764 if (integer_zerop (arg0))
4765 return omit_one_operand (type, arg0, arg1);
4766 if (TREE_CODE (arg1) == INTEGER_CST)
4767 {
4768 arg1 = fold (build1 (BIT_NOT_EXPR, type, arg1));
4769 code = BIT_AND_EXPR;
4770 goto bit_and;
4771 }
4772 goto binary;
4773
e9aaa5a5
RK
4774 case RDIV_EXPR:
4775 /* In most cases, do nothing with a divide by zero. */
4776#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
4777#ifndef REAL_INFINITY
4778 if (TREE_CODE (arg1) == REAL_CST && real_zerop (arg1))
4779 return t;
4780#endif
4781#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
4782
4783 /* In IEEE floating point, x/1 is not equivalent to x for snans.
4784 However, ANSI says we can drop signals, so we can do this anyway. */
4785 if (real_onep (arg1))
4786 return non_lvalue (convert (type, arg0));
4787
4788 /* If ARG1 is a constant, we can convert this to a multiply by the
4789 reciprocal. This does not have the same rounding properties,
4790 so only do this if -ffast-math. We can actually always safely
4791 do it if ARG1 is a power of two, but it's hard to tell if it is
4792 or not in a portable manner. */
39647dcb
RK
4793 if (TREE_CODE (arg1) == REAL_CST)
4794 {
4795 if (flag_fast_math
4796 && 0 != (tem = const_binop (code, build_real (type, dconst1),
4797 arg1, 0)))
4798 return fold (build (MULT_EXPR, type, arg0, tem));
4799 /* Find the reciprocal if optimizing and the result is exact. */
4800 else if (optimize)
4801 {
4802 REAL_VALUE_TYPE r;
4803 r = TREE_REAL_CST (arg1);
4804 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
4805 {
4806 tem = build_real (type, r);
4807 return fold (build (MULT_EXPR, type, arg0, tem));
4808 }
4809 }
4810 }
e9aaa5a5
RK
4811 goto binary;
4812
6d716ca8
RS
4813 case TRUNC_DIV_EXPR:
4814 case ROUND_DIV_EXPR:
4815 case FLOOR_DIV_EXPR:
4816 case CEIL_DIV_EXPR:
4817 case EXACT_DIV_EXPR:
6d716ca8
RS
4818 if (integer_onep (arg1))
4819 return non_lvalue (convert (type, arg0));
4820 if (integer_zerop (arg1))
4821 return t;
3b998c11 4822
39dfb55a
JL
4823 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
4824 operation, EXACT_DIV_EXPR.
4825
91585c63
TM
4826 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
4827 At one time others generated faster code, it's not clear if they do
4828 after the last round to changes to the DIV code in expmed.c. */
4829 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
39dfb55a
JL
4830 && multiple_of_p (type, arg0, arg1))
4831 return fold (build (EXACT_DIV_EXPR, type, arg0, arg1));
4832
37bdb7e3 4833 /* If we have ((a / C1) / C2) where both division are the same type, try
e9aaa5a5
RK
4834 to simplify. First see if C1 * C2 overflows or not. */
4835 if (TREE_CODE (arg0) == code && TREE_CODE (arg1) == INTEGER_CST
4836 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
4837 {
37bdb7e3 4838 tree new_divisor;
e9aaa5a5 4839
37bdb7e3
TG
4840 new_divisor = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 1), arg1, 0);
4841 tem = const_binop (FLOOR_DIV_EXPR, new_divisor, arg1, 0);
3122945e 4842
37bdb7e3
TG
4843 if (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) == TREE_INT_CST_LOW (tem)
4844 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == TREE_INT_CST_HIGH (tem))
e9aaa5a5 4845 {
37bdb7e3
TG
4846 /* If no overflow, divide by C1*C2. */
4847 return fold (build (code, type, TREE_OPERAND (arg0, 0), new_divisor));
e9aaa5a5 4848 }
e9aaa5a5
RK
4849 }
4850
6a96fcb4
RK
4851 /* Look for ((a * C1) / C3) or (((a * C1) + C2) / C3),
4852 where C1 % C3 == 0 or C3 % C1 == 0. We can simplify these
4853 expressions, which often appear in the offsets or sizes of
4854 objects with a varying size. Only deal with positive divisors
aae67841 4855 and multiplicands. If C2 is negative, we must have C2 % C3 == 0.
6a96fcb4
RK
4856
4857 Look for NOPs and SAVE_EXPRs inside. */
4858
3b998c11 4859 if (TREE_CODE (arg1) == INTEGER_CST
d0cb4c65 4860 && tree_int_cst_sgn (arg1) >= 0)
3b998c11 4861 {
6a96fcb4
RK
4862 int have_save_expr = 0;
4863 tree c2 = integer_zero_node;
4864 tree xarg0 = arg0;
3b998c11 4865
d011fbf9 4866 if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
6a96fcb4 4867 have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
3b998c11 4868
6a96fcb4
RK
4869 STRIP_NOPS (xarg0);
4870
750e8348
TM
4871 /* Look inside the dividend and simplify using EXACT_DIV_EXPR
4872 if possible. */
4873 if (TREE_CODE (xarg0) == MULT_EXPR
4874 && multiple_of_p (type, TREE_OPERAND (xarg0, 0), arg1))
4875 {
4876 tree t;
4877
4878 t = fold (build (MULT_EXPR, type,
4879 fold (build (EXACT_DIV_EXPR, type,
4880 TREE_OPERAND (xarg0, 0), arg1)),
4881 TREE_OPERAND (xarg0, 1)));
4882 if (have_save_expr)
4883 t = save_expr (t);
4884 return t;
4885
4886 }
4887
4888 if (TREE_CODE (xarg0) == MULT_EXPR
4889 && multiple_of_p (type, TREE_OPERAND (xarg0, 1), arg1))
4890 {
4891 tree t;
4892
4893 t = fold (build (MULT_EXPR, type,
4894 fold (build (EXACT_DIV_EXPR, type,
4895 TREE_OPERAND (xarg0, 1), arg1)),
4896 TREE_OPERAND (xarg0, 0)));
4897 if (have_save_expr)
4898 t = save_expr (t);
4899 return t;
4900 }
4901
6a96fcb4
RK
4902 if (TREE_CODE (xarg0) == PLUS_EXPR
4903 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
4904 c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
4905 else if (TREE_CODE (xarg0) == MINUS_EXPR
aae67841
RK
4906 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4907 /* If we are doing this computation unsigned, the negate
4908 is incorrect. */
4909 && ! TREE_UNSIGNED (type))
6a96fcb4
RK
4910 {
4911 c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
4912 xarg0 = TREE_OPERAND (xarg0, 0);
4913 }
4914
d011fbf9 4915 if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
6a96fcb4
RK
4916 have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
4917
4918 STRIP_NOPS (xarg0);
4919
4920 if (TREE_CODE (xarg0) == MULT_EXPR
4921 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
d0cb4c65 4922 && tree_int_cst_sgn (TREE_OPERAND (xarg0, 1)) >= 0
6a96fcb4
RK
4923 && (integer_zerop (const_binop (TRUNC_MOD_EXPR,
4924 TREE_OPERAND (xarg0, 1), arg1, 1))
4925 || integer_zerop (const_binop (TRUNC_MOD_EXPR, arg1,
aae67841 4926 TREE_OPERAND (xarg0, 1), 1)))
d0cb4c65 4927 && (tree_int_cst_sgn (c2) >= 0
aae67841
RK
4928 || integer_zerop (const_binop (TRUNC_MOD_EXPR, c2,
4929 arg1, 1))))
6a96fcb4
RK
4930 {
4931 tree outer_div = integer_one_node;
4932 tree c1 = TREE_OPERAND (xarg0, 1);
4933 tree c3 = arg1;
4934
4935 /* If C3 > C1, set them equal and do a divide by
4936 C3/C1 at the end of the operation. */
4937 if (tree_int_cst_lt (c1, c3))
4938 outer_div = const_binop (code, c3, c1, 0), c3 = c1;
4939
4940 /* The result is A * (C1/C3) + (C2/C3). */
4941 t = fold (build (PLUS_EXPR, type,
4942 fold (build (MULT_EXPR, type,
4943 TREE_OPERAND (xarg0, 0),
4944 const_binop (code, c1, c3, 1))),
4945 const_binop (code, c2, c3, 1)));
4946
4947 if (! integer_onep (outer_div))
d0cb4c65 4948 t = fold (build (code, type, t, convert (type, outer_div)));
6a96fcb4
RK
4949
4950 if (have_save_expr)
4951 t = save_expr (t);
4952
4953 return t;
4954 }
3b998c11
RK
4955 }
4956
6d716ca8
RS
4957 goto binary;
4958
4959 case CEIL_MOD_EXPR:
4960 case FLOOR_MOD_EXPR:
4961 case ROUND_MOD_EXPR:
4962 case TRUNC_MOD_EXPR:
4963 if (integer_onep (arg1))
4964 return omit_one_operand (type, integer_zero_node, arg0);
4965 if (integer_zerop (arg1))
4966 return t;
6a96fcb4
RK
4967
4968 /* Look for ((a * C1) % C3) or (((a * C1) + C2) % C3),
4969 where C1 % C3 == 0. Handle similarly to the division case,
4970 but don't bother with SAVE_EXPRs. */
4971
4972 if (TREE_CODE (arg1) == INTEGER_CST
4973 && ! integer_zerop (arg1))
4974 {
4975 tree c2 = integer_zero_node;
4976 tree xarg0 = arg0;
4977
4978 if (TREE_CODE (xarg0) == PLUS_EXPR
4979 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST)
4980 c2 = TREE_OPERAND (xarg0, 1), xarg0 = TREE_OPERAND (xarg0, 0);
4981 else if (TREE_CODE (xarg0) == MINUS_EXPR
aae67841
RK
4982 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4983 && ! TREE_UNSIGNED (type))
6a96fcb4
RK
4984 {
4985 c2 = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (xarg0, 1)));
4986 xarg0 = TREE_OPERAND (xarg0, 0);
4987 }
4988
4989 STRIP_NOPS (xarg0);
4990
4991 if (TREE_CODE (xarg0) == MULT_EXPR
4992 && TREE_CODE (TREE_OPERAND (xarg0, 1)) == INTEGER_CST
4993 && integer_zerop (const_binop (TRUNC_MOD_EXPR,
4994 TREE_OPERAND (xarg0, 1),
aae67841 4995 arg1, 1))
d0cb4c65 4996 && tree_int_cst_sgn (c2) >= 0)
6a96fcb4
RK
4997 /* The result is (C2%C3). */
4998 return omit_one_operand (type, const_binop (code, c2, arg1, 1),
4999 TREE_OPERAND (xarg0, 0));
5000 }
5001
6d716ca8
RS
5002 goto binary;
5003
5004 case LSHIFT_EXPR:
5005 case RSHIFT_EXPR:
5006 case LROTATE_EXPR:
5007 case RROTATE_EXPR:
5008 if (integer_zerop (arg1))
5009 return non_lvalue (convert (type, arg0));
5010 /* Since negative shift count is not well-defined,
5011 don't try to compute it in the compiler. */
4d39710e 5012 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
6d716ca8 5013 return t;
4d39710e
RK
5014 /* Rewrite an LROTATE_EXPR by a constant into an
5015 RROTATE_EXPR by a new constant. */
5016 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
5017 {
5018 TREE_SET_CODE (t, RROTATE_EXPR);
5019 code = RROTATE_EXPR;
5020 TREE_OPERAND (t, 1) = arg1
5021 = const_binop
5022 (MINUS_EXPR,
5023 convert (TREE_TYPE (arg1),
5024 build_int_2 (GET_MODE_BITSIZE (TYPE_MODE (type)), 0)),
5025 arg1, 0);
5026 if (tree_int_cst_sgn (arg1) < 0)
5027 return t;
5028 }
5029
5030 /* If we have a rotate of a bit operation with the rotate count and
5031 the second operand of the bit operation both constant,
5032 permute the two operations. */
5033 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
5034 && (TREE_CODE (arg0) == BIT_AND_EXPR
5035 || TREE_CODE (arg0) == BIT_ANDTC_EXPR
5036 || TREE_CODE (arg0) == BIT_IOR_EXPR
5037 || TREE_CODE (arg0) == BIT_XOR_EXPR)
5038 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
5039 return fold (build (TREE_CODE (arg0), type,
5040 fold (build (code, type,
5041 TREE_OPERAND (arg0, 0), arg1)),
5042 fold (build (code, type,
5043 TREE_OPERAND (arg0, 1), arg1))));
5044
5045 /* Two consecutive rotates adding up to the width of the mode can
5046 be ignored. */
5047 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
5048 && TREE_CODE (arg0) == RROTATE_EXPR
5049 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
5050 && TREE_INT_CST_HIGH (arg1) == 0
5051 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
5052 && ((TREE_INT_CST_LOW (arg1)
5053 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
5054 == GET_MODE_BITSIZE (TYPE_MODE (type))))
5055 return TREE_OPERAND (arg0, 0);
5056
6d716ca8
RS
5057 goto binary;
5058
5059 case MIN_EXPR:
5060 if (operand_equal_p (arg0, arg1, 0))
5061 return arg0;
7178e3af 5062 if (INTEGRAL_TYPE_P (type)
6d716ca8
RS
5063 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), 1))
5064 return omit_one_operand (type, arg1, arg0);
5065 goto associate;
5066
5067 case MAX_EXPR:
5068 if (operand_equal_p (arg0, arg1, 0))
5069 return arg0;
7178e3af 5070 if (INTEGRAL_TYPE_P (type)
e1ee5cdc 5071 && TYPE_MAX_VALUE (type)
6d716ca8
RS
5072 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), 1))
5073 return omit_one_operand (type, arg1, arg0);
5074 goto associate;
5075
5076 case TRUTH_NOT_EXPR:
5077 /* Note that the operand of this must be an int
5078 and its values must be 0 or 1.
5079 ("true" is a fixed value perhaps depending on the language,
5080 but we don't handle values other than 1 correctly yet.) */
1180eb10
JM
5081 tem = invert_truthvalue (arg0);
5082 /* Avoid infinite recursion. */
5083 if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
5084 return t;
5085 return convert (type, tem);
6d716ca8
RS
5086
5087 case TRUTH_ANDIF_EXPR:
5088 /* Note that the operands of this must be ints
5089 and their values must be 0 or 1.
5090 ("true" is a fixed value perhaps depending on the language.) */
5091 /* If first arg is constant zero, return it. */
772447c5 5092 if (integer_zerop (arg0))
6d716ca8
RS
5093 return arg0;
5094 case TRUTH_AND_EXPR:
5095 /* If either arg is constant true, drop it. */
5096 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5097 return non_lvalue (arg1);
5098 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
5099 return non_lvalue (arg0);
772447c5
RK
5100 /* If second arg is constant zero, result is zero, but first arg
5101 must be evaluated. */
5102 if (integer_zerop (arg1))
5103 return omit_one_operand (type, arg1, arg0);
80906567
RK
5104 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
5105 case will be handled here. */
5106 if (integer_zerop (arg0))
5107 return omit_one_operand (type, arg0, arg1);
6d716ca8
RS
5108
5109 truth_andor:
e9b5e15f
RK
5110 /* We only do these simplifications if we are optimizing. */
5111 if (!optimize)
5112 return t;
5113
5114 /* Check for things like (A || B) && (A || C). We can convert this
5115 to A || (B && C). Note that either operator can be any of the four
5116 truth and/or operations and the transformation will still be
5117 valid. Also note that we only care about order for the
96f06cb6
RK
5118 ANDIF and ORIF operators. If B contains side effects, this
5119 might change the truth-value of A. */
e9b5e15f
RK
5120 if (TREE_CODE (arg0) == TREE_CODE (arg1)
5121 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
5122 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
5123 || TREE_CODE (arg0) == TRUTH_AND_EXPR
96f06cb6
RK
5124 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
5125 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
e9b5e15f
RK
5126 {
5127 tree a00 = TREE_OPERAND (arg0, 0);
5128 tree a01 = TREE_OPERAND (arg0, 1);
5129 tree a10 = TREE_OPERAND (arg1, 0);
5130 tree a11 = TREE_OPERAND (arg1, 1);
5131 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
5132 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
5133 && (code == TRUTH_AND_EXPR
5134 || code == TRUTH_OR_EXPR));
5135
5136 if (operand_equal_p (a00, a10, 0))
5137 return fold (build (TREE_CODE (arg0), type, a00,
5138 fold (build (code, type, a01, a11))));
5139 else if (commutative && operand_equal_p (a00, a11, 0))
5140 return fold (build (TREE_CODE (arg0), type, a00,
5141 fold (build (code, type, a01, a10))));
5142 else if (commutative && operand_equal_p (a01, a10, 0))
5143 return fold (build (TREE_CODE (arg0), type, a01,
5144 fold (build (code, type, a00, a11))));
5145
5146 /* This case if tricky because we must either have commutative
5147 operators or else A10 must not have side-effects. */
5148
5149 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
5150 && operand_equal_p (a01, a11, 0))
5151 return fold (build (TREE_CODE (arg0), type,
5152 fold (build (code, type, a00, a10)),
5153 a01));
5154 }
5155
ebde8a27
RK
5156 /* See if we can build a range comparison. */
5157 if (0 != (tem = fold_range_test (t)))
5158 return tem;
5159
6d716ca8
RS
5160 /* Check for the possibility of merging component references. If our
5161 lhs is another similar operation, try to merge its rhs with our
5162 rhs. Then try to merge our lhs and rhs. */
e9b5e15f
RK
5163 if (TREE_CODE (arg0) == code
5164 && 0 != (tem = fold_truthop (code, type,
5165 TREE_OPERAND (arg0, 1), arg1)))
5166 return fold (build (code, type, TREE_OPERAND (arg0, 0), tem));
6d716ca8 5167
e9b5e15f
RK
5168 if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
5169 return tem;
61f275ff 5170
6d716ca8
RS
5171 return t;
5172
5173 case TRUTH_ORIF_EXPR:
5174 /* Note that the operands of this must be ints
5175 and their values must be 0 or true.
5176 ("true" is a fixed value perhaps depending on the language.) */
5177 /* If first arg is constant true, return it. */
5178 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5179 return arg0;
5180 case TRUTH_OR_EXPR:
5181 /* If either arg is constant zero, drop it. */
5182 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
5183 return non_lvalue (arg1);
5184 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1))
5185 return non_lvalue (arg0);
772447c5
RK
5186 /* If second arg is constant true, result is true, but we must
5187 evaluate first arg. */
5188 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
5189 return omit_one_operand (type, arg1, arg0);
80906567
RK
5190 /* Likewise for first arg, but note this only occurs here for
5191 TRUTH_OR_EXPR. */
5192 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
5193 return omit_one_operand (type, arg0, arg1);
6d716ca8
RS
5194 goto truth_andor;
5195
772447c5
RK
5196 case TRUTH_XOR_EXPR:
5197 /* If either arg is constant zero, drop it. */
5198 if (integer_zerop (arg0))
5199 return non_lvalue (arg1);
5200 if (integer_zerop (arg1))
5201 return non_lvalue (arg0);
5202 /* If either arg is constant true, this is a logical inversion. */
5203 if (integer_onep (arg0))
5204 return non_lvalue (invert_truthvalue (arg1));
5205 if (integer_onep (arg1))
5206 return non_lvalue (invert_truthvalue (arg0));
62d8b51e 5207 return t;
772447c5 5208
6d716ca8
RS
5209 case EQ_EXPR:
5210 case NE_EXPR:
5211 case LT_EXPR:
5212 case GT_EXPR:
5213 case LE_EXPR:
5214 case GE_EXPR:
5215 /* If one arg is a constant integer, put it last. */
5216 if (TREE_CODE (arg0) == INTEGER_CST
5217 && TREE_CODE (arg1) != INTEGER_CST)
5218 {
5219 TREE_OPERAND (t, 0) = arg1;
5220 TREE_OPERAND (t, 1) = arg0;
5221 arg0 = TREE_OPERAND (t, 0);
5222 arg1 = TREE_OPERAND (t, 1);
c05a9b68 5223 code = swap_tree_comparison (code);
6d716ca8
RS
5224 TREE_SET_CODE (t, code);
5225 }
5226
5227 /* Convert foo++ == CONST into ++foo == CONST + INCR.
5228 First, see if one arg is constant; find the constant arg
5229 and the other one. */
5230 {
4e86caed 5231 tree constop = 0, varop = NULL_TREE;
cd7ece66 5232 int constopnum = -1;
6d716ca8
RS
5233
5234 if (TREE_CONSTANT (arg1))
cd7ece66 5235 constopnum = 1, constop = arg1, varop = arg0;
6d716ca8 5236 if (TREE_CONSTANT (arg0))
cd7ece66 5237 constopnum = 0, constop = arg0, varop = arg1;
6d716ca8
RS
5238
5239 if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR)
5240 {
6d716ca8
RS
5241 /* This optimization is invalid for ordered comparisons
5242 if CONST+INCR overflows or if foo+incr might overflow.
c05a9b68 5243 This optimization is invalid for floating point due to rounding.
6d716ca8 5244 For pointer types we assume overflow doesn't happen. */
e5e809f4 5245 if (POINTER_TYPE_P (TREE_TYPE (varop))
7178e3af 5246 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
c05a9b68 5247 && (code == EQ_EXPR || code == NE_EXPR)))
6d716ca8 5248 {
c05a9b68
RS
5249 tree newconst
5250 = fold (build (PLUS_EXPR, TREE_TYPE (varop),
5251 constop, TREE_OPERAND (varop, 1)));
5252 TREE_SET_CODE (varop, PREINCREMENT_EXPR);
cd7ece66 5253
30eca391
RK
5254 /* If VAROP is a reference to a bitfield, we must mask
5255 the constant by the width of the field. */
5256 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
5257 && DECL_BIT_FIELD(TREE_OPERAND
5258 (TREE_OPERAND (varop, 0), 1)))
5259 {
5260 int size
5261 = TREE_INT_CST_LOW (DECL_SIZE
5262 (TREE_OPERAND
5263 (TREE_OPERAND (varop, 0), 1)));
df0e526f
AS
5264 tree mask, unsigned_type;
5265 int precision;
5266 tree folded_compare;
5267
5268 /* First check whether the comparison would come out
5269 always the same. If we don't do that we would
5270 change the meaning with the masking. */
5271 if (constopnum == 0)
5272 folded_compare = fold (build (code, type, constop,
5273 TREE_OPERAND (varop, 0)));
5274 else
5275 folded_compare = fold (build (code, type,
5276 TREE_OPERAND (varop, 0),
5277 constop));
5278 if (integer_zerop (folded_compare)
5279 || integer_onep (folded_compare))
5280 return omit_one_operand (type, folded_compare, varop);
5281
5282 unsigned_type = type_for_size (size, 1);
5283 precision = TYPE_PRECISION (unsigned_type);
5284 mask = build_int_2 (~0, ~0);
5285 TREE_TYPE (mask) = unsigned_type;
5286 force_fit_type (mask, 0);
5287 mask = const_binop (RSHIFT_EXPR, mask,
5288 size_int (precision - size), 0);
30eca391
RK
5289 newconst = fold (build (BIT_AND_EXPR,
5290 TREE_TYPE (varop), newconst,
5291 convert (TREE_TYPE (varop),
df0e526f 5292 mask)));
30eca391
RK
5293 }
5294
5295
cd7ece66
RK
5296 t = build (code, type, TREE_OPERAND (t, 0),
5297 TREE_OPERAND (t, 1));
5298 TREE_OPERAND (t, constopnum) = newconst;
c05a9b68 5299 return t;
6d716ca8
RS
5300 }
5301 }
5302 else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
5303 {
e5e809f4 5304 if (POINTER_TYPE_P (TREE_TYPE (varop))
7178e3af 5305 || (! FLOAT_TYPE_P (TREE_TYPE (varop))
c05a9b68 5306 && (code == EQ_EXPR || code == NE_EXPR)))
6d716ca8 5307 {
c05a9b68
RS
5308 tree newconst
5309 = fold (build (MINUS_EXPR, TREE_TYPE (varop),
5310 constop, TREE_OPERAND (varop, 1)));
5311 TREE_SET_CODE (varop, PREDECREMENT_EXPR);
30eca391
RK
5312
5313 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
5314 && DECL_BIT_FIELD(TREE_OPERAND
5315 (TREE_OPERAND (varop, 0), 1)))
5316 {
5317 int size
5318 = TREE_INT_CST_LOW (DECL_SIZE
5319 (TREE_OPERAND
5320 (TREE_OPERAND (varop, 0), 1)));
df0e526f
AS
5321 tree mask, unsigned_type;
5322 int precision;
5323 tree folded_compare;
5324
5325 if (constopnum == 0)
5326 folded_compare = fold (build (code, type, constop,
5327 TREE_OPERAND (varop, 0)));
5328 else
5329 folded_compare = fold (build (code, type,
5330 TREE_OPERAND (varop, 0),
5331 constop));
5332 if (integer_zerop (folded_compare)
5333 || integer_onep (folded_compare))
5334 return omit_one_operand (type, folded_compare, varop);
5335
5336 unsigned_type = type_for_size (size, 1);
5337 precision = TYPE_PRECISION (unsigned_type);
5338 mask = build_int_2 (~0, ~0);
5339 TREE_TYPE (mask) = TREE_TYPE (varop);
5340 force_fit_type (mask, 0);
5341 mask = const_binop (RSHIFT_EXPR, mask,
5342 size_int (precision - size), 0);
30eca391
RK
5343 newconst = fold (build (BIT_AND_EXPR,
5344 TREE_TYPE (varop), newconst,
5345 convert (TREE_TYPE (varop),
df0e526f 5346 mask)));
30eca391
RK
5347 }
5348
5349
cd7ece66
RK
5350 t = build (code, type, TREE_OPERAND (t, 0),
5351 TREE_OPERAND (t, 1));
5352 TREE_OPERAND (t, constopnum) = newconst;
c05a9b68 5353 return t;
6d716ca8
RS
5354 }
5355 }
5356 }
5357
5358 /* Change X >= CST to X > (CST - 1) if CST is positive. */
5359 if (TREE_CODE (arg1) == INTEGER_CST
5360 && TREE_CODE (arg0) != INTEGER_CST
d0cb4c65 5361 && tree_int_cst_sgn (arg1) > 0)
6d716ca8
RS
5362 {
5363 switch (TREE_CODE (t))
5364 {
5365 case GE_EXPR:
5366 code = GT_EXPR;
91d33e36 5367 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
cd7ece66 5368 t = build (code, type, TREE_OPERAND (t, 0), arg1);
6d716ca8
RS
5369 break;
5370
5371 case LT_EXPR:
5372 code = LE_EXPR;
91d33e36 5373 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
cd7ece66
RK
5374 t = build (code, type, TREE_OPERAND (t, 0), arg1);
5375 break;
e9a25f70
JL
5376
5377 default:
5378 break;
6d716ca8
RS
5379 }
5380 }
5381
6d716ca8
RS
5382 /* If this is an EQ or NE comparison with zero and ARG0 is
5383 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
5384 two operations, but the latter can be done in one less insn
e9a25f70 5385 on machines that have only two-operand insns or on which a
6d716ca8
RS
5386 constant cannot be the first operand. */
5387 if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
5388 && TREE_CODE (arg0) == BIT_AND_EXPR)
5389 {
5390 if (TREE_CODE (TREE_OPERAND (arg0, 0)) == LSHIFT_EXPR
5391 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 0), 0)))
5392 return
5393 fold (build (code, type,
5394 build (BIT_AND_EXPR, TREE_TYPE (arg0),
5395 build (RSHIFT_EXPR,
5396 TREE_TYPE (TREE_OPERAND (arg0, 0)),
5397 TREE_OPERAND (arg0, 1),
5398 TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)),
5399 convert (TREE_TYPE (arg0),
5400 integer_one_node)),
5401 arg1));
5402 else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
5403 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
5404 return
5405 fold (build (code, type,
5406 build (BIT_AND_EXPR, TREE_TYPE (arg0),
5407 build (RSHIFT_EXPR,
5408 TREE_TYPE (TREE_OPERAND (arg0, 1)),
5409 TREE_OPERAND (arg0, 0),
5410 TREE_OPERAND (TREE_OPERAND (arg0, 1), 1)),
5411 convert (TREE_TYPE (arg0),
5412 integer_one_node)),
5413 arg1));
5414 }
5415
05a0d5ea 5416 /* If this is an NE or EQ comparison of zero against the result of a
79bf94d3
RK
5417 signed MOD operation whose second operand is a power of 2, make
5418 the MOD operation unsigned since it is simpler and equivalent. */
05a0d5ea
RK
5419 if ((code == NE_EXPR || code == EQ_EXPR)
5420 && integer_zerop (arg1)
5421 && ! TREE_UNSIGNED (TREE_TYPE (arg0))
5422 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
5423 || TREE_CODE (arg0) == CEIL_MOD_EXPR
5424 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
79bf94d3
RK
5425 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
5426 && integer_pow2p (TREE_OPERAND (arg0, 1)))
05a0d5ea
RK
5427 {
5428 tree newtype = unsigned_type (TREE_TYPE (arg0));
5429 tree newmod = build (TREE_CODE (arg0), newtype,
5430 convert (newtype, TREE_OPERAND (arg0, 0)),
5431 convert (newtype, TREE_OPERAND (arg0, 1)));
5432
5433 return build (code, type, newmod, convert (newtype, arg1));
5434 }
5435
6d716ca8
RS
5436 /* If this is an NE comparison of zero with an AND of one, remove the
5437 comparison since the AND will give the correct value. */
5438 if (code == NE_EXPR && integer_zerop (arg1)
5439 && TREE_CODE (arg0) == BIT_AND_EXPR
5440 && integer_onep (TREE_OPERAND (arg0, 1)))
5441 return convert (type, arg0);
5442
5443 /* If we have (A & C) == C where C is a power of 2, convert this into
5444 (A & C) != 0. Similarly for NE_EXPR. */
5445 if ((code == EQ_EXPR || code == NE_EXPR)
5446 && TREE_CODE (arg0) == BIT_AND_EXPR
5447 && integer_pow2p (TREE_OPERAND (arg0, 1))
5448 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
5449 return build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
5450 arg0, integer_zero_node);
5451
e92d3048 5452 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
34b1b41f 5453 and similarly for >= into !=. */
e92d3048
RK
5454 if ((code == LT_EXPR || code == GE_EXPR)
5455 && TREE_UNSIGNED (TREE_TYPE (arg0))
5456 && TREE_CODE (arg1) == LSHIFT_EXPR
5457 && integer_onep (TREE_OPERAND (arg1, 0)))
5458 return build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
5459 build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
5460 TREE_OPERAND (arg1, 1)),
5461 convert (TREE_TYPE (arg0), integer_zero_node));
5462
5463 else if ((code == LT_EXPR || code == GE_EXPR)
5464 && TREE_UNSIGNED (TREE_TYPE (arg0))
5465 && (TREE_CODE (arg1) == NOP_EXPR
5466 || TREE_CODE (arg1) == CONVERT_EXPR)
5467 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
5468 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
5469 return
5470 build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
5471 convert (TREE_TYPE (arg0),
5472 build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
5473 TREE_OPERAND (TREE_OPERAND (arg1, 0), 1))),
5474 convert (TREE_TYPE (arg0), integer_zero_node));
5475
c05a9b68
RS
5476 /* Simplify comparison of something with itself. (For IEEE
5477 floating-point, we can only do some of these simplifications.) */
5478 if (operand_equal_p (arg0, arg1, 0))
6d716ca8
RS
5479 {
5480 switch (code)
5481 {
5482 case EQ_EXPR:
5483 case GE_EXPR:
5484 case LE_EXPR:
7178e3af 5485 if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
f628873f 5486 return constant_boolean_node (1, type);
c05a9b68
RS
5487 code = EQ_EXPR;
5488 TREE_SET_CODE (t, code);
5489 break;
5490
6d716ca8 5491 case NE_EXPR:
c05a9b68 5492 /* For NE, we can only do this simplification if integer. */
7178e3af 5493 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
c05a9b68 5494 break;
0f41302f 5495 /* ... fall through ... */
6d716ca8
RS
5496 case GT_EXPR:
5497 case LT_EXPR:
f628873f 5498 return constant_boolean_node (0, type);
e9a25f70
JL
5499 default:
5500 abort ();
6d716ca8
RS
5501 }
5502 }
5503
5504 /* An unsigned comparison against 0 can be simplified. */
5505 if (integer_zerop (arg1)
7178e3af 5506 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
e5e809f4 5507 || POINTER_TYPE_P (TREE_TYPE (arg1)))
6d716ca8
RS
5508 && TREE_UNSIGNED (TREE_TYPE (arg1)))
5509 {
5510 switch (TREE_CODE (t))
5511 {
5512 case GT_EXPR:
c05a9b68 5513 code = NE_EXPR;
6d716ca8
RS
5514 TREE_SET_CODE (t, NE_EXPR);
5515 break;
5516 case LE_EXPR:
c05a9b68 5517 code = EQ_EXPR;
6d716ca8
RS
5518 TREE_SET_CODE (t, EQ_EXPR);
5519 break;
5520 case GE_EXPR:
56f8e5e6
RK
5521 return omit_one_operand (type,
5522 convert (type, integer_one_node),
5523 arg0);
6d716ca8 5524 case LT_EXPR:
56f8e5e6
RK
5525 return omit_one_operand (type,
5526 convert (type, integer_zero_node),
5527 arg0);
e9a25f70
JL
5528 default:
5529 break;
6d716ca8
RS
5530 }
5531 }
5532
e9a25f70
JL
5533 /* An unsigned <= 0x7fffffff can be simplified. */
5534 {
5535 int width = TYPE_PRECISION (TREE_TYPE (arg1));
5536 if (TREE_CODE (arg1) == INTEGER_CST
5537 && ! TREE_CONSTANT_OVERFLOW (arg1)
5538 && width <= HOST_BITS_PER_WIDE_INT
5539 && TREE_INT_CST_LOW (arg1) == ((HOST_WIDE_INT) 1 << (width - 1)) - 1
5540 && TREE_INT_CST_HIGH (arg1) == 0
5541 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
e5e809f4 5542 || POINTER_TYPE_P (TREE_TYPE (arg1)))
e9a25f70
JL
5543 && TREE_UNSIGNED (TREE_TYPE (arg1)))
5544 {
5545 switch (TREE_CODE (t))
5546 {
5547 case LE_EXPR:
5548 return fold (build (GE_EXPR, type,
5549 convert (signed_type (TREE_TYPE (arg0)),
5550 arg0),
5551 convert (signed_type (TREE_TYPE (arg1)),
5552 integer_zero_node)));
5553 case GT_EXPR:
5554 return fold (build (LT_EXPR, type,
5555 convert (signed_type (TREE_TYPE (arg0)),
5556 arg0),
5557 convert (signed_type (TREE_TYPE (arg1)),
5558 integer_zero_node)));
1d300e19
KG
5559 default:
5560 break;
e9a25f70
JL
5561 }
5562 }
5563 }
5564
c05a9b68
RS
5565 /* If we are comparing an expression that just has comparisons
5566 of two integer values, arithmetic expressions of those comparisons,
5567 and constants, we can simplify it. There are only three cases
5568 to check: the two values can either be equal, the first can be
5569 greater, or the second can be greater. Fold the expression for
5570 those three values. Since each value must be 0 or 1, we have
5571 eight possibilities, each of which corresponds to the constant 0
5572 or 1 or one of the six possible comparisons.
5573
5574 This handles common cases like (a > b) == 0 but also handles
5575 expressions like ((x > y) - (y > x)) > 0, which supposedly
5576 occur in macroized code. */
5577
5578 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
5579 {
5580 tree cval1 = 0, cval2 = 0;
35e66bd1 5581 int save_p = 0;
c05a9b68 5582
35e66bd1 5583 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
c05a9b68
RS
5584 /* Don't handle degenerate cases here; they should already
5585 have been handled anyway. */
5586 && cval1 != 0 && cval2 != 0
5587 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
5588 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
7178e3af 5589 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
e1ee5cdc
RH
5590 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
5591 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
c05a9b68
RS
5592 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
5593 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
5594 {
5595 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
5596 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
5597
5598 /* We can't just pass T to eval_subst in case cval1 or cval2
5599 was the same as ARG1. */
5600
5601 tree high_result
5602 = fold (build (code, type,
5603 eval_subst (arg0, cval1, maxval, cval2, minval),
5604 arg1));
5605 tree equal_result
5606 = fold (build (code, type,
5607 eval_subst (arg0, cval1, maxval, cval2, maxval),
5608 arg1));
5609 tree low_result
5610 = fold (build (code, type,
5611 eval_subst (arg0, cval1, minval, cval2, maxval),
5612 arg1));
5613
5614 /* All three of these results should be 0 or 1. Confirm they
5615 are. Then use those values to select the proper code
5616 to use. */
5617
5618 if ((integer_zerop (high_result)
5619 || integer_onep (high_result))
5620 && (integer_zerop (equal_result)
5621 || integer_onep (equal_result))
5622 && (integer_zerop (low_result)
5623 || integer_onep (low_result)))
5624 {
5625 /* Make a 3-bit mask with the high-order bit being the
5626 value for `>', the next for '=', and the low for '<'. */
5627 switch ((integer_onep (high_result) * 4)
5628 + (integer_onep (equal_result) * 2)
5629 + integer_onep (low_result))
5630 {
5631 case 0:
5632 /* Always false. */
13837058 5633 return omit_one_operand (type, integer_zero_node, arg0);
c05a9b68
RS
5634 case 1:
5635 code = LT_EXPR;
5636 break;
5637 case 2:
5638 code = EQ_EXPR;
5639 break;
5640 case 3:
5641 code = LE_EXPR;
5642 break;
5643 case 4:
5644 code = GT_EXPR;
5645 break;
5646 case 5:
5647 code = NE_EXPR;
5648 break;
5649 case 6:
5650 code = GE_EXPR;
5651 break;
5652 case 7:
5653 /* Always true. */
13837058 5654 return omit_one_operand (type, integer_one_node, arg0);
c05a9b68
RS
5655 }
5656
35e66bd1
RK
5657 t = build (code, type, cval1, cval2);
5658 if (save_p)
5659 return save_expr (t);
5660 else
5661 return fold (t);
c05a9b68
RS
5662 }
5663 }
5664 }
5665
5666 /* If this is a comparison of a field, we may be able to simplify it. */
5667 if ((TREE_CODE (arg0) == COMPONENT_REF
ebde8a27
RK
5668 || TREE_CODE (arg0) == BIT_FIELD_REF)
5669 && (code == EQ_EXPR || code == NE_EXPR)
5670 /* Handle the constant case even without -O
5671 to make sure the warnings are given. */
5672 && (optimize || TREE_CODE (arg1) == INTEGER_CST))
c05a9b68
RS
5673 {
5674 t1 = optimize_bit_field_compare (code, type, arg0, arg1);
5675 return t1 ? t1 : t;
5676 }
5677
9ec36da5
JL
5678 /* If this is a comparison of complex values and either or both sides
5679 are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
5680 comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
5681 This may prevent needless evaluations. */
95aa28ae
RK
5682 if ((code == EQ_EXPR || code == NE_EXPR)
5683 && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
5684 && (TREE_CODE (arg0) == COMPLEX_EXPR
9ec36da5
JL
5685 || TREE_CODE (arg1) == COMPLEX_EXPR
5686 || TREE_CODE (arg0) == COMPLEX_CST
5687 || TREE_CODE (arg1) == COMPLEX_CST))
95aa28ae
RK
5688 {
5689 tree subtype = TREE_TYPE (TREE_TYPE (arg0));
f0b8d9aa
AS
5690 tree real0, imag0, real1, imag1;
5691
5692 arg0 = save_expr (arg0);
5693 arg1 = save_expr (arg1);
5694 real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
5695 imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
5696 real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
5697 imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
95aa28ae
RK
5698
5699 return fold (build ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
5700 : TRUTH_ORIF_EXPR),
5701 type,
5702 fold (build (code, type, real0, real1)),
5703 fold (build (code, type, imag0, imag1))));
5704 }
5705
c05a9b68
RS
5706 /* From here on, the only cases we handle are when the result is
5707 known to be a constant.
5708
5709 To compute GT, swap the arguments and do LT.
6d716ca8
RS
5710 To compute GE, do LT and invert the result.
5711 To compute LE, swap the arguments, do LT and invert the result.
c05a9b68
RS
5712 To compute NE, do EQ and invert the result.
5713
5714 Therefore, the code below must handle only EQ and LT. */
5715
6d716ca8
RS
5716 if (code == LE_EXPR || code == GT_EXPR)
5717 {
c05a9b68
RS
5718 tem = arg0, arg0 = arg1, arg1 = tem;
5719 code = swap_tree_comparison (code);
5720 }
5721
5722 /* Note that it is safe to invert for real values here because we
5723 will check below in the one case that it matters. */
5724
5725 invert = 0;
5726 if (code == NE_EXPR || code == GE_EXPR)
5727 {
5728 invert = 1;
5729 code = invert_tree_comparison (code);
6d716ca8
RS
5730 }
5731
5732 /* Compute a result for LT or EQ if args permit;
5733 otherwise return T. */
c05a9b68 5734 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
6d716ca8 5735 {
c05a9b68
RS
5736 if (code == EQ_EXPR)
5737 t1 = build_int_2 ((TREE_INT_CST_LOW (arg0)
5738 == TREE_INT_CST_LOW (arg1))
5739 && (TREE_INT_CST_HIGH (arg0)
5740 == TREE_INT_CST_HIGH (arg1)),
5741 0);
6d716ca8 5742 else
c05a9b68
RS
5743 t1 = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0))
5744 ? INT_CST_LT_UNSIGNED (arg0, arg1)
5745 : INT_CST_LT (arg0, arg1)),
5746 0);
6d716ca8 5747 }
c05a9b68 5748
e80c9ccb 5749#if 0 /* This is no longer useful, but breaks some real code. */
6d716ca8
RS
5750 /* Assume a nonexplicit constant cannot equal an explicit one,
5751 since such code would be undefined anyway.
5752 Exception: on sysvr4, using #pragma weak,
5753 a label can come out as 0. */
5754 else if (TREE_CODE (arg1) == INTEGER_CST
5755 && !integer_zerop (arg1)
5756 && TREE_CONSTANT (arg0)
5757 && TREE_CODE (arg0) == ADDR_EXPR
c05a9b68
RS
5758 && code == EQ_EXPR)
5759 t1 = build_int_2 (0, 0);
e80c9ccb 5760#endif
6d716ca8 5761 /* Two real constants can be compared explicitly. */
c05a9b68 5762 else if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
6d716ca8 5763 {
c05a9b68
RS
5764 /* If either operand is a NaN, the result is false with two
5765 exceptions: First, an NE_EXPR is true on NaNs, but that case
5766 is already handled correctly since we will be inverting the
5767 result for NE_EXPR. Second, if we had inverted a LE_EXPR
5768 or a GE_EXPR into a LT_EXPR, we must return true so that it
5769 will be inverted into false. */
5770
5771 if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
5772 || REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
5773 t1 = build_int_2 (invert && code == LT_EXPR, 0);
5774
5775 else if (code == EQ_EXPR)
5776 t1 = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0),
5777 TREE_REAL_CST (arg1)),
5778 0);
6d716ca8 5779 else
c05a9b68
RS
5780 t1 = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0),
5781 TREE_REAL_CST (arg1)),
5782 0);
6d716ca8
RS
5783 }
5784
c05a9b68
RS
5785 if (t1 == NULL_TREE)
5786 return t;
5787
5788 if (invert)
5789 TREE_INT_CST_LOW (t1) ^= 1;
5790
5791 TREE_TYPE (t1) = type;
c651e1e0
MM
5792 if (TREE_CODE (type) == BOOLEAN_TYPE)
5793 return truthvalue_conversion (t1);
c05a9b68 5794 return t1;
6d716ca8
RS
5795
5796 case COND_EXPR:
a5e9b124
JW
5797 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
5798 so all simple results must be passed through pedantic_non_lvalue. */
6d716ca8 5799 if (TREE_CODE (arg0) == INTEGER_CST)
a5e9b124
JW
5800 return pedantic_non_lvalue
5801 (TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1)));
6d716ca8 5802 else if (operand_equal_p (arg1, TREE_OPERAND (expr, 2), 0))
4ab3cb65 5803 return pedantic_omit_one_operand (type, arg1, arg0);
6d716ca8 5804
c05a9b68
RS
5805 /* If the second operand is zero, invert the comparison and swap
5806 the second and third operands. Likewise if the second operand
5807 is constant and the third is not or if the third operand is
5808 equivalent to the first operand of the comparison. */
6d716ca8 5809
c05a9b68
RS
5810 if (integer_zerop (arg1)
5811 || (TREE_CONSTANT (arg1) && ! TREE_CONSTANT (TREE_OPERAND (t, 2)))
5812 || (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
5813 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
5814 TREE_OPERAND (t, 2),
5815 TREE_OPERAND (arg0, 1))))
5816 {
5817 /* See if this can be inverted. If it can't, possibly because
5818 it was a floating-point inequality comparison, don't do
5819 anything. */
5820 tem = invert_truthvalue (arg0);
6d716ca8 5821
c05a9b68
RS
5822 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
5823 {
cd7ece66
RK
5824 t = build (code, type, tem,
5825 TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
5826 arg0 = tem;
a58bd508
MT
5827 /* arg1 should be the first argument of the new T. */
5828 arg1 = TREE_OPERAND (t, 1);
3a96b5eb 5829 STRIP_NOPS (arg1);
c05a9b68
RS
5830 }
5831 }
6d716ca8 5832
c05a9b68
RS
5833 /* If we have A op B ? A : C, we may be able to convert this to a
5834 simpler expression, depending on the operation and the values
b5c52586
RS
5835 of B and C. IEEE floating point prevents this though,
5836 because A or B might be -0.0 or a NaN. */
6d716ca8 5837
c05a9b68 5838 if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
b5c52586 5839 && (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
fab446b8
RK
5840 || ! FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0)))
5841 || flag_fast_math)
c05a9b68
RS
5842 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
5843 arg1, TREE_OPERAND (arg0, 1)))
6d716ca8 5844 {
c05a9b68
RS
5845 tree arg2 = TREE_OPERAND (t, 2);
5846 enum tree_code comp_code = TREE_CODE (arg0);
5847
3a96b5eb
RK
5848 STRIP_NOPS (arg2);
5849
c05a9b68
RS
5850 /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or abs (-A),
5851 depending on the comparison operation. */
68c6b3a9
DE
5852 if ((FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 1)))
5853 ? real_zerop (TREE_OPERAND (arg0, 1))
5854 : integer_zerop (TREE_OPERAND (arg0, 1)))
c05a9b68
RS
5855 && TREE_CODE (arg2) == NEGATE_EXPR
5856 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
5857 switch (comp_code)
5858 {
5859 case EQ_EXPR:
a5e9b124
JW
5860 return pedantic_non_lvalue
5861 (fold (build1 (NEGATE_EXPR, type, arg1)));
c05a9b68 5862 case NE_EXPR:
a5e9b124 5863 return pedantic_non_lvalue (convert (type, arg1));
c05a9b68
RS
5864 case GE_EXPR:
5865 case GT_EXPR:
899f1ed6
RH
5866 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
5867 arg1 = convert (signed_type (TREE_TYPE (arg1)), arg1);
a5e9b124 5868 return pedantic_non_lvalue
21403f14
RK
5869 (convert (type, fold (build1 (ABS_EXPR,
5870 TREE_TYPE (arg1), arg1))));
c05a9b68
RS
5871 case LE_EXPR:
5872 case LT_EXPR:
899f1ed6
RH
5873 if (TREE_UNSIGNED (TREE_TYPE (arg1)))
5874 arg1 = convert (signed_type (TREE_TYPE (arg1)), arg1);
a5e9b124
JW
5875 return pedantic_non_lvalue
5876 (fold (build1 (NEGATE_EXPR, type,
21403f14
RK
5877 convert (type,
5878 fold (build1 (ABS_EXPR,
5879 TREE_TYPE (arg1),
5880 arg1))))));
e9a25f70
JL
5881 default:
5882 abort ();
c05a9b68 5883 }
6d716ca8 5884
c05a9b68
RS
5885 /* If this is A != 0 ? A : 0, this is simply A. For ==, it is
5886 always zero. */
6d716ca8 5887
29ebe69a 5888 if (integer_zerop (TREE_OPERAND (arg0, 1)) && integer_zerop (arg2))
c05a9b68
RS
5889 {
5890 if (comp_code == NE_EXPR)
a5e9b124 5891 return pedantic_non_lvalue (convert (type, arg1));
c05a9b68 5892 else if (comp_code == EQ_EXPR)
a5e9b124 5893 return pedantic_non_lvalue (convert (type, integer_zero_node));
c05a9b68
RS
5894 }
5895
5896 /* If this is A op B ? A : B, this is either A, B, min (A, B),
5897 or max (A, B), depending on the operation. */
5898
5899 if (operand_equal_for_comparison_p (TREE_OPERAND (arg0, 1),
5900 arg2, TREE_OPERAND (arg0, 0)))
3a96b5eb
RK
5901 {
5902 tree comp_op0 = TREE_OPERAND (arg0, 0);
5903 tree comp_op1 = TREE_OPERAND (arg0, 1);
5904 tree comp_type = TREE_TYPE (comp_op0);
5905
5906 switch (comp_code)
5907 {
5908 case EQ_EXPR:
5909 return pedantic_non_lvalue (convert (type, arg2));
5910 case NE_EXPR:
5911 return pedantic_non_lvalue (convert (type, arg1));
5912 case LE_EXPR:
5913 case LT_EXPR:
e9a25f70
JL
5914 /* In C++ a ?: expression can be an lvalue, so put the
5915 operand which will be used if they are equal first
5916 so that we can convert this back to the
5917 corresponding COND_EXPR. */
5918 return pedantic_non_lvalue
5919 (convert (type, (fold (build (MIN_EXPR, comp_type,
5920 (comp_code == LE_EXPR
5921 ? comp_op0 : comp_op1),
5922 (comp_code == LE_EXPR
5923 ? comp_op1 : comp_op0))))));
88a5cdb8 5924 break;
3a96b5eb
RK
5925 case GE_EXPR:
5926 case GT_EXPR:
e9a25f70
JL
5927 return pedantic_non_lvalue
5928 (convert (type, fold (build (MAX_EXPR, comp_type,
5929 (comp_code == GE_EXPR
5930 ? comp_op0 : comp_op1),
5931 (comp_code == GE_EXPR
5932 ? comp_op1 : comp_op0)))));
88a5cdb8 5933 break;
e9a25f70
JL
5934 default:
5935 abort ();
3a96b5eb
RK
5936 }
5937 }
c05a9b68
RS
5938
5939 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5940 we might still be able to simplify this. For example,
5941 if C1 is one less or one more than C2, this might have started
53d2fb4f 5942 out as a MIN or MAX and been transformed by this function.
7178e3af 5943 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
c05a9b68 5944
7178e3af 5945 if (INTEGRAL_TYPE_P (type)
53d2fb4f 5946 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
c05a9b68
RS
5947 && TREE_CODE (arg2) == INTEGER_CST)
5948 switch (comp_code)
5949 {
5950 case EQ_EXPR:
5951 /* We can replace A with C1 in this case. */
cd7ece66
RK
5952 arg1 = convert (type, TREE_OPERAND (arg0, 1));
5953 t = build (code, type, TREE_OPERAND (t, 0), arg1,
5954 TREE_OPERAND (t, 2));
c05a9b68
RS
5955 break;
5956
5957 case LT_EXPR:
5958 /* If C1 is C2 + 1, this is min(A, C2). */
5959 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
5960 && operand_equal_p (TREE_OPERAND (arg0, 1),
5961 const_binop (PLUS_EXPR, arg2,
91d33e36 5962 integer_one_node, 0), 1))
a5e9b124
JW
5963 return pedantic_non_lvalue
5964 (fold (build (MIN_EXPR, type, arg1, arg2)));
c05a9b68
RS
5965 break;
5966
5967 case LE_EXPR:
5968 /* If C1 is C2 - 1, this is min(A, C2). */
5969 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
5970 && operand_equal_p (TREE_OPERAND (arg0, 1),
5971 const_binop (MINUS_EXPR, arg2,
91d33e36 5972 integer_one_node, 0), 1))
a5e9b124
JW
5973 return pedantic_non_lvalue
5974 (fold (build (MIN_EXPR, type, arg1, arg2)));
c05a9b68
RS
5975 break;
5976
5977 case GT_EXPR:
5978 /* If C1 is C2 - 1, this is max(A, C2). */
5979 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 1)
5980 && operand_equal_p (TREE_OPERAND (arg0, 1),
5981 const_binop (MINUS_EXPR, arg2,
91d33e36 5982 integer_one_node, 0), 1))
a5e9b124
JW
5983 return pedantic_non_lvalue
5984 (fold (build (MAX_EXPR, type, arg1, arg2)));
c05a9b68
RS
5985 break;
5986
5987 case GE_EXPR:
5988 /* If C1 is C2 + 1, this is max(A, C2). */
5989 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 1)
5990 && operand_equal_p (TREE_OPERAND (arg0, 1),
5991 const_binop (PLUS_EXPR, arg2,
91d33e36 5992 integer_one_node, 0), 1))
a5e9b124
JW
5993 return pedantic_non_lvalue
5994 (fold (build (MAX_EXPR, type, arg1, arg2)));
c05a9b68 5995 break;
e9a25f70
JL
5996 case NE_EXPR:
5997 break;
5998 default:
5999 abort ();
c05a9b68 6000 }
6d716ca8
RS
6001 }
6002
e1f56f62
RK
6003 /* If the second operand is simpler than the third, swap them
6004 since that produces better jump optimization results. */
6005 if ((TREE_CONSTANT (arg1) || TREE_CODE_CLASS (TREE_CODE (arg1)) == 'd'
6006 || TREE_CODE (arg1) == SAVE_EXPR)
6007 && ! (TREE_CONSTANT (TREE_OPERAND (t, 2))
6008 || TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 2))) == 'd'
6009 || TREE_CODE (TREE_OPERAND (t, 2)) == SAVE_EXPR))
6010 {
6011 /* See if this can be inverted. If it can't, possibly because
6012 it was a floating-point inequality comparison, don't do
6013 anything. */
6014 tem = invert_truthvalue (arg0);
6015
6016 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
6017 {
cd7ece66
RK
6018 t = build (code, type, tem,
6019 TREE_OPERAND (t, 2), TREE_OPERAND (t, 1));
6020 arg0 = tem;
c479c2ac
JL
6021 /* arg1 should be the first argument of the new T. */
6022 arg1 = TREE_OPERAND (t, 1);
3a96b5eb 6023 STRIP_NOPS (arg1);
e1f56f62
RK
6024 }
6025 }
6026
c05a9b68
RS
6027 /* Convert A ? 1 : 0 to simply A. */
6028 if (integer_onep (TREE_OPERAND (t, 1))
6029 && integer_zerop (TREE_OPERAND (t, 2))
6030 /* If we try to convert TREE_OPERAND (t, 0) to our type, the
6031 call to fold will try to move the conversion inside
6032 a COND, which will recurse. In that case, the COND_EXPR
6033 is probably the best choice, so leave it alone. */
6034 && type == TREE_TYPE (arg0))
a5e9b124 6035 return pedantic_non_lvalue (arg0);
6d716ca8 6036
c05a9b68
RS
6037 /* Look for expressions of the form A & 2 ? 2 : 0. The result of this
6038 operation is simply A & 2. */
6d716ca8
RS
6039
6040 if (integer_zerop (TREE_OPERAND (t, 2))
6041 && TREE_CODE (arg0) == NE_EXPR
6042 && integer_zerop (TREE_OPERAND (arg0, 1))
c05a9b68
RS
6043 && integer_pow2p (arg1)
6044 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
6045 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
6046 arg1, 1))
a5e9b124 6047 return pedantic_non_lvalue (convert (type, TREE_OPERAND (arg0, 0)));
6d716ca8 6048
6d716ca8
RS
6049 return t;
6050
6051 case COMPOUND_EXPR:
b7647895
JW
6052 /* When pedantic, a compound expression can be neither an lvalue
6053 nor an integer constant expression. */
6054 if (TREE_SIDE_EFFECTS (arg0) || pedantic)
d023bff9
RS
6055 return t;
6056 /* Don't let (0, 0) be null pointer constant. */
6057 if (integer_zerop (arg1))
ff59bfe6 6058 return build1 (NOP_EXPR, TREE_TYPE (arg1), arg1);
d023bff9 6059 return arg1;
6d716ca8 6060
1cc1b11a
RS
6061 case COMPLEX_EXPR:
6062 if (wins)
214d5b84 6063 return build_complex (type, arg0, arg1);
1cc1b11a
RS
6064 return t;
6065
6066 case REALPART_EXPR:
a333b79f 6067 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
1cc1b11a
RS
6068 return t;
6069 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
6070 return omit_one_operand (type, TREE_OPERAND (arg0, 0),
6071 TREE_OPERAND (arg0, 1));
6072 else if (TREE_CODE (arg0) == COMPLEX_CST)
6073 return TREE_REALPART (arg0);
6074 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
a3279355
RK
6075 return fold (build (TREE_CODE (arg0), type,
6076 fold (build1 (REALPART_EXPR, type,
6077 TREE_OPERAND (arg0, 0))),
6078 fold (build1 (REALPART_EXPR,
6079 type, TREE_OPERAND (arg0, 1)))));
1cc1b11a
RS
6080 return t;
6081
6082 case IMAGPART_EXPR:
a333b79f 6083 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
1cc1b11a
RS
6084 return convert (type, integer_zero_node);
6085 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
6086 return omit_one_operand (type, TREE_OPERAND (arg0, 1),
6087 TREE_OPERAND (arg0, 0));
6088 else if (TREE_CODE (arg0) == COMPLEX_CST)
6089 return TREE_IMAGPART (arg0);
6090 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
a3279355
RK
6091 return fold (build (TREE_CODE (arg0), type,
6092 fold (build1 (IMAGPART_EXPR, type,
6093 TREE_OPERAND (arg0, 0))),
6094 fold (build1 (IMAGPART_EXPR, type,
6095 TREE_OPERAND (arg0, 1)))));
1cc1b11a
RS
6096 return t;
6097
56c98e5b
JM
6098 /* Pull arithmetic ops out of the CLEANUP_POINT_EXPR where
6099 appropriate. */
6100 case CLEANUP_POINT_EXPR:
b7f6588d 6101 if (! has_cleanups (arg0))
3ffcb234 6102 return TREE_OPERAND (t, 0);
56c98e5b
JM
6103
6104 {
6105 enum tree_code code0 = TREE_CODE (arg0);
6106 int kind0 = TREE_CODE_CLASS (code0);
6107 tree arg00 = TREE_OPERAND (arg0, 0);
6108 tree arg01;
6109
0982a4b8 6110 if (kind0 == '1' || code0 == TRUTH_NOT_EXPR)
56c98e5b
JM
6111 return fold (build1 (code0, type,
6112 fold (build1 (CLEANUP_POINT_EXPR,
6113 TREE_TYPE (arg00), arg00))));
0982a4b8
JM
6114
6115 if (kind0 == '<' || kind0 == '2'
6116 || code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR
6117 || code0 == TRUTH_AND_EXPR || code0 == TRUTH_OR_EXPR
6118 || code0 == TRUTH_XOR_EXPR)
6119 {
6120 arg01 = TREE_OPERAND (arg0, 1);
6121
b7f6588d
JM
6122 if (TREE_CONSTANT (arg00)
6123 || ((code0 == TRUTH_ANDIF_EXPR || code0 == TRUTH_ORIF_EXPR)
6124 && ! has_cleanups (arg00)))
0982a4b8
JM
6125 return fold (build (code0, type, arg00,
6126 fold (build1 (CLEANUP_POINT_EXPR,
6127 TREE_TYPE (arg01), arg01))));
6128
b7f6588d 6129 if (TREE_CONSTANT (arg01))
0982a4b8
JM
6130 return fold (build (code0, type,
6131 fold (build1 (CLEANUP_POINT_EXPR,
6132 TREE_TYPE (arg00), arg00)),
6133 arg01));
6134 }
56c98e5b
JM
6135
6136 return t;
6137 }
6138
6d716ca8
RS
6139 default:
6140 return t;
6141 } /* switch (code) */
6142}
39dfb55a
JL
6143
6144/* Determine if first argument is a multiple of second argument.
6145 Return 0 if it is not, or is not easily determined to so be.
6146
6147 An example of the sort of thing we care about (at this point --
6148 this routine could surely be made more general, and expanded
6149 to do what the *_DIV_EXPR's fold() cases do now) is discovering
6150 that
6151
6152 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
6153
6154 is a multiple of
6155
6156 SAVE_EXPR (J * 8)
6157
6158 when we know that the two `SAVE_EXPR (J * 8)' nodes are the
6159 same node (which means they will have the same value at run
6160 time, even though we don't know when they'll be assigned).
6161
6162 This code also handles discovering that
6163
6164 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
6165
6166 is a multiple of
6167
6168 8
6169
6170 (of course) so we don't have to worry about dealing with a
6171 possible remainder.
6172
6173 Note that we _look_ inside a SAVE_EXPR only to determine
6174 how it was calculated; it is not safe for fold() to do much
6175 of anything else with the internals of a SAVE_EXPR, since
6176 fold() cannot know when it will be evaluated at run time.
6177 For example, the latter example above _cannot_ be implemented
6178 as
6179
6180 SAVE_EXPR (I) * J
6181
6182 or any variant thereof, since the value of J at evaluation time
6183 of the original SAVE_EXPR is not necessarily the same at the time
6184 the new expression is evaluated. The only optimization of this
6185 sort that would be valid is changing
6186
6187 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
6188 divided by
6189 8
6190
6191 to
6192
6193 SAVE_EXPR (I) * SAVE_EXPR (J)
6194
6195 (where the same SAVE_EXPR (J) is used in the original and the
6196 transformed version). */
6197
6198static int
6199multiple_of_p (type, top, bottom)
6200 tree type;
6201 tree top;
6202 tree bottom;
6203{
6204 if (operand_equal_p (top, bottom, 0))
6205 return 1;
6206
6207 if (TREE_CODE (type) != INTEGER_TYPE)
6208 return 0;
6209
6210 switch (TREE_CODE (top))
6211 {
6212 case MULT_EXPR:
6213 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
6214 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
6215
6216 case PLUS_EXPR:
6217 case MINUS_EXPR:
6218 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
6219 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
6220
6221 case NOP_EXPR:
6222 /* Punt if conversion from non-integral or wider integral type. */
6223 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
6224 || (TYPE_PRECISION (type)
6225 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
6226 return 0;
6227 /* Fall through. */
6228 case SAVE_EXPR:
6229 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
6230
6231 case INTEGER_CST:
6232 if ((TREE_CODE (bottom) != INTEGER_CST)
6233 || (tree_int_cst_sgn (top) < 0)
6234 || (tree_int_cst_sgn (bottom) < 0))
6235 return 0;
6236 return integer_zerop (const_binop (TRUNC_MOD_EXPR,
6237 top, bottom, 0));
6238
6239 default:
6240 return 0;
6241 }
6242}
6243\f
This page took 1.436642 seconds and 5 git commands to generate.