]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fold-const.c
2004-11-22 Michael Koch <konqueror@gmx.de>
[thirdparty/gcc.git] / gcc / fold-const.c
CommitLineData
2bc77e10 1/* Fold a constant sub-tree into a single node for C-compiler
22331643 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
04b253e8 3 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
2bc77e10 4
f12b58b3 5This file is part of GCC.
2bc77e10 6
f12b58b3 7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
2bc77e10 11
f12b58b3 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
2bc77e10 16
17You should have received a copy of the GNU General Public License
f12b58b3 18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
2bc77e10 21
4bbea254 22/*@@ This file should be rewritten to use an arbitrary precision
2bc77e10 23 @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24 @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25 @@ The routines that translate from the ap rep should
26 @@ warn if precision et. al. is lost.
27 @@ This would also make life easier when this technology is used
28 @@ for cross-compilers. */
29
30384dcf 30/* The entry points in this file are fold, size_int_wide, size_binop
6e44befc 31 and force_fit_type.
2bc77e10 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
6e44befc 40 with type from `sizetype'.
41
4d28c5d1 42 force_fit_type takes a constant, an overflowable flag and prior
43 overflow indicators. It forces the value to fit the type and sets
44 TREE_OVERFLOW and TREE_CONSTANT_OVERFLOW as appropriate. */
6e44befc 45
0dbd1c74 46#include "config.h"
5ee8fe30 47#include "system.h"
805e22b2 48#include "coretypes.h"
49#include "tm.h"
2bc77e10 50#include "flags.h"
51#include "tree.h"
ef258422 52#include "real.h"
0f9685e4 53#include "rtl.h"
aed0bd19 54#include "expr.h"
7953c610 55#include "tm_p.h"
12874aaf 56#include "toplev.h"
1bfd55c5 57#include "ggc.h"
15d769aa 58#include "hashtab.h"
20325f61 59#include "langhooks.h"
fc3df357 60#include "md5.h"
2bc77e10 61
318a728f 62/* The following constants represent a bit based encoding of GCC's
63 comparison operators. This encoding simplifies transformations
64 on relational comparison operators, such as AND and OR. */
65enum comparison_code {
66 COMPCODE_FALSE = 0,
67 COMPCODE_LT = 1,
68 COMPCODE_EQ = 2,
69 COMPCODE_LE = 3,
70 COMPCODE_GT = 4,
71 COMPCODE_LTGT = 5,
72 COMPCODE_GE = 6,
73 COMPCODE_ORD = 7,
74 COMPCODE_UNORD = 8,
75 COMPCODE_UNLT = 9,
76 COMPCODE_UNEQ = 10,
77 COMPCODE_UNLE = 11,
78 COMPCODE_UNGT = 12,
79 COMPCODE_NE = 13,
80 COMPCODE_UNGE = 14,
81 COMPCODE_TRUE = 15
82};
83
de1b648b 84static void encode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
85static void decode (HOST_WIDE_INT *, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
bd214d13 86static bool negate_mathfn_p (enum built_in_function);
de1b648b 87static bool negate_expr_p (tree);
88static tree negate_expr (tree);
89static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
90static tree associate_trees (tree, tree, enum tree_code, tree);
de1b648b 91static tree const_binop (enum tree_code, tree, tree, int);
80db63ef 92static tree build_zero_vector (tree);
04b253e8 93static tree fold_convert_const (enum tree_code, tree, tree);
318a728f 94static enum tree_code invert_tree_comparison (enum tree_code, bool);
318a728f 95static enum comparison_code comparison_to_compcode (enum tree_code);
96static enum tree_code compcode_to_comparison (enum comparison_code);
97static tree combine_comparisons (enum tree_code, enum tree_code,
98 enum tree_code, tree, tree, tree);
de1b648b 99static int truth_value_p (enum tree_code);
100static int operand_equal_for_comparison_p (tree, tree, tree);
101static int twoval_comparison_p (tree, tree *, tree *, int *);
102static tree eval_subst (tree, tree, tree, tree, tree);
103static tree pedantic_omit_one_operand (tree, tree, tree);
104static tree distribute_bit_expr (enum tree_code, tree, tree, tree);
105static tree make_bit_field_ref (tree, tree, int, int, int);
106static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree);
107static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
108 enum machine_mode *, int *, int *,
109 tree *, tree *);
110static int all_ones_mask_p (tree, int);
111static tree sign_bit_p (tree, tree);
112static int simple_operand_p (tree);
113static tree range_binop (enum tree_code, tree, tree, int, tree, int);
114static tree make_range (tree, int *, tree *, tree *);
115static tree build_range_check (tree, tree, int, tree, tree);
116static int merge_ranges (int *, tree *, tree *, int, tree, tree, int, tree,
117 tree);
118static tree fold_range_test (tree);
9b1fa4a0 119static tree fold_cond_expr_with_comparison (tree, tree, tree, tree);
de1b648b 120static tree unextend (tree, int, int, tree);
121static tree fold_truthop (enum tree_code, tree, tree, tree);
122static tree optimize_minmax_comparison (tree);
123static tree extract_muldiv (tree, tree, enum tree_code, tree);
124static tree extract_muldiv_1 (tree, tree, enum tree_code, tree);
de1b648b 125static int multiple_of_p (tree, tree, tree);
de1b648b 126static tree fold_binary_op_with_conditional_arg (enum tree_code, tree, tree,
127 tree, int);
128static bool fold_real_zero_addition_p (tree, tree, int);
129static tree fold_mathfn_compare (enum built_in_function, enum tree_code,
130 tree, tree, tree);
131static tree fold_inf_compare (enum tree_code, tree, tree, tree);
270029e0 132static tree fold_div_compare (enum tree_code, tree, tree, tree);
bd214d13 133static bool reorder_operands_p (tree, tree);
9d77437d 134static tree fold_negate_const (tree, tree);
c183306c 135static tree fold_not_const (tree, tree);
ad46984d 136static tree fold_relational_const (enum tree_code, tree, tree, tree);
c183306c 137static tree fold_relational_hi_lo (enum tree_code *, const tree,
138 tree *, tree *);
990af12c 139static bool tree_expr_nonzero_p (tree);
9d77437d 140
083a2b5e 141/* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
142 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
143 and SUM1. Then this yields nonzero if overflow occurred during the
144 addition.
145
146 Overflow occurs if A and B have the same sign, but A and SUM differ in
147 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
148 sign. */
149#define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
2bc77e10 150\f
b572011e 151/* To do constant folding on INTEGER_CST nodes requires two-word arithmetic.
bd5b3bce 152 We do that by representing the two-word integer in 4 words, with only
083a2b5e 153 HOST_BITS_PER_WIDE_INT / 2 bits stored in each word, as a positive
154 number. The value of the word is LOWPART + HIGHPART * BASE. */
bd5b3bce 155
156#define LOWPART(x) \
083a2b5e 157 ((x) & (((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) - 1))
bd5b3bce 158#define HIGHPART(x) \
083a2b5e 159 ((unsigned HOST_WIDE_INT) (x) >> HOST_BITS_PER_WIDE_INT / 2)
160#define BASE ((unsigned HOST_WIDE_INT) 1 << HOST_BITS_PER_WIDE_INT / 2)
2bc77e10 161
bd5b3bce 162/* Unpack a two-word integer into 4 words.
b572011e 163 LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
bd5b3bce 164 WORDS points to the array of HOST_WIDE_INTs. */
2bc77e10 165
166static void
de1b648b 167encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
2bc77e10 168{
bd5b3bce 169 words[0] = LOWPART (low);
170 words[1] = HIGHPART (low);
171 words[2] = LOWPART (hi);
172 words[3] = HIGHPART (hi);
2bc77e10 173}
174
bd5b3bce 175/* Pack an array of 4 words into a two-word integer.
176 WORDS points to the array of words.
b572011e 177 The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */
2bc77e10 178
179static void
dc81944a 180decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low,
181 HOST_WIDE_INT *hi)
2bc77e10 182{
083a2b5e 183 *low = words[0] + words[1] * BASE;
184 *hi = words[2] + words[3] * BASE;
2bc77e10 185}
186\f
4d28c5d1 187/* T is an INT_CST node. OVERFLOWABLE indicates if we are interested
188 in overflow of the value, when >0 we are only interested in signed
189 overflow, for <0 we are interested in any overflow. OVERFLOWED
190 indicates whether overflow has already occurred. CONST_OVERFLOWED
191 indicates whether constant overflow has already occurred. We force
192 T's value to be within range of T's type (by setting to 0 or 1 all
193 the bits outside the type's range). We set TREE_OVERFLOWED if,
9ee236f3 194 OVERFLOWED is nonzero,
4d28c5d1 195 or OVERFLOWABLE is >0 and signed overflow occurs
196 or OVERFLOWABLE is <0 and any overflow occurs
197 We set TREE_CONSTANT_OVERFLOWED if,
9ee236f3 198 CONST_OVERFLOWED is nonzero
4d28c5d1 199 or we set TREE_OVERFLOWED.
200 We return either the original T, or a copy. */
083a2b5e 201
4d28c5d1 202tree
7c446c95 203force_fit_type (tree t, int overflowable,
204 bool overflowed, bool overflowed_const)
2bc77e10 205{
a0c2c45b 206 unsigned HOST_WIDE_INT low;
207 HOST_WIDE_INT high;
208 unsigned int prec;
4d28c5d1 209 int sign_extended_type;
2bc77e10 210
fdada98f 211 gcc_assert (TREE_CODE (t) == INTEGER_CST);
0c5713a2 212
817e5691 213 low = TREE_INT_CST_LOW (t);
214 high = TREE_INT_CST_HIGH (t);
d7b6c802 215
1bc16cab 216 if (POINTER_TYPE_P (TREE_TYPE (t))
217 || TREE_CODE (TREE_TYPE (t)) == OFFSET_TYPE)
2bc77e10 218 prec = POINTER_SIZE;
817e5691 219 else
220 prec = TYPE_PRECISION (TREE_TYPE (t));
4d28c5d1 221 /* Size types *are* sign extended. */
222 sign_extended_type = (!TYPE_UNSIGNED (TREE_TYPE (t))
223 || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
224 && TYPE_IS_SIZETYPE (TREE_TYPE (t))));
2bc77e10 225
226 /* First clear all bits that are beyond the type's precision. */
227
b572011e 228 if (prec == 2 * HOST_BITS_PER_WIDE_INT)
2bc77e10 229 ;
b572011e 230 else if (prec > HOST_BITS_PER_WIDE_INT)
4d28c5d1 231 high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
2bc77e10 232 else
233 {
4d28c5d1 234 high = 0;
b572011e 235 if (prec < HOST_BITS_PER_WIDE_INT)
4d28c5d1 236 low &= ~((HOST_WIDE_INT) (-1) << prec);
237 }
238
239 if (!sign_extended_type)
240 /* No sign extension */;
241 else if (prec == 2 * HOST_BITS_PER_WIDE_INT)
242 /* Correct width already. */;
243 else if (prec > HOST_BITS_PER_WIDE_INT)
244 {
245 /* Sign extend top half? */
246 if (high & ((unsigned HOST_WIDE_INT)1
247 << (prec - HOST_BITS_PER_WIDE_INT - 1)))
248 high |= (HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT);
249 }
250 else if (prec == HOST_BITS_PER_WIDE_INT)
251 {
252 if ((HOST_WIDE_INT)low < 0)
253 high = -1;
254 }
255 else
256 {
257 /* Sign extend bottom half? */
258 if (low & ((unsigned HOST_WIDE_INT)1 << (prec - 1)))
2bc77e10 259 {
4d28c5d1 260 high = -1;
261 low |= (HOST_WIDE_INT)(-1) << prec;
2bc77e10 262 }
263 }
f55401f0 264
4d28c5d1 265 /* If the value changed, return a new node. */
266 if (overflowed || overflowed_const
267 || low != TREE_INT_CST_LOW (t) || high != TREE_INT_CST_HIGH (t))
268 {
7016c612 269 t = build_int_cst_wide (TREE_TYPE (t), low, high);
0c5713a2 270
4d28c5d1 271 if (overflowed
272 || overflowable < 0
273 || (overflowable > 0 && sign_extended_type))
274 {
00b76131 275 t = copy_node (t);
4d28c5d1 276 TREE_OVERFLOW (t) = 1;
277 TREE_CONSTANT_OVERFLOW (t) = 1;
278 }
279 else if (overflowed_const)
00b76131 280 {
281 t = copy_node (t);
282 TREE_CONSTANT_OVERFLOW (t) = 1;
283 }
4d28c5d1 284 }
0c5713a2 285
4d28c5d1 286 return t;
2bc77e10 287}
288\f
b572011e 289/* Add two doubleword integers with doubleword result.
290 Each argument is given as two `HOST_WIDE_INT' pieces.
2bc77e10 291 One argument is L1 and H1; the other, L2 and H2.
bd5b3bce 292 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 293
b9e999f0 294int
dc81944a 295add_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
296 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
297 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
2bc77e10 298{
a0c2c45b 299 unsigned HOST_WIDE_INT l;
300 HOST_WIDE_INT h;
2bc77e10 301
bd5b3bce 302 l = l1 + l2;
a0c2c45b 303 h = h1 + h2 + (l < l1);
2bc77e10 304
bd5b3bce 305 *lv = l;
306 *hv = h;
083a2b5e 307 return OVERFLOW_SUM_SIGN (h1, h2, h);
2bc77e10 308}
309
b572011e 310/* Negate a doubleword integer with doubleword result.
b9e999f0 311 Return nonzero if the operation overflows, assuming it's signed.
b572011e 312 The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
bd5b3bce 313 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 314
b9e999f0 315int
dc81944a 316neg_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
317 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
2bc77e10 318{
319 if (l1 == 0)
320 {
321 *lv = 0;
322 *hv = - h1;
f55401f0 323 return (*hv & h1) < 0;
2bc77e10 324 }
325 else
326 {
cc049fa3 327 *lv = -l1;
328 *hv = ~h1;
b9e999f0 329 return 0;
2bc77e10 330 }
331}
332\f
b572011e 333/* Multiply two doubleword integers with doubleword result.
b9e999f0 334 Return nonzero if the operation overflows, assuming it's signed.
b572011e 335 Each argument is given as two `HOST_WIDE_INT' pieces.
2bc77e10 336 One argument is L1 and H1; the other, L2 and H2.
bd5b3bce 337 The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 338
b9e999f0 339int
dc81944a 340mul_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
341 unsigned HOST_WIDE_INT l2, HOST_WIDE_INT h2,
342 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
2bc77e10 343{
bd5b3bce 344 HOST_WIDE_INT arg1[4];
345 HOST_WIDE_INT arg2[4];
346 HOST_WIDE_INT prod[4 * 2];
19cb6b50 347 unsigned HOST_WIDE_INT carry;
348 int i, j, k;
a0c2c45b 349 unsigned HOST_WIDE_INT toplow, neglow;
350 HOST_WIDE_INT tophigh, neghigh;
2bc77e10 351
2bc77e10 352 encode (arg1, l1, h1);
353 encode (arg2, l2, h2);
354
f0af5a88 355 memset (prod, 0, sizeof prod);
2bc77e10 356
bd5b3bce 357 for (i = 0; i < 4; i++)
358 {
359 carry = 0;
360 for (j = 0; j < 4; j++)
361 {
362 k = i + j;
363 /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */
364 carry += arg1[i] * arg2[j];
365 /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */
366 carry += prod[k];
367 prod[k] = LOWPART (carry);
368 carry = HIGHPART (carry);
369 }
370 prod[i + 4] = carry;
371 }
2bc77e10 372
bd5b3bce 373 decode (prod, lv, hv); /* This ignores prod[4] through prod[4*2-1] */
b9e999f0 374
375 /* Check for overflow by calculating the top half of the answer in full;
376 it should agree with the low half's sign bit. */
cc049fa3 377 decode (prod + 4, &toplow, &tophigh);
b9e999f0 378 if (h1 < 0)
379 {
380 neg_double (l2, h2, &neglow, &neghigh);
381 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
382 }
383 if (h2 < 0)
384 {
385 neg_double (l1, h1, &neglow, &neghigh);
386 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
387 }
388 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;
2bc77e10 389}
390\f
b572011e 391/* Shift the doubleword integer in L1, H1 left by COUNT places
2bc77e10 392 keeping only PREC bits of result.
393 Shift right if COUNT is negative.
394 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
b572011e 395 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 396
f55401f0 397void
dc81944a 398lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
399 HOST_WIDE_INT count, unsigned int prec,
400 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, int arith)
2bc77e10 401{
7c5b13dc 402 unsigned HOST_WIDE_INT signmask;
403
2bc77e10 404 if (count < 0)
405 {
cc049fa3 406 rshift_double (l1, h1, -count, prec, lv, hv, arith);
f55401f0 407 return;
2bc77e10 408 }
cc049fa3 409
0bb60c65 410 if (SHIFT_COUNT_TRUNCATED)
411 count %= prec;
2bc77e10 412
016d117a 413 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
414 {
415 /* Shifting by the host word size is undefined according to the
416 ANSI standard, so we must handle this as a special case. */
417 *hv = 0;
418 *lv = 0;
419 }
420 else if (count >= HOST_BITS_PER_WIDE_INT)
2bc77e10 421 {
a0c2c45b 422 *hv = l1 << (count - HOST_BITS_PER_WIDE_INT);
bd5b3bce 423 *lv = 0;
424 }
425 else
426 {
427 *hv = (((unsigned HOST_WIDE_INT) h1 << count)
a0c2c45b 428 | (l1 >> (HOST_BITS_PER_WIDE_INT - count - 1) >> 1));
429 *lv = l1 << count;
2bc77e10 430 }
7c5b13dc 431
432 /* Sign extend all bits that are beyond the precision. */
433
434 signmask = -((prec > HOST_BITS_PER_WIDE_INT
f9a532b0 435 ? ((unsigned HOST_WIDE_INT) *hv
d3371fcd 436 >> (prec - HOST_BITS_PER_WIDE_INT - 1))
7c5b13dc 437 : (*lv >> (prec - 1))) & 1);
438
439 if (prec >= 2 * HOST_BITS_PER_WIDE_INT)
440 ;
441 else if (prec >= HOST_BITS_PER_WIDE_INT)
442 {
443 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
444 *hv |= signmask << (prec - HOST_BITS_PER_WIDE_INT);
445 }
446 else
447 {
448 *hv = signmask;
449 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << prec);
450 *lv |= signmask << prec;
451 }
2bc77e10 452}
453
b572011e 454/* Shift the doubleword integer in L1, H1 right by COUNT places
2bc77e10 455 keeping only PREC bits of result. COUNT must be positive.
456 ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
b572011e 457 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 458
459void
dc81944a 460rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
461 HOST_WIDE_INT count, unsigned int prec,
462 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv,
de1b648b 463 int arith)
2bc77e10 464{
bd5b3bce 465 unsigned HOST_WIDE_INT signmask;
a0c2c45b 466
bd5b3bce 467 signmask = (arith
468 ? -((unsigned HOST_WIDE_INT) h1 >> (HOST_BITS_PER_WIDE_INT - 1))
469 : 0);
2bc77e10 470
0bb60c65 471 if (SHIFT_COUNT_TRUNCATED)
472 count %= prec;
2bc77e10 473
016d117a 474 if (count >= 2 * HOST_BITS_PER_WIDE_INT)
475 {
476 /* Shifting by the host word size is undefined according to the
477 ANSI standard, so we must handle this as a special case. */
7c5b13dc 478 *hv = 0;
479 *lv = 0;
016d117a 480 }
481 else if (count >= HOST_BITS_PER_WIDE_INT)
2bc77e10 482 {
7c5b13dc 483 *hv = 0;
484 *lv = (unsigned HOST_WIDE_INT) h1 >> (count - HOST_BITS_PER_WIDE_INT);
bd5b3bce 485 }
486 else
487 {
7c5b13dc 488 *hv = (unsigned HOST_WIDE_INT) h1 >> count;
a0c2c45b 489 *lv = ((l1 >> count)
5ee8fe30 490 | ((unsigned HOST_WIDE_INT) h1 << (HOST_BITS_PER_WIDE_INT - count - 1) << 1));
7c5b13dc 491 }
492
493 /* Zero / sign extend all bits that are beyond the precision. */
494
495 if (count >= (HOST_WIDE_INT)prec)
496 {
497 *hv = signmask;
498 *lv = signmask;
499 }
500 else if ((prec - count) >= 2 * HOST_BITS_PER_WIDE_INT)
501 ;
502 else if ((prec - count) >= HOST_BITS_PER_WIDE_INT)
503 {
504 *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - HOST_BITS_PER_WIDE_INT));
505 *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT);
506 }
507 else
508 {
509 *hv = signmask;
510 *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count));
511 *lv |= signmask << (prec - count);
2bc77e10 512 }
2bc77e10 513}
514\f
bd5b3bce 515/* Rotate the doubleword integer in L1, H1 left by COUNT places
2bc77e10 516 keeping only PREC bits of result.
517 Rotate right if COUNT is negative.
b572011e 518 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 519
520void
dc81944a 521lrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
522 HOST_WIDE_INT count, unsigned int prec,
523 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
2bc77e10 524{
a0c2c45b 525 unsigned HOST_WIDE_INT s1l, s2l;
526 HOST_WIDE_INT s1h, s2h;
2bc77e10 527
7a1b56a9 528 count %= prec;
2bc77e10 529 if (count < 0)
7a1b56a9 530 count += prec;
2bc77e10 531
7a1b56a9 532 lshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
533 rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
534 *lv = s1l | s2l;
535 *hv = s1h | s2h;
2bc77e10 536}
537
b572011e 538/* Rotate the doubleword integer in L1, H1 left by COUNT places
2bc77e10 539 keeping only PREC bits of result. COUNT must be positive.
b572011e 540 Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */
2bc77e10 541
542void
dc81944a 543rrotate_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1,
544 HOST_WIDE_INT count, unsigned int prec,
545 unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv)
2bc77e10 546{
a0c2c45b 547 unsigned HOST_WIDE_INT s1l, s2l;
548 HOST_WIDE_INT s1h, s2h;
2bc77e10 549
7a1b56a9 550 count %= prec;
551 if (count < 0)
552 count += prec;
2bc77e10 553
7a1b56a9 554 rshift_double (l1, h1, count, prec, &s1l, &s1h, 0);
555 lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0);
556 *lv = s1l | s2l;
557 *hv = s1h | s2h;
2bc77e10 558}
559\f
b572011e 560/* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
2bc77e10 561 for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
562 CODE is a tree code for a kind of division, one of
563 TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
564 or EXACT_DIV_EXPR
20dd417a 565 It controls how the quotient is rounded to an integer.
b9e999f0 566 Return nonzero if the operation overflows.
2bc77e10 567 UNS nonzero says do unsigned division. */
568
15ca565e 569int
de1b648b 570div_and_round_double (enum tree_code code, int uns,
571 unsigned HOST_WIDE_INT lnum_orig, /* num == numerator == dividend */
572 HOST_WIDE_INT hnum_orig,
573 unsigned HOST_WIDE_INT lden_orig, /* den == denominator == divisor */
dc81944a 574 HOST_WIDE_INT hden_orig,
575 unsigned HOST_WIDE_INT *lquo,
de1b648b 576 HOST_WIDE_INT *hquo, unsigned HOST_WIDE_INT *lrem,
577 HOST_WIDE_INT *hrem)
2bc77e10 578{
579 int quo_neg = 0;
bd5b3bce 580 HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */
581 HOST_WIDE_INT den[4], quo[4];
19cb6b50 582 int i, j;
bd5b3bce 583 unsigned HOST_WIDE_INT work;
a0c2c45b 584 unsigned HOST_WIDE_INT carry = 0;
585 unsigned HOST_WIDE_INT lnum = lnum_orig;
abd9ac9c 586 HOST_WIDE_INT hnum = hnum_orig;
a0c2c45b 587 unsigned HOST_WIDE_INT lden = lden_orig;
abd9ac9c 588 HOST_WIDE_INT hden = hden_orig;
b9e999f0 589 int overflow = 0;
2bc77e10 590
a0c2c45b 591 if (hden == 0 && lden == 0)
ad87de1e 592 overflow = 1, lden = 1;
2bc77e10 593
139c3f48 594 /* Calculate quotient sign and convert operands to unsigned. */
cc049fa3 595 if (!uns)
2bc77e10 596 {
b9e999f0 597 if (hnum < 0)
2bc77e10 598 {
599 quo_neg = ~ quo_neg;
b9e999f0 600 /* (minimum integer) / (-1) is the only overflow case. */
a0c2c45b 601 if (neg_double (lnum, hnum, &lnum, &hnum)
602 && ((HOST_WIDE_INT) lden & hden) == -1)
b9e999f0 603 overflow = 1;
2bc77e10 604 }
cc049fa3 605 if (hden < 0)
2bc77e10 606 {
607 quo_neg = ~ quo_neg;
b9e999f0 608 neg_double (lden, hden, &lden, &hden);
2bc77e10 609 }
610 }
611
612 if (hnum == 0 && hden == 0)
613 { /* single precision */
614 *hquo = *hrem = 0;
802ddb63 615 /* This unsigned division rounds toward zero. */
a0c2c45b 616 *lquo = lnum / lden;
2bc77e10 617 goto finish_up;
618 }
619
620 if (hnum == 0)
621 { /* trivial case: dividend < divisor */
622 /* hden != 0 already checked. */
623 *hquo = *lquo = 0;
624 *hrem = hnum;
625 *lrem = lnum;
626 goto finish_up;
627 }
628
f0af5a88 629 memset (quo, 0, sizeof quo);
2bc77e10 630
f0af5a88 631 memset (num, 0, sizeof num); /* to zero 9th element */
632 memset (den, 0, sizeof den);
2bc77e10 633
cc049fa3 634 encode (num, lnum, hnum);
2bc77e10 635 encode (den, lden, hden);
636
bd5b3bce 637 /* Special code for when the divisor < BASE. */
a0c2c45b 638 if (hden == 0 && lden < (unsigned HOST_WIDE_INT) BASE)
bd5b3bce 639 {
2bc77e10 640 /* hnum != 0 already checked. */
bd5b3bce 641 for (i = 4 - 1; i >= 0; i--)
2bc77e10 642 {
bd5b3bce 643 work = num[i] + carry * BASE;
a0c2c45b 644 quo[i] = work / lden;
645 carry = work % lden;
2bc77e10 646 }
647 }
bd5b3bce 648 else
649 {
650 /* Full double precision division,
651 with thanks to Don Knuth's "Seminumerical Algorithms". */
a0c2c45b 652 int num_hi_sig, den_hi_sig;
653 unsigned HOST_WIDE_INT quo_est, scale;
2bc77e10 654
6ef828f9 655 /* Find the highest nonzero divisor digit. */
cc049fa3 656 for (i = 4 - 1;; i--)
657 if (den[i] != 0)
658 {
659 den_hi_sig = i;
660 break;
661 }
bd5b3bce 662
a0c2c45b 663 /* Insure that the first digit of the divisor is at least BASE/2.
664 This is required by the quotient digit estimation algorithm. */
2bc77e10 665
a0c2c45b 666 scale = BASE / (den[den_hi_sig] + 1);
667 if (scale > 1)
668 { /* scale divisor and dividend */
669 carry = 0;
670 for (i = 0; i <= 4 - 1; i++)
671 {
672 work = (num[i] * scale) + carry;
673 num[i] = LOWPART (work);
674 carry = HIGHPART (work);
675 }
2bc77e10 676
a0c2c45b 677 num[4] = carry;
678 carry = 0;
679 for (i = 0; i <= 4 - 1; i++)
680 {
681 work = (den[i] * scale) + carry;
682 den[i] = LOWPART (work);
683 carry = HIGHPART (work);
684 if (den[i] != 0) den_hi_sig = i;
685 }
686 }
2bc77e10 687
a0c2c45b 688 num_hi_sig = 4;
2bc77e10 689
a0c2c45b 690 /* Main loop */
691 for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--)
2bc77e10 692 {
a0c2c45b 693 /* Guess the next quotient digit, quo_est, by dividing the first
694 two remaining dividend digits by the high order quotient digit.
695 quo_est is never low and is at most 2 high. */
696 unsigned HOST_WIDE_INT tmp;
697
698 num_hi_sig = i + den_hi_sig + 1;
699 work = num[num_hi_sig] * BASE + num[num_hi_sig - 1];
700 if (num[num_hi_sig] != den[den_hi_sig])
701 quo_est = work / den[den_hi_sig];
702 else
703 quo_est = BASE - 1;
2bc77e10 704
1e625a2e 705 /* Refine quo_est so it's usually correct, and at most one high. */
a0c2c45b 706 tmp = work - quo_est * den[den_hi_sig];
707 if (tmp < BASE
708 && (den[den_hi_sig - 1] * quo_est
709 > (tmp * BASE + num[num_hi_sig - 2])))
710 quo_est--;
2bc77e10 711
a0c2c45b 712 /* Try QUO_EST as the quotient digit, by multiplying the
713 divisor by QUO_EST and subtracting from the remaining dividend.
714 Keep in mind that QUO_EST is the I - 1st digit. */
715
716 carry = 0;
2bc77e10 717 for (j = 0; j <= den_hi_sig; j++)
718 {
a0c2c45b 719 work = quo_est * den[j] + carry;
bd5b3bce 720 carry = HIGHPART (work);
a0c2c45b 721 work = num[i + j] - LOWPART (work);
bd5b3bce 722 num[i + j] = LOWPART (work);
a0c2c45b 723 carry += HIGHPART (work) != 0;
2bc77e10 724 }
2bc77e10 725
a0c2c45b 726 /* If quo_est was high by one, then num[i] went negative and
727 we need to correct things. */
f9a532b0 728 if (num[num_hi_sig] < (HOST_WIDE_INT) carry)
a0c2c45b 729 {
730 quo_est--;
731 carry = 0; /* add divisor back in */
732 for (j = 0; j <= den_hi_sig; j++)
733 {
734 work = num[i + j] + den[j] + carry;
735 carry = HIGHPART (work);
736 num[i + j] = LOWPART (work);
737 }
738
739 num [num_hi_sig] += carry;
740 }
741
742 /* Store the quotient digit. */
743 quo[i] = quo_est;
744 }
2bc77e10 745 }
2bc77e10 746
747 decode (quo, lquo, hquo);
748
749 finish_up:
b4b174c3 750 /* If result is negative, make it so. */
2bc77e10 751 if (quo_neg)
752 neg_double (*lquo, *hquo, lquo, hquo);
753
aab2cf92 754 /* Compute trial remainder: rem = num - (quo * den) */
2bc77e10 755 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
756 neg_double (*lrem, *hrem, lrem, hrem);
757 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
758
759 switch (code)
760 {
761 case TRUNC_DIV_EXPR:
762 case TRUNC_MOD_EXPR: /* round toward zero */
763 case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */
b9e999f0 764 return overflow;
2bc77e10 765
766 case FLOOR_DIV_EXPR:
767 case FLOOR_MOD_EXPR: /* round toward negative infinity */
768 if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */
769 {
770 /* quo = quo - 1; */
b572011e 771 add_double (*lquo, *hquo, (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1,
772 lquo, hquo);
2bc77e10 773 }
a0c2c45b 774 else
775 return overflow;
2bc77e10 776 break;
777
778 case CEIL_DIV_EXPR:
779 case CEIL_MOD_EXPR: /* round toward positive infinity */
780 if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */
781 {
b572011e 782 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
783 lquo, hquo);
2bc77e10 784 }
a0c2c45b 785 else
786 return overflow;
2bc77e10 787 break;
cc049fa3 788
2bc77e10 789 case ROUND_DIV_EXPR:
790 case ROUND_MOD_EXPR: /* round to closest integer */
791 {
a0c2c45b 792 unsigned HOST_WIDE_INT labs_rem = *lrem;
793 HOST_WIDE_INT habs_rem = *hrem;
794 unsigned HOST_WIDE_INT labs_den = lden, ltwice;
795 HOST_WIDE_INT habs_den = hden, htwice;
796
2358393e 797 /* Get absolute values. */
a0c2c45b 798 if (*hrem < 0)
799 neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
800 if (hden < 0)
801 neg_double (lden, hden, &labs_den, &habs_den);
802
803 /* If (2 * abs (lrem) >= abs (lden)) */
b572011e 804 mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
805 labs_rem, habs_rem, &ltwice, &htwice);
a0c2c45b 806
b572011e 807 if (((unsigned HOST_WIDE_INT) habs_den
808 < (unsigned HOST_WIDE_INT) htwice)
809 || (((unsigned HOST_WIDE_INT) habs_den
810 == (unsigned HOST_WIDE_INT) htwice)
a0c2c45b 811 && (labs_den < ltwice)))
2bc77e10 812 {
813 if (*hquo < 0)
814 /* quo = quo - 1; */
b572011e 815 add_double (*lquo, *hquo,
816 (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
2bc77e10 817 else
818 /* quo = quo + 1; */
b572011e 819 add_double (*lquo, *hquo, (HOST_WIDE_INT) 1, (HOST_WIDE_INT) 0,
820 lquo, hquo);
2bc77e10 821 }
a0c2c45b 822 else
823 return overflow;
2bc77e10 824 }
825 break;
826
827 default:
fdada98f 828 gcc_unreachable ();
2bc77e10 829 }
830
21dda4ee 831 /* Compute true remainder: rem = num - (quo * den) */
2bc77e10 832 mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem);
833 neg_double (*lrem, *hrem, lrem, hrem);
834 add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem);
b9e999f0 835 return overflow;
2bc77e10 836}
837\f
bd214d13 838/* Return true if built-in mathematical function specified by CODE
839 preserves the sign of it argument, i.e. -f(x) == f(-x). */
840
841static bool
842negate_mathfn_p (enum built_in_function code)
843{
844 switch (code)
845 {
846 case BUILT_IN_ASIN:
847 case BUILT_IN_ASINF:
848 case BUILT_IN_ASINL:
849 case BUILT_IN_ATAN:
850 case BUILT_IN_ATANF:
851 case BUILT_IN_ATANL:
852 case BUILT_IN_SIN:
853 case BUILT_IN_SINF:
854 case BUILT_IN_SINL:
855 case BUILT_IN_TAN:
856 case BUILT_IN_TANF:
857 case BUILT_IN_TANL:
858 return true;
859
860 default:
861 break;
862 }
863 return false;
864}
865
bb445479 866/* Check whether we may negate an integer constant T without causing
867 overflow. */
868
869bool
870may_negate_without_overflow_p (tree t)
871{
872 unsigned HOST_WIDE_INT val;
873 unsigned int prec;
874 tree type;
875
fdada98f 876 gcc_assert (TREE_CODE (t) == INTEGER_CST);
bb445479 877
878 type = TREE_TYPE (t);
879 if (TYPE_UNSIGNED (type))
880 return false;
881
882 prec = TYPE_PRECISION (type);
883 if (prec > HOST_BITS_PER_WIDE_INT)
884 {
885 if (TREE_INT_CST_LOW (t) != 0)
886 return true;
887 prec -= HOST_BITS_PER_WIDE_INT;
888 val = TREE_INT_CST_HIGH (t);
889 }
890 else
891 val = TREE_INT_CST_LOW (t);
892 if (prec < HOST_BITS_PER_WIDE_INT)
893 val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
894 return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
895}
896
22331643 897/* Determine whether an expression T can be cheaply negated using
898 the function negate_expr. */
899
900static bool
de1b648b 901negate_expr_p (tree t)
22331643 902{
22331643 903 tree type;
904
905 if (t == 0)
906 return false;
907
908 type = TREE_TYPE (t);
909
910 STRIP_SIGN_NOPS (t);
911 switch (TREE_CODE (t))
912 {
913 case INTEGER_CST:
78a8ed03 914 if (TYPE_UNSIGNED (type) || ! flag_trapv)
bd214d13 915 return true;
22331643 916
917 /* Check that -CST will not overflow type. */
bb445479 918 return may_negate_without_overflow_p (t);
22331643 919
920 case REAL_CST:
921 case NEGATE_EXPR:
22331643 922 return true;
923
bd214d13 924 case COMPLEX_CST:
925 return negate_expr_p (TREE_REALPART (t))
926 && negate_expr_p (TREE_IMAGPART (t));
927
2169cab6 928 case PLUS_EXPR:
929 if (FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
930 return false;
931 /* -(A + B) -> (-B) - A. */
932 if (negate_expr_p (TREE_OPERAND (t, 1))
933 && reorder_operands_p (TREE_OPERAND (t, 0),
934 TREE_OPERAND (t, 1)))
935 return true;
936 /* -(A + B) -> (-A) - B. */
937 return negate_expr_p (TREE_OPERAND (t, 0));
938
d842742d 939 case MINUS_EXPR:
940 /* We can't turn -(A-B) into B-A when we honor signed zeros. */
bd214d13 941 return (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
942 && reorder_operands_p (TREE_OPERAND (t, 0),
943 TREE_OPERAND (t, 1));
d842742d 944
a12ecaaa 945 case MULT_EXPR:
78a8ed03 946 if (TYPE_UNSIGNED (TREE_TYPE (t)))
a12ecaaa 947 break;
948
949 /* Fall through. */
950
951 case RDIV_EXPR:
952 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
953 return negate_expr_p (TREE_OPERAND (t, 1))
954 || negate_expr_p (TREE_OPERAND (t, 0));
955 break;
956
bd214d13 957 case NOP_EXPR:
958 /* Negate -((double)float) as (double)(-float). */
959 if (TREE_CODE (type) == REAL_TYPE)
960 {
961 tree tem = strip_float_extensions (t);
962 if (tem != t)
963 return negate_expr_p (tem);
964 }
965 break;
966
967 case CALL_EXPR:
968 /* Negate -f(x) as f(-x). */
969 if (negate_mathfn_p (builtin_mathfn_code (t)))
970 return negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1)));
971 break;
972
a22fd555 973 case RSHIFT_EXPR:
974 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
975 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
976 {
977 tree op1 = TREE_OPERAND (t, 1);
978 if (TREE_INT_CST_HIGH (op1) == 0
979 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
980 == TREE_INT_CST_LOW (op1))
981 return true;
982 }
983 break;
984
22331643 985 default:
986 break;
987 }
988 return false;
989}
990
23ec2d5e 991/* Given T, an expression, return the negation of T. Allow for T to be
992 null, in which case return null. */
2bc77e10 993
23ec2d5e 994static tree
de1b648b 995negate_expr (tree t)
23ec2d5e 996{
997 tree type;
998 tree tem;
999
1000 if (t == 0)
1001 return 0;
1002
1003 type = TREE_TYPE (t);
1004 STRIP_SIGN_NOPS (t);
1005
1006 switch (TREE_CODE (t))
1007 {
1008 case INTEGER_CST:
9d77437d 1009 tem = fold_negate_const (t, type);
bd214d13 1010 if (! TREE_OVERFLOW (tem)
78a8ed03 1011 || TYPE_UNSIGNED (type)
bd214d13 1012 || ! flag_trapv)
23ec2d5e 1013 return tem;
1014 break;
1015
a12ecaaa 1016 case REAL_CST:
9d77437d 1017 tem = fold_negate_const (t, type);
a12ecaaa 1018 /* Two's complement FP formats, such as c4x, may overflow. */
bd214d13 1019 if (! TREE_OVERFLOW (tem) || ! flag_trapping_math)
b30e3dbc 1020 return fold_convert (type, tem);
a12ecaaa 1021 break;
1022
bd214d13 1023 case COMPLEX_CST:
1024 {
1025 tree rpart = negate_expr (TREE_REALPART (t));
1026 tree ipart = negate_expr (TREE_IMAGPART (t));
1027
1028 if ((TREE_CODE (rpart) == REAL_CST
1029 && TREE_CODE (ipart) == REAL_CST)
1030 || (TREE_CODE (rpart) == INTEGER_CST
1031 && TREE_CODE (ipart) == INTEGER_CST))
1032 return build_complex (type, rpart, ipart);
1033 }
1034 break;
1035
23ec2d5e 1036 case NEGATE_EXPR:
b30e3dbc 1037 return fold_convert (type, TREE_OPERAND (t, 0));
23ec2d5e 1038
2169cab6 1039 case PLUS_EXPR:
1040 if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1041 {
1042 /* -(A + B) -> (-B) - A. */
1043 if (negate_expr_p (TREE_OPERAND (t, 1))
1044 && reorder_operands_p (TREE_OPERAND (t, 0),
1045 TREE_OPERAND (t, 1)))
fd96eeef 1046 {
1047 tem = negate_expr (TREE_OPERAND (t, 1));
1048 tem = fold (build2 (MINUS_EXPR, TREE_TYPE (t),
1049 tem, TREE_OPERAND (t, 0)));
1050 return fold_convert (type, tem);
1051 }
1052
2169cab6 1053 /* -(A + B) -> (-A) - B. */
1054 if (negate_expr_p (TREE_OPERAND (t, 0)))
fd96eeef 1055 {
1056 tem = negate_expr (TREE_OPERAND (t, 0));
1057 tem = fold (build2 (MINUS_EXPR, TREE_TYPE (t),
1058 tem, TREE_OPERAND (t, 1)));
1059 return fold_convert (type, tem);
1060 }
2169cab6 1061 }
1062 break;
1063
23ec2d5e 1064 case MINUS_EXPR:
1065 /* - (A - B) -> B - A */
bd214d13 1066 if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
1067 && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
b30e3dbc 1068 return fold_convert (type,
fd96eeef 1069 fold (build2 (MINUS_EXPR, TREE_TYPE (t),
1070 TREE_OPERAND (t, 1),
1071 TREE_OPERAND (t, 0))));
23ec2d5e 1072 break;
1073
a12ecaaa 1074 case MULT_EXPR:
78a8ed03 1075 if (TYPE_UNSIGNED (TREE_TYPE (t)))
a12ecaaa 1076 break;
1077
1078 /* Fall through. */
1079
1080 case RDIV_EXPR:
1081 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
1082 {
1083 tem = TREE_OPERAND (t, 1);
1084 if (negate_expr_p (tem))
b30e3dbc 1085 return fold_convert (type,
fd96eeef 1086 fold (build2 (TREE_CODE (t), TREE_TYPE (t),
1087 TREE_OPERAND (t, 0),
1088 negate_expr (tem))));
a12ecaaa 1089 tem = TREE_OPERAND (t, 0);
1090 if (negate_expr_p (tem))
b30e3dbc 1091 return fold_convert (type,
fd96eeef 1092 fold (build2 (TREE_CODE (t), TREE_TYPE (t),
1093 negate_expr (tem),
1094 TREE_OPERAND (t, 1))));
a12ecaaa 1095 }
1096 break;
1097
bd214d13 1098 case NOP_EXPR:
1099 /* Convert -((double)float) into (double)(-float). */
1100 if (TREE_CODE (type) == REAL_TYPE)
1101 {
1102 tem = strip_float_extensions (t);
1103 if (tem != t && negate_expr_p (tem))
b30e3dbc 1104 return fold_convert (type, negate_expr (tem));
bd214d13 1105 }
1106 break;
1107
1108 case CALL_EXPR:
1109 /* Negate -f(x) as f(-x). */
1110 if (negate_mathfn_p (builtin_mathfn_code (t))
1111 && negate_expr_p (TREE_VALUE (TREE_OPERAND (t, 1))))
1112 {
1113 tree fndecl, arg, arglist;
1114
1115 fndecl = get_callee_fndecl (t);
1116 arg = negate_expr (TREE_VALUE (TREE_OPERAND (t, 1)));
1117 arglist = build_tree_list (NULL_TREE, arg);
1118 return build_function_call_expr (fndecl, arglist);
1119 }
1120 break;
1121
a22fd555 1122 case RSHIFT_EXPR:
1123 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
1124 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
1125 {
1126 tree op1 = TREE_OPERAND (t, 1);
1127 if (TREE_INT_CST_HIGH (op1) == 0
1128 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
1129 == TREE_INT_CST_LOW (op1))
1130 {
78a8ed03 1131 tree ntype = TYPE_UNSIGNED (type)
fa8b888f 1132 ? lang_hooks.types.signed_type (type)
1133 : lang_hooks.types.unsigned_type (type);
a22fd555 1134 tree temp = fold_convert (ntype, TREE_OPERAND (t, 0));
1135 temp = fold (build2 (RSHIFT_EXPR, ntype, temp, op1));
1136 return fold_convert (type, temp);
1137 }
1138 }
1139 break;
1140
23ec2d5e 1141 default:
1142 break;
1143 }
1144
b30e3dbc 1145 tem = fold (build1 (NEGATE_EXPR, TREE_TYPE (t), t));
1146 return fold_convert (type, tem);
23ec2d5e 1147}
1148\f
1149/* Split a tree IN into a constant, literal and variable parts that could be
1150 combined with CODE to make IN. "constant" means an expression with
1151 TREE_CONSTANT but that isn't an actual constant. CODE must be a
1152 commutative arithmetic operation. Store the constant part into *CONP,
b07ba9ff 1153 the literal in *LITP and return the variable part. If a part isn't
23ec2d5e 1154 present, set it to null. If the tree does not decompose in this way,
1155 return the entire tree as the variable part and the other parts as null.
1156
1157 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that
b07ba9ff 1158 case, we negate an operand that was subtracted. Except if it is a
1159 literal for which we use *MINUS_LITP instead.
1160
1161 If NEGATE_P is true, we are negating all of IN, again except a literal
1162 for which we use *MINUS_LITP instead.
23ec2d5e 1163
1164 If IN is itself a literal or constant, return it as appropriate.
1165
1166 Note that we do not guarantee that any of the three values will be the
1167 same type as IN, but they will have the same signedness and mode. */
1168
1169static tree
dc81944a 1170split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
1171 tree *minus_litp, int negate_p)
2bc77e10 1172{
23ec2d5e 1173 tree var = 0;
1174
2bc77e10 1175 *conp = 0;
23ec2d5e 1176 *litp = 0;
b07ba9ff 1177 *minus_litp = 0;
23ec2d5e 1178
6312a35e 1179 /* Strip any conversions that don't change the machine mode or signedness. */
23ec2d5e 1180 STRIP_SIGN_NOPS (in);
1181
1182 if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST)
1183 *litp = in;
23ec2d5e 1184 else if (TREE_CODE (in) == code
1185 || (! FLOAT_TYPE_P (TREE_TYPE (in))
1186 /* We can associate addition and subtraction together (even
1187 though the C standard doesn't say so) for integers because
1188 the value is not affected. For reals, the value might be
1189 affected, so we can't. */
1190 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
1191 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
1192 {
1193 tree op0 = TREE_OPERAND (in, 0);
1194 tree op1 = TREE_OPERAND (in, 1);
1195 int neg1_p = TREE_CODE (in) == MINUS_EXPR;
1196 int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
1197
1198 /* First see if either of the operands is a literal, then a constant. */
1199 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
1200 *litp = op0, op0 = 0;
1201 else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST)
1202 *litp = op1, neg_litp_p = neg1_p, op1 = 0;
1203
1204 if (op0 != 0 && TREE_CONSTANT (op0))
1205 *conp = op0, op0 = 0;
1206 else if (op1 != 0 && TREE_CONSTANT (op1))
1207 *conp = op1, neg_conp_p = neg1_p, op1 = 0;
1208
1209 /* If we haven't dealt with either operand, this is not a case we can
6312a35e 1210 decompose. Otherwise, VAR is either of the ones remaining, if any. */
23ec2d5e 1211 if (op0 != 0 && op1 != 0)
1212 var = in;
1213 else if (op0 != 0)
1214 var = op0;
1215 else
1216 var = op1, neg_var_p = neg1_p;
2bc77e10 1217
23ec2d5e 1218 /* Now do any needed negations. */
b07ba9ff 1219 if (neg_litp_p)
1220 *minus_litp = *litp, *litp = 0;
1221 if (neg_conp_p)
1222 *conp = negate_expr (*conp);
1223 if (neg_var_p)
1224 var = negate_expr (var);
23ec2d5e 1225 }
8541c166 1226 else if (TREE_CONSTANT (in))
1227 *conp = in;
23ec2d5e 1228 else
1229 var = in;
1230
1231 if (negate_p)
2bc77e10 1232 {
b07ba9ff 1233 if (*litp)
1234 *minus_litp = *litp, *litp = 0;
1235 else if (*minus_litp)
1236 *litp = *minus_litp, *minus_litp = 0;
23ec2d5e 1237 *conp = negate_expr (*conp);
b07ba9ff 1238 var = negate_expr (var);
2bc77e10 1239 }
23ec2d5e 1240
1241 return var;
1242}
1243
1244/* Re-associate trees split by the above function. T1 and T2 are either
1245 expressions to associate or null. Return the new expression, if any. If
b07ba9ff 1246 we build an operation, do it in TYPE and with CODE. */
23ec2d5e 1247
1248static tree
de1b648b 1249associate_trees (tree t1, tree t2, enum tree_code code, tree type)
23ec2d5e 1250{
23ec2d5e 1251 if (t1 == 0)
1252 return t2;
1253 else if (t2 == 0)
1254 return t1;
1255
23ec2d5e 1256 /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
1257 try to fold this since we will have infinite recursion. But do
1258 deal with any NEGATE_EXPRs. */
1259 if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
1260 || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
1261 {
5a3fb4d3 1262 if (code == PLUS_EXPR)
1263 {
1264 if (TREE_CODE (t1) == NEGATE_EXPR)
fd96eeef 1265 return build2 (MINUS_EXPR, type, fold_convert (type, t2),
1266 fold_convert (type, TREE_OPERAND (t1, 0)));
5a3fb4d3 1267 else if (TREE_CODE (t2) == NEGATE_EXPR)
fd96eeef 1268 return build2 (MINUS_EXPR, type, fold_convert (type, t1),
1269 fold_convert (type, TREE_OPERAND (t2, 0)));
faab57e3 1270 else if (integer_zerop (t2))
1271 return fold_convert (type, t1);
5a3fb4d3 1272 }
faab57e3 1273 else if (code == MINUS_EXPR)
1274 {
1275 if (integer_zerop (t2))
1276 return fold_convert (type, t1);
1277 }
1278
fd96eeef 1279 return build2 (code, type, fold_convert (type, t1),
1280 fold_convert (type, t2));
23ec2d5e 1281 }
1282
fd96eeef 1283 return fold (build2 (code, type, fold_convert (type, t1),
1284 fold_convert (type, t2)));
2bc77e10 1285}
1286\f
0dbd1c74 1287/* Combine two integer constants ARG1 and ARG2 under operation CODE
2bc77e10 1288 to produce a new constant.
5485823f 1289
15d769aa 1290 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
2bc77e10 1291
4ee9c684 1292tree
de1b648b 1293int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
2bc77e10 1294{
a0c2c45b 1295 unsigned HOST_WIDE_INT int1l, int2l;
1296 HOST_WIDE_INT int1h, int2h;
1297 unsigned HOST_WIDE_INT low;
1298 HOST_WIDE_INT hi;
1299 unsigned HOST_WIDE_INT garbagel;
1300 HOST_WIDE_INT garbageh;
19cb6b50 1301 tree t;
15d769aa 1302 tree type = TREE_TYPE (arg1);
78a8ed03 1303 int uns = TYPE_UNSIGNED (type);
15d769aa 1304 int is_sizetype
1305 = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
0dbd1c74 1306 int overflow = 0;
1307 int no_overflow = 0;
8ea862a9 1308
0dbd1c74 1309 int1l = TREE_INT_CST_LOW (arg1);
1310 int1h = TREE_INT_CST_HIGH (arg1);
1311 int2l = TREE_INT_CST_LOW (arg2);
1312 int2h = TREE_INT_CST_HIGH (arg2);
1313
1314 switch (code)
2bc77e10 1315 {
0dbd1c74 1316 case BIT_IOR_EXPR:
1317 low = int1l | int2l, hi = int1h | int2h;
1318 break;
2bc77e10 1319
0dbd1c74 1320 case BIT_XOR_EXPR:
1321 low = int1l ^ int2l, hi = int1h ^ int2h;
1322 break;
2bc77e10 1323
0dbd1c74 1324 case BIT_AND_EXPR:
1325 low = int1l & int2l, hi = int1h & int2h;
1326 break;
2bc77e10 1327
0dbd1c74 1328 case RSHIFT_EXPR:
cc049fa3 1329 int2l = -int2l;
0dbd1c74 1330 case LSHIFT_EXPR:
1331 /* It's unclear from the C standard whether shifts can overflow.
1332 The following code ignores overflow; perhaps a C standard
1333 interpretation ruling is needed. */
15d769aa 1334 lshift_double (int1l, int1h, int2l, TYPE_PRECISION (type),
02e7a332 1335 &low, &hi, !uns);
0dbd1c74 1336 no_overflow = 1;
1337 break;
2bc77e10 1338
0dbd1c74 1339 case RROTATE_EXPR:
1340 int2l = - int2l;
1341 case LROTATE_EXPR:
15d769aa 1342 lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (type),
0dbd1c74 1343 &low, &hi);
1344 break;
2bc77e10 1345
0dbd1c74 1346 case PLUS_EXPR:
1347 overflow = add_double (int1l, int1h, int2l, int2h, &low, &hi);
1348 break;
2bc77e10 1349
0dbd1c74 1350 case MINUS_EXPR:
1351 neg_double (int2l, int2h, &low, &hi);
1352 add_double (int1l, int1h, low, hi, &low, &hi);
083a2b5e 1353 overflow = OVERFLOW_SUM_SIGN (hi, int2h, int1h);
0dbd1c74 1354 break;
2bc77e10 1355
0dbd1c74 1356 case MULT_EXPR:
1357 overflow = mul_double (int1l, int1h, int2l, int2h, &low, &hi);
1358 break;
2bc77e10 1359
0dbd1c74 1360 case TRUNC_DIV_EXPR:
1361 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1362 case EXACT_DIV_EXPR:
1363 /* This is a shortcut for a common special case. */
a0c2c45b 1364 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
0dbd1c74 1365 && ! TREE_CONSTANT_OVERFLOW (arg1)
1366 && ! TREE_CONSTANT_OVERFLOW (arg2)
a0c2c45b 1367 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
0dbd1c74 1368 {
1369 if (code == CEIL_DIV_EXPR)
1370 int1l += int2l - 1;
a0c2c45b 1371
0dbd1c74 1372 low = int1l / int2l, hi = 0;
2bc77e10 1373 break;
0dbd1c74 1374 }
2bc77e10 1375
6312a35e 1376 /* ... fall through ... */
2bc77e10 1377
cc049fa3 1378 case ROUND_DIV_EXPR:
0dbd1c74 1379 if (int2h == 0 && int2l == 1)
1380 {
1381 low = int1l, hi = int1h;
2bc77e10 1382 break;
0dbd1c74 1383 }
1384 if (int1l == int2l && int1h == int2h
1385 && ! (int1l == 0 && int1h == 0))
1386 {
1387 low = 1, hi = 0;
c13e6dce 1388 break;
0dbd1c74 1389 }
15d769aa 1390 overflow = div_and_round_double (code, uns, int1l, int1h, int2l, int2h,
0dbd1c74 1391 &low, &hi, &garbagel, &garbageh);
1392 break;
c13e6dce 1393
0dbd1c74 1394 case TRUNC_MOD_EXPR:
1395 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1396 /* This is a shortcut for a common special case. */
a0c2c45b 1397 if (int2h == 0 && (HOST_WIDE_INT) int2l > 0
0dbd1c74 1398 && ! TREE_CONSTANT_OVERFLOW (arg1)
1399 && ! TREE_CONSTANT_OVERFLOW (arg2)
a0c2c45b 1400 && int1h == 0 && (HOST_WIDE_INT) int1l >= 0)
0dbd1c74 1401 {
1402 if (code == CEIL_MOD_EXPR)
1403 int1l += int2l - 1;
1404 low = int1l % int2l, hi = 0;
c13e6dce 1405 break;
0dbd1c74 1406 }
c13e6dce 1407
6312a35e 1408 /* ... fall through ... */
0dbd1c74 1409
cc049fa3 1410 case ROUND_MOD_EXPR:
0dbd1c74 1411 overflow = div_and_round_double (code, uns,
1412 int1l, int1h, int2l, int2h,
1413 &garbagel, &garbageh, &low, &hi);
1414 break;
1415
1416 case MIN_EXPR:
1417 case MAX_EXPR:
1418 if (uns)
083a2b5e 1419 low = (((unsigned HOST_WIDE_INT) int1h
1420 < (unsigned HOST_WIDE_INT) int2h)
1421 || (((unsigned HOST_WIDE_INT) int1h
1422 == (unsigned HOST_WIDE_INT) int2h)
a0c2c45b 1423 && int1l < int2l));
a3f1e3ec 1424 else
a0c2c45b 1425 low = (int1h < int2h
1426 || (int1h == int2h && int1l < int2l));
083a2b5e 1427
0dbd1c74 1428 if (low == (code == MIN_EXPR))
1429 low = int1l, hi = int1h;
1430 else
1431 low = int2l, hi = int2h;
1432 break;
8ea862a9 1433
0dbd1c74 1434 default:
fdada98f 1435 gcc_unreachable ();
8ea862a9 1436 }
0dbd1c74 1437
7016c612 1438 t = build_int_cst_wide (TREE_TYPE (arg1), low, hi);
0dbd1c74 1439
4d28c5d1 1440 if (notrunc)
1441 {
1442 /* Propagate overflow flags ourselves. */
1443 if (((!uns || is_sizetype) && overflow)
1444 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
00b76131 1445 {
1446 t = copy_node (t);
1447 TREE_OVERFLOW (t) = 1;
1448 TREE_CONSTANT_OVERFLOW (t) = 1;
1449 }
1450 else if (TREE_CONSTANT_OVERFLOW (arg1) | TREE_CONSTANT_OVERFLOW (arg2))
1451 {
1452 t = copy_node (t);
1453 TREE_CONSTANT_OVERFLOW (t) = 1;
1454 }
4d28c5d1 1455 }
1456 else
1457 t = force_fit_type (t, 1,
1458 ((!uns || is_sizetype) && overflow)
1459 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2),
1460 TREE_CONSTANT_OVERFLOW (arg1)
1461 | TREE_CONSTANT_OVERFLOW (arg2));
0c5713a2 1462
0dbd1c74 1463 return t;
1464}
1465
083a2b5e 1466/* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1467 constant. We assume ARG1 and ARG2 have the same data type, or at least
1468 are the same kind of constant and the same machine mode.
0dbd1c74 1469
1470 If NOTRUNC is nonzero, do not truncate the result to fit the data type. */
1471
1472static tree
de1b648b 1473const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
0dbd1c74 1474{
cc049fa3 1475 STRIP_NOPS (arg1);
1476 STRIP_NOPS (arg2);
0dbd1c74 1477
1478 if (TREE_CODE (arg1) == INTEGER_CST)
15d769aa 1479 return int_const_binop (code, arg1, arg2, notrunc);
0dbd1c74 1480
2bc77e10 1481 if (TREE_CODE (arg1) == REAL_CST)
1482 {
276beea2 1483 enum machine_mode mode;
9a24cfc6 1484 REAL_VALUE_TYPE d1;
1485 REAL_VALUE_TYPE d2;
536f5fb1 1486 REAL_VALUE_TYPE value;
276beea2 1487 tree t, type;
2bc77e10 1488
9a24cfc6 1489 d1 = TREE_REAL_CST (arg1);
1490 d2 = TREE_REAL_CST (arg2);
9248d3e0 1491
276beea2 1492 type = TREE_TYPE (arg1);
1493 mode = TYPE_MODE (type);
1494
1495 /* Don't perform operation if we honor signaling NaNs and
1496 either operand is a NaN. */
1497 if (HONOR_SNANS (mode)
1498 && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1499 return NULL_TREE;
1500
1501 /* Don't perform operation if it would raise a division
1502 by zero exception. */
1503 if (code == RDIV_EXPR
1504 && REAL_VALUES_EQUAL (d2, dconst0)
1505 && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1506 return NULL_TREE;
1507
9248d3e0 1508 /* If either operand is a NaN, just return it. Otherwise, set up
1509 for floating-point trap; we return an overflow. */
1510 if (REAL_VALUE_ISNAN (d1))
1511 return arg1;
1512 else if (REAL_VALUE_ISNAN (d2))
1513 return arg2;
70192c5e 1514
536f5fb1 1515 REAL_ARITHMETIC (value, code, d1, d2);
cc049fa3 1516
276beea2 1517 t = build_real (type, real_value_truncate (mode, value));
23fed9b2 1518
4d28c5d1 1519 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
23fed9b2 1520 TREE_CONSTANT_OVERFLOW (t)
1521 = TREE_OVERFLOW (t)
1522 | TREE_CONSTANT_OVERFLOW (arg1)
1523 | TREE_CONSTANT_OVERFLOW (arg2);
c0244247 1524 return t;
2bc77e10 1525 }
2bc77e10 1526 if (TREE_CODE (arg1) == COMPLEX_CST)
1527 {
19cb6b50 1528 tree type = TREE_TYPE (arg1);
1529 tree r1 = TREE_REALPART (arg1);
1530 tree i1 = TREE_IMAGPART (arg1);
1531 tree r2 = TREE_REALPART (arg2);
1532 tree i2 = TREE_IMAGPART (arg2);
1533 tree t;
2bc77e10 1534
1535 switch (code)
1536 {
1537 case PLUS_EXPR:
5b2ade4d 1538 t = build_complex (type,
1539 const_binop (PLUS_EXPR, r1, r2, notrunc),
5485823f 1540 const_binop (PLUS_EXPR, i1, i2, notrunc));
2bc77e10 1541 break;
1542
1543 case MINUS_EXPR:
5b2ade4d 1544 t = build_complex (type,
1545 const_binop (MINUS_EXPR, r1, r2, notrunc),
5485823f 1546 const_binop (MINUS_EXPR, i1, i2, notrunc));
2bc77e10 1547 break;
1548
1549 case MULT_EXPR:
5b2ade4d 1550 t = build_complex (type,
1551 const_binop (MINUS_EXPR,
5485823f 1552 const_binop (MULT_EXPR,
1553 r1, r2, notrunc),
1554 const_binop (MULT_EXPR,
1555 i1, i2, notrunc),
1556 notrunc),
2bc77e10 1557 const_binop (PLUS_EXPR,
5485823f 1558 const_binop (MULT_EXPR,
1559 r1, i2, notrunc),
1560 const_binop (MULT_EXPR,
1561 i1, r2, notrunc),
1562 notrunc));
2bc77e10 1563 break;
1564
1565 case RDIV_EXPR:
1566 {
19cb6b50 1567 tree magsquared
2bc77e10 1568 = const_binop (PLUS_EXPR,
5485823f 1569 const_binop (MULT_EXPR, r2, r2, notrunc),
1570 const_binop (MULT_EXPR, i2, i2, notrunc),
1571 notrunc);
56d9b5a8 1572
5b2ade4d 1573 t = build_complex (type,
1574 const_binop
1575 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1576 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1577 const_binop (PLUS_EXPR,
1578 const_binop (MULT_EXPR, r1, r2,
1579 notrunc),
1580 const_binop (MULT_EXPR, i1, i2,
1581 notrunc),
1582 notrunc),
1583 magsquared, notrunc),
1584 const_binop
1585 (INTEGRAL_TYPE_P (TREE_TYPE (r1))
1586 ? TRUNC_DIV_EXPR : RDIV_EXPR,
1587 const_binop (MINUS_EXPR,
1588 const_binop (MULT_EXPR, i1, r2,
1589 notrunc),
1590 const_binop (MULT_EXPR, r1, i2,
1591 notrunc),
1592 notrunc),
1593 magsquared, notrunc));
2bc77e10 1594 }
1595 break;
1596
1597 default:
fdada98f 1598 gcc_unreachable ();
2bc77e10 1599 }
2bc77e10 1600 return t;
1601 }
1602 return 0;
1603}
15d769aa 1604
85390276 1605/* Create a size type INT_CST node with NUMBER sign extended. KIND
1606 indicates which particular sizetype to create. */
083a2b5e 1607
902de8ed 1608tree
1e9d55d7 1609size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
902de8ed 1610{
85390276 1611 return build_int_cst (sizetype_tab[(int) kind], number);
902de8ed 1612}
85390276 1613\f
902de8ed 1614/* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE
1615 is a tree code. The type of the result is taken from the operands.
1616 Both must be the same type integer type and it must be a size type.
2bc77e10 1617 If the operands are constant, so is the result. */
1618
1619tree
de1b648b 1620size_binop (enum tree_code code, tree arg0, tree arg1)
2bc77e10 1621{
902de8ed 1622 tree type = TREE_TYPE (arg0);
1623
fdada98f 1624 gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1625 && type == TREE_TYPE (arg1));
902de8ed 1626
2bc77e10 1627 /* Handle the special case of two integer constants faster. */
1628 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1629 {
1630 /* And some specific cases even faster than that. */
a7baffe5 1631 if (code == PLUS_EXPR && integer_zerop (arg0))
2bc77e10 1632 return arg1;
a7baffe5 1633 else if ((code == MINUS_EXPR || code == PLUS_EXPR)
1634 && integer_zerop (arg1))
2bc77e10 1635 return arg0;
a7baffe5 1636 else if (code == MULT_EXPR && integer_onep (arg0))
2bc77e10 1637 return arg1;
a7baffe5 1638
2bc77e10 1639 /* Handle general case of two integer constants. */
15d769aa 1640 return int_const_binop (code, arg0, arg1, 0);
2bc77e10 1641 }
1642
1643 if (arg0 == error_mark_node || arg1 == error_mark_node)
1644 return error_mark_node;
1645
fd96eeef 1646 return fold (build2 (code, type, arg0, arg1));
2bc77e10 1647}
3fd3b688 1648
902de8ed 1649/* Given two values, either both of sizetype or both of bitsizetype,
1650 compute the difference between the two values. Return the value
1651 in signed type corresponding to the type of the operands. */
3fd3b688 1652
1653tree
de1b648b 1654size_diffop (tree arg0, tree arg1)
3fd3b688 1655{
902de8ed 1656 tree type = TREE_TYPE (arg0);
1657 tree ctype;
3fd3b688 1658
fdada98f 1659 gcc_assert (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type)
1660 && type == TREE_TYPE (arg1));
3fd3b688 1661
902de8ed 1662 /* If the type is already signed, just do the simple thing. */
78a8ed03 1663 if (!TYPE_UNSIGNED (type))
902de8ed 1664 return size_binop (MINUS_EXPR, arg0, arg1);
1665
e2134ab3 1666 ctype = type == bitsizetype ? sbitsizetype : ssizetype;
902de8ed 1667
1668 /* If either operand is not a constant, do the conversions to the signed
1669 type and subtract. The hardware will do the right thing with any
1670 overflow in the subtraction. */
1671 if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
b30e3dbc 1672 return size_binop (MINUS_EXPR, fold_convert (ctype, arg0),
1673 fold_convert (ctype, arg1));
902de8ed 1674
1675 /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1676 Otherwise, subtract the other way, convert to CTYPE (we know that can't
1677 overflow) and negate (which can't either). Special-case a result
1678 of zero while we're here. */
1679 if (tree_int_cst_equal (arg0, arg1))
b30e3dbc 1680 return fold_convert (ctype, integer_zero_node);
902de8ed 1681 else if (tree_int_cst_lt (arg1, arg0))
b30e3dbc 1682 return fold_convert (ctype, size_binop (MINUS_EXPR, arg0, arg1));
902de8ed 1683 else
b30e3dbc 1684 return size_binop (MINUS_EXPR, fold_convert (ctype, integer_zero_node),
1685 fold_convert (ctype, size_binop (MINUS_EXPR,
1686 arg1, arg0)));
3fd3b688 1687}
2bc77e10 1688\f
80db63ef 1689/* Construct a vector of zero elements of vector type TYPE. */
1690
1691static tree
1692build_zero_vector (tree type)
1693{
1694 tree elem, list;
1695 int i, units;
1696
1697 elem = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
1698 units = TYPE_VECTOR_SUBPARTS (type);
1699
1700 list = NULL_TREE;
1701 for (i = 0; i < units; i++)
1702 list = tree_cons (NULL_TREE, elem, list);
1703 return build_vector (type, list);
1704}
1705
70192c5e 1706
04b253e8 1707/* Attempt to fold type conversion operation CODE of expression ARG1 to
1708 type TYPE. If no simplification can be done return NULL_TREE. */
2bc77e10 1709
1710static tree
04b253e8 1711fold_convert_const (enum tree_code code, tree type, tree arg1)
2bc77e10 1712{
23fed9b2 1713 int overflow = 0;
04b253e8 1714 tree t;
1715
1716 if (TREE_TYPE (arg1) == type)
1717 return arg1;
2bc77e10 1718
997d68fe 1719 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
2bc77e10 1720 {
1721 if (TREE_CODE (arg1) == INTEGER_CST)
1722 {
ccf05f85 1723 /* If we would build a constant wider than GCC supports,
1724 leave the conversion unfolded. */
1725 if (TYPE_PRECISION (type) > 2 * HOST_BITS_PER_WIDE_INT)
04b253e8 1726 return NULL_TREE;
ccf05f85 1727
2bc77e10 1728 /* Given an integer constant, make new constant with new type,
1729 appropriately sign-extended or truncated. */
7016c612 1730 t = build_int_cst_wide (type, TREE_INT_CST_LOW (arg1),
1731 TREE_INT_CST_HIGH (arg1));
4d28c5d1 1732
1733 t = force_fit_type (t,
1734 /* Don't set the overflow when
1735 converting a pointer */
1736 !POINTER_TYPE_P (TREE_TYPE (arg1)),
1737 (TREE_INT_CST_HIGH (arg1) < 0
1738 && (TYPE_UNSIGNED (type)
1739 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1740 | TREE_OVERFLOW (arg1),
1741 TREE_CONSTANT_OVERFLOW (arg1));
04b253e8 1742 return t;
2bc77e10 1743 }
2bc77e10 1744 else if (TREE_CODE (arg1) == REAL_CST)
1745 {
67c65562 1746 /* The following code implements the floating point to integer
1747 conversion rules required by the Java Language Specification,
1748 that IEEE NaNs are mapped to zero and values that overflow
1749 the target precision saturate, i.e. values greater than
1750 INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1751 are mapped to INT_MIN. These semantics are allowed by the
1752 C and C++ standards that simply state that the behavior of
1753 FP-to-integer conversion is unspecified upon overflow. */
1754
1755 HOST_WIDE_INT high, low;
04b253e8 1756 REAL_VALUE_TYPE r;
67c65562 1757 REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
04b253e8 1758
1759 switch (code)
1760 {
1761 case FIX_TRUNC_EXPR:
1762 real_trunc (&r, VOIDmode, &x);
1763 break;
1764
1765 case FIX_CEIL_EXPR:
1766 real_ceil (&r, VOIDmode, &x);
1767 break;
1768
1769 case FIX_FLOOR_EXPR:
1770 real_floor (&r, VOIDmode, &x);
1771 break;
1772
50c90ea2 1773 case FIX_ROUND_EXPR:
1774 real_round (&r, VOIDmode, &x);
1775 break;
1776
04b253e8 1777 default:
fdada98f 1778 gcc_unreachable ();
04b253e8 1779 }
1780
1781 /* If R is NaN, return zero and show we have an overflow. */
1782 if (REAL_VALUE_ISNAN (r))
67c65562 1783 {
1784 overflow = 1;
1785 high = 0;
1786 low = 0;
1787 }
f52483b5 1788
04b253e8 1789 /* See if R is less than the lower bound or greater than the
1790 upper bound. */
23fed9b2 1791
67c65562 1792 if (! overflow)
1793 {
1794 tree lt = TYPE_MIN_VALUE (type);
1795 REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
04b253e8 1796 if (REAL_VALUES_LESS (r, l))
67c65562 1797 {
1798 overflow = 1;
1799 high = TREE_INT_CST_HIGH (lt);
1800 low = TREE_INT_CST_LOW (lt);
1801 }
1802 }
1803
1804 if (! overflow)
1805 {
1806 tree ut = TYPE_MAX_VALUE (type);
1807 if (ut)
1808 {
1809 REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
04b253e8 1810 if (REAL_VALUES_LESS (u, r))
67c65562 1811 {
1812 overflow = 1;
1813 high = TREE_INT_CST_HIGH (ut);
1814 low = TREE_INT_CST_LOW (ut);
1815 }
1816 }
1817 }
1818
1819 if (! overflow)
04b253e8 1820 REAL_VALUE_TO_INT (&low, &high, r);
67c65562 1821
7016c612 1822 t = build_int_cst_wide (type, low, high);
4d28c5d1 1823
1824 t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg1),
1825 TREE_CONSTANT_OVERFLOW (arg1));
04b253e8 1826 return t;
2bc77e10 1827 }
2bc77e10 1828 }
1829 else if (TREE_CODE (type) == REAL_TYPE)
1830 {
2bc77e10 1831 if (TREE_CODE (arg1) == INTEGER_CST)
1832 return build_real_from_int_cst (type, arg1);
2bc77e10 1833 if (TREE_CODE (arg1) == REAL_CST)
c0244247 1834 {
9248d3e0 1835 if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
55a78ca1 1836 {
95ed90bf 1837 /* We make a copy of ARG1 so that we don't modify an
1838 existing constant tree. */
1839 t = copy_node (arg1);
1840 TREE_TYPE (t) = type;
55a78ca1 1841 return t;
1842 }
70192c5e 1843
536f5fb1 1844 t = build_real (type,
1845 real_value_truncate (TYPE_MODE (type),
1846 TREE_REAL_CST (arg1)));
23fed9b2 1847
4d28c5d1 1848 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
23fed9b2 1849 TREE_CONSTANT_OVERFLOW (t)
1850 = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
c0244247 1851 return t;
1852 }
2bc77e10 1853 }
04b253e8 1854 return NULL_TREE;
2bc77e10 1855}
b30e3dbc 1856
1857/* Convert expression ARG to type TYPE. Used by the middle-end for
1858 simple conversions in preference to calling the front-end's convert. */
1859
d7aeca92 1860tree
b30e3dbc 1861fold_convert (tree type, tree arg)
1862{
1863 tree orig = TREE_TYPE (arg);
1864 tree tem;
1865
1866 if (type == orig)
1867 return arg;
1868
1869 if (TREE_CODE (arg) == ERROR_MARK
1870 || TREE_CODE (type) == ERROR_MARK
1871 || TREE_CODE (orig) == ERROR_MARK)
1872 return error_mark_node;
1873
88e62366 1874 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)
1875 || lang_hooks.types_compatible_p (TYPE_MAIN_VARIANT (type),
1876 TYPE_MAIN_VARIANT (orig)))
b30e3dbc 1877 return fold (build1 (NOP_EXPR, type, arg));
1878
fdada98f 1879 switch (TREE_CODE (type))
b30e3dbc 1880 {
fdada98f 1881 case INTEGER_TYPE: case CHAR_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
1882 case POINTER_TYPE: case REFERENCE_TYPE:
1883 case OFFSET_TYPE:
b30e3dbc 1884 if (TREE_CODE (arg) == INTEGER_CST)
1885 {
1886 tem = fold_convert_const (NOP_EXPR, type, arg);
1887 if (tem != NULL_TREE)
1888 return tem;
1889 }
8d4b8f86 1890 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1891 || TREE_CODE (orig) == OFFSET_TYPE)
b30e3dbc 1892 return fold (build1 (NOP_EXPR, type, arg));
1893 if (TREE_CODE (orig) == COMPLEX_TYPE)
1894 {
1895 tem = fold (build1 (REALPART_EXPR, TREE_TYPE (orig), arg));
1896 return fold_convert (type, tem);
1897 }
fdada98f 1898 gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
1899 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1900 return fold (build1 (NOP_EXPR, type, arg));
0c5713a2 1901
fdada98f 1902 case REAL_TYPE:
b30e3dbc 1903 if (TREE_CODE (arg) == INTEGER_CST)
1904 {
1905 tem = fold_convert_const (FLOAT_EXPR, type, arg);
1906 if (tem != NULL_TREE)
1907 return tem;
1908 }
1909 else if (TREE_CODE (arg) == REAL_CST)
1910 {
1911 tem = fold_convert_const (NOP_EXPR, type, arg);
1912 if (tem != NULL_TREE)
1913 return tem;
1914 }
1915
fdada98f 1916 switch (TREE_CODE (orig))
b30e3dbc 1917 {
fdada98f 1918 case INTEGER_TYPE: case CHAR_TYPE:
1919 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1920 case POINTER_TYPE: case REFERENCE_TYPE:
1921 return fold (build1 (FLOAT_EXPR, type, arg));
0c5713a2 1922
fdada98f 1923 case REAL_TYPE:
1924 return fold (build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
1925 type, arg));
0c5713a2 1926
fdada98f 1927 case COMPLEX_TYPE:
b30e3dbc 1928 tem = fold (build1 (REALPART_EXPR, TREE_TYPE (orig), arg));
1929 return fold_convert (type, tem);
0c5713a2 1930
fdada98f 1931 default:
1932 gcc_unreachable ();
b30e3dbc 1933 }
0c5713a2 1934
fdada98f 1935 case COMPLEX_TYPE:
1936 switch (TREE_CODE (orig))
1937 {
1938 case INTEGER_TYPE: case CHAR_TYPE:
1939 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1940 case POINTER_TYPE: case REFERENCE_TYPE:
1941 case REAL_TYPE:
1942 return build2 (COMPLEX_EXPR, type,
1943 fold_convert (TREE_TYPE (type), arg),
1944 fold_convert (TREE_TYPE (type), integer_zero_node));
1945 case COMPLEX_TYPE:
1946 {
1947 tree rpart, ipart;
0c5713a2 1948
fdada98f 1949 if (TREE_CODE (arg) == COMPLEX_EXPR)
1950 {
1951 rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
1952 ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
1953 return fold (build2 (COMPLEX_EXPR, type, rpart, ipart));
1954 }
0c5713a2 1955
fdada98f 1956 arg = save_expr (arg);
1957 rpart = fold (build1 (REALPART_EXPR, TREE_TYPE (orig), arg));
1958 ipart = fold (build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg));
1959 rpart = fold_convert (TREE_TYPE (type), rpart);
1960 ipart = fold_convert (TREE_TYPE (type), ipart);
1961 return fold (build2 (COMPLEX_EXPR, type, rpart, ipart));
1962 }
0c5713a2 1963
fdada98f 1964 default:
1965 gcc_unreachable ();
1966 }
0c5713a2 1967
fdada98f 1968 case VECTOR_TYPE:
80db63ef 1969 if (integer_zerop (arg))
1970 return build_zero_vector (type);
fdada98f 1971 gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1972 gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1973 || TREE_CODE (orig) == VECTOR_TYPE);
1974 return fold (build1 (NOP_EXPR, type, arg));
b30e3dbc 1975
fdada98f 1976 case VOID_TYPE:
1977 return fold (build1 (CONVERT_EXPR, type, fold_ignored_result (arg)));
b30e3dbc 1978
fdada98f 1979 default:
1980 gcc_unreachable ();
b30e3dbc 1981 }
b30e3dbc 1982}
2bc77e10 1983\f
84791d69 1984/* Return an expr equal to X but certainly not valid as an lvalue. */
2bc77e10 1985
1986tree
de1b648b 1987non_lvalue (tree x)
2bc77e10 1988{
0dedabfa 1989 /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
1990 us. */
1991 if (in_gimple_form)
1992 return x;
1993
f4d47aeb 1994 /* We only need to wrap lvalue tree codes. */
1995 switch (TREE_CODE (x))
1996 {
1997 case VAR_DECL:
1998 case PARM_DECL:
1999 case RESULT_DECL:
2000 case LABEL_DECL:
2001 case FUNCTION_DECL:
2002 case SSA_NAME:
2003
2004 case COMPONENT_REF:
2005 case INDIRECT_REF:
b056d812 2006 case ALIGN_INDIRECT_REF:
2007 case MISALIGNED_INDIRECT_REF:
f4d47aeb 2008 case ARRAY_REF:
6374121b 2009 case ARRAY_RANGE_REF:
f4d47aeb 2010 case BIT_FIELD_REF:
215e2f1d 2011 case OBJ_TYPE_REF:
f4d47aeb 2012
2013 case REALPART_EXPR:
2014 case IMAGPART_EXPR:
2015 case PREINCREMENT_EXPR:
2016 case PREDECREMENT_EXPR:
2017 case SAVE_EXPR:
f4d47aeb 2018 case TRY_CATCH_EXPR:
2019 case WITH_CLEANUP_EXPR:
2020 case COMPOUND_EXPR:
2021 case MODIFY_EXPR:
2022 case TARGET_EXPR:
2023 case COND_EXPR:
2024 case BIND_EXPR:
2025 case MIN_EXPR:
2026 case MAX_EXPR:
f4d47aeb 2027 break;
2028
2029 default:
2030 /* Assume the worst for front-end tree codes. */
2031 if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2032 break;
84791d69 2033 return x;
f4d47aeb 2034 }
4ee9c684 2035 return build1 (NON_LVALUE_EXPR, TREE_TYPE (x), x);
2bc77e10 2036}
56753054 2037
b12c26dc 2038/* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2039 Zero means allow extended lvalues. */
2040
2041int pedantic_lvalues;
2042
56753054 2043/* When pedantic, return an expr equal to X but certainly not valid as a
2044 pedantic lvalue. Otherwise, return X. */
2045
d50efa49 2046static tree
de1b648b 2047pedantic_non_lvalue (tree x)
56753054 2048{
b12c26dc 2049 if (pedantic_lvalues)
56753054 2050 return non_lvalue (x);
2051 else
2052 return x;
2053}
e233264a 2054\f
2055/* Given a tree comparison code, return the code that is the logical inverse
2056 of the given code. It is not safe to do this for floating-point
318a728f 2057 comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
2058 as well: if reversing the comparison is unsafe, return ERROR_MARK. */
2bc77e10 2059
e233264a 2060static enum tree_code
318a728f 2061invert_tree_comparison (enum tree_code code, bool honor_nans)
e233264a 2062{
318a728f 2063 if (honor_nans && flag_trapping_math)
2064 return ERROR_MARK;
2065
e233264a 2066 switch (code)
2067 {
2068 case EQ_EXPR:
2069 return NE_EXPR;
2070 case NE_EXPR:
2071 return EQ_EXPR;
2072 case GT_EXPR:
318a728f 2073 return honor_nans ? UNLE_EXPR : LE_EXPR;
e233264a 2074 case GE_EXPR:
318a728f 2075 return honor_nans ? UNLT_EXPR : LT_EXPR;
e233264a 2076 case LT_EXPR:
318a728f 2077 return honor_nans ? UNGE_EXPR : GE_EXPR;
e233264a 2078 case LE_EXPR:
318a728f 2079 return honor_nans ? UNGT_EXPR : GT_EXPR;
2080 case LTGT_EXPR:
2081 return UNEQ_EXPR;
2082 case UNEQ_EXPR:
2083 return LTGT_EXPR;
2084 case UNGT_EXPR:
2085 return LE_EXPR;
2086 case UNGE_EXPR:
2087 return LT_EXPR;
2088 case UNLT_EXPR:
2089 return GE_EXPR;
2090 case UNLE_EXPR:
e233264a 2091 return GT_EXPR;
318a728f 2092 case ORDERED_EXPR:
2093 return UNORDERED_EXPR;
2094 case UNORDERED_EXPR:
2095 return ORDERED_EXPR;
e233264a 2096 default:
fdada98f 2097 gcc_unreachable ();
e233264a 2098 }
2099}
2100
2101/* Similar, but return the comparison that results if the operands are
2102 swapped. This is safe for floating-point. */
2103
cc0bdf91 2104enum tree_code
de1b648b 2105swap_tree_comparison (enum tree_code code)
e233264a 2106{
2107 switch (code)
2108 {
2109 case EQ_EXPR:
2110 case NE_EXPR:
2111 return code;
2112 case GT_EXPR:
2113 return LT_EXPR;
2114 case GE_EXPR:
2115 return LE_EXPR;
2116 case LT_EXPR:
2117 return GT_EXPR;
2118 case LE_EXPR:
2119 return GE_EXPR;
2120 default:
fdada98f 2121 gcc_unreachable ();
e233264a 2122 }
2123}
8b94828f 2124
7835f163 2125
2126/* Convert a comparison tree code from an enum tree_code representation
2127 into a compcode bit-based encoding. This function is the inverse of
2128 compcode_to_comparison. */
2129
318a728f 2130static enum comparison_code
de1b648b 2131comparison_to_compcode (enum tree_code code)
7835f163 2132{
2133 switch (code)
2134 {
2135 case LT_EXPR:
2136 return COMPCODE_LT;
2137 case EQ_EXPR:
2138 return COMPCODE_EQ;
2139 case LE_EXPR:
2140 return COMPCODE_LE;
2141 case GT_EXPR:
2142 return COMPCODE_GT;
2143 case NE_EXPR:
2144 return COMPCODE_NE;
2145 case GE_EXPR:
2146 return COMPCODE_GE;
318a728f 2147 case ORDERED_EXPR:
2148 return COMPCODE_ORD;
2149 case UNORDERED_EXPR:
2150 return COMPCODE_UNORD;
2151 case UNLT_EXPR:
2152 return COMPCODE_UNLT;
2153 case UNEQ_EXPR:
2154 return COMPCODE_UNEQ;
2155 case UNLE_EXPR:
2156 return COMPCODE_UNLE;
2157 case UNGT_EXPR:
2158 return COMPCODE_UNGT;
2159 case LTGT_EXPR:
2160 return COMPCODE_LTGT;
2161 case UNGE_EXPR:
2162 return COMPCODE_UNGE;
7835f163 2163 default:
fdada98f 2164 gcc_unreachable ();
7835f163 2165 }
2166}
2167
2168/* Convert a compcode bit-based encoding of a comparison operator back
2169 to GCC's enum tree_code representation. This function is the
2170 inverse of comparison_to_compcode. */
2171
2172static enum tree_code
318a728f 2173compcode_to_comparison (enum comparison_code code)
7835f163 2174{
2175 switch (code)
2176 {
2177 case COMPCODE_LT:
2178 return LT_EXPR;
2179 case COMPCODE_EQ:
2180 return EQ_EXPR;
2181 case COMPCODE_LE:
2182 return LE_EXPR;
2183 case COMPCODE_GT:
2184 return GT_EXPR;
2185 case COMPCODE_NE:
2186 return NE_EXPR;
2187 case COMPCODE_GE:
2188 return GE_EXPR;
318a728f 2189 case COMPCODE_ORD:
2190 return ORDERED_EXPR;
2191 case COMPCODE_UNORD:
2192 return UNORDERED_EXPR;
2193 case COMPCODE_UNLT:
2194 return UNLT_EXPR;
2195 case COMPCODE_UNEQ:
2196 return UNEQ_EXPR;
2197 case COMPCODE_UNLE:
2198 return UNLE_EXPR;
2199 case COMPCODE_UNGT:
2200 return UNGT_EXPR;
2201 case COMPCODE_LTGT:
2202 return LTGT_EXPR;
2203 case COMPCODE_UNGE:
2204 return UNGE_EXPR;
7835f163 2205 default:
fdada98f 2206 gcc_unreachable ();
7835f163 2207 }
2208}
2209
318a728f 2210/* Return a tree for the comparison which is the combination of
2211 doing the AND or OR (depending on CODE) of the two operations LCODE
2212 and RCODE on the identical operands LL_ARG and LR_ARG. Take into account
2213 the possibility of trapping if the mode has NaNs, and return NULL_TREE
2214 if this makes the transformation invalid. */
2215
2216tree
2217combine_comparisons (enum tree_code code, enum tree_code lcode,
2218 enum tree_code rcode, tree truth_type,
2219 tree ll_arg, tree lr_arg)
2220{
2221 bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2222 enum comparison_code lcompcode = comparison_to_compcode (lcode);
2223 enum comparison_code rcompcode = comparison_to_compcode (rcode);
2224 enum comparison_code compcode;
2225
2226 switch (code)
2227 {
2228 case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2229 compcode = lcompcode & rcompcode;
2230 break;
2231
2232 case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2233 compcode = lcompcode | rcompcode;
2234 break;
2235
2236 default:
2237 return NULL_TREE;
2238 }
2239
2240 if (!honor_nans)
2241 {
2242 /* Eliminate unordered comparisons, as well as LTGT and ORD
2243 which are not used unless the mode has NaNs. */
2244 compcode &= ~COMPCODE_UNORD;
2245 if (compcode == COMPCODE_LTGT)
2246 compcode = COMPCODE_NE;
2247 else if (compcode == COMPCODE_ORD)
2248 compcode = COMPCODE_TRUE;
2249 }
2250 else if (flag_trapping_math)
2251 {
7206da1b 2252 /* Check that the original operation and the optimized ones will trap
318a728f 2253 under the same condition. */
2254 bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2255 && (lcompcode != COMPCODE_EQ)
2256 && (lcompcode != COMPCODE_ORD);
2257 bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2258 && (rcompcode != COMPCODE_EQ)
2259 && (rcompcode != COMPCODE_ORD);
2260 bool trap = (compcode & COMPCODE_UNORD) == 0
2261 && (compcode != COMPCODE_EQ)
2262 && (compcode != COMPCODE_ORD);
2263
2264 /* In a short-circuited boolean expression the LHS might be
2265 such that the RHS, if evaluated, will never trap. For
2266 example, in ORD (x, y) && (x < y), we evaluate the RHS only
2267 if neither x nor y is NaN. (This is a mixed blessing: for
2268 example, the expression above will never trap, hence
2269 optimizing it to x < y would be invalid). */
2270 if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2271 || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2272 rtrap = false;
2273
2274 /* If the comparison was short-circuited, and only the RHS
2275 trapped, we may now generate a spurious trap. */
2276 if (rtrap && !ltrap
2277 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2278 return NULL_TREE;
2279
2280 /* If we changed the conditions that cause a trap, we lose. */
2281 if ((ltrap || rtrap) != trap)
2282 return NULL_TREE;
2283 }
2284
2285 if (compcode == COMPCODE_TRUE)
20783f07 2286 return constant_boolean_node (true, truth_type);
318a728f 2287 else if (compcode == COMPCODE_FALSE)
20783f07 2288 return constant_boolean_node (false, truth_type);
318a728f 2289 else
2290 return fold (build2 (compcode_to_comparison (compcode),
2291 truth_type, ll_arg, lr_arg));
2292}
2293
8b94828f 2294/* Return nonzero if CODE is a tree code that represents a truth value. */
2295
2296static int
de1b648b 2297truth_value_p (enum tree_code code)
8b94828f 2298{
ce45a448 2299 return (TREE_CODE_CLASS (code) == tcc_comparison
8b94828f 2300 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2301 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2302 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
2303}
e233264a 2304\f
9e6f4cc9 2305/* Return nonzero if two operands (typically of the same tree node)
2306 are necessarily equal. If either argument has side-effects this
365db11e 2307 function returns zero. FLAGS modifies behavior as follows:
9e6f4cc9 2308
4ee9c684 2309 If OEP_ONLY_CONST is set, only return nonzero for constants.
11acc1df 2310 This function tests whether the operands are indistinguishable;
2311 it does not test whether they are equal using C's == operation.
2312 The distinction is important for IEEE floating point, because
2313 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
9e6f4cc9 2314 (2) two NaNs may be indistinguishable, but NaN!=NaN.
2315
4ee9c684 2316 If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
9e6f4cc9 2317 even though it may hold multiple values during a function.
2318 This is because a GCC tree node guarantees that nothing else is
2319 executed between the evaluation of its "operands" (which may often
2320 be evaluated in arbitrary order). Hence if the operands themselves
2321 don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
9b931277 2322 same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST
2323 unset means assuming isochronic (or instantaneous) tree equivalence.
2324 Unless comparing arbitrary expression trees, such as from different
2325 statements, this flag can usually be left unset.
4ee9c684 2326
2327 If OEP_PURE_SAME is set, then pure functions with identical arguments
2328 are considered the same. It is used when the caller has other ways
2329 to ensure that global memory is unchanged in between. */
2bc77e10 2330
2331int
4ee9c684 2332operand_equal_p (tree arg0, tree arg1, unsigned int flags)
2bc77e10 2333{
e715d92e 2334 /* If one is specified and the other isn't, they aren't equal and if
2335 neither is specified, they are.
2336
2337 ??? This is temporary and is meant only to handle the cases of the
2338 optional operands for COMPONENT_REF and ARRAY_REF. */
2339 if ((arg0 && !arg1) || (!arg0 && arg1))
2340 return 0;
2341 else if (!arg0 && !arg1)
2342 return 1;
78a8ed03 2343 /* If either is ERROR_MARK, they aren't equal. */
e715d92e 2344 else if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK)
78a8ed03 2345 return 0;
2346
2bc77e10 2347 /* If both types don't have the same signedness, then we can't consider
2348 them equal. We must check this before the STRIP_NOPS calls
2349 because they may change the signedness of the arguments. */
78a8ed03 2350 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2bc77e10 2351 return 0;
2352
2353 STRIP_NOPS (arg0);
2354 STRIP_NOPS (arg1);
2355
8faaadf1 2356 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2357 /* This is needed for conversions and for COMPONENT_REF.
2358 Might as well play it safe and always test this. */
6a4737bf 2359 || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2360 || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
8faaadf1 2361 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2bc77e10 2362 return 0;
2363
8faaadf1 2364 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2365 We don't care about side effects in that case because the SAVE_EXPR
2366 takes care of that for us. In all other cases, two expressions are
2367 equal if they have no side effects. If we have two identical
2368 expressions with side effects that should be treated the same due
2369 to the only side effects being identical SAVE_EXPR's, that will
2370 be detected in the recursive calls below. */
4ee9c684 2371 if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
8faaadf1 2372 && (TREE_CODE (arg0) == SAVE_EXPR
2373 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2bc77e10 2374 return 1;
2375
8faaadf1 2376 /* Next handle constant cases, those for which we can return 1 even
2377 if ONLY_CONST is set. */
2378 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2379 switch (TREE_CODE (arg0))
2380 {
2381 case INTEGER_CST:
d3041b98 2382 return (! TREE_CONSTANT_OVERFLOW (arg0)
2383 && ! TREE_CONSTANT_OVERFLOW (arg1)
a0c2c45b 2384 && tree_int_cst_equal (arg0, arg1));
8faaadf1 2385
2386 case REAL_CST:
d3041b98 2387 return (! TREE_CONSTANT_OVERFLOW (arg0)
2388 && ! TREE_CONSTANT_OVERFLOW (arg1)
62aa7862 2389 && REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2390 TREE_REAL_CST (arg1)));
8faaadf1 2391
886cfd4f 2392 case VECTOR_CST:
2393 {
2394 tree v1, v2;
2395
2396 if (TREE_CONSTANT_OVERFLOW (arg0)
2397 || TREE_CONSTANT_OVERFLOW (arg1))
2398 return 0;
2399
2400 v1 = TREE_VECTOR_CST_ELTS (arg0);
2401 v2 = TREE_VECTOR_CST_ELTS (arg1);
2402 while (v1 && v2)
2403 {
11cb6006 2404 if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
4ee9c684 2405 flags))
886cfd4f 2406 return 0;
2407 v1 = TREE_CHAIN (v1);
2408 v2 = TREE_CHAIN (v2);
2409 }
2410
2411 return 1;
2412 }
2413
8faaadf1 2414 case COMPLEX_CST:
2415 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
4ee9c684 2416 flags)
8faaadf1 2417 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
4ee9c684 2418 flags));
8faaadf1 2419
2420 case STRING_CST:
2421 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
6b918462 2422 && ! memcmp (TREE_STRING_POINTER (arg0),
8faaadf1 2423 TREE_STRING_POINTER (arg1),
2424 TREE_STRING_LENGTH (arg0)));
2425
2426 case ADDR_EXPR:
2427 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2428 0);
0dbd1c74 2429 default:
2430 break;
8faaadf1 2431 }
2bc77e10 2432
4ee9c684 2433 if (flags & OEP_ONLY_CONST)
2bc77e10 2434 return 0;
2435
2bc77e10 2436 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2437 {
ce45a448 2438 case tcc_unary:
2bc77e10 2439 /* Two conversions are equal only if signedness and modes match. */
e6546627 2440 switch (TREE_CODE (arg0))
2441 {
2442 case NOP_EXPR:
2443 case CONVERT_EXPR:
2444 case FIX_CEIL_EXPR:
2445 case FIX_TRUNC_EXPR:
2446 case FIX_FLOOR_EXPR:
2447 case FIX_ROUND_EXPR:
2448 if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2449 != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2450 return 0;
2451 break;
2452 default:
2453 break;
2454 }
2bc77e10 2455
e715d92e 2456 return operand_equal_p (TREE_OPERAND (arg0, 0),
2457 TREE_OPERAND (arg1, 0), flags);
2bc77e10 2458
ce45a448 2459 case tcc_comparison:
2460 case tcc_binary:
e715d92e 2461 if (operand_equal_p (TREE_OPERAND (arg0, 0),
2462 TREE_OPERAND (arg1, 0), flags)
2463 && operand_equal_p (TREE_OPERAND (arg0, 1),
2464 TREE_OPERAND (arg1, 1), flags))
8faaadf1 2465 return 1;
2466
2467 /* For commutative ops, allow the other order. */
21dff555 2468 return (commutative_tree_code (TREE_CODE (arg0))
8faaadf1 2469 && operand_equal_p (TREE_OPERAND (arg0, 0),
4ee9c684 2470 TREE_OPERAND (arg1, 1), flags)
2bc77e10 2471 && operand_equal_p (TREE_OPERAND (arg0, 1),
4ee9c684 2472 TREE_OPERAND (arg1, 0), flags));
2bc77e10 2473
ce45a448 2474 case tcc_reference:
06506f5d 2475 /* If either of the pointer (or reference) expressions we are
2476 dereferencing contain a side effect, these cannot be equal. */
dbc71562 2477 if (TREE_SIDE_EFFECTS (arg0)
2478 || TREE_SIDE_EFFECTS (arg1))
2479 return 0;
2480
2bc77e10 2481 switch (TREE_CODE (arg0))
2482 {
2483 case INDIRECT_REF:
b056d812 2484 case ALIGN_INDIRECT_REF:
2485 case MISALIGNED_INDIRECT_REF:
b25de375 2486 case REALPART_EXPR:
2487 case IMAGPART_EXPR:
e715d92e 2488 return operand_equal_p (TREE_OPERAND (arg0, 0),
2489 TREE_OPERAND (arg1, 0), flags);
2bc77e10 2490
2bc77e10 2491 case ARRAY_REF:
ba04d9d5 2492 case ARRAY_RANGE_REF:
e715d92e 2493 return (operand_equal_p (TREE_OPERAND (arg0, 0),
2494 TREE_OPERAND (arg1, 0), flags)
2495 && operand_equal_p (TREE_OPERAND (arg0, 1),
2496 TREE_OPERAND (arg1, 1), flags)
2497 && operand_equal_p (TREE_OPERAND (arg0, 2),
2498 TREE_OPERAND (arg1, 2), flags)
2499 && operand_equal_p (TREE_OPERAND (arg0, 3),
2500 TREE_OPERAND (arg1, 3), flags));
2501
6ab43650 2502
2503 case COMPONENT_REF:
e715d92e 2504 return (operand_equal_p (TREE_OPERAND (arg0, 0),
2505 TREE_OPERAND (arg1, 0), flags)
2506 && operand_equal_p (TREE_OPERAND (arg0, 1),
2507 TREE_OPERAND (arg1, 1), flags)
2508 && operand_equal_p (TREE_OPERAND (arg0, 2),
2509 TREE_OPERAND (arg1, 2), flags));
2bc77e10 2510
8d061c60 2511
e715d92e 2512 case BIT_FIELD_REF:
2513 return (operand_equal_p (TREE_OPERAND (arg0, 0),
2514 TREE_OPERAND (arg1, 0), flags)
2515 && operand_equal_p (TREE_OPERAND (arg0, 1),
2516 TREE_OPERAND (arg1, 1), flags)
2517 && operand_equal_p (TREE_OPERAND (arg0, 2),
2518 TREE_OPERAND (arg1, 2), flags));
0dbd1c74 2519 default:
2520 return 0;
2bc77e10 2521 }
1d322a97 2522
ce45a448 2523 case tcc_expression:
564989a5 2524 switch (TREE_CODE (arg0))
2525 {
2526 case ADDR_EXPR:
2527 case TRUTH_NOT_EXPR:
e715d92e 2528 return operand_equal_p (TREE_OPERAND (arg0, 0),
2529 TREE_OPERAND (arg1, 0), flags);
564989a5 2530
bd975dc2 2531 case TRUTH_ANDIF_EXPR:
2532 case TRUTH_ORIF_EXPR:
e715d92e 2533 return operand_equal_p (TREE_OPERAND (arg0, 0),
2534 TREE_OPERAND (arg1, 0), flags)
2535 && operand_equal_p (TREE_OPERAND (arg0, 1),
2536 TREE_OPERAND (arg1, 1), flags);
bd975dc2 2537
2538 case TRUTH_AND_EXPR:
2539 case TRUTH_OR_EXPR:
2540 case TRUTH_XOR_EXPR:
2541 return (operand_equal_p (TREE_OPERAND (arg0, 0),
e715d92e 2542 TREE_OPERAND (arg1, 0), flags)
bd975dc2 2543 && operand_equal_p (TREE_OPERAND (arg0, 1),
e715d92e 2544 TREE_OPERAND (arg1, 1), flags))
2545 || (operand_equal_p (TREE_OPERAND (arg0, 0),
2546 TREE_OPERAND (arg1, 1), flags)
2547 && operand_equal_p (TREE_OPERAND (arg0, 1),
2548 TREE_OPERAND (arg1, 0), flags));
bd975dc2 2549
06506f5d 2550 case CALL_EXPR:
2551 /* If the CALL_EXPRs call different functions, then they
2552 clearly can not be equal. */
e715d92e 2553 if (! operand_equal_p (TREE_OPERAND (arg0, 0),
2554 TREE_OPERAND (arg1, 0), flags))
06506f5d 2555 return 0;
2556
4ee9c684 2557 {
2558 unsigned int cef = call_expr_flags (arg0);
2559 if (flags & OEP_PURE_SAME)
2560 cef &= ECF_CONST | ECF_PURE;
2561 else
2562 cef &= ECF_CONST;
2563 if (!cef)
2564 return 0;
2565 }
06506f5d 2566
2567 /* Now see if all the arguments are the same. operand_equal_p
2568 does not handle TREE_LIST, so we walk the operands here
2569 feeding them to operand_equal_p. */
2570 arg0 = TREE_OPERAND (arg0, 1);
2571 arg1 = TREE_OPERAND (arg1, 1);
2572 while (arg0 && arg1)
2573 {
4ee9c684 2574 if (! operand_equal_p (TREE_VALUE (arg0), TREE_VALUE (arg1),
2575 flags))
06506f5d 2576 return 0;
2577
2578 arg0 = TREE_CHAIN (arg0);
2579 arg1 = TREE_CHAIN (arg1);
2580 }
2581
2582 /* If we get here and both argument lists are exhausted
2583 then the CALL_EXPRs are equal. */
2584 return ! (arg0 || arg1);
2585
564989a5 2586 default:
2587 return 0;
2588 }
cc049fa3 2589
ce45a448 2590 case tcc_declaration:
4ee9c684 2591 /* Consider __builtin_sqrt equal to sqrt. */
2592 return (TREE_CODE (arg0) == FUNCTION_DECL
2593 && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2594 && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2595 && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
06506f5d 2596
0dbd1c74 2597 default:
2598 return 0;
2bc77e10 2599 }
2bc77e10 2600}
e233264a 2601\f
2602/* Similar to operand_equal_p, but see if ARG0 might have been made by
cc049fa3 2603 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
2bc77e10 2604
2bc77e10 2605 When in doubt, return 0. */
2606
cc049fa3 2607static int
de1b648b 2608operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
2bc77e10 2609{
e233264a 2610 int unsignedp1, unsignedpo;
df7caa7b 2611 tree primarg0, primarg1, primother;
02e7a332 2612 unsigned int correct_width;
2bc77e10 2613
e233264a 2614 if (operand_equal_p (arg0, arg1, 0))
2bc77e10 2615 return 1;
2616
154e6f12 2617 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
2618 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
2bc77e10 2619 return 0;
2620
df7caa7b 2621 /* Discard any conversions that don't change the modes of ARG0 and ARG1
2622 and see if the inner values are the same. This removes any
2623 signedness comparison, which doesn't matter here. */
2624 primarg0 = arg0, primarg1 = arg1;
cc049fa3 2625 STRIP_NOPS (primarg0);
2626 STRIP_NOPS (primarg1);
df7caa7b 2627 if (operand_equal_p (primarg0, primarg1, 0))
2628 return 1;
2629
e233264a 2630 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
2631 actual comparison operand, ARG0.
2bc77e10 2632
e233264a 2633 First throw away any conversions to wider types
2bc77e10 2634 already present in the operands. */
2bc77e10 2635
e233264a 2636 primarg1 = get_narrower (arg1, &unsignedp1);
2637 primother = get_narrower (other, &unsignedpo);
2638
2639 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
2640 if (unsignedp1 == unsignedpo
2641 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
2642 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
2bc77e10 2643 {
e233264a 2644 tree type = TREE_TYPE (arg0);
2bc77e10 2645
2646 /* Make sure shorter operand is extended the right way
2647 to match the longer operand. */
fa8b888f 2648 primarg1 = fold_convert (lang_hooks.types.signed_or_unsigned_type
b30e3dbc 2649 (unsignedp1, TREE_TYPE (primarg1)), primarg1);
2bc77e10 2650
b30e3dbc 2651 if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
2bc77e10 2652 return 1;
2653 }
2654
2655 return 0;
2656}
2657\f
eb2f80f3 2658/* See if ARG is an expression that is either a comparison or is performing
e233264a 2659 arithmetic on comparisons. The comparisons must only be comparing
2660 two different values, which will be stored in *CVAL1 and *CVAL2; if
6ef828f9 2661 they are nonzero it means that some operands have already been found.
e233264a 2662 No variables may be used anywhere else in the expression except in the
d0314131 2663 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
2664 the expression and save_expr needs to be called with CVAL1 and CVAL2.
e233264a 2665
2666 If this is true, return 1. Otherwise, return zero. */
2667
2668static int
de1b648b 2669twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
e233264a 2670{
2671 enum tree_code code = TREE_CODE (arg);
ce45a448 2672 enum tree_code_class class = TREE_CODE_CLASS (code);
e233264a 2673
ce45a448 2674 /* We can handle some of the tcc_expression cases here. */
2675 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
2676 class = tcc_unary;
2677 else if (class == tcc_expression
e233264a 2678 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2679 || code == COMPOUND_EXPR))
ce45a448 2680 class = tcc_binary;
8be91fe5 2681
ce45a448 2682 else if (class == tcc_expression && code == SAVE_EXPR
083a2b5e 2683 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
d0314131 2684 {
2685 /* If we've already found a CVAL1 or CVAL2, this expression is
2686 two complex to handle. */
2687 if (*cval1 || *cval2)
2688 return 0;
2689
ce45a448 2690 class = tcc_unary;
d0314131 2691 *save_p = 1;
2692 }
e233264a 2693
2694 switch (class)
2695 {
ce45a448 2696 case tcc_unary:
d0314131 2697 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
e233264a 2698
ce45a448 2699 case tcc_binary:
d0314131 2700 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2701 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2702 cval1, cval2, save_p));
e233264a 2703
ce45a448 2704 case tcc_constant:
e233264a 2705 return 1;
2706
ce45a448 2707 case tcc_expression:
e233264a 2708 if (code == COND_EXPR)
d0314131 2709 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2710 cval1, cval2, save_p)
2711 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2712 cval1, cval2, save_p)
e233264a 2713 && twoval_comparison_p (TREE_OPERAND (arg, 2),
d0314131 2714 cval1, cval2, save_p));
e233264a 2715 return 0;
cc049fa3 2716
ce45a448 2717 case tcc_comparison:
e233264a 2718 /* First see if we can handle the first operand, then the second. For
2719 the second operand, we know *CVAL1 can't be zero. It must be that
2720 one side of the comparison is each of the values; test for the
2721 case where this isn't true by failing if the two operands
2722 are the same. */
2723
2724 if (operand_equal_p (TREE_OPERAND (arg, 0),
2725 TREE_OPERAND (arg, 1), 0))
2726 return 0;
2727
2728 if (*cval1 == 0)
2729 *cval1 = TREE_OPERAND (arg, 0);
2730 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2731 ;
2732 else if (*cval2 == 0)
2733 *cval2 = TREE_OPERAND (arg, 0);
2734 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2735 ;
2736 else
2737 return 0;
2738
2739 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2740 ;
2741 else if (*cval2 == 0)
2742 *cval2 = TREE_OPERAND (arg, 1);
2743 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2744 ;
2745 else
2746 return 0;
2747
2748 return 1;
e233264a 2749
0dbd1c74 2750 default:
2751 return 0;
2752 }
e233264a 2753}
2754\f
2755/* ARG is a tree that is known to contain just arithmetic operations and
2756 comparisons. Evaluate the operations in the tree substituting NEW0 for
eb2f80f3 2757 any occurrence of OLD0 as an operand of a comparison and likewise for
e233264a 2758 NEW1 and OLD1. */
2759
2760static tree
de1b648b 2761eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
e233264a 2762{
2763 tree type = TREE_TYPE (arg);
2764 enum tree_code code = TREE_CODE (arg);
ce45a448 2765 enum tree_code_class class = TREE_CODE_CLASS (code);
e233264a 2766
ce45a448 2767 /* We can handle some of the tcc_expression cases here. */
2768 if (class == tcc_expression && code == TRUTH_NOT_EXPR)
2769 class = tcc_unary;
2770 else if (class == tcc_expression
e233264a 2771 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
ce45a448 2772 class = tcc_binary;
e233264a 2773
2774 switch (class)
2775 {
ce45a448 2776 case tcc_unary:
e233264a 2777 return fold (build1 (code, type,
2778 eval_subst (TREE_OPERAND (arg, 0),
2779 old0, new0, old1, new1)));
2780
ce45a448 2781 case tcc_binary:
fd96eeef 2782 return fold (build2 (code, type,
2783 eval_subst (TREE_OPERAND (arg, 0),
2784 old0, new0, old1, new1),
2785 eval_subst (TREE_OPERAND (arg, 1),
2786 old0, new0, old1, new1)));
e233264a 2787
ce45a448 2788 case tcc_expression:
e233264a 2789 switch (code)
2790 {
2791 case SAVE_EXPR:
2792 return eval_subst (TREE_OPERAND (arg, 0), old0, new0, old1, new1);
2793
2794 case COMPOUND_EXPR:
2795 return eval_subst (TREE_OPERAND (arg, 1), old0, new0, old1, new1);
2796
2797 case COND_EXPR:
fd96eeef 2798 return fold (build3 (code, type,
2799 eval_subst (TREE_OPERAND (arg, 0),
2800 old0, new0, old1, new1),
2801 eval_subst (TREE_OPERAND (arg, 1),
2802 old0, new0, old1, new1),
2803 eval_subst (TREE_OPERAND (arg, 2),
2804 old0, new0, old1, new1)));
0dbd1c74 2805 default:
2806 break;
e233264a 2807 }
b4b174c3 2808 /* Fall through - ??? */
e233264a 2809
ce45a448 2810 case tcc_comparison:
e233264a 2811 {
2812 tree arg0 = TREE_OPERAND (arg, 0);
2813 tree arg1 = TREE_OPERAND (arg, 1);
2814
2815 /* We need to check both for exact equality and tree equality. The
2816 former will be true if the operand has a side-effect. In that
2817 case, we know the operand occurred exactly once. */
2818
2819 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2820 arg0 = new0;
2821 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2822 arg0 = new1;
2823
2824 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2825 arg1 = new0;
2826 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2827 arg1 = new1;
2828
fd96eeef 2829 return fold (build2 (code, type, arg0, arg1));
e233264a 2830 }
e233264a 2831
0dbd1c74 2832 default:
2833 return arg;
2834 }
e233264a 2835}
2836\f
2bc77e10 2837/* Return a tree for the case when the result of an expression is RESULT
2838 converted to TYPE and OMITTED was previously an operand of the expression
2839 but is now not needed (e.g., we folded OMITTED * 0).
2840
2841 If OMITTED has side effects, we must evaluate it. Otherwise, just do
2842 the conversion of RESULT to TYPE. */
2843
e9f80ff5 2844tree
de1b648b 2845omit_one_operand (tree type, tree result, tree omitted)
2bc77e10 2846{
b30e3dbc 2847 tree t = fold_convert (type, result);
2bc77e10 2848
2849 if (TREE_SIDE_EFFECTS (omitted))
db97ad41 2850 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
2bc77e10 2851
c3ce5d04 2852 return non_lvalue (t);
2bc77e10 2853}
6df5edfa 2854
2855/* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
2856
2857static tree
de1b648b 2858pedantic_omit_one_operand (tree type, tree result, tree omitted)
6df5edfa 2859{
b30e3dbc 2860 tree t = fold_convert (type, result);
6df5edfa 2861
2862 if (TREE_SIDE_EFFECTS (omitted))
db97ad41 2863 return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t);
6df5edfa 2864
2865 return pedantic_non_lvalue (t);
2866}
9bc9f15f 2867
2868/* Return a tree for the case when the result of an expression is RESULT
2869 converted to TYPE and OMITTED1 and OMITTED2 were previously operands
2870 of the expression but are now not needed.
2871
2872 If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
2873 If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
2874 evaluated before OMITTED2. Otherwise, if neither has side effects,
2875 just do the conversion of RESULT to TYPE. */
2876
2877tree
2878omit_two_operands (tree type, tree result, tree omitted1, tree omitted2)
2879{
2880 tree t = fold_convert (type, result);
2881
2882 if (TREE_SIDE_EFFECTS (omitted2))
2883 t = build2 (COMPOUND_EXPR, type, omitted2, t);
2884 if (TREE_SIDE_EFFECTS (omitted1))
2885 t = build2 (COMPOUND_EXPR, type, omitted1, t);
2886
2887 return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue (t) : t;
2888}
2889
2bc77e10 2890\f
46b0e007 2891/* Return a simplified tree node for the truth-negation of ARG. This
2892 never alters ARG itself. We assume that ARG is an operation that
318a728f 2893 returns a truth value (0 or 1).
2bc77e10 2894
318a728f 2895 FIXME: one would think we would fold the result, but it causes
2896 problems with the dominator optimizer. */
2bc77e10 2897tree
de1b648b 2898invert_truthvalue (tree arg)
2bc77e10 2899{
2900 tree type = TREE_TYPE (arg);
e233264a 2901 enum tree_code code = TREE_CODE (arg);
2bc77e10 2902
c34cc7e5 2903 if (code == ERROR_MARK)
2904 return arg;
2905
e233264a 2906 /* If this is a comparison, we can simply invert it, except for
2907 floating-point non-equality comparisons, in which case we just
2908 enclose a TRUTH_NOT_EXPR around what we have. */
2bc77e10 2909
ce45a448 2910 if (TREE_CODE_CLASS (code) == tcc_comparison)
2bc77e10 2911 {
318a728f 2912 tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
2913 if (FLOAT_TYPE_P (op_type)
2914 && flag_trapping_math
2915 && code != ORDERED_EXPR && code != UNORDERED_EXPR
2916 && code != NE_EXPR && code != EQ_EXPR)
5f03fd61 2917 return build1 (TRUTH_NOT_EXPR, type, arg);
e233264a 2918 else
318a728f 2919 {
2920 code = invert_tree_comparison (code,
2921 HONOR_NANS (TYPE_MODE (op_type)));
2922 if (code == ERROR_MARK)
2923 return build1 (TRUTH_NOT_EXPR, type, arg);
2924 else
2925 return build2 (code, type,
2926 TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1));
2927 }
e233264a 2928 }
2bc77e10 2929
e233264a 2930 switch (code)
2931 {
2bc77e10 2932 case INTEGER_CST:
7c446c95 2933 return fold_convert (type,
7016c612 2934 build_int_cst (NULL_TREE, integer_zerop (arg)));
2bc77e10 2935
2936 case TRUTH_AND_EXPR:
fd96eeef 2937 return build2 (TRUTH_OR_EXPR, type,
2938 invert_truthvalue (TREE_OPERAND (arg, 0)),
2939 invert_truthvalue (TREE_OPERAND (arg, 1)));
2bc77e10 2940
2941 case TRUTH_OR_EXPR:
fd96eeef 2942 return build2 (TRUTH_AND_EXPR, type,
2943 invert_truthvalue (TREE_OPERAND (arg, 0)),
2944 invert_truthvalue (TREE_OPERAND (arg, 1)));
2bc77e10 2945
9a7b73a1 2946 case TRUTH_XOR_EXPR:
2947 /* Here we can invert either operand. We invert the first operand
2948 unless the second operand is a TRUTH_NOT_EXPR in which case our
2949 result is the XOR of the first operand with the inside of the
2950 negation of the second operand. */
2951
2952 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
fd96eeef 2953 return build2 (TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
2954 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
9a7b73a1 2955 else
fd96eeef 2956 return build2 (TRUTH_XOR_EXPR, type,
2957 invert_truthvalue (TREE_OPERAND (arg, 0)),
2958 TREE_OPERAND (arg, 1));
9a7b73a1 2959
2bc77e10 2960 case TRUTH_ANDIF_EXPR:
fd96eeef 2961 return build2 (TRUTH_ORIF_EXPR, type,
2962 invert_truthvalue (TREE_OPERAND (arg, 0)),
2963 invert_truthvalue (TREE_OPERAND (arg, 1)));
2bc77e10 2964
2965 case TRUTH_ORIF_EXPR:
fd96eeef 2966 return build2 (TRUTH_ANDIF_EXPR, type,
2967 invert_truthvalue (TREE_OPERAND (arg, 0)),
2968 invert_truthvalue (TREE_OPERAND (arg, 1)));
2bc77e10 2969
2970 case TRUTH_NOT_EXPR:
2971 return TREE_OPERAND (arg, 0);
2972
2973 case COND_EXPR:
fd96eeef 2974 return build3 (COND_EXPR, type, TREE_OPERAND (arg, 0),
2975 invert_truthvalue (TREE_OPERAND (arg, 1)),
2976 invert_truthvalue (TREE_OPERAND (arg, 2)));
2bc77e10 2977
3139f3ce 2978 case COMPOUND_EXPR:
fd96eeef 2979 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg, 0),
2980 invert_truthvalue (TREE_OPERAND (arg, 1)));
3139f3ce 2981
2bc77e10 2982 case NON_LVALUE_EXPR:
2983 return invert_truthvalue (TREE_OPERAND (arg, 0));
2984
2985 case NOP_EXPR:
4ee9c684 2986 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
2987 break;
2988
2bc77e10 2989 case CONVERT_EXPR:
2990 case FLOAT_EXPR:
2991 return build1 (TREE_CODE (arg), type,
2992 invert_truthvalue (TREE_OPERAND (arg, 0)));
2993
2994 case BIT_AND_EXPR:
c35387e1 2995 if (!integer_onep (TREE_OPERAND (arg, 1)))
2996 break;
fd96eeef 2997 return build2 (EQ_EXPR, type, arg,
2998 fold_convert (type, integer_zero_node));
2bc77e10 2999
468d693c 3000 case SAVE_EXPR:
3001 return build1 (TRUTH_NOT_EXPR, type, arg);
f33c3a83 3002
3003 case CLEANUP_POINT_EXPR:
3004 return build1 (CLEANUP_POINT_EXPR, type,
3005 invert_truthvalue (TREE_OPERAND (arg, 0)));
0dbd1c74 3006
3007 default:
3008 break;
c35387e1 3009 }
fdada98f 3010 gcc_assert (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE);
c35387e1 3011 return build1 (TRUTH_NOT_EXPR, type, arg);
2bc77e10 3012}
3013
3014/* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3015 operands are another bit-wise operation with a common input. If so,
3016 distribute the bit operations to save an operation and possibly two if
3017 constants are involved. For example, convert
de1b648b 3018 (A | B) & (A | C) into A | (B & C)
2bc77e10 3019 Further simplification will occur if B and C are constants.
3020
3021 If this optimization cannot be done, 0 will be returned. */
3022
3023static tree
de1b648b 3024distribute_bit_expr (enum tree_code code, tree type, tree arg0, tree arg1)
2bc77e10 3025{
3026 tree common;
3027 tree left, right;
3028
3029 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3030 || TREE_CODE (arg0) == code
5b1de181 3031 || (TREE_CODE (arg0) != BIT_AND_EXPR
3032 && TREE_CODE (arg0) != BIT_IOR_EXPR))
2bc77e10 3033 return 0;
3034
3035 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3036 {
3037 common = TREE_OPERAND (arg0, 0);
3038 left = TREE_OPERAND (arg0, 1);
3039 right = TREE_OPERAND (arg1, 1);
3040 }
3041 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3042 {
3043 common = TREE_OPERAND (arg0, 0);
3044 left = TREE_OPERAND (arg0, 1);
3045 right = TREE_OPERAND (arg1, 0);
3046 }
3047 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3048 {
3049 common = TREE_OPERAND (arg0, 1);
3050 left = TREE_OPERAND (arg0, 0);
3051 right = TREE_OPERAND (arg1, 1);
3052 }
3053 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3054 {
3055 common = TREE_OPERAND (arg0, 1);
3056 left = TREE_OPERAND (arg0, 0);
3057 right = TREE_OPERAND (arg1, 0);
3058 }
3059 else
3060 return 0;
3061
fd96eeef 3062 return fold (build2 (TREE_CODE (arg0), type, common,
3063 fold (build2 (code, type, left, right))));
2bc77e10 3064}
3065\f
3066/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
6ef828f9 3067 starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */
2bc77e10 3068
3069static tree
dc81944a 3070make_bit_field_ref (tree inner, tree type, int bitsize, int bitpos,
3071 int unsignedp)
2bc77e10 3072{
fd96eeef 3073 tree result = build3 (BIT_FIELD_REF, type, inner,
3074 size_int (bitsize), bitsize_int (bitpos));
2bc77e10 3075
86ae60fd 3076 BIT_FIELD_REF_UNSIGNED (result) = unsignedp;
2bc77e10 3077
3078 return result;
3079}
3080
3081/* Optimize a bit-field compare.
3082
3083 There are two cases: First is a compare against a constant and the
3084 second is a comparison of two items where the fields are at the same
3085 bit position relative to the start of a chunk (byte, halfword, word)
3086 large enough to contain it. In these cases we can avoid the shift
3087 implicit in bitfield extractions.
3088
3089 For constants, we emit a compare of the shifted constant with the
3090 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3091 compared. For two fields at the same position, we do the ANDs with the
3092 similar mask and compare the result of the ANDs.
3093
3094 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3095 COMPARE_TYPE is the type of the comparison, and LHS and RHS
3096 are the left and right operands of the comparison, respectively.
3097
4bbea254 3098 If the optimization described above can be done, we return the resulting
2bc77e10 3099 tree. Otherwise we return zero. */
3100
3101static tree
dc81944a 3102optimize_bit_field_compare (enum tree_code code, tree compare_type,
3103 tree lhs, tree rhs)
2bc77e10 3104{
02e7a332 3105 HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
2bc77e10 3106 tree type = TREE_TYPE (lhs);
3107 tree signed_type, unsigned_type;
3108 int const_p = TREE_CODE (rhs) == INTEGER_CST;
4d1060a2 3109 enum machine_mode lmode, rmode, nmode;
2bc77e10 3110 int lunsignedp, runsignedp;
3111 int lvolatilep = 0, rvolatilep = 0;
93b6a460 3112 tree linner, rinner = NULL_TREE;
2bc77e10 3113 tree mask;
bbfbdece 3114 tree offset;
2bc77e10 3115
3116 /* Get all the information about the extractions being done. If the bit size
3117 if the same as the size of the underlying object, we aren't doing an
155b05dc 3118 extraction at all and so can do nothing. We also don't want to
3119 do anything if the inner expression is a PLACEHOLDER_EXPR since we
3120 then will no longer be able to replace it. */
bbfbdece 3121 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
2b96c5f6 3122 &lunsignedp, &lvolatilep);
f73497ef 3123 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
155b05dc 3124 || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
2bc77e10 3125 return 0;
3126
3127 if (!const_p)
3128 {
3129 /* If this is not a constant, we can only do something if bit positions,
1e625a2e 3130 sizes, and signedness are the same. */
417d3458 3131 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
2b96c5f6 3132 &runsignedp, &rvolatilep);
2bc77e10 3133
f73497ef 3134 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
155b05dc 3135 || lunsignedp != runsignedp || offset != 0
3136 || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
2bc77e10 3137 return 0;
3138 }
3139
3140 /* See if we can find a mode to refer to this field. We should be able to,
3141 but fail if we can't. */
4d1060a2 3142 nmode = get_best_mode (lbitsize, lbitpos,
3143 const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3144 : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3145 TYPE_ALIGN (TREE_TYPE (rinner))),
3146 word_mode, lvolatilep || rvolatilep);
3147 if (nmode == VOIDmode)
2bc77e10 3148 return 0;
3149
3150 /* Set signed and unsigned types of the precision of this mode for the
3151 shifts below. */
fa8b888f 3152 signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3153 unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
2bc77e10 3154
2bc77e10 3155 /* Compute the bit position and size for the new reference and our offset
3156 within it. If the new reference is the same size as the original, we
3157 won't optimize anything, so return zero. */
4d1060a2 3158 nbitsize = GET_MODE_BITSIZE (nmode);
3159 nbitpos = lbitpos & ~ (nbitsize - 1);
3160 lbitpos -= nbitpos;
3161 if (nbitsize == lbitsize)
2bc77e10 3162 return 0;
3163
51356f86 3164 if (BYTES_BIG_ENDIAN)
4d1060a2 3165 lbitpos = nbitsize - lbitsize - lbitpos;
2bc77e10 3166
3167 /* Make the mask to be used against the extracted field. */
7016c612 3168 mask = build_int_cst (unsigned_type, -1);
4d28c5d1 3169 mask = force_fit_type (mask, 0, false, false);
b30e3dbc 3170 mask = fold_convert (unsigned_type, mask);
4d1060a2 3171 mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0);
2bc77e10 3172 mask = const_binop (RSHIFT_EXPR, mask,
4d1060a2 3173 size_int (nbitsize - lbitsize - lbitpos), 0);
2bc77e10 3174
3175 if (! const_p)
3176 /* If not comparing with constant, just rework the comparison
3177 and return. */
fd96eeef 3178 return build2 (code, compare_type,
3179 build2 (BIT_AND_EXPR, unsigned_type,
3180 make_bit_field_ref (linner, unsigned_type,
3181 nbitsize, nbitpos, 1),
3182 mask),
3183 build2 (BIT_AND_EXPR, unsigned_type,
3184 make_bit_field_ref (rinner, unsigned_type,
3185 nbitsize, nbitpos, 1),
3186 mask));
2bc77e10 3187
3188 /* Otherwise, we are handling the constant case. See if the constant is too
3189 big for the field. Warn and return a tree of for 0 (false) if so. We do
3190 this not only for its own sake, but to avoid having to test for this
3191 error case below. If we didn't, we might generate wrong code.
3192
3193 For unsigned fields, the constant shifted right by the field length should
cc049fa3 3194 be all zero. For signed fields, the high-order bits should agree with
2bc77e10 3195 the sign bit. */
3196
3197 if (lunsignedp)
3198 {
3199 if (! integer_zerop (const_binop (RSHIFT_EXPR,
b30e3dbc 3200 fold_convert (unsigned_type, rhs),
5485823f 3201 size_int (lbitsize), 0)))
2bc77e10 3202 {
f4ec69cb 3203 warning ("comparison is always %d due to width of bit-field",
be2828ce 3204 code == NE_EXPR);
20783f07 3205 return constant_boolean_node (code == NE_EXPR, compare_type);
2bc77e10 3206 }
3207 }
3208 else
3209 {
b30e3dbc 3210 tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs),
5485823f 3211 size_int (lbitsize - 1), 0);
2bc77e10 3212 if (! integer_zerop (tem) && ! integer_all_onesp (tem))
3213 {
f4ec69cb 3214 warning ("comparison is always %d due to width of bit-field",
be2828ce 3215 code == NE_EXPR);
20783f07 3216 return constant_boolean_node (code == NE_EXPR, compare_type);
2bc77e10 3217 }
3218 }
3219
3220 /* Single-bit compares should always be against zero. */
3221 if (lbitsize == 1 && ! integer_zerop (rhs))
3222 {
3223 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
b30e3dbc 3224 rhs = fold_convert (type, integer_zero_node);
2bc77e10 3225 }
3226
3227 /* Make a new bitfield reference, shift the constant over the
3228 appropriate number of bits and mask it with the computed mask
3229 (in case this was a signed field). If we changed it, make a new one. */
4d1060a2 3230 lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1);
e03ab35e 3231 if (lvolatilep)
3232 {
3233 TREE_SIDE_EFFECTS (lhs) = 1;
3234 TREE_THIS_VOLATILE (lhs) = 1;
3235 }
2bc77e10 3236
66716a97 3237 rhs = fold (const_binop (BIT_AND_EXPR,
3238 const_binop (LSHIFT_EXPR,
b30e3dbc 3239 fold_convert (unsigned_type, rhs),
eb8ae79c 3240 size_int (lbitpos), 0),
5485823f 3241 mask, 0));
2bc77e10 3242
fd96eeef 3243 return build2 (code, compare_type,
3244 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask),
3245 rhs);
2bc77e10 3246}
3247\f
79109eec 3248/* Subroutine for fold_truthop: decode a field reference.
2bc77e10 3249
3250 If EXP is a comparison reference, we return the innermost reference.
3251
3252 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3253 set to the starting bit number.
3254
3255 If the innermost field can be completely contained in a mode-sized
3256 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
3257
3258 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3259 otherwise it is not changed.
3260
3261 *PUNSIGNEDP is set to the signedness of the field.
3262
3263 *PMASK is set to the mask used. This is either contained in a
3264 BIT_AND_EXPR or derived from the width of the field.
3265
3398e91d 3266 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
2a6329ae 3267
2bc77e10 3268 Return 0 if this is not a component reference or is one that we can't
3269 do anything with. */
3270
3271static tree
dc81944a 3272decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
3273 HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3274 int *punsignedp, int *pvolatilep,
de1b648b 3275 tree *pmask, tree *pand_mask)
2bc77e10 3276{
74878f86 3277 tree outer_type = 0;
4843fe7c 3278 tree and_mask = 0;
3279 tree mask, inner, offset;
3280 tree unsigned_type;
02e7a332 3281 unsigned int precision;
2bc77e10 3282
cc049fa3 3283 /* All the optimizations using this function assume integer fields.
e40566fc 3284 There are problems with FP fields since the type_for_size call
3285 below can fail for, e.g., XFmode. */
3286 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3287 return 0;
3288
74878f86 3289 /* We are interested in the bare arrangement of bits, so strip everything
3290 that doesn't affect the machine mode. However, record the type of the
3291 outermost expression if it may matter below. */
3292 if (TREE_CODE (exp) == NOP_EXPR
3293 || TREE_CODE (exp) == CONVERT_EXPR
3294 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3295 outer_type = TREE_TYPE (exp);
78379bd9 3296 STRIP_NOPS (exp);
2bc77e10 3297
3298 if (TREE_CODE (exp) == BIT_AND_EXPR)
3299 {
4843fe7c 3300 and_mask = TREE_OPERAND (exp, 1);
2bc77e10 3301 exp = TREE_OPERAND (exp, 0);
4843fe7c 3302 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3303 if (TREE_CODE (and_mask) != INTEGER_CST)
2bc77e10 3304 return 0;
3305 }
3306
bbfbdece 3307 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
2b96c5f6 3308 punsignedp, pvolatilep);
94f29e88 3309 if ((inner == exp && and_mask == 0)
155b05dc 3310 || *pbitsize < 0 || offset != 0
3311 || TREE_CODE (inner) == PLACEHOLDER_EXPR)
e233264a 3312 return 0;
cc049fa3 3313
74878f86 3314 /* If the number of bits in the reference is the same as the bitsize of
3315 the outer type, then the outer type gives the signedness. Otherwise
3316 (in case of a small bitfield) the signedness is unchanged. */
18dbec6f 3317 if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
78a8ed03 3318 *punsignedp = TYPE_UNSIGNED (outer_type);
74878f86 3319
4843fe7c 3320 /* Compute the mask to access the bitfield. */
fa8b888f 3321 unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
4843fe7c 3322 precision = TYPE_PRECISION (unsigned_type);
3323
7016c612 3324 mask = build_int_cst (unsigned_type, -1);
4d28c5d1 3325 mask = force_fit_type (mask, 0, false, false);
0c5713a2 3326
4843fe7c 3327 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3328 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
3329
3330 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
3331 if (and_mask != 0)
fd96eeef 3332 mask = fold (build2 (BIT_AND_EXPR, unsigned_type,
3333 fold_convert (unsigned_type, and_mask), mask));
2bc77e10 3334
3335 *pmask = mask;
2a6329ae 3336 *pand_mask = and_mask;
2bc77e10 3337 return inner;
3338}
3339
6ef828f9 3340/* Return nonzero if MASK represents a mask of SIZE ones in the low-order
2bc77e10 3341 bit positions. */
3342
3343static int
de1b648b 3344all_ones_mask_p (tree mask, int size)
2bc77e10 3345{
3346 tree type = TREE_TYPE (mask);
02e7a332 3347 unsigned int precision = TYPE_PRECISION (type);
52a49c7c 3348 tree tmask;
2bc77e10 3349
7016c612 3350 tmask = build_int_cst (lang_hooks.types.signed_type (type), -1);
4d28c5d1 3351 tmask = force_fit_type (tmask, 0, false, false);
0c5713a2 3352
2bc77e10 3353 return
cc049fa3 3354 tree_int_cst_equal (mask,
94f29e88 3355 const_binop (RSHIFT_EXPR,
3356 const_binop (LSHIFT_EXPR, tmask,
3357 size_int (precision - size),
3358 0),
3359 size_int (precision - size), 0));
2bc77e10 3360}
79109eec 3361
203a24c4 3362/* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3363 represents the sign bit of EXP's type. If EXP represents a sign
3364 or zero extension, also test VAL against the unextended type.
3365 The return value is the (sub)expression whose sign bit is VAL,
3366 or NULL_TREE otherwise. */
3367
3368static tree
de1b648b 3369sign_bit_p (tree exp, tree val)
203a24c4 3370{
a4de5624 3371 unsigned HOST_WIDE_INT mask_lo, lo;
3372 HOST_WIDE_INT mask_hi, hi;
203a24c4 3373 int width;
3374 tree t;
3375
95cc2547 3376 /* Tree EXP must have an integral type. */
203a24c4 3377 t = TREE_TYPE (exp);
3378 if (! INTEGRAL_TYPE_P (t))
3379 return NULL_TREE;
3380
3381 /* Tree VAL must be an integer constant. */
3382 if (TREE_CODE (val) != INTEGER_CST
3383 || TREE_CONSTANT_OVERFLOW (val))
3384 return NULL_TREE;
3385
3386 width = TYPE_PRECISION (t);
3387 if (width > HOST_BITS_PER_WIDE_INT)
3388 {
3389 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3390 lo = 0;
a4de5624 3391
3392 mask_hi = ((unsigned HOST_WIDE_INT) -1
3393 >> (2 * HOST_BITS_PER_WIDE_INT - width));
3394 mask_lo = -1;
203a24c4 3395 }
3396 else
3397 {
3398 hi = 0;
3399 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
a4de5624 3400
3401 mask_hi = 0;
3402 mask_lo = ((unsigned HOST_WIDE_INT) -1
3403 >> (HOST_BITS_PER_WIDE_INT - width));
203a24c4 3404 }
3405
a4de5624 3406 /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3407 treat VAL as if it were unsigned. */
3408 if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3409 && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
203a24c4 3410 return exp;
3411
3412 /* Handle extension from a narrower type. */
3413 if (TREE_CODE (exp) == NOP_EXPR
3414 && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3415 return sign_bit_p (TREE_OPERAND (exp, 0), val);
3416
3417 return NULL_TREE;
3418}
3419
79109eec 3420/* Subroutine for fold_truthop: determine if an operand is simple enough
3421 to be evaluated unconditionally. */
3422
cc049fa3 3423static int
de1b648b 3424simple_operand_p (tree exp)
79109eec 3425{
3426 /* Strip any conversions that don't change the machine mode. */
3427 while ((TREE_CODE (exp) == NOP_EXPR
3428 || TREE_CODE (exp) == CONVERT_EXPR)
3429 && (TYPE_MODE (TREE_TYPE (exp))
3430 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
3431 exp = TREE_OPERAND (exp, 0);
3432
ce45a448 3433 return (CONSTANT_CLASS_P (exp)
9308e976 3434 || (DECL_P (exp)
79109eec 3435 && ! TREE_ADDRESSABLE (exp)
3436 && ! TREE_THIS_VOLATILE (exp)
7735dddb 3437 && ! DECL_NONLOCAL (exp)
3438 /* Don't regard global variables as simple. They may be
3439 allocated in ways unknown to the compiler (shared memory,
3440 #pragma weak, etc). */
3441 && ! TREE_PUBLIC (exp)
3442 && ! DECL_EXTERNAL (exp)
3443 /* Loading a static variable is unduly expensive, but global
3444 registers aren't expensive. */
3445 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
79109eec 3446}
2bc77e10 3447\f
12ec0a8a 3448/* The following functions are subroutines to fold_range_test and allow it to
3449 try to change a logical combination of comparisons into a range test.
3450
3451 For example, both
de1b648b 3452 X == 2 || X == 3 || X == 4 || X == 5
12ec0a8a 3453 and
de1b648b 3454 X >= 2 && X <= 5
12ec0a8a 3455 are converted to
3456 (unsigned) (X - 2) <= 3
3457
ad87de1e 3458 We describe each set of comparisons as being either inside or outside
12ec0a8a 3459 a range, using a variable named like IN_P, and then describe the
3460 range with a lower and upper bound. If one of the bounds is omitted,
3461 it represents either the highest or lowest value of the type.
3462
3463 In the comments below, we represent a range by two numbers in brackets
ad87de1e 3464 preceded by a "+" to designate being inside that range, or a "-" to
12ec0a8a 3465 designate being outside that range, so the condition can be inverted by
3466 flipping the prefix. An omitted bound is represented by a "-". For
3467 example, "- [-, 10]" means being outside the range starting at the lowest
3468 possible value and ending at 10, in other words, being greater than 10.
3469 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
3470 always false.
3471
3472 We set up things so that the missing bounds are handled in a consistent
3473 manner so neither a missing bound nor "true" and "false" need to be
3474 handled using a special case. */
3475
3476/* Return the result of applying CODE to ARG0 and ARG1, but handle the case
3477 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
3478 and UPPER1_P are nonzero if the respective argument is an upper bound
3479 and zero for a lower. TYPE, if nonzero, is the type of the result; it
3480 must be specified for a comparison. ARG1 will be converted to ARG0's
3481 type if both are specified. */
6f725368 3482
12ec0a8a 3483static tree
dc81944a 3484range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
3485 tree arg1, int upper1_p)
12ec0a8a 3486{
7560c8de 3487 tree tem;
12ec0a8a 3488 int result;
3489 int sgn0, sgn1;
6f725368 3490
12ec0a8a 3491 /* If neither arg represents infinity, do the normal operation.
3492 Else, if not a comparison, return infinity. Else handle the special
3493 comparison rules. Note that most of the cases below won't occur, but
3494 are handled for consistency. */
6f725368 3495
12ec0a8a 3496 if (arg0 != 0 && arg1 != 0)
7560c8de 3497 {
fd96eeef 3498 tem = fold (build2 (code, type != 0 ? type : TREE_TYPE (arg0),
3499 arg0, fold_convert (TREE_TYPE (arg0), arg1)));
7560c8de 3500 STRIP_NOPS (tem);
3501 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
3502 }
6f725368 3503
ce45a448 3504 if (TREE_CODE_CLASS (code) != tcc_comparison)
12ec0a8a 3505 return 0;
3506
3507 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
621ba396 3508 for neither. In real maths, we cannot assume open ended ranges are
3509 the same. But, this is computer arithmetic, where numbers are finite.
3510 We can therefore make the transformation of any unbounded range with
3511 the value Z, Z being greater than any representable number. This permits
6312a35e 3512 us to treat unbounded ranges as equal. */
12ec0a8a 3513 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
263497ab 3514 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
12ec0a8a 3515 switch (code)
3516 {
621ba396 3517 case EQ_EXPR:
3518 result = sgn0 == sgn1;
3519 break;
3520 case NE_EXPR:
3521 result = sgn0 != sgn1;
12ec0a8a 3522 break;
621ba396 3523 case LT_EXPR:
12ec0a8a 3524 result = sgn0 < sgn1;
3525 break;
621ba396 3526 case LE_EXPR:
3527 result = sgn0 <= sgn1;
3528 break;
3529 case GT_EXPR:
12ec0a8a 3530 result = sgn0 > sgn1;
3531 break;
621ba396 3532 case GE_EXPR:
3533 result = sgn0 >= sgn1;
3534 break;
0dbd1c74 3535 default:
fdada98f 3536 gcc_unreachable ();
12ec0a8a 3537 }
3538
20783f07 3539 return constant_boolean_node (result, type);
12ec0a8a 3540}
cc049fa3 3541\f
12ec0a8a 3542/* Given EXP, a logical expression, set the range it is testing into
3543 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
62af9abe 3544 actually being tested. *PLOW and *PHIGH will be made of the same type
12ec0a8a 3545 as the returned expression. If EXP is not a comparison, we will most
3546 likely not be returning a useful value and range. */
6f725368 3547
bfd67d2c 3548static tree
de1b648b 3549make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
6f725368 3550{
12ec0a8a 3551 enum tree_code code;
7206da1b 3552 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
3553 tree exp_type = NULL_TREE, arg0_type = NULL_TREE;
12ec0a8a 3554 int in_p, n_in_p;
3555 tree low, high, n_low, n_high;
6f725368 3556
12ec0a8a 3557 /* Start with simply saying "EXP != 0" and then look at the code of EXP
3558 and see if we can refine the range. Some of the cases below may not
3559 happen, but it doesn't seem worth worrying about this. We "continue"
3560 the outer loop when we've changed something; otherwise we "break"
3561 the switch, which will "break" the while. */
6f725368 3562
b30e3dbc 3563 in_p = 0;
3564 low = high = fold_convert (TREE_TYPE (exp), integer_zero_node);
12ec0a8a 3565
3566 while (1)
6f725368 3567 {
12ec0a8a 3568 code = TREE_CODE (exp);
7206da1b 3569 exp_type = TREE_TYPE (exp);
5eb945de 3570
3571 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
3572 {
13795292 3573 if (first_rtl_op (code) > 0)
3574 arg0 = TREE_OPERAND (exp, 0);
ce45a448 3575 if (TREE_CODE_CLASS (code) == tcc_comparison
3576 || TREE_CODE_CLASS (code) == tcc_unary
3577 || TREE_CODE_CLASS (code) == tcc_binary)
7206da1b 3578 arg0_type = TREE_TYPE (arg0);
ce45a448 3579 if (TREE_CODE_CLASS (code) == tcc_binary
3580 || TREE_CODE_CLASS (code) == tcc_comparison
3581 || (TREE_CODE_CLASS (code) == tcc_expression
3f1e707c 3582 && TREE_CODE_LENGTH (code) > 1))
5eb945de 3583 arg1 = TREE_OPERAND (exp, 1);
3584 }
6f725368 3585
12ec0a8a 3586 switch (code)
3587 {
3588 case TRUTH_NOT_EXPR:
3589 in_p = ! in_p, exp = arg0;
3590 continue;
3591
3592 case EQ_EXPR: case NE_EXPR:
3593 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
3594 /* We can only do something if the range is testing for zero
3595 and if the second operand is an integer constant. Note that
3596 saying something is "in" the range we make is done by
3597 complementing IN_P since it will set in the initial case of
3598 being not equal to zero; "out" is leaving it alone. */
3599 if (low == 0 || high == 0
3600 || ! integer_zerop (low) || ! integer_zerop (high)
3601 || TREE_CODE (arg1) != INTEGER_CST)
3602 break;
6f725368 3603
12ec0a8a 3604 switch (code)
3605 {
3606 case NE_EXPR: /* - [c, c] */
3607 low = high = arg1;
3608 break;
3609 case EQ_EXPR: /* + [c, c] */
3610 in_p = ! in_p, low = high = arg1;
3611 break;
3612 case GT_EXPR: /* - [-, c] */
3613 low = 0, high = arg1;
3614 break;
3615 case GE_EXPR: /* + [c, -] */
3616 in_p = ! in_p, low = arg1, high = 0;
3617 break;
3618 case LT_EXPR: /* - [c, -] */
3619 low = arg1, high = 0;
3620 break;
3621 case LE_EXPR: /* + [-, c] */
3622 in_p = ! in_p, low = 0, high = arg1;
3623 break;
0dbd1c74 3624 default:
fdada98f 3625 gcc_unreachable ();
12ec0a8a 3626 }
6f725368 3627
c317c285 3628 /* If this is an unsigned comparison, we also know that EXP is
a9e29e86 3629 greater than or equal to zero. We base the range tests we make
3630 on that fact, so we record it here so we can parse existing
7206da1b 3631 range tests. We test arg0_type since often the return type
3632 of, e.g. EQ_EXPR, is boolean. */
3633 if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
12ec0a8a 3634 {
5c9198bd 3635 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3636 in_p, low, high, 1,
3637 fold_convert (arg0_type, integer_zero_node),
a9e29e86 3638 NULL_TREE))
12ec0a8a 3639 break;
6f725368 3640
12ec0a8a 3641 in_p = n_in_p, low = n_low, high = n_high;
a9e29e86 3642
751e10d1 3643 /* If the high bound is missing, but we have a nonzero low
e524954a 3644 bound, reverse the range so it goes from zero to the low bound
3645 minus 1. */
3646 if (high == 0 && low && ! integer_zerop (low))
a9e29e86 3647 {
3648 in_p = ! in_p;
3649 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
3650 integer_one_node, 0);
7206da1b 3651 low = fold_convert (arg0_type, integer_zero_node);
a9e29e86 3652 }
12ec0a8a 3653 }
7206da1b 3654
3655 exp = arg0;
12ec0a8a 3656 continue;
3657
3658 case NEGATE_EXPR:
3659 /* (-x) IN [a,b] -> x in [-b, -a] */
7206da1b 3660 n_low = range_binop (MINUS_EXPR, exp_type,
3661 fold_convert (exp_type, integer_zero_node),
b30e3dbc 3662 0, high, 1);
7206da1b 3663 n_high = range_binop (MINUS_EXPR, exp_type,
3664 fold_convert (exp_type, integer_zero_node),
b30e3dbc 3665 0, low, 0);
12ec0a8a 3666 low = n_low, high = n_high;
3667 exp = arg0;
3668 continue;
3669
3670 case BIT_NOT_EXPR:
3671 /* ~ X -> -X - 1 */
7206da1b 3672 exp = build2 (MINUS_EXPR, exp_type, negate_expr (arg0),
3673 fold_convert (exp_type, integer_one_node));
12ec0a8a 3674 continue;
3675
3676 case PLUS_EXPR: case MINUS_EXPR:
3677 if (TREE_CODE (arg1) != INTEGER_CST)
3678 break;
3679
3680 /* If EXP is signed, any overflow in the computation is undefined,
3681 so we don't worry about it so long as our computations on
3682 the bounds don't overflow. For unsigned, overflow is defined
3683 and this is exactly the right thing. */
3684 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
7206da1b 3685 arg0_type, low, 0, arg1, 0);
12ec0a8a 3686 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
7206da1b 3687 arg0_type, high, 1, arg1, 0);
12ec0a8a 3688 if ((n_low != 0 && TREE_OVERFLOW (n_low))
3689 || (n_high != 0 && TREE_OVERFLOW (n_high)))
3690 break;
3691
6b457c77 3692 /* Check for an unsigned range which has wrapped around the maximum
3693 value thus making n_high < n_low, and normalize it. */
98db800f 3694 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
6b457c77 3695 {
7206da1b 3696 low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
a9e29e86 3697 integer_one_node, 0);
7206da1b 3698 high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
a80d786b 3699 integer_one_node, 0);
3700
3701 /* If the range is of the form +/- [ x+1, x ], we won't
3702 be able to normalize it. But then, it represents the
3703 whole range or the empty set, so make it
3704 +/- [ -, - ]. */
3705 if (tree_int_cst_equal (n_low, low)
3706 && tree_int_cst_equal (n_high, high))
3707 low = high = 0;
3708 else
3709 in_p = ! in_p;
6b457c77 3710 }
98db800f 3711 else
3712 low = n_low, high = n_high;
7560c8de 3713
12ec0a8a 3714 exp = arg0;
3715 continue;
3716
3717 case NOP_EXPR: case NON_LVALUE_EXPR: case CONVERT_EXPR:
7206da1b 3718 if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
d6d65bd2 3719 break;
3720
7206da1b 3721 if (! INTEGRAL_TYPE_P (arg0_type)
3722 || (low != 0 && ! int_fits_type_p (low, arg0_type))
3723 || (high != 0 && ! int_fits_type_p (high, arg0_type)))
12ec0a8a 3724 break;
3725
4cd44a59 3726 n_low = low, n_high = high;
12ec0a8a 3727
4cd44a59 3728 if (n_low != 0)
7206da1b 3729 n_low = fold_convert (arg0_type, n_low);
4cd44a59 3730
3731 if (n_high != 0)
7206da1b 3732 n_high = fold_convert (arg0_type, n_high);
4cd44a59 3733
4cd44a59 3734
7206da1b 3735 /* If we're converting arg0 from an unsigned type, to exp,
2c763ed4 3736 a signed type, we will be doing the comparison as unsigned.
7206da1b 3737 The tests above have already verified that LOW and HIGH
3738 are both positive.
3739
3740 So we have to ensure that we will handle large unsigned
3741 values the same way that the current signed bounds treat
3742 negative values. */
3743
3744 if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4cd44a59 3745 {
f52483b5 3746 tree high_positive;
7206da1b 3747 tree equiv_type = lang_hooks.types.type_for_mode
3748 (TYPE_MODE (arg0_type), 1);
f52483b5 3749
3750 /* A range without an upper bound is, naturally, unbounded.
3751 Since convert would have cropped a very large value, use
155b05dc 3752 the max value for the destination type. */
3753 high_positive
3754 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
7206da1b 3755 : TYPE_MAX_VALUE (arg0_type);
f52483b5 3756
7206da1b 3757 if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
3758 high_positive = fold (build2 (RSHIFT_EXPR, arg0_type,
3759 fold_convert (arg0_type,
fd96eeef 3760 high_positive),
7206da1b 3761 fold_convert (arg0_type,
fd96eeef 3762 integer_one_node)));
cc049fa3 3763
4cd44a59 3764 /* If the low bound is specified, "and" the range with the
3765 range for which the original unsigned value will be
3766 positive. */
3767 if (low != 0)
3768 {
3769 if (! merge_ranges (&n_in_p, &n_low, &n_high,
b30e3dbc 3770 1, n_low, n_high, 1,
5c9198bd 3771 fold_convert (arg0_type,
3772 integer_zero_node),
4cd44a59 3773 high_positive))
3774 break;
3775
3776 in_p = (n_in_p == in_p);
3777 }
3778 else
3779 {
3780 /* Otherwise, "or" the range with the range of the input
3781 that will be interpreted as negative. */
3782 if (! merge_ranges (&n_in_p, &n_low, &n_high,
b30e3dbc 3783 0, n_low, n_high, 1,
5c9198bd 3784 fold_convert (arg0_type,
3785 integer_zero_node),
4cd44a59 3786 high_positive))
3787 break;
3788
3789 in_p = (in_p != n_in_p);
3790 }
3791 }
12ec0a8a 3792
3793 exp = arg0;
4cd44a59 3794 low = n_low, high = n_high;
12ec0a8a 3795 continue;
4cd44a59 3796
3797 default:
3798 break;
6f725368 3799 }
12ec0a8a 3800
3801 break;
6f725368 3802 }
12ec0a8a 3803
f83854c8 3804 /* If EXP is a constant, we can evaluate whether this is true or false. */
3805 if (TREE_CODE (exp) == INTEGER_CST)
3806 {
3807 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
3808 exp, 0, low, 0))
3809 && integer_onep (range_binop (LE_EXPR, integer_type_node,
3810 exp, 1, high, 1)));
3811 low = high = 0;
3812 exp = 0;
3813 }
3814
12ec0a8a 3815 *pin_p = in_p, *plow = low, *phigh = high;
3816 return exp;
3817}
3818\f
3819/* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
3820 type, TYPE, return an expression to test if EXP is in (or out of, depending
3b3a787a 3821 on IN_P) the range. Return 0 if the test couldn't be created. */
12ec0a8a 3822
3823static tree
de1b648b 3824build_range_check (tree type, tree exp, int in_p, tree low, tree high)
12ec0a8a 3825{
3826 tree etype = TREE_TYPE (exp);
843dd7a3 3827 tree value;
12ec0a8a 3828
3b3a787a 3829 if (! in_p)
3830 {
3831 value = build_range_check (type, exp, 1, low, high);
3832 if (value != 0)
3833 return invert_truthvalue (value);
3834
3835 return 0;
3836 }
12ec0a8a 3837
843dd7a3 3838 if (low == 0 && high == 0)
b30e3dbc 3839 return fold_convert (type, integer_one_node);
12ec0a8a 3840
843dd7a3 3841 if (low == 0)
fd96eeef 3842 return fold (build2 (LE_EXPR, type, exp, high));
12ec0a8a 3843
843dd7a3 3844 if (high == 0)
fd96eeef 3845 return fold (build2 (GE_EXPR, type, exp, low));
12ec0a8a 3846
843dd7a3 3847 if (operand_equal_p (low, high, 0))
fd96eeef 3848 return fold (build2 (EQ_EXPR, type, exp, low));
12ec0a8a 3849
843dd7a3 3850 if (integer_zerop (low))
6f725368 3851 {
78a8ed03 3852 if (! TYPE_UNSIGNED (etype))
d3371fcd 3853 {
fa8b888f 3854 etype = lang_hooks.types.unsigned_type (etype);
b30e3dbc 3855 high = fold_convert (etype, high);
3856 exp = fold_convert (etype, exp);
d3371fcd 3857 }
843dd7a3 3858 return build_range_check (type, exp, 1, 0, high);
12ec0a8a 3859 }
6f725368 3860
843dd7a3 3861 /* Optimize (c>=1) && (c<=127) into (signed char)c > 0. */
3862 if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
3863 {
3864 unsigned HOST_WIDE_INT lo;
3865 HOST_WIDE_INT hi;
3866 int prec;
3867
3868 prec = TYPE_PRECISION (etype);
3869 if (prec <= HOST_BITS_PER_WIDE_INT)
d3371fcd 3870 {
3871 hi = 0;
3872 lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
3873 }
843dd7a3 3874 else
d3371fcd 3875 {
3876 hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
3877 lo = (unsigned HOST_WIDE_INT) -1;
3878 }
843dd7a3 3879
3880 if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
d3371fcd 3881 {
78a8ed03 3882 if (TYPE_UNSIGNED (etype))
d3371fcd 3883 {
fa8b888f 3884 etype = lang_hooks.types.signed_type (etype);
b30e3dbc 3885 exp = fold_convert (etype, exp);
d3371fcd 3886 }
fd96eeef 3887 return fold (build2 (GT_EXPR, type, exp,
3888 fold_convert (etype, integer_zero_node)));
d3371fcd 3889 }
843dd7a3 3890 }
3891
3b3a787a 3892 value = const_binop (MINUS_EXPR, high, low, 0);
3893 if (value != 0 && TREE_OVERFLOW (value) && ! TYPE_UNSIGNED (etype))
3894 {
3895 tree utype, minv, maxv;
3896
3897 /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
3898 for the type in question, as we rely on this here. */
3899 switch (TREE_CODE (etype))
3900 {
3901 case INTEGER_TYPE:
3902 case ENUMERAL_TYPE:
3903 case CHAR_TYPE:
3904 utype = lang_hooks.types.unsigned_type (etype);
3905 maxv = fold_convert (utype, TYPE_MAX_VALUE (etype));
3906 maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
3907 integer_one_node, 1);
3908 minv = fold_convert (utype, TYPE_MIN_VALUE (etype));
3909 if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
3910 minv, 1, maxv, 1)))
3911 {
3912 etype = utype;
3913 high = fold_convert (etype, high);
3914 low = fold_convert (etype, low);
3915 exp = fold_convert (etype, exp);
3916 value = const_binop (MINUS_EXPR, high, low, 0);
3917 }
3918 break;
3919 default:
3920 break;
3921 }
3922 }
3923
3924 if (value != 0 && ! TREE_OVERFLOW (value))
12ec0a8a 3925 return build_range_check (type,
fd96eeef 3926 fold (build2 (MINUS_EXPR, etype, exp, low)),
b30e3dbc 3927 1, fold_convert (etype, integer_zero_node),
3928 value);
843dd7a3 3929
3930 return 0;
12ec0a8a 3931}
3932\f
cc049fa3 3933/* Given two ranges, see if we can merge them into one. Return 1 if we
12ec0a8a 3934 can, 0 if we can't. Set the output range into the specified parameters. */
6f725368 3935
12ec0a8a 3936static int
dc81944a 3937merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
3938 tree high0, int in1_p, tree low1, tree high1)
12ec0a8a 3939{
3940 int no_overlap;
3941 int subset;
3942 int temp;
3943 tree tem;
3944 int in_p;
3945 tree low, high;
4cd44a59 3946 int lowequal = ((low0 == 0 && low1 == 0)
3947 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3948 low0, 0, low1, 0)));
3949 int highequal = ((high0 == 0 && high1 == 0)
3950 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
3951 high0, 1, high1, 1)));
3952
3953 /* Make range 0 be the range that starts first, or ends last if they
3954 start at the same value. Swap them if it isn't. */
cc049fa3 3955 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
12ec0a8a 3956 low0, 0, low1, 0))
4cd44a59 3957 || (lowequal
12ec0a8a 3958 && integer_onep (range_binop (GT_EXPR, integer_type_node,
4cd44a59 3959 high1, 1, high0, 1))))
12ec0a8a 3960 {
3961 temp = in0_p, in0_p = in1_p, in1_p = temp;
3962 tem = low0, low0 = low1, low1 = tem;
3963 tem = high0, high0 = high1, high1 = tem;
3964 }
6f725368 3965
12ec0a8a 3966 /* Now flag two cases, whether the ranges are disjoint or whether the
3967 second range is totally subsumed in the first. Note that the tests
3968 below are simplified by the ones above. */
3969 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
3970 high0, 1, low1, 0));
718acf6d 3971 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
12ec0a8a 3972 high1, 1, high0, 1));
3973
3974 /* We now have four cases, depending on whether we are including or
3975 excluding the two ranges. */
3976 if (in0_p && in1_p)
3977 {
3978 /* If they don't overlap, the result is false. If the second range
3979 is a subset it is the result. Otherwise, the range is from the start
3980 of the second to the end of the first. */
3981 if (no_overlap)
3982 in_p = 0, low = high = 0;
3983 else if (subset)
3984 in_p = 1, low = low1, high = high1;
3985 else
3986 in_p = 1, low = low1, high = high0;
3987 }
6f725368 3988
12ec0a8a 3989 else if (in0_p && ! in1_p)
3990 {
4cd44a59 3991 /* If they don't overlap, the result is the first range. If they are
3992 equal, the result is false. If the second range is a subset of the
3993 first, and the ranges begin at the same place, we go from just after
3994 the end of the first range to the end of the second. If the second
3995 range is not a subset of the first, or if it is a subset and both
3996 ranges end at the same place, the range starts at the start of the
3997 first range and ends just before the second range.
3998 Otherwise, we can't describe this as a single range. */
12ec0a8a 3999 if (no_overlap)
4000 in_p = 1, low = low0, high = high0;
4cd44a59 4001 else if (lowequal && highequal)
08986c47 4002 in_p = 0, low = high = 0;
4cd44a59 4003 else if (subset && lowequal)
4004 {
4005 in_p = 1, high = high0;
4006 low = range_binop (PLUS_EXPR, NULL_TREE, high1, 0,
cc049fa3 4007 integer_one_node, 0);
4cd44a59 4008 }
4009 else if (! subset || highequal)
12ec0a8a 4010 {
4011 in_p = 1, low = low0;
4012 high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
a9e29e86 4013 integer_one_node, 0);
12ec0a8a 4014 }
4cd44a59 4015 else
4016 return 0;
12ec0a8a 4017 }
6f725368 4018
12ec0a8a 4019 else if (! in0_p && in1_p)
4020 {
4021 /* If they don't overlap, the result is the second range. If the second
4022 is a subset of the first, the result is false. Otherwise,
4023 the range starts just after the first range and ends at the
4024 end of the second. */
4025 if (no_overlap)
4026 in_p = 1, low = low1, high = high1;
155b05dc 4027 else if (subset || highequal)
12ec0a8a 4028 in_p = 0, low = high = 0;
4029 else
4030 {
4031 in_p = 1, high = high1;
4032 low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
4033 integer_one_node, 0);
6f725368 4034 }
4035 }
4036
12ec0a8a 4037 else
4038 {
4039 /* The case where we are excluding both ranges. Here the complex case
4040 is if they don't overlap. In that case, the only time we have a
4041 range is if they are adjacent. If the second is a subset of the
4042 first, the result is the first. Otherwise, the range to exclude
4043 starts at the beginning of the first range and ends at the end of the
4044 second. */
4045 if (no_overlap)
4046 {
4047 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4048 range_binop (PLUS_EXPR, NULL_TREE,
4049 high0, 1,
4050 integer_one_node, 1),
4051 1, low1, 0)))
4052 in_p = 0, low = low0, high = high1;
4053 else
3b3a787a 4054 {
4055 /* Canonicalize - [min, x] into - [-, x]. */
4056 if (low0 && TREE_CODE (low0) == INTEGER_CST)
4057 switch (TREE_CODE (TREE_TYPE (low0)))
4058 {
4059 case ENUMERAL_TYPE:
4060 if (TYPE_PRECISION (TREE_TYPE (low0))
4061 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4062 break;
4063 /* FALLTHROUGH */
4064 case INTEGER_TYPE:
4065 case CHAR_TYPE:
4066 if (tree_int_cst_equal (low0,
4067 TYPE_MIN_VALUE (TREE_TYPE (low0))))
4068 low0 = 0;
4069 break;
4070 case POINTER_TYPE:
4071 if (TYPE_UNSIGNED (TREE_TYPE (low0))
4072 && integer_zerop (low0))
4073 low0 = 0;
4074 break;
4075 default:
4076 break;
4077 }
4078
4079 /* Canonicalize - [x, max] into - [x, -]. */
4080 if (high1 && TREE_CODE (high1) == INTEGER_CST)
4081 switch (TREE_CODE (TREE_TYPE (high1)))
4082 {
4083 case ENUMERAL_TYPE:
4084 if (TYPE_PRECISION (TREE_TYPE (high1))
4085 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4086 break;
4087 /* FALLTHROUGH */
4088 case INTEGER_TYPE:
4089 case CHAR_TYPE:
4090 if (tree_int_cst_equal (high1,
4091 TYPE_MAX_VALUE (TREE_TYPE (high1))))
4092 high1 = 0;
4093 break;
4094 case POINTER_TYPE:
4095 if (TYPE_UNSIGNED (TREE_TYPE (high1))
4096 && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4097 high1, 1,
4098 integer_one_node, 1)))
4099 high1 = 0;
4100 break;
4101 default:
4102 break;
4103 }
4104
4105 /* The ranges might be also adjacent between the maximum and
4106 minimum values of the given type. For
4107 - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4108 return + [x + 1, y - 1]. */
4109 if (low0 == 0 && high1 == 0)
4110 {
4111 low = range_binop (PLUS_EXPR, NULL_TREE, high0, 1,
4112 integer_one_node, 1);
4113 high = range_binop (MINUS_EXPR, NULL_TREE, low1, 0,
4114 integer_one_node, 0);
4115 if (low == 0 || high == 0)
4116 return 0;
4117
4118 in_p = 1;
4119 }
4120 else
4121 return 0;
4122 }
12ec0a8a 4123 }
4124 else if (subset)
4125 in_p = 0, low = low0, high = high0;
4126 else
4127 in_p = 0, low = low0, high = high1;
4128 }
b29eae68 4129
12ec0a8a 4130 *pin_p = in_p, *plow = low, *phigh = high;
4131 return 1;
4132}
0023616d 4133\f
4134
4135/* Subroutine of fold, looking inside expressions of the form
9b1fa4a0 4136 A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4137 of the COND_EXPR. This function is being used also to optimize
4138 A op B ? C : A, by reversing the comparison first.
0023616d 4139
4140 Return a folded expression whose code is not a COND_EXPR
4141 anymore, or NULL_TREE if no folding opportunity is found. */
4142
4143static tree
9b1fa4a0 4144fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
0023616d 4145{
4146 enum tree_code comp_code = TREE_CODE (arg0);
4147 tree arg00 = TREE_OPERAND (arg0, 0);
4148 tree arg01 = TREE_OPERAND (arg0, 1);
9b1fa4a0 4149 tree arg1_type = TREE_TYPE (arg1);
0023616d 4150 tree tem;
9b1fa4a0 4151
4152 STRIP_NOPS (arg1);
0023616d 4153 STRIP_NOPS (arg2);
4154
4155 /* If we have A op 0 ? A : -A, consider applying the following
4156 transformations:
4157
4158 A == 0? A : -A same as -A
4159 A != 0? A : -A same as A
4160 A >= 0? A : -A same as abs (A)
4161 A > 0? A : -A same as abs (A)
4162 A <= 0? A : -A same as -abs (A)
4163 A < 0? A : -A same as -abs (A)
4164
4165 None of these transformations work for modes with signed
4166 zeros. If A is +/-0, the first two transformations will
4167 change the sign of the result (from +0 to -0, or vice
4168 versa). The last four will fix the sign of the result,
4169 even though the original expressions could be positive or
4170 negative, depending on the sign of A.
4171
4172 Note that all these transformations are correct if A is
4173 NaN, since the two alternatives (A and -A) are also NaNs. */
4174 if ((FLOAT_TYPE_P (TREE_TYPE (arg01))
4175 ? real_zerop (arg01)
4176 : integer_zerop (arg01))
4177 && TREE_CODE (arg2) == NEGATE_EXPR
9b1fa4a0 4178 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
0023616d 4179 switch (comp_code)
4180 {
4181 case EQ_EXPR:
fe9b47eb 4182 case UNEQ_EXPR:
9b1fa4a0 4183 tem = fold_convert (arg1_type, arg1);
4184 return pedantic_non_lvalue (fold_convert (type, negate_expr (tem)));
0023616d 4185 case NE_EXPR:
fe9b47eb 4186 case LTGT_EXPR:
9b1fa4a0 4187 return pedantic_non_lvalue (fold_convert (type, arg1));
fe9b47eb 4188 case UNGE_EXPR:
4189 case UNGT_EXPR:
4190 if (flag_trapping_math)
4191 break;
4192 /* Fall through. */
0023616d 4193 case GE_EXPR:
4194 case GT_EXPR:
9b1fa4a0 4195 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4196 arg1 = fold_convert (lang_hooks.types.signed_type
4197 (TREE_TYPE (arg1)), arg1);
4198 tem = fold (build1 (ABS_EXPR, TREE_TYPE (arg1), arg1));
0023616d 4199 return pedantic_non_lvalue (fold_convert (type, tem));
fe9b47eb 4200 case UNLE_EXPR:
4201 case UNLT_EXPR:
4202 if (flag_trapping_math)
4203 break;
0023616d 4204 case LE_EXPR:
4205 case LT_EXPR:
9b1fa4a0 4206 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4207 arg1 = fold_convert (lang_hooks.types.signed_type
4208 (TREE_TYPE (arg1)), arg1);
4209 tem = fold (build1 (ABS_EXPR, TREE_TYPE (arg1), arg1));
0023616d 4210 return negate_expr (fold_convert (type, tem));
4211 default:
ce45a448 4212 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
fe9b47eb 4213 break;
0023616d 4214 }
4215
4216 /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise
4217 A == 0 ? A : 0 is always 0 unless A is -0. Note that
4218 both transformations are correct when A is NaN: A != 0
4219 is then true, and A == 0 is false. */
4220
4221 if (integer_zerop (arg01) && integer_zerop (arg2))
4222 {
4223 if (comp_code == NE_EXPR)
9b1fa4a0 4224 return pedantic_non_lvalue (fold_convert (type, arg1));
0023616d 4225 else if (comp_code == EQ_EXPR)
5c9198bd 4226 return fold_convert (type, integer_zero_node);
0023616d 4227 }
4228
4229 /* Try some transformations of A op B ? A : B.
4230
4231 A == B? A : B same as B
4232 A != B? A : B same as A
4233 A >= B? A : B same as max (A, B)
4234 A > B? A : B same as max (B, A)
4235 A <= B? A : B same as min (A, B)
4236 A < B? A : B same as min (B, A)
4237
4238 As above, these transformations don't work in the presence
4239 of signed zeros. For example, if A and B are zeros of
4240 opposite sign, the first two transformations will change
4241 the sign of the result. In the last four, the original
4242 expressions give different results for (A=+0, B=-0) and
4243 (A=-0, B=+0), but the transformed expressions do not.
4244
4245 The first two transformations are correct if either A or B
4246 is a NaN. In the first transformation, the condition will
4247 be false, and B will indeed be chosen. In the case of the
4248 second transformation, the condition A != B will be true,
4249 and A will be chosen.
4250
4251 The conversions to max() and min() are not correct if B is
4252 a number and A is not. The conditions in the original
4253 expressions will be false, so all four give B. The min()
4254 and max() versions would give a NaN instead. */
4255 if (operand_equal_for_comparison_p (arg01, arg2, arg00))
4256 {
4257 tree comp_op0 = arg00;
4258 tree comp_op1 = arg01;
4259 tree comp_type = TREE_TYPE (comp_op0);
4260
4261 /* Avoid adding NOP_EXPRs in case this is an lvalue. */
4262 if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4263 {
4264 comp_type = type;
9b1fa4a0 4265 comp_op0 = arg1;
0023616d 4266 comp_op1 = arg2;
4267 }
4268
4269 switch (comp_code)
4270 {
4271 case EQ_EXPR:
4272 return pedantic_non_lvalue (fold_convert (type, arg2));
4273 case NE_EXPR:
9b1fa4a0 4274 return pedantic_non_lvalue (fold_convert (type, arg1));
0023616d 4275 case LE_EXPR:
4276 case LT_EXPR:
fe9b47eb 4277 case UNLE_EXPR:
4278 case UNLT_EXPR:
0023616d 4279 /* In C++ a ?: expression can be an lvalue, so put the
4280 operand which will be used if they are equal first
4281 so that we can convert this back to the
4282 corresponding COND_EXPR. */
9b1fa4a0 4283 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5c9198bd 4284 {
4285 comp_op0 = fold_convert (comp_type, comp_op0);
4286 comp_op1 = fold_convert (comp_type, comp_op1);
fe9b47eb 4287 tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4288 ? fold (build2 (MIN_EXPR, comp_type, comp_op0, comp_op1))
4289 : fold (build2 (MIN_EXPR, comp_type, comp_op1, comp_op0));
5c9198bd 4290 return pedantic_non_lvalue (fold_convert (type, tem));
4291 }
0023616d 4292 break;
4293 case GE_EXPR:
4294 case GT_EXPR:
fe9b47eb 4295 case UNGE_EXPR:
4296 case UNGT_EXPR:
9b1fa4a0 4297 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
5c9198bd 4298 {
4299 comp_op0 = fold_convert (comp_type, comp_op0);
4300 comp_op1 = fold_convert (comp_type, comp_op1);
fe9b47eb 4301 tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4302 ? fold (build2 (MAX_EXPR, comp_type, comp_op0, comp_op1))
4303 : fold (build2 (MAX_EXPR, comp_type, comp_op1, comp_op0));
5c9198bd 4304 return pedantic_non_lvalue (fold_convert (type, tem));
4305 }
0023616d 4306 break;
fe9b47eb 4307 case UNEQ_EXPR:
4308 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4309 return pedantic_non_lvalue (fold_convert (type, arg2));
4310 break;
4311 case LTGT_EXPR:
4312 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4313 return pedantic_non_lvalue (fold_convert (type, arg1));
4314 break;
0023616d 4315 default:
ce45a448 4316 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
fe9b47eb 4317 break;
0023616d 4318 }
4319 }
4320
4321 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4322 we might still be able to simplify this. For example,
4323 if C1 is one less or one more than C2, this might have started
4324 out as a MIN or MAX and been transformed by this function.
4325 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
4326
4327 if (INTEGRAL_TYPE_P (type)
4328 && TREE_CODE (arg01) == INTEGER_CST
4329 && TREE_CODE (arg2) == INTEGER_CST)
4330 switch (comp_code)
4331 {
4332 case EQ_EXPR:
4333 /* We can replace A with C1 in this case. */
9b1fa4a0 4334 arg1 = fold_convert (type, arg01);
4335 return fold (build3 (COND_EXPR, type, arg0, arg1, arg2));
0023616d 4336
4337 case LT_EXPR:
4338 /* If C1 is C2 + 1, this is min(A, C2). */
4339 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4340 OEP_ONLY_CONST)
4341 && operand_equal_p (arg01,
4342 const_binop (PLUS_EXPR, arg2,
4343 integer_one_node, 0),
4344 OEP_ONLY_CONST))
4345 return pedantic_non_lvalue (fold (build2 (MIN_EXPR,
9b1fa4a0 4346 type, arg1, arg2)));
0023616d 4347 break;
4348
4349 case LE_EXPR:
4350 /* If C1 is C2 - 1, this is min(A, C2). */
4351 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4352 OEP_ONLY_CONST)
4353 && operand_equal_p (arg01,
4354 const_binop (MINUS_EXPR, arg2,
4355 integer_one_node, 0),
4356 OEP_ONLY_CONST))
4357 return pedantic_non_lvalue (fold (build2 (MIN_EXPR,
9b1fa4a0 4358 type, arg1, arg2)));
0023616d 4359 break;
4360
4361 case GT_EXPR:
4362 /* If C1 is C2 - 1, this is max(A, C2). */
4363 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4364 OEP_ONLY_CONST)
4365 && operand_equal_p (arg01,
4366 const_binop (MINUS_EXPR, arg2,
4367 integer_one_node, 0),
4368 OEP_ONLY_CONST))
4369 return pedantic_non_lvalue (fold (build2 (MAX_EXPR,
9b1fa4a0 4370 type, arg1, arg2)));
0023616d 4371 break;
4372
4373 case GE_EXPR:
4374 /* If C1 is C2 + 1, this is max(A, C2). */
4375 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4376 OEP_ONLY_CONST)
4377 && operand_equal_p (arg01,
4378 const_binop (PLUS_EXPR, arg2,
4379 integer_one_node, 0),
4380 OEP_ONLY_CONST))
4381 return pedantic_non_lvalue (fold (build2 (MAX_EXPR,
9b1fa4a0 4382 type, arg1, arg2)));
0023616d 4383 break;
4384 case NE_EXPR:
4385 break;
4386 default:
fdada98f 4387 gcc_unreachable ();
0023616d 4388 }
4389
4390 return NULL_TREE;
4391}
4392
4393
12ec0a8a 4394\f
17529f98 4395#ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4396#define LOGICAL_OP_NON_SHORT_CIRCUIT (BRANCH_COST >= 2)
cf451ad8 4397#endif
4398
12ec0a8a 4399/* EXP is some logical combination of boolean tests. See if we can
4400 merge it into some range test. Return the new tree if so. */
6f725368 4401
12ec0a8a 4402static tree
de1b648b 4403fold_range_test (tree exp)
12ec0a8a 4404{
4405 int or_op = (TREE_CODE (exp) == TRUTH_ORIF_EXPR
4406 || TREE_CODE (exp) == TRUTH_OR_EXPR);
4407 int in0_p, in1_p, in_p;
4408 tree low0, low1, low, high0, high1, high;
4409 tree lhs = make_range (TREE_OPERAND (exp, 0), &in0_p, &low0, &high0);
4410 tree rhs = make_range (TREE_OPERAND (exp, 1), &in1_p, &low1, &high1);
4411 tree tem;
6f725368 4412
12ec0a8a 4413 /* If this is an OR operation, invert both sides; we will invert
4414 again at the end. */
4415 if (or_op)
4416 in0_p = ! in0_p, in1_p = ! in1_p;
4417
4418 /* If both expressions are the same, if we can merge the ranges, and we
f83854c8 4419 can build the range test, return it or it inverted. If one of the
4420 ranges is always true or always false, consider it to be the same
4421 expression as the other. */
4422 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
12ec0a8a 4423 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4424 in1_p, low1, high1)
f83854c8 4425 && 0 != (tem = (build_range_check (TREE_TYPE (exp),
4426 lhs != 0 ? lhs
4427 : rhs != 0 ? rhs : integer_zero_node,
12ec0a8a 4428 in_p, low, high))))
4429 return or_op ? invert_truthvalue (tem) : tem;
4430
4431 /* On machines where the branch cost is expensive, if this is a
4432 short-circuited branch and the underlying object on both sides
4433 is the same, make a non-short-circuit operation. */
17529f98 4434 else if (LOGICAL_OP_NON_SHORT_CIRCUIT
1fdbc76b 4435 && lhs != 0 && rhs != 0
12ec0a8a 4436 && (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
4437 || TREE_CODE (exp) == TRUTH_ORIF_EXPR)
4438 && operand_equal_p (lhs, rhs, 0))
6f725368 4439 {
90a73592 4440 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
9e042f31 4441 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
4442 which cases we can't do this. */
12ec0a8a 4443 if (simple_operand_p (lhs))
fd96eeef 4444 return build2 (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
4445 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4446 TREE_TYPE (exp), TREE_OPERAND (exp, 0),
4447 TREE_OPERAND (exp, 1));
90a73592 4448
fa8b888f 4449 else if (lang_hooks.decls.global_bindings_p () == 0
ce3fb06e 4450 && ! CONTAINS_PLACEHOLDER_P (lhs))
12ec0a8a 4451 {
4452 tree common = save_expr (lhs);
4453
4454 if (0 != (lhs = build_range_check (TREE_TYPE (exp), common,
4455 or_op ? ! in0_p : in0_p,
4456 low0, high0))
4457 && (0 != (rhs = build_range_check (TREE_TYPE (exp), common,
4458 or_op ? ! in1_p : in1_p,
4459 low1, high1))))
fd96eeef 4460 return build2 (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
4461 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4462 TREE_TYPE (exp), lhs, rhs);
12ec0a8a 4463 }
6f725368 4464 }
831e3af4 4465
831e3af4 4466 return 0;
6f725368 4467}
4468\f
94f29e88 4469/* Subroutine for fold_truthop: C is an INTEGER_CST interpreted as a P
b2dcfbf7 4470 bit value. Arrange things so the extra bits will be set to zero if and
2a6329ae 4471 only if C is signed-extended to its full width. If MASK is nonzero,
4472 it is an INTEGER_CST that should be AND'ed with the extra bits. */
94f29e88 4473
4474static tree
de1b648b 4475unextend (tree c, int p, int unsignedp, tree mask)
94f29e88 4476{
4477 tree type = TREE_TYPE (c);
4478 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
4479 tree temp;
4480
4481 if (p == modesize || unsignedp)
4482 return c;
4483
94f29e88 4484 /* We work by getting just the sign bit into the low-order bit, then
c3418f42 4485 into the high-order bit, then sign-extend. We then XOR that value
94f29e88 4486 with C. */
4487 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1), 0);
4488 temp = const_binop (BIT_AND_EXPR, temp, size_int (1), 0);
dd5f6dae 4489
4490 /* We must use a signed type in order to get an arithmetic right shift.
4491 However, we must also avoid introducing accidental overflows, so that
cc049fa3 4492 a subsequent call to integer_zerop will work. Hence we must
dd5f6dae 4493 do the type conversion here. At this point, the constant is either
4494 zero or one, and the conversion to a signed type can never overflow.
4495 We could get an overflow if this conversion is done anywhere else. */
78a8ed03 4496 if (TYPE_UNSIGNED (type))
fa8b888f 4497 temp = fold_convert (lang_hooks.types.signed_type (type), temp);
dd5f6dae 4498
94f29e88 4499 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1), 0);
4500 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1), 0);
2a6329ae 4501 if (mask != 0)
b30e3dbc 4502 temp = const_binop (BIT_AND_EXPR, temp,
4503 fold_convert (TREE_TYPE (c), mask), 0);
dd5f6dae 4504 /* If necessary, convert the type back to match the type of C. */
78a8ed03 4505 if (TYPE_UNSIGNED (type))
b30e3dbc 4506 temp = fold_convert (type, temp);
2a6329ae 4507
b30e3dbc 4508 return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp, 0));
94f29e88 4509}
4510\f
79109eec 4511/* Find ways of folding logical expressions of LHS and RHS:
4512 Try to merge two comparisons to the same innermost item.
4513 Look for range tests like "ch >= '0' && ch <= '9'".
4514 Look for combinations of simple terms on machines with expensive branches
4515 and evaluate the RHS unconditionally.
2bc77e10 4516
4517 For example, if we have p->a == 2 && p->b == 4 and we can make an
4518 object large enough to span both A and B, we can do this with a comparison
4519 against the object ANDed with the a mask.
4520
4521 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
4522 operations to do this with one comparison.
4523
4524 We check for both normal comparisons and the BIT_AND_EXPRs made this by
4525 function and the one above.
4526
4527 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
4528 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
4529
4530 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
4531 two operands.
4532
4533 We return the simplified tree or 0 if no optimization is possible. */
4534
4535static tree
de1b648b 4536fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
2bc77e10 4537{
62af9abe 4538 /* If this is the "or" of two comparisons, we can do something if
2bc77e10 4539 the comparisons are NE_EXPR. If this is the "and", we can do something
cc049fa3 4540 if the comparisons are EQ_EXPR. I.e.,
de1b648b 4541 (a->b == 2 && a->c == 4) can become (a->new == NEW).
2bc77e10 4542
4543 WANTED_CODE is this operation code. For single bit fields, we can
4544 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
4545 comparison for one-bit fields. */
4546
79109eec 4547 enum tree_code wanted_code;
2bc77e10 4548 enum tree_code lcode, rcode;
79109eec 4549 tree ll_arg, lr_arg, rl_arg, rr_arg;
2bc77e10 4550 tree ll_inner, lr_inner, rl_inner, rr_inner;
02e7a332 4551 HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
4552 HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
4553 HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
4554 HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
2bc77e10 4555 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
4556 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
4557 enum machine_mode lnmode, rnmode;
4558 tree ll_mask, lr_mask, rl_mask, rr_mask;
2a6329ae 4559 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
79109eec 4560 tree l_const, r_const;
ffba564c 4561 tree lntype, rntype, result;
2bc77e10 4562 int first_bit, end_bit;
79109eec 4563 int volatilep;
2bc77e10 4564
12ec0a8a 4565 /* Start by getting the comparison codes. Fail if anything is volatile.
4566 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
4567 it were surrounded with a NE_EXPR. */
2bc77e10 4568
12ec0a8a 4569 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
79109eec 4570 return 0;
4571
2bc77e10 4572 lcode = TREE_CODE (lhs);
4573 rcode = TREE_CODE (rhs);
6f725368 4574
b5ab1edd 4575 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
fd96eeef 4576 {
5c9198bd 4577 lhs = build2 (NE_EXPR, truth_type, lhs,
4578 fold_convert (TREE_TYPE (lhs), integer_zero_node));
fd96eeef 4579 lcode = NE_EXPR;
4580 }
b5ab1edd 4581
4582 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
fd96eeef 4583 {
5c9198bd 4584 rhs = build2 (NE_EXPR, truth_type, rhs,
4585 fold_convert (TREE_TYPE (rhs), integer_zero_node));
fd96eeef 4586 rcode = NE_EXPR;
4587 }
b5ab1edd 4588
ce45a448 4589 if (TREE_CODE_CLASS (lcode) != tcc_comparison
4590 || TREE_CODE_CLASS (rcode) != tcc_comparison)
6f725368 4591 return 0;
4592
79109eec 4593 ll_arg = TREE_OPERAND (lhs, 0);
4594 lr_arg = TREE_OPERAND (lhs, 1);
4595 rl_arg = TREE_OPERAND (rhs, 0);
4596 rr_arg = TREE_OPERAND (rhs, 1);
cc049fa3 4597
7835f163 4598 /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations. */
4599 if (simple_operand_p (ll_arg)
318a728f 4600 && simple_operand_p (lr_arg))
7835f163 4601 {
318a728f 4602 tree result;
7835f163 4603 if (operand_equal_p (ll_arg, rl_arg, 0)
4604 && operand_equal_p (lr_arg, rr_arg, 0))
318a728f 4605 {
4606 result = combine_comparisons (code, lcode, rcode,
4607 truth_type, ll_arg, lr_arg);
4608 if (result)
4609 return result;
4610 }
7835f163 4611 else if (operand_equal_p (ll_arg, rr_arg, 0)
4612 && operand_equal_p (lr_arg, rl_arg, 0))
318a728f 4613 {
4614 result = combine_comparisons (code, lcode,
4615 swap_tree_comparison (rcode),
4616 truth_type, ll_arg, lr_arg);
4617 if (result)
4618 return result;
4619 }
7835f163 4620 }
4621
318a728f 4622 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
4623 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
4624
7735dddb 4625 /* If the RHS can be evaluated unconditionally and its operands are
79109eec 4626 simple, it wins to evaluate the RHS unconditionally on machines
4627 with expensive branches. In this case, this isn't a comparison
35212e61 4628 that can be merged. Avoid doing this if the RHS is a floating-point
4629 comparison since those can trap. */
79109eec 4630
4631 if (BRANCH_COST >= 2
35212e61 4632 && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
79109eec 4633 && simple_operand_p (rl_arg)
7735dddb 4634 && simple_operand_p (rr_arg))
0425437e 4635 {
4636 /* Convert (a != 0) || (b != 0) into (a | b) != 0. */
4637 if (code == TRUTH_OR_EXPR
4638 && lcode == NE_EXPR && integer_zerop (lr_arg)
4639 && rcode == NE_EXPR && integer_zerop (rr_arg)
4640 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
fd96eeef 4641 return build2 (NE_EXPR, truth_type,
4642 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
4643 ll_arg, rl_arg),
20783f07 4644 fold_convert (TREE_TYPE (ll_arg), integer_zero_node));
0425437e 4645
4646 /* Convert (a == 0) && (b == 0) into (a | b) == 0. */
4647 if (code == TRUTH_AND_EXPR
4648 && lcode == EQ_EXPR && integer_zerop (lr_arg)
4649 && rcode == EQ_EXPR && integer_zerop (rr_arg)
4650 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
fd96eeef 4651 return build2 (EQ_EXPR, truth_type,
4652 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
4653 ll_arg, rl_arg),
20783f07 4654 fold_convert (TREE_TYPE (ll_arg), integer_zero_node));
0425437e 4655
17529f98 4656 if (LOGICAL_OP_NON_SHORT_CIRCUIT)
4657 return build2 (code, truth_type, lhs, rhs);
0425437e 4658 }
79109eec 4659
6f725368 4660 /* See if the comparisons can be merged. Then get all the parameters for
4661 each side. */
4662
2bc77e10 4663 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
6f725368 4664 || (rcode != EQ_EXPR && rcode != NE_EXPR))
2bc77e10 4665 return 0;
4666
79109eec 4667 volatilep = 0;
4668 ll_inner = decode_field_reference (ll_arg,
2bc77e10 4669 &ll_bitsize, &ll_bitpos, &ll_mode,
2a6329ae 4670 &ll_unsignedp, &volatilep, &ll_mask,
4671 &ll_and_mask);
79109eec 4672 lr_inner = decode_field_reference (lr_arg,
2bc77e10 4673 &lr_bitsize, &lr_bitpos, &lr_mode,
2a6329ae 4674 &lr_unsignedp, &volatilep, &lr_mask,
4675 &lr_and_mask);
79109eec 4676 rl_inner = decode_field_reference (rl_arg,
2bc77e10 4677 &rl_bitsize, &rl_bitpos, &rl_mode,
2a6329ae 4678 &rl_unsignedp, &volatilep, &rl_mask,
4679 &rl_and_mask);
79109eec 4680 rr_inner = decode_field_reference (rr_arg,
2bc77e10 4681 &rr_bitsize, &rr_bitpos, &rr_mode,
2a6329ae 4682 &rr_unsignedp, &volatilep, &rr_mask,
4683 &rr_and_mask);
2bc77e10 4684
4685 /* It must be true that the inner operation on the lhs of each
4686 comparison must be the same if we are to be able to do anything.
4687 Then see if we have constants. If not, the same must be true for
4688 the rhs's. */
4689 if (volatilep || ll_inner == 0 || rl_inner == 0
4690 || ! operand_equal_p (ll_inner, rl_inner, 0))
4691 return 0;
4692
79109eec 4693 if (TREE_CODE (lr_arg) == INTEGER_CST
4694 && TREE_CODE (rr_arg) == INTEGER_CST)
4695 l_const = lr_arg, r_const = rr_arg;
2bc77e10 4696 else if (lr_inner == 0 || rr_inner == 0
4697 || ! operand_equal_p (lr_inner, rr_inner, 0))
4698 return 0;
79109eec 4699 else
4700 l_const = r_const = 0;
2bc77e10 4701
4702 /* If either comparison code is not correct for our logical operation,
4703 fail. However, we can convert a one-bit comparison against zero into
4704 the opposite comparison against that bit being set in the field. */
79109eec 4705
76e4a18b 4706 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
2bc77e10 4707 if (lcode != wanted_code)
4708 {
4709 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
c6107ab0 4710 {
28bb328d 4711 /* Make the left operand unsigned, since we are only interested
4712 in the value of one bit. Otherwise we are doing the wrong
4713 thing below. */
4714 ll_unsignedp = 1;
68ae709d 4715 l_const = ll_mask;
c6107ab0 4716 }
2bc77e10 4717 else
4718 return 0;
4719 }
4720
68ae709d 4721 /* This is analogous to the code for l_const above. */
2bc77e10 4722 if (rcode != wanted_code)
4723 {
4724 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
c6107ab0 4725 {
28bb328d 4726 rl_unsignedp = 1;
68ae709d 4727 r_const = rl_mask;
c6107ab0 4728 }
2bc77e10 4729 else
4730 return 0;
4731 }
4732
d50b22af 4733 /* After this point all optimizations will generate bit-field
4734 references, which we might not want. */
fa8b888f 4735 if (! lang_hooks.can_use_bit_fields_p ())
d50b22af 4736 return 0;
4737
2bc77e10 4738 /* See if we can find a mode that contains both fields being compared on
4739 the left. If we can't, fail. Otherwise, update all constants and masks
4740 to be relative to a field of that size. */
4741 first_bit = MIN (ll_bitpos, rl_bitpos);
4742 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
4743 lnmode = get_best_mode (end_bit - first_bit, first_bit,
4744 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
4745 volatilep);
4746 if (lnmode == VOIDmode)
4747 return 0;
4748
4749 lnbitsize = GET_MODE_BITSIZE (lnmode);
4750 lnbitpos = first_bit & ~ (lnbitsize - 1);
fa8b888f 4751 lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
2bc77e10 4752 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
4753
51356f86 4754 if (BYTES_BIG_ENDIAN)
4755 {
4756 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
4757 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
4758 }
2bc77e10 4759
b30e3dbc 4760 ll_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, ll_mask),
5485823f 4761 size_int (xll_bitpos), 0);
b30e3dbc 4762 rl_mask = const_binop (LSHIFT_EXPR, fold_convert (lntype, rl_mask),
5485823f 4763 size_int (xrl_bitpos), 0);
2bc77e10 4764
2bc77e10 4765 if (l_const)
4766 {
b30e3dbc 4767 l_const = fold_convert (lntype, l_const);
cc049fa3 4768 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
94f29e88 4769 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos), 0);
4770 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
4771 fold (build1 (BIT_NOT_EXPR,
ffba564c 4772 lntype, ll_mask)),
94f29e88 4773 0)))
4774 {
be2828ce 4775 warning ("comparison is always %d", wanted_code == NE_EXPR);
cc049fa3 4776
20783f07 4777 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
94f29e88 4778 }
2bc77e10 4779 }
4780 if (r_const)
4781 {
b30e3dbc 4782 r_const = fold_convert (lntype, r_const);
2a6329ae 4783 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
94f29e88 4784 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos), 0);
4785 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
4786 fold (build1 (BIT_NOT_EXPR,
ffba564c 4787 lntype, rl_mask)),
94f29e88 4788 0)))
4789 {
be2828ce 4790 warning ("comparison is always %d", wanted_code == NE_EXPR);
4791
20783f07 4792 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
94f29e88 4793 }
2bc77e10 4794 }
4795
4796 /* If the right sides are not constant, do the same for it. Also,
4797 disallow this optimization if a size or signedness mismatch occurs
4798 between the left and right sides. */
4799 if (l_const == 0)
4800 {
4801 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
15e4fe21 4802 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
4803 /* Make sure the two fields on the right
4804 correspond to the left without being swapped. */
4805 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
2bc77e10 4806 return 0;
4807
4808 first_bit = MIN (lr_bitpos, rr_bitpos);
4809 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
4810 rnmode = get_best_mode (end_bit - first_bit, first_bit,
4811 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
4812 volatilep);
4813 if (rnmode == VOIDmode)
4814 return 0;
4815
4816 rnbitsize = GET_MODE_BITSIZE (rnmode);
4817 rnbitpos = first_bit & ~ (rnbitsize - 1);
fa8b888f 4818 rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
2bc77e10 4819 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
4820
51356f86 4821 if (BYTES_BIG_ENDIAN)
4822 {
4823 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
4824 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
4825 }
2bc77e10 4826
b30e3dbc 4827 lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask),
5485823f 4828 size_int (xlr_bitpos), 0);
b30e3dbc 4829 rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask),
5485823f 4830 size_int (xrr_bitpos), 0);
2bc77e10 4831
4832 /* Make a mask that corresponds to both fields being compared.
00ee0921 4833 Do this for both items being compared. If the operands are the
4834 same size and the bits being compared are in the same position
4835 then we can do this by masking both and comparing the masked
4836 results. */
5485823f 4837 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
4838 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0);
00ee0921 4839 if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
2bc77e10 4840 {
ffba564c 4841 lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
2bc77e10 4842 ll_unsignedp || rl_unsignedp);
00ee0921 4843 if (! all_ones_mask_p (ll_mask, lnbitsize))
fd96eeef 4844 lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
00ee0921 4845
ffba564c 4846 rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos,
2bc77e10 4847 lr_unsignedp || rr_unsignedp);
00ee0921 4848 if (! all_ones_mask_p (lr_mask, rnbitsize))
fd96eeef 4849 rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
00ee0921 4850
fd96eeef 4851 return build2 (wanted_code, truth_type, lhs, rhs);
2bc77e10 4852 }
4853
4854 /* There is still another way we can do something: If both pairs of
4855 fields being compared are adjacent, we may be able to make a wider
4cf66b97 4856 field containing them both.
4857
4858 Note that we still must mask the lhs/rhs expressions. Furthermore,
cc049fa3 4859 the mask must be shifted to account for the shift done by
4cf66b97 4860 make_bit_field_ref. */
2bc77e10 4861 if ((ll_bitsize + ll_bitpos == rl_bitpos
4862 && lr_bitsize + lr_bitpos == rr_bitpos)
4863 || (ll_bitpos == rl_bitpos + rl_bitsize
4864 && lr_bitpos == rr_bitpos + rr_bitsize))
4cf66b97 4865 {
ffba564c 4866 tree type;
4867
4868 lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize,
4cf66b97 4869 MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
ffba564c 4870 rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize,
4871 MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
4872
4cf66b97 4873 ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
4874 size_int (MIN (xll_bitpos, xrl_bitpos)), 0);
ffba564c 4875 lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
4876 size_int (MIN (xlr_bitpos, xrr_bitpos)), 0);
4877
4878 /* Convert to the smaller type before masking out unwanted bits. */
4879 type = lntype;
4880 if (lntype != rntype)
4881 {
4882 if (lnbitsize > rnbitsize)
4883 {
b30e3dbc 4884 lhs = fold_convert (rntype, lhs);
4885 ll_mask = fold_convert (rntype, ll_mask);
ffba564c 4886 type = rntype;
4887 }
4888 else if (lnbitsize < rnbitsize)
4889 {
b30e3dbc 4890 rhs = fold_convert (lntype, rhs);
4891 lr_mask = fold_convert (lntype, lr_mask);
ffba564c 4892 type = lntype;
4893 }
4894 }
4895
4cf66b97 4896 if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
fd96eeef 4897 lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
4cf66b97 4898
4cf66b97 4899 if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
fd96eeef 4900 rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
4cf66b97 4901
fd96eeef 4902 return build2 (wanted_code, truth_type, lhs, rhs);
4cf66b97 4903 }
2bc77e10 4904
4905 return 0;
4906 }
4907
4908 /* Handle the case of comparisons with constants. If there is something in
4909 common between the masks, those bits of the constants must be the same.
4910 If not, the condition is always false. Test for this to avoid generating
4911 incorrect code below. */
5485823f 4912 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask, 0);
2bc77e10 4913 if (! integer_zerop (result)
5485823f 4914 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const, 0),
4915 const_binop (BIT_AND_EXPR, result, r_const, 0)) != 1)
2bc77e10 4916 {
4917 if (wanted_code == NE_EXPR)
4918 {
eb586f2c 4919 warning ("%<or%> of unmatched not-equal tests is always 1");
20783f07 4920 return constant_boolean_node (true, truth_type);
2bc77e10 4921 }
4922 else
4923 {
eb586f2c 4924 warning ("%<and%> of mutually exclusive equal-tests is always 0");
20783f07 4925 return constant_boolean_node (false, truth_type);
2bc77e10 4926 }
4927 }
4928
4929 /* Construct the expression we will return. First get the component
4930 reference we will make. Unless the mask is all ones the width of
4931 that field, perform the mask operation. Then compare with the
4932 merged constant. */
ffba564c 4933 result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos,
2bc77e10 4934 ll_unsignedp || rl_unsignedp);
4935
5485823f 4936 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0);
2bc77e10 4937 if (! all_ones_mask_p (ll_mask, lnbitsize))
fd96eeef 4938 result = build2 (BIT_AND_EXPR, lntype, result, ll_mask);
2bc77e10 4939
fd96eeef 4940 return build2 (wanted_code, truth_type, result,
4941 const_binop (BIT_IOR_EXPR, l_const, r_const, 0));
2bc77e10 4942}
4943\f
cc049fa3 4944/* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
155b05dc 4945 constant. */
4946
4947static tree
de1b648b 4948optimize_minmax_comparison (tree t)
155b05dc 4949{
4950 tree type = TREE_TYPE (t);
4951 tree arg0 = TREE_OPERAND (t, 0);
4952 enum tree_code op_code;
4953 tree comp_const = TREE_OPERAND (t, 1);
4954 tree minmax_const;
4955 int consts_equal, consts_lt;
4956 tree inner;
4957
4958 STRIP_SIGN_NOPS (arg0);
4959
4960 op_code = TREE_CODE (arg0);
4961 minmax_const = TREE_OPERAND (arg0, 1);
4962 consts_equal = tree_int_cst_equal (minmax_const, comp_const);
4963 consts_lt = tree_int_cst_lt (minmax_const, comp_const);
4964 inner = TREE_OPERAND (arg0, 0);
4965
4966 /* If something does not permit us to optimize, return the original tree. */
4967 if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
4968 || TREE_CODE (comp_const) != INTEGER_CST
4969 || TREE_CONSTANT_OVERFLOW (comp_const)
4970 || TREE_CODE (minmax_const) != INTEGER_CST
4971 || TREE_CONSTANT_OVERFLOW (minmax_const))
4972 return t;
4973
4974 /* Now handle all the various comparison codes. We only handle EQ_EXPR
4975 and GT_EXPR, doing the rest with recursive calls using logical
4976 simplifications. */
4977 switch (TREE_CODE (t))
4978 {
4979 case NE_EXPR: case LT_EXPR: case LE_EXPR:
4980 return
4981 invert_truthvalue (optimize_minmax_comparison (invert_truthvalue (t)));
4982
4983 case GE_EXPR:
4984 return
fd96eeef 4985 fold (build2 (TRUTH_ORIF_EXPR, type,
4986 optimize_minmax_comparison
4987 (build2 (EQ_EXPR, type, arg0, comp_const)),
4988 optimize_minmax_comparison
4989 (build2 (GT_EXPR, type, arg0, comp_const))));
155b05dc 4990
4991 case EQ_EXPR:
4992 if (op_code == MAX_EXPR && consts_equal)
4993 /* MAX (X, 0) == 0 -> X <= 0 */
fd96eeef 4994 return fold (build2 (LE_EXPR, type, inner, comp_const));
155b05dc 4995
4996 else if (op_code == MAX_EXPR && consts_lt)
4997 /* MAX (X, 0) == 5 -> X == 5 */
fd96eeef 4998 return fold (build2 (EQ_EXPR, type, inner, comp_const));
155b05dc 4999
5000 else if (op_code == MAX_EXPR)
5001 /* MAX (X, 0) == -1 -> false */
5002 return omit_one_operand (type, integer_zero_node, inner);
5003
5004 else if (consts_equal)
5005 /* MIN (X, 0) == 0 -> X >= 0 */
fd96eeef 5006 return fold (build2 (GE_EXPR, type, inner, comp_const));
155b05dc 5007
5008 else if (consts_lt)
5009 /* MIN (X, 0) == 5 -> false */
5010 return omit_one_operand (type, integer_zero_node, inner);
5011
5012 else
5013 /* MIN (X, 0) == -1 -> X == -1 */
fd96eeef 5014 return fold (build2 (EQ_EXPR, type, inner, comp_const));
155b05dc 5015
5016 case GT_EXPR:
5017 if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5018 /* MAX (X, 0) > 0 -> X > 0
5019 MAX (X, 0) > 5 -> X > 5 */
fd96eeef 5020 return fold (build2 (GT_EXPR, type, inner, comp_const));
155b05dc 5021
5022 else if (op_code == MAX_EXPR)
5023 /* MAX (X, 0) > -1 -> true */
5024 return omit_one_operand (type, integer_one_node, inner);
5025
5026 else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5027 /* MIN (X, 0) > 0 -> false
5028 MIN (X, 0) > 5 -> false */
5029 return omit_one_operand (type, integer_zero_node, inner);
5030
5031 else
5032 /* MIN (X, 0) > -1 -> X > -1 */
fd96eeef 5033 return fold (build2 (GT_EXPR, type, inner, comp_const));
155b05dc 5034
5035 default:
5036 return t;
5037 }
5038}
5039\f
23ec2d5e 5040/* T is an integer expression that is being multiplied, divided, or taken a
5041 modulus (CODE says which and what kind of divide or modulus) by a
5042 constant C. See if we can eliminate that operation by folding it with
5043 other operations already in T. WIDE_TYPE, if non-null, is a type that
5044 should be used for the computation if wider than our type.
5045
b07ba9ff 5046 For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5047 (X * 2) + (Y * 4). We must, however, be assured that either the original
2f5cf552 5048 expression would not overflow or that overflow is undefined for the type
5049 in the language in question.
5050
5051 We also canonicalize (X + 7) * 4 into X * 4 + 28 in the hope that either
5052 the machine has a multiply-accumulate insn or that this is part of an
5053 addressing calculation.
23ec2d5e 5054
5055 If we return a non-null expression, it is an equivalent form of the
5056 original computation, but need not be in the original type. */
5057
5058static tree
de1b648b 5059extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type)
009f6e1c 5060{
5061 /* To avoid exponential search depth, refuse to allow recursion past
5062 three levels. Beyond that (1) it's highly unlikely that we'll find
5063 something interesting and (2) we've probably processed it before
5064 when we built the inner expression. */
5065
5066 static int depth;
5067 tree ret;
5068
5069 if (depth > 3)
5070 return NULL;
5071
5072 depth++;
5073 ret = extract_muldiv_1 (t, c, code, wide_type);
5074 depth--;
5075
5076 return ret;
5077}
5078
5079static tree
de1b648b 5080extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
23ec2d5e 5081{
5082 tree type = TREE_TYPE (t);
5083 enum tree_code tcode = TREE_CODE (t);
cc049fa3 5084 tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
23ec2d5e 5085 > GET_MODE_SIZE (TYPE_MODE (type)))
5086 ? wide_type : type);
5087 tree t1, t2;
5088 int same_p = tcode == code;
03435587 5089 tree op0 = NULL_TREE, op1 = NULL_TREE;
23ec2d5e 5090
5091 /* Don't deal with constants of zero here; they confuse the code below. */
5092 if (integer_zerop (c))
2f5cf552 5093 return NULL_TREE;
23ec2d5e 5094
ce45a448 5095 if (TREE_CODE_CLASS (tcode) == tcc_unary)
23ec2d5e 5096 op0 = TREE_OPERAND (t, 0);
5097
ce45a448 5098 if (TREE_CODE_CLASS (tcode) == tcc_binary)
23ec2d5e 5099 op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5100
5101 /* Note that we need not handle conditional operations here since fold
5102 already handles those cases. So just do arithmetic here. */
5103 switch (tcode)
5104 {
5105 case INTEGER_CST:
5106 /* For a constant, we can always simplify if we are a multiply
5107 or (for divide and modulus) if it is a multiple of our constant. */
5108 if (code == MULT_EXPR
5109 || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c, 0)))
b30e3dbc 5110 return const_binop (code, fold_convert (ctype, t),
5111 fold_convert (ctype, c), 0);
23ec2d5e 5112 break;
5113
5114 case CONVERT_EXPR: case NON_LVALUE_EXPR: case NOP_EXPR:
12480406 5115 /* If op0 is an expression ... */
ce45a448 5116 if ((COMPARISON_CLASS_P (op0)
5117 || UNARY_CLASS_P (op0)
5118 || BINARY_CLASS_P (op0)
5119 || EXPRESSION_CLASS_P (op0))
12480406 5120 /* ... and is unsigned, and its type is smaller than ctype,
5121 then we cannot pass through as widening. */
78a8ed03 5122 && ((TYPE_UNSIGNED (TREE_TYPE (op0))
12480406 5123 && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5124 && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5125 && (GET_MODE_SIZE (TYPE_MODE (ctype))
5126 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
40309554 5127 /* ... or this is a truncation (t is narrower than op0),
5128 then we cannot pass through this narrowing. */
5129 || (GET_MODE_SIZE (TYPE_MODE (type))
cee280ef 5130 < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
5131 /* ... or signedness changes for division or modulus,
5132 then we cannot pass through this conversion. */
5133 || (code != MULT_EXPR
78a8ed03 5134 && (TYPE_UNSIGNED (ctype)
5135 != TYPE_UNSIGNED (TREE_TYPE (op0))))))
3cb1a3c6 5136 break;
5137
23ec2d5e 5138 /* Pass the constant down and see if we can make a simplification. If
5f0002b0 5139 we can, replace this expression with the inner simplification for
5140 possible later conversion to our or some other type. */
b30e3dbc 5141 if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
f2fa1510 5142 && TREE_CODE (t2) == INTEGER_CST
5143 && ! TREE_CONSTANT_OVERFLOW (t2)
5144 && (0 != (t1 = extract_muldiv (op0, t2, code,
5145 code == MULT_EXPR
5146 ? ctype : NULL_TREE))))
23ec2d5e 5147 return t1;
5148 break;
5149
5150 case NEGATE_EXPR: case ABS_EXPR:
5151 if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
b30e3dbc 5152 return fold (build1 (tcode, ctype, fold_convert (ctype, t1)));
23ec2d5e 5153 break;
5154
5155 case MIN_EXPR: case MAX_EXPR:
6269027b 5156 /* If widening the type changes the signedness, then we can't perform
5157 this optimization as that changes the result. */
78a8ed03 5158 if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6269027b 5159 break;
5160
23ec2d5e 5161 /* MIN (a, b) / 5 -> MIN (a / 5, b / 5) */
5162 if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0
5163 && (t2 = extract_muldiv (op1, c, code, wide_type)) != 0)
5f0002b0 5164 {
5165 if (tree_int_cst_sgn (c) < 0)
5166 tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5167
fd96eeef 5168 return fold (build2 (tcode, ctype, fold_convert (ctype, t1),
5169 fold_convert (ctype, t2)));
5f0002b0 5170 }
23ec2d5e 5171 break;
5172
23ec2d5e 5173 case LSHIFT_EXPR: case RSHIFT_EXPR:
5174 /* If the second operand is constant, this is a multiplication
5175 or floor division, by a power of two, so we can treat it that
dceee6fb 5176 way unless the multiplier or divisor overflows. Signed
5177 left-shift overflow is implementation-defined rather than
5178 undefined in C90, so do not convert signed left shift into
5179 multiplication. */
23ec2d5e 5180 if (TREE_CODE (op1) == INTEGER_CST
dceee6fb 5181 && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
c011f821 5182 /* const_binop may not detect overflow correctly,
5183 so check for it explicitly here. */
5184 && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5185 && TREE_INT_CST_HIGH (op1) == 0
b30e3dbc 5186 && 0 != (t1 = fold_convert (ctype,
5187 const_binop (LSHIFT_EXPR,
5188 size_one_node,
5189 op1, 0)))
23ec2d5e 5190 && ! TREE_OVERFLOW (t1))
fd96eeef 5191 return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5192 ? MULT_EXPR : FLOOR_DIV_EXPR,
5193 ctype, fold_convert (ctype, op0), t1),
23ec2d5e 5194 c, code, wide_type);
5195 break;
5196
5197 case PLUS_EXPR: case MINUS_EXPR:
5198 /* See if we can eliminate the operation on both sides. If we can, we
5199 can return a new PLUS or MINUS. If we can't, the only remaining
5200 cases where we can do anything are if the second operand is a
5201 constant. */
5202 t1 = extract_muldiv (op0, c, code, wide_type);
5203 t2 = extract_muldiv (op1, c, code, wide_type);
17e3940f 5204 if (t1 != 0 && t2 != 0
5205 && (code == MULT_EXPR
e5b30d78 5206 /* If not multiplication, we can only do this if both operands
5207 are divisible by c. */
5208 || (multiple_of_p (ctype, op0, c)
5209 && multiple_of_p (ctype, op1, c))))
fd96eeef 5210 return fold (build2 (tcode, ctype, fold_convert (ctype, t1),
5211 fold_convert (ctype, t2)));
23ec2d5e 5212
5f0002b0 5213 /* If this was a subtraction, negate OP1 and set it to be an addition.
5214 This simplifies the logic below. */
5215 if (tcode == MINUS_EXPR)
5216 tcode = PLUS_EXPR, op1 = negate_expr (op1);
5217
ec4d93b0 5218 if (TREE_CODE (op1) != INTEGER_CST)
5219 break;
5220
5f0002b0 5221 /* If either OP1 or C are negative, this optimization is not safe for
5222 some of the division and remainder types while for others we need
5223 to change the code. */
5224 if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5225 {
5226 if (code == CEIL_DIV_EXPR)
5227 code = FLOOR_DIV_EXPR;
5f0002b0 5228 else if (code == FLOOR_DIV_EXPR)
5229 code = CEIL_DIV_EXPR;
b575bb01 5230 else if (code != MULT_EXPR
5231 && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5f0002b0 5232 break;
5233 }
5234
98248b34 5235 /* If it's a multiply or a division/modulus operation of a multiple
5236 of our constant, do the operation and verify it doesn't overflow. */
5237 if (code == MULT_EXPR
5238 || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
d3371fcd 5239 {
b30e3dbc 5240 op1 = const_binop (code, fold_convert (ctype, op1),
5241 fold_convert (ctype, c), 0);
f5c47dd7 5242 /* We allow the constant to overflow with wrapping semantics. */
5243 if (op1 == 0
5244 || (TREE_OVERFLOW (op1) && ! flag_wrapv))
d3371fcd 5245 break;
5246 }
98248b34 5247 else
d3371fcd 5248 break;
5f0002b0 5249
fc452262 5250 /* If we have an unsigned type is not a sizetype, we cannot widen
5251 the operation since it will change the result if the original
5252 computation overflowed. */
78a8ed03 5253 if (TYPE_UNSIGNED (ctype)
d490e2f2 5254 && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
fc452262 5255 && ctype != type)
5256 break;
5257
23ec2d5e 5258 /* If we were able to eliminate our operation from the first side,
5f0002b0 5259 apply our operation to the second side and reform the PLUS. */
5260 if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
fd96eeef 5261 return fold (build2 (tcode, ctype, fold_convert (ctype, t1), op1));
23ec2d5e 5262
5263 /* The last case is if we are a multiply. In that case, we can
5264 apply the distributive law to commute the multiply and addition
6312a35e 5265 if the multiplication of the constants doesn't overflow. */
5f0002b0 5266 if (code == MULT_EXPR)
fd96eeef 5267 return fold (build2 (tcode, ctype,
5268 fold (build2 (code, ctype,
5269 fold_convert (ctype, op0),
5270 fold_convert (ctype, c))),
5271 op1));
23ec2d5e 5272
5273 break;
5274
5275 case MULT_EXPR:
5276 /* We have a special case here if we are doing something like
5277 (C * 8) % 4 since we know that's zero. */
5278 if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5279 || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5280 && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5281 && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
5282 return omit_one_operand (type, integer_zero_node, op0);
5283
6312a35e 5284 /* ... fall through ... */
23ec2d5e 5285
5286 case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR:
5287 case ROUND_DIV_EXPR: case EXACT_DIV_EXPR:
5288 /* If we can extract our operation from the LHS, do so and return a
5289 new operation. Likewise for the RHS from a MULT_EXPR. Otherwise,
5290 do something only if the second operand is a constant. */
5291 if (same_p
5292 && (t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
fd96eeef 5293 return fold (build2 (tcode, ctype, fold_convert (ctype, t1),
5294 fold_convert (ctype, op1)));
23ec2d5e 5295 else if (tcode == MULT_EXPR && code == MULT_EXPR
5296 && (t1 = extract_muldiv (op1, c, code, wide_type)) != 0)
fd96eeef 5297 return fold (build2 (tcode, ctype, fold_convert (ctype, op0),
5298 fold_convert (ctype, t1)));
23ec2d5e 5299 else if (TREE_CODE (op1) != INTEGER_CST)
5300 return 0;
5301
5302 /* If these are the same operation types, we can associate them
5303 assuming no overflow. */
5304 if (tcode == code
b30e3dbc 5305 && 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
5306 fold_convert (ctype, c), 0))
23ec2d5e 5307 && ! TREE_OVERFLOW (t1))
fd96eeef 5308 return fold (build2 (tcode, ctype, fold_convert (ctype, op0), t1));
23ec2d5e 5309
5310 /* If these operations "cancel" each other, we have the main
5311 optimizations of this pass, which occur when either constant is a
5312 multiple of the other, in which case we replace this with either an
cc049fa3 5313 operation or CODE or TCODE.
2f5cf552 5314
35a3065a 5315 If we have an unsigned type that is not a sizetype, we cannot do
2f5cf552 5316 this since it will change the result if the original computation
5317 overflowed. */
78a8ed03 5318 if ((! TYPE_UNSIGNED (ctype)
d490e2f2 5319 || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
b24bee03 5320 && ! flag_wrapv
2f5cf552 5321 && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5322 || (tcode == MULT_EXPR
5323 && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5324 && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR)))
23ec2d5e 5325 {
5326 if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
fd96eeef 5327 return fold (build2 (tcode, ctype, fold_convert (ctype, op0),
5328 fold_convert (ctype,
5329 const_binop (TRUNC_DIV_EXPR,
5330 op1, c, 0))));
23ec2d5e 5331 else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1, 0)))
fd96eeef 5332 return fold (build2 (code, ctype, fold_convert (ctype, op0),
5333 fold_convert (ctype,
5334 const_binop (TRUNC_DIV_EXPR,
5335 c, op1, 0))));
23ec2d5e 5336 }
5337 break;
5338
5339 default:
5340 break;
5341 }
5342
5343 return 0;
5344}
5345\f
b4af30fd 5346/* Return a node which has the indicated constant VALUE (either 0 or
5347 1), and is of the indicated TYPE. */
5348
5c9198bd 5349tree
de1b648b 5350constant_boolean_node (int value, tree type)
b4af30fd 5351{
5352 if (type == integer_type_node)
5353 return value ? integer_one_node : integer_zero_node;
c4e122e7 5354 else if (type == boolean_type_node)
5355 return value ? boolean_true_node : boolean_false_node;
b4af30fd 5356 else if (TREE_CODE (type) == BOOLEAN_TYPE)
fa8b888f 5357 return lang_hooks.truthvalue_conversion (value ? integer_one_node
5358 : integer_zero_node);
cc049fa3 5359 else
7016c612 5360 return build_int_cst (type, value);
b4af30fd 5361}
5362
203a24c4 5363/* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
47cbd05d 5364 Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here
5365 CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6ef828f9 5366 expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the
47cbd05d 5367 COND is the first argument to CODE; otherwise (as in the example
5368 given here), it is the second argument. TYPE is the type of the
9c9bad97 5369 original expression. Return NULL_TREE if no simplification is
a6661800 5370 possible. */
47cbd05d 5371
5372static tree
dc81944a 5373fold_binary_op_with_conditional_arg (enum tree_code code, tree type,
5374 tree cond, tree arg, int cond_first_p)
47cbd05d 5375{
5376 tree test, true_value, false_value;
5377 tree lhs = NULL_TREE;
5378 tree rhs = NULL_TREE;
a6661800 5379
f2b83d13 5380 /* This transformation is only worthwhile if we don't have to wrap
5381 arg in a SAVE_EXPR, and the operation can be simplified on atleast
5382 one of the branches once its pushed inside the COND_EXPR. */
5383 if (!TREE_CONSTANT (arg))
a6661800 5384 return NULL_TREE;
5385
47cbd05d 5386 if (TREE_CODE (cond) == COND_EXPR)
5387 {
5388 test = TREE_OPERAND (cond, 0);
5389 true_value = TREE_OPERAND (cond, 1);
5390 false_value = TREE_OPERAND (cond, 2);
5391 /* If this operand throws an expression, then it does not make
5392 sense to try to perform a logical or arithmetic operation
f2b83d13 5393 involving it. */
47cbd05d 5394 if (VOID_TYPE_P (TREE_TYPE (true_value)))
f2b83d13 5395 lhs = true_value;
47cbd05d 5396 if (VOID_TYPE_P (TREE_TYPE (false_value)))
f2b83d13 5397 rhs = false_value;
47cbd05d 5398 }
5399 else
5400 {
5401 tree testtype = TREE_TYPE (cond);
5402 test = cond;
20783f07 5403 true_value = constant_boolean_node (true, testtype);
5404 false_value = constant_boolean_node (false, testtype);
47cbd05d 5405 }
d3371fcd 5406
47cbd05d 5407 if (lhs == 0)
f2b83d13 5408 lhs = fold (cond_first_p ? build2 (code, type, true_value, arg)
5409 : build2 (code, type, arg, true_value));
47cbd05d 5410 if (rhs == 0)
f2b83d13 5411 rhs = fold (cond_first_p ? build2 (code, type, false_value, arg)
5412 : build2 (code, type, arg, false_value));
5413
5414 test = fold (build3 (COND_EXPR, type, test, lhs, rhs));
5415 return fold_convert (type, test);
47cbd05d 5416}
5417
be2828ce 5418\f
920d0fb5 5419/* Subroutine of fold() that checks for the addition of +/- 0.0.
5420
5421 If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
5422 TYPE, X + ADDEND is the same as X. If NEGATE, return true if X -
5423 ADDEND is the same as X.
5424
6ef828f9 5425 X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
920d0fb5 5426 and finite. The problematic cases are when X is zero, and its mode
5427 has signed zeros. In the case of rounding towards -infinity,
5428 X - 0 is not the same as X because 0 - 0 is -0. In other rounding
5429 modes, X + 0 is not the same as X because -0 + 0 is 0. */
5430
5431static bool
de1b648b 5432fold_real_zero_addition_p (tree type, tree addend, int negate)
920d0fb5 5433{
5434 if (!real_zerop (addend))
5435 return false;
5436
c7590f7e 5437 /* Don't allow the fold with -fsignaling-nans. */
5438 if (HONOR_SNANS (TYPE_MODE (type)))
5439 return false;
5440
920d0fb5 5441 /* Allow the fold if zeros aren't signed, or their sign isn't important. */
5442 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
5443 return true;
5444
5445 /* Treat x + -0 as x - 0 and x - -0 as x + 0. */
5446 if (TREE_CODE (addend) == REAL_CST
5447 && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
5448 negate = !negate;
5449
5450 /* The mode has signed zeros, and we have to honor their sign.
5451 In this situation, there is only one case we can return true for.
5452 X - 0 is the same as X unless rounding towards -infinity is
5453 supported. */
5454 return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
5455}
5456
4b0b9adb 5457/* Subroutine of fold() that checks comparisons of built-in math
5458 functions against real constants.
5459
5460 FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
5461 operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR. TYPE
5462 is the type of the result and ARG0 and ARG1 are the operands of the
5463 comparison. ARG1 must be a TREE_REAL_CST.
5464
5465 The function returns the constant folded tree if a simplification
5466 can be made, and NULL_TREE otherwise. */
5467
5468static tree
dc81944a 5469fold_mathfn_compare (enum built_in_function fcode, enum tree_code code,
5470 tree type, tree arg0, tree arg1)
4b0b9adb 5471{
5472 REAL_VALUE_TYPE c;
5473
852da3c3 5474 if (BUILTIN_SQRT_P (fcode))
4b0b9adb 5475 {
5476 tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
5477 enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
5478
5479 c = TREE_REAL_CST (arg1);
5480 if (REAL_VALUE_NEGATIVE (c))
5481 {
5482 /* sqrt(x) < y is always false, if y is negative. */
5483 if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
20783f07 5484 return omit_one_operand (type, integer_zero_node, arg);
4b0b9adb 5485
5486 /* sqrt(x) > y is always true, if y is negative and we
5487 don't care about NaNs, i.e. negative values of x. */
5488 if (code == NE_EXPR || !HONOR_NANS (mode))
20783f07 5489 return omit_one_operand (type, integer_one_node, arg);
4b0b9adb 5490
5491 /* sqrt(x) > y is the same as x >= 0, if y is negative. */
fd96eeef 5492 return fold (build2 (GE_EXPR, type, arg,
5493 build_real (TREE_TYPE (arg), dconst0)));
4b0b9adb 5494 }
5495 else if (code == GT_EXPR || code == GE_EXPR)
5496 {
5497 REAL_VALUE_TYPE c2;
5498
5499 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
5500 real_convert (&c2, mode, &c2);
5501
5502 if (REAL_VALUE_ISINF (c2))
5503 {
5504 /* sqrt(x) > y is x == +Inf, when y is very large. */
5505 if (HONOR_INFINITIES (mode))
fd96eeef 5506 return fold (build2 (EQ_EXPR, type, arg,
5507 build_real (TREE_TYPE (arg), c2)));
4b0b9adb 5508
5509 /* sqrt(x) > y is always false, when y is very large
5510 and we don't care about infinities. */
20783f07 5511 return omit_one_operand (type, integer_zero_node, arg);
4b0b9adb 5512 }
5513
5514 /* sqrt(x) > c is the same as x > c*c. */
fd96eeef 5515 return fold (build2 (code, type, arg,
5516 build_real (TREE_TYPE (arg), c2)));
4b0b9adb 5517 }
5518 else if (code == LT_EXPR || code == LE_EXPR)
5519 {
5520 REAL_VALUE_TYPE c2;
5521
5522 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
5523 real_convert (&c2, mode, &c2);
5524
5525 if (REAL_VALUE_ISINF (c2))
5526 {
5527 /* sqrt(x) < y is always true, when y is a very large
5528 value and we don't care about NaNs or Infinities. */
5529 if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
20783f07 5530 return omit_one_operand (type, integer_one_node, arg);
4b0b9adb 5531
5532 /* sqrt(x) < y is x != +Inf when y is very large and we
5533 don't care about NaNs. */
5534 if (! HONOR_NANS (mode))
fd96eeef 5535 return fold (build2 (NE_EXPR, type, arg,
5536 build_real (TREE_TYPE (arg), c2)));
4b0b9adb 5537
5538 /* sqrt(x) < y is x >= 0 when y is very large and we
5539 don't care about Infinities. */
5540 if (! HONOR_INFINITIES (mode))
fd96eeef 5541 return fold (build2 (GE_EXPR, type, arg,
5542 build_real (TREE_TYPE (arg), dconst0)));
4b0b9adb 5543
5544 /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */
fa8b888f 5545 if (lang_hooks.decls.global_bindings_p () != 0
ce3fb06e 5546 || CONTAINS_PLACEHOLDER_P (arg))
4b0b9adb 5547 return NULL_TREE;
5548
5549 arg = save_expr (arg);
fd96eeef 5550 return fold (build2 (TRUTH_ANDIF_EXPR, type,
5551 fold (build2 (GE_EXPR, type, arg,
5552 build_real (TREE_TYPE (arg),
5553 dconst0))),
5554 fold (build2 (NE_EXPR, type, arg,
5555 build_real (TREE_TYPE (arg),
5556 c2)))));
4b0b9adb 5557 }
5558
5559 /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */
5560 if (! HONOR_NANS (mode))
fd96eeef 5561 return fold (build2 (code, type, arg,
5562 build_real (TREE_TYPE (arg), c2)));
4b0b9adb 5563
5564 /* sqrt(x) < c is the same as x >= 0 && x < c*c. */
fa8b888f 5565 if (lang_hooks.decls.global_bindings_p () == 0
ce3fb06e 5566 && ! CONTAINS_PLACEHOLDER_P (arg))
4b0b9adb 5567 {
5568 arg = save_expr (arg);
fd96eeef 5569 return fold (build2 (TRUTH_ANDIF_EXPR, type,
5570 fold (build2 (GE_EXPR, type, arg,
5571 build_real (TREE_TYPE (arg),
5572 dconst0))),
5573 fold (build2 (code, type, arg,
5574 build_real (TREE_TYPE (arg),
5575 c2)))));
4b0b9adb 5576 }
5577 }
5578 }
5579
5580 return NULL_TREE;
5581}
5582
6d2e901f 5583/* Subroutine of fold() that optimizes comparisons against Infinities,
5584 either +Inf or -Inf.
5585
5586 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
5587 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
5588 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
5589
5590 The function returns the constant folded tree if a simplification
5591 can be made, and NULL_TREE otherwise. */
5592
5593static tree
de1b648b 5594fold_inf_compare (enum tree_code code, tree type, tree arg0, tree arg1)
6d2e901f 5595{
ac4bd9a0 5596 enum machine_mode mode;
5597 REAL_VALUE_TYPE max;
5598 tree temp;
5599 bool neg;
5600
5601 mode = TYPE_MODE (TREE_TYPE (arg0));
5602
6d2e901f 5603 /* For negative infinity swap the sense of the comparison. */
ac4bd9a0 5604 neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
5605 if (neg)
6d2e901f 5606 code = swap_tree_comparison (code);
5607
5608 switch (code)
5609 {
5610 case GT_EXPR:
5611 /* x > +Inf is always false, if with ignore sNANs. */
ac4bd9a0 5612 if (HONOR_SNANS (mode))
6d2e901f 5613 return NULL_TREE;
20783f07 5614 return omit_one_operand (type, integer_zero_node, arg0);
6d2e901f 5615
5616 case LE_EXPR:
5617 /* x <= +Inf is always true, if we don't case about NaNs. */
ac4bd9a0 5618 if (! HONOR_NANS (mode))
20783f07 5619 return omit_one_operand (type, integer_one_node, arg0);
6d2e901f 5620
5621 /* x <= +Inf is the same as x == x, i.e. isfinite(x). */
fa8b888f 5622 if (lang_hooks.decls.global_bindings_p () == 0
ce3fb06e 5623 && ! CONTAINS_PLACEHOLDER_P (arg0))
6d2e901f 5624 {
5625 arg0 = save_expr (arg0);
fd96eeef 5626 return fold (build2 (EQ_EXPR, type, arg0, arg0));
6d2e901f 5627 }
5628 break;
5629
ac4bd9a0 5630 case EQ_EXPR:
5631 case GE_EXPR:
5632 /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX. */
5633 real_maxval (&max, neg, mode);
fd96eeef 5634 return fold (build2 (neg ? LT_EXPR : GT_EXPR, type,
5635 arg0, build_real (TREE_TYPE (arg0), max)));
ac4bd9a0 5636
5637 case LT_EXPR:
5638 /* x < +Inf is always equal to x <= DBL_MAX. */
5639 real_maxval (&max, neg, mode);
fd96eeef 5640 return fold (build2 (neg ? GE_EXPR : LE_EXPR, type,
5641 arg0, build_real (TREE_TYPE (arg0), max)));
ac4bd9a0 5642
5643 case NE_EXPR:
5644 /* x != +Inf is always equal to !(x > DBL_MAX). */
5645 real_maxval (&max, neg, mode);
5646 if (! HONOR_NANS (mode))
fd96eeef 5647 return fold (build2 (neg ? GE_EXPR : LE_EXPR, type,
5648 arg0, build_real (TREE_TYPE (arg0), max)));
bd1ec513 5649
5650 /* The transformation below creates non-gimple code and thus is
5651 not appropriate if we are in gimple form. */
5652 if (in_gimple_form)
5653 return NULL_TREE;
7206da1b 5654
fd96eeef 5655 temp = fold (build2 (neg ? LT_EXPR : GT_EXPR, type,
5656 arg0, build_real (TREE_TYPE (arg0), max)));
ac4bd9a0 5657 return fold (build1 (TRUTH_NOT_EXPR, type, temp));
6d2e901f 5658
5659 default:
5660 break;
5661 }
5662
5663 return NULL_TREE;
5664}
920d0fb5 5665
270029e0 5666/* Subroutine of fold() that optimizes comparisons of a division by
365db11e 5667 a nonzero integer constant against an integer constant, i.e.
270029e0 5668 X/C1 op C2.
5669
5670 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
5671 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
5672 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
5673
5674 The function returns the constant folded tree if a simplification
5675 can be made, and NULL_TREE otherwise. */
5676
5677static tree
5678fold_div_compare (enum tree_code code, tree type, tree arg0, tree arg1)
5679{
5680 tree prod, tmp, hi, lo;
5681 tree arg00 = TREE_OPERAND (arg0, 0);
5682 tree arg01 = TREE_OPERAND (arg0, 1);
5683 unsigned HOST_WIDE_INT lpart;
5684 HOST_WIDE_INT hpart;
5685 int overflow;
5686
5687 /* We have to do this the hard way to detect unsigned overflow.
5688 prod = int_const_binop (MULT_EXPR, arg01, arg1, 0); */
5689 overflow = mul_double (TREE_INT_CST_LOW (arg01),
5690 TREE_INT_CST_HIGH (arg01),
5691 TREE_INT_CST_LOW (arg1),
5692 TREE_INT_CST_HIGH (arg1), &lpart, &hpart);
7016c612 5693 prod = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
4d28c5d1 5694 prod = force_fit_type (prod, -1, overflow, false);
270029e0 5695
5696 if (TYPE_UNSIGNED (TREE_TYPE (arg0)))
5697 {
5698 tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
5699 lo = prod;
5700
5701 /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp, 0). */
5702 overflow = add_double (TREE_INT_CST_LOW (prod),
5703 TREE_INT_CST_HIGH (prod),
5704 TREE_INT_CST_LOW (tmp),
5705 TREE_INT_CST_HIGH (tmp),
5706 &lpart, &hpart);
7016c612 5707 hi = build_int_cst_wide (TREE_TYPE (arg00), lpart, hpart);
4d28c5d1 5708 hi = force_fit_type (hi, -1, overflow | TREE_OVERFLOW (prod),
5709 TREE_CONSTANT_OVERFLOW (prod));
270029e0 5710 }
5711 else if (tree_int_cst_sgn (arg01) >= 0)
5712 {
5713 tmp = int_const_binop (MINUS_EXPR, arg01, integer_one_node, 0);
5714 switch (tree_int_cst_sgn (arg1))
5715 {
5716 case -1:
5717 lo = int_const_binop (MINUS_EXPR, prod, tmp, 0);
5718 hi = prod;
5719 break;
5720
5721 case 0:
5722 lo = fold_negate_const (tmp, TREE_TYPE (arg0));
5723 hi = tmp;
5724 break;
5725
5726 case 1:
5727 hi = int_const_binop (PLUS_EXPR, prod, tmp, 0);
5728 lo = prod;
5729 break;
5730
5731 default:
fdada98f 5732 gcc_unreachable ();
270029e0 5733 }
5734 }
5735 else
5736 {
460c8e36 5737 /* A negative divisor reverses the relational operators. */
5738 code = swap_tree_comparison (code);
5739
270029e0 5740 tmp = int_const_binop (PLUS_EXPR, arg01, integer_one_node, 0);
5741 switch (tree_int_cst_sgn (arg1))
5742 {
5743 case -1:
5744 hi = int_const_binop (MINUS_EXPR, prod, tmp, 0);
5745 lo = prod;
5746 break;
5747
5748 case 0:
5749 hi = fold_negate_const (tmp, TREE_TYPE (arg0));
5750 lo = tmp;
5751 break;
5752
5753 case 1:
5754 lo = int_const_binop (PLUS_EXPR, prod, tmp, 0);
5755 hi = prod;
5756 break;
5757
5758 default:
fdada98f 5759 gcc_unreachable ();
270029e0 5760 }
5761 }
5762
5763 switch (code)
5764 {
5765 case EQ_EXPR:
5766 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
5767 return omit_one_operand (type, integer_zero_node, arg00);
5768 if (TREE_OVERFLOW (hi))
5769 return fold (build2 (GE_EXPR, type, arg00, lo));
5770 if (TREE_OVERFLOW (lo))
5771 return fold (build2 (LE_EXPR, type, arg00, hi));
5772 return build_range_check (type, arg00, 1, lo, hi);
5773
5774 case NE_EXPR:
5775 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
5776 return omit_one_operand (type, integer_one_node, arg00);
5777 if (TREE_OVERFLOW (hi))
5778 return fold (build2 (LT_EXPR, type, arg00, lo));
5779 if (TREE_OVERFLOW (lo))
5780 return fold (build2 (GT_EXPR, type, arg00, hi));
5781 return build_range_check (type, arg00, 0, lo, hi);
5782
5783 case LT_EXPR:
5784 if (TREE_OVERFLOW (lo))
5785 return omit_one_operand (type, integer_zero_node, arg00);
5786 return fold (build2 (LT_EXPR, type, arg00, lo));
5787
5788 case LE_EXPR:
5789 if (TREE_OVERFLOW (hi))
5790 return omit_one_operand (type, integer_one_node, arg00);
5791 return fold (build2 (LE_EXPR, type, arg00, hi));
5792
5793 case GT_EXPR:
5794 if (TREE_OVERFLOW (hi))
5795 return omit_one_operand (type, integer_zero_node, arg00);
5796 return fold (build2 (GT_EXPR, type, arg00, hi));
5797
5798 case GE_EXPR:
5799 if (TREE_OVERFLOW (lo))
5800 return omit_one_operand (type, integer_one_node, arg00);
5801 return fold (build2 (GE_EXPR, type, arg00, lo));
5802
5803 default:
5804 break;
5805 }
5806
5807 return NULL_TREE;
5808}
5809
5810
6881f973 5811/* If CODE with arguments ARG0 and ARG1 represents a single bit
5812 equality/inequality test, then return a simplified form of
5813 the test using shifts and logical operations. Otherwise return
5814 NULL. TYPE is the desired result type. */
7206da1b 5815
6881f973 5816tree
f82b06e0 5817fold_single_bit_test (enum tree_code code, tree arg0, tree arg1,
5818 tree result_type)
6881f973 5819{
5820 /* If this is a TRUTH_NOT_EXPR, it may have a single bit test inside
5821 operand 0. */
5822 if (code == TRUTH_NOT_EXPR)
5823 {
5824 code = TREE_CODE (arg0);
5825 if (code != NE_EXPR && code != EQ_EXPR)
5826 return NULL_TREE;
5827
5828 /* Extract the arguments of the EQ/NE. */
5829 arg1 = TREE_OPERAND (arg0, 1);
5830 arg0 = TREE_OPERAND (arg0, 0);
5831
7206da1b 5832 /* This requires us to invert the code. */
6881f973 5833 code = (code == EQ_EXPR ? NE_EXPR : EQ_EXPR);
5834 }
5835
5836 /* If this is testing a single bit, we can optimize the test. */
5837 if ((code == NE_EXPR || code == EQ_EXPR)
5838 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
5839 && integer_pow2p (TREE_OPERAND (arg0, 1)))
5840 {
5841 tree inner = TREE_OPERAND (arg0, 0);
5842 tree type = TREE_TYPE (arg0);
5843 int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
5844 enum machine_mode operand_mode = TYPE_MODE (type);
5845 int ops_unsigned;
654d0fed 5846 tree signed_type, unsigned_type, intermediate_type;
6881f973 5847 tree arg00;
7206da1b 5848
6881f973 5849 /* If we have (A & C) != 0 where C is the sign bit of A, convert
5850 this into A < 0. Similarly for (A & C) == 0 into A >= 0. */
5851 arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
7cc00cbd 5852 if (arg00 != NULL_TREE
5853 /* This is only a win if casting to a signed type is cheap,
5854 i.e. when arg00's type is not a partial mode. */
5855 && TYPE_PRECISION (TREE_TYPE (arg00))
5856 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6881f973 5857 {
fa8b888f 5858 tree stype = lang_hooks.types.signed_type (TREE_TYPE (arg00));
fd96eeef 5859 return fold (build2 (code == EQ_EXPR ? GE_EXPR : LT_EXPR,
5860 result_type, fold_convert (stype, arg00),
5861 fold_convert (stype, integer_zero_node)));
6881f973 5862 }
a4de5624 5863
7206da1b 5864 /* Otherwise we have (A & C) != 0 where C is a single bit,
6881f973 5865 convert that into ((A >> C2) & 1). Where C2 = log2(C).
5866 Similarly for (A & C) == 0. */
5867
5868 /* If INNER is a right shift of a constant and it plus BITNUM does
5869 not overflow, adjust BITNUM and INNER. */
5870 if (TREE_CODE (inner) == RSHIFT_EXPR
5871 && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
5872 && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
5873 && bitnum < TYPE_PRECISION (type)
5874 && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
5875 bitnum - TYPE_PRECISION (type)))
5876 {
5877 bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
5878 inner = TREE_OPERAND (inner, 0);
5879 }
5880
5881 /* If we are going to be able to omit the AND below, we must do our
5882 operations as unsigned. If we must use the AND, we have a choice.
5883 Normally unsigned is faster, but for some machines signed is. */
6881f973 5884#ifdef LOAD_EXTEND_OP
a4de5624 5885 ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND ? 0 : 1);
6881f973 5886#else
a4de5624 5887 ops_unsigned = 1;
6881f973 5888#endif
6881f973 5889
fa8b888f 5890 signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
5891 unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
654d0fed 5892 intermediate_type = ops_unsigned ? unsigned_type : signed_type;
b30e3dbc 5893 inner = fold_convert (intermediate_type, inner);
6881f973 5894
5895 if (bitnum != 0)
fd96eeef 5896 inner = build2 (RSHIFT_EXPR, intermediate_type,
5897 inner, size_int (bitnum));
6881f973 5898
5899 if (code == EQ_EXPR)
abfce8ed 5900 inner = fold (build2 (BIT_XOR_EXPR, intermediate_type,
5901 inner, integer_one_node));
6881f973 5902
5903 /* Put the AND last so it can combine with more things. */
fd96eeef 5904 inner = build2 (BIT_AND_EXPR, intermediate_type,
5905 inner, integer_one_node);
6881f973 5906
5907 /* Make sure to return the proper type. */
b30e3dbc 5908 inner = fold_convert (result_type, inner);
6881f973 5909
5910 return inner;
5911 }
5912 return NULL_TREE;
5913}
fc3df357 5914
bd214d13 5915/* Check whether we are allowed to reorder operands arg0 and arg1,
5916 such that the evaluation of arg1 occurs before arg0. */
5917
5918static bool
5919reorder_operands_p (tree arg0, tree arg1)
5920{
5921 if (! flag_evaluation_order)
0c5713a2 5922 return true;
bd214d13 5923 if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
5924 return true;
5925 return ! TREE_SIDE_EFFECTS (arg0)
5926 && ! TREE_SIDE_EFFECTS (arg1);
5927}
5928
88e11d8f 5929/* Test whether it is preferable two swap two operands, ARG0 and
5930 ARG1, for example because ARG0 is an integer constant and ARG1
bd214d13 5931 isn't. If REORDER is true, only recommend swapping if we can
5932 evaluate the operands in reverse order. */
88e11d8f 5933
cc0bdf91 5934bool
bd214d13 5935tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
88e11d8f 5936{
5937 STRIP_SIGN_NOPS (arg0);
5938 STRIP_SIGN_NOPS (arg1);
5939
5940 if (TREE_CODE (arg1) == INTEGER_CST)
5941 return 0;
5942 if (TREE_CODE (arg0) == INTEGER_CST)
5943 return 1;
5944
5945 if (TREE_CODE (arg1) == REAL_CST)
5946 return 0;
5947 if (TREE_CODE (arg0) == REAL_CST)
5948 return 1;
5949
5950 if (TREE_CODE (arg1) == COMPLEX_CST)
5951 return 0;
5952 if (TREE_CODE (arg0) == COMPLEX_CST)
5953 return 1;
5954
5955 if (TREE_CONSTANT (arg1))
5956 return 0;
5957 if (TREE_CONSTANT (arg0))
5958 return 1;
7206da1b 5959
f9464d30 5960 if (optimize_size)
5961 return 0;
88e11d8f 5962
bd214d13 5963 if (reorder && flag_evaluation_order
5964 && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
5965 return 0;
5966
5967 if (DECL_P (arg1))
5968 return 0;
5969 if (DECL_P (arg0))
5970 return 1;
5971
cc0bdf91 5972 /* It is preferable to swap two SSA_NAME to ensure a canonical form
5973 for commutative and comparison operators. Ensuring a canonical
5974 form allows the optimizers to find additional redundancies without
5975 having to explicitly check for both orderings. */
5976 if (TREE_CODE (arg0) == SSA_NAME
5977 && TREE_CODE (arg1) == SSA_NAME
5978 && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
5979 return 1;
5980
88e11d8f 5981 return 0;
5982}
5983
faab57e3 5984/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
5985 ARG0 is extended to a wider type. */
5986
5987static tree
5988fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
5989{
5990 tree arg0_unw = get_unwidened (arg0, NULL_TREE);
5991 tree arg1_unw;
5992 tree shorter_type, outer_type;
5993 tree min, max;
5994 bool above, below;
5995
5996 if (arg0_unw == arg0)
5997 return NULL_TREE;
5998 shorter_type = TREE_TYPE (arg0_unw);
5999
6000 arg1_unw = get_unwidened (arg1, shorter_type);
6001 if (!arg1_unw)
6002 return NULL_TREE;
6003
6004 /* If possible, express the comparison in the shorter mode. */
6005 if ((code == EQ_EXPR || code == NE_EXPR
6006 || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6007 && (TREE_TYPE (arg1_unw) == shorter_type
6008 || (TREE_CODE (arg1_unw) == INTEGER_CST
6009 && int_fits_type_p (arg1_unw, shorter_type))))
6010 return fold (build (code, type, arg0_unw,
6011 fold_convert (shorter_type, arg1_unw)));
6012
6013 if (TREE_CODE (arg1_unw) != INTEGER_CST)
6014 return NULL_TREE;
6015
6016 /* If we are comparing with the integer that does not fit into the range
6017 of the shorter type, the result is known. */
6018 outer_type = TREE_TYPE (arg1_unw);
6019 min = lower_bound_in_type (outer_type, shorter_type);
6020 max = upper_bound_in_type (outer_type, shorter_type);
6021
6022 above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6023 max, arg1_unw));
6024 below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6025 arg1_unw, min));
6026
6027 switch (code)
6028 {
6029 case EQ_EXPR:
6030 if (above || below)
6031 return constant_boolean_node (false, type);
6032 break;
6033
6034 case NE_EXPR:
6035 if (above || below)
6036 return constant_boolean_node (true, type);
6037 break;
6038
6039 case LT_EXPR:
6040 case LE_EXPR:
6041 if (above)
6042 return constant_boolean_node (true, type);
6043 else if (below)
6044 return constant_boolean_node (false, type);;
6045
6046 case GT_EXPR:
6047 case GE_EXPR:
6048 if (above)
6049 return constant_boolean_node (false, type);
6050 else if (below)
6051 return constant_boolean_node (true, type);;
6052
6053 default:
6054 break;
6055 }
6056
6057 return NULL_TREE;
6058}
6059
6060/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6061 ARG0 just the signedness is changed. */
6062
6063static tree
6064fold_sign_changed_comparison (enum tree_code code, tree type,
6065 tree arg0, tree arg1)
6066{
6067 tree arg0_inner, tmp;
6068 tree inner_type, outer_type;
6069
6070 if (TREE_CODE (arg0) != NOP_EXPR)
6071 return NULL_TREE;
6072
6073 outer_type = TREE_TYPE (arg0);
6074 arg0_inner = TREE_OPERAND (arg0, 0);
6075 inner_type = TREE_TYPE (arg0_inner);
6076
6077 if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6078 return NULL_TREE;
6079
6080 if (TREE_CODE (arg1) != INTEGER_CST
6081 && !(TREE_CODE (arg1) == NOP_EXPR
6082 && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6083 return NULL_TREE;
6084
6085 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6086 && code != NE_EXPR
6087 && code != EQ_EXPR)
6088 return NULL_TREE;
6089
6090 if (TREE_CODE (arg1) == INTEGER_CST)
6091 {
6092 tmp = build_int_cst_wide (inner_type,
6093 TREE_INT_CST_LOW (arg1),
6094 TREE_INT_CST_HIGH (arg1));
6095 arg1 = force_fit_type (tmp, 0,
6096 TREE_OVERFLOW (arg1),
6097 TREE_CONSTANT_OVERFLOW (arg1));
6098 }
6099 else
6100 arg1 = fold_convert (inner_type, arg1);
6101
6102 return fold (build (code, type, arg0_inner, arg1));
6103}
6104
dede8dcc 6105/* Tries to replace &a[idx] CODE s * delta with &a[idx CODE delta], if s is
6106 step of the array. TYPE is the type of the expression. ADDR is the address.
6107 MULT is the multiplicative expression. If the function succeeds, the new
6108 address expression is returned. Otherwise NULL_TREE is returned. */
6109
6110static tree
6111try_move_mult_to_index (tree type, enum tree_code code, tree addr, tree mult)
6112{
6113 tree s, delta, step;
6114 tree arg0 = TREE_OPERAND (mult, 0), arg1 = TREE_OPERAND (mult, 1);
6115 tree ref = TREE_OPERAND (addr, 0), pref;
6116 tree ret, pos;
6117 tree itype;
6118
6119 STRIP_NOPS (arg0);
6120 STRIP_NOPS (arg1);
6121
6122 if (TREE_CODE (arg0) == INTEGER_CST)
6123 {
6124 s = arg0;
6125 delta = arg1;
6126 }
6127 else if (TREE_CODE (arg1) == INTEGER_CST)
6128 {
6129 s = arg1;
6130 delta = arg0;
6131 }
6132 else
6133 return NULL_TREE;
6134
6135 for (;; ref = TREE_OPERAND (ref, 0))
6136 {
6137 if (TREE_CODE (ref) == ARRAY_REF)
6138 {
6139 step = array_ref_element_size (ref);
6140
6141 if (TREE_CODE (step) != INTEGER_CST)
6142 continue;
6143
6144 itype = TREE_TYPE (step);
6145
6146 /* If the type sizes do not match, we might run into problems
6147 when one of them would overflow. */
6148 if (TYPE_PRECISION (itype) != TYPE_PRECISION (type))
6149 continue;
6150
6151 if (!operand_equal_p (step, fold_convert (itype, s), 0))
6152 continue;
6153
6154 delta = fold_convert (itype, delta);
6155 break;
6156 }
6157
6158 if (!handled_component_p (ref))
6159 return NULL_TREE;
6160 }
6161
6162 /* We found the suitable array reference. So copy everything up to it,
6163 and replace the index. */
6164
6165 pref = TREE_OPERAND (addr, 0);
6166 ret = copy_node (pref);
6167 pos = ret;
6168
6169 while (pref != ref)
6170 {
6171 pref = TREE_OPERAND (pref, 0);
6172 TREE_OPERAND (pos, 0) = copy_node (pref);
6173 pos = TREE_OPERAND (pos, 0);
6174 }
6175
6176 TREE_OPERAND (pos, 1) = fold (build2 (code, itype,
6177 TREE_OPERAND (pos, 1),
6178 delta));
6179
6180 return build1 (ADDR_EXPR, type, ret);
6181}
6182
2bc77e10 6183/* Perform constant folding and related simplification of EXPR.
6184 The related simplifications include x*1 => x, x*0 => 0, etc.,
6185 and application of the associative law.
6186 NOP_EXPR conversions may be removed freely (as long as we
c4b03c0f 6187 are careful not to change the type of the overall expression).
2bc77e10 6188 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
6189 but we can constant-fold them if they have constant operands. */
6190
fc3df357 6191#ifdef ENABLE_FOLD_CHECKING
6192# define fold(x) fold_1 (x)
6193static tree fold_1 (tree);
6194static
6195#endif
2bc77e10 6196tree
de1b648b 6197fold (tree expr)
2bc77e10 6198{
53f78329 6199 const tree t = expr;
2b03eaaf 6200 const tree type = TREE_TYPE (expr);
2bc77e10 6201 tree t1 = NULL_TREE;
e233264a 6202 tree tem;
19cb6b50 6203 tree arg0 = NULL_TREE, arg1 = NULL_TREE;
6204 enum tree_code code = TREE_CODE (t);
ce45a448 6205 enum tree_code_class kind = TREE_CODE_CLASS (code);
4ee9c684 6206
2bc77e10 6207 /* WINS will be nonzero when the switch is done
6208 if all operands are constant. */
2bc77e10 6209 int wins = 1;
6210
8541c166 6211 /* Return right away if a constant. */
ce45a448 6212 if (kind == tcc_constant)
8541c166 6213 return t;
cc049fa3 6214
233c0cbd 6215 if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
6216 {
bb6b5123 6217 tree subop;
6218
233c0cbd 6219 /* Special case for conversion ops that can have fixed point args. */
6220 arg0 = TREE_OPERAND (t, 0);
6221
6222 /* Don't use STRIP_NOPS, because signedness of argument type matters. */
6223 if (arg0 != 0)
155b05dc 6224 STRIP_SIGN_NOPS (arg0);
233c0cbd 6225
bb6b5123 6226 if (arg0 != 0 && TREE_CODE (arg0) == COMPLEX_CST)
6227 subop = TREE_REALPART (arg0);
6228 else
6229 subop = arg0;
6230
6231 if (subop != 0 && TREE_CODE (subop) != INTEGER_CST
88e11d8f 6232 && TREE_CODE (subop) != REAL_CST)
233c0cbd 6233 /* Note that TREE_CONSTANT isn't enough:
6234 static var addresses are constant but we can't
6235 do arithmetic on them. */
6236 wins = 0;
6237 }
47549347 6238 else if (IS_EXPR_CODE_CLASS (kind))
2bc77e10 6239 {
19cb6b50 6240 int len = first_rtl_op (code);
6241 int i;
2bc77e10 6242 for (i = 0; i < len; i++)
6243 {
6244 tree op = TREE_OPERAND (t, i);
bb6b5123 6245 tree subop;
2bc77e10 6246
6247 if (op == 0)
6248 continue; /* Valid for CALL_EXPR, at least. */
6249
6f420099 6250 /* Strip any conversions that don't change the mode. This is
6251 safe for every expression, except for a comparison expression
6252 because its signedness is derived from its operands. So, in
6253 the latter case, only strip conversions that don't change the
6254 signedness.
6255
6256 Note that this is done as an internal manipulation within the
6257 constant folder, in order to find the simplest representation
6258 of the arguments so that their form can be studied. In any
6259 cases, the appropriate type conversions should be put back in
6260 the tree that will get out of the constant folder. */
ce45a448 6261 if (kind == tcc_comparison)
6f420099 6262 STRIP_SIGN_NOPS (op);
c2cbd9a8 6263 else
3a6656ad 6264 STRIP_NOPS (op);
cc049fa3 6265
bb6b5123 6266 if (TREE_CODE (op) == COMPLEX_CST)
6267 subop = TREE_REALPART (op);
6268 else
6269 subop = op;
6270
6271 if (TREE_CODE (subop) != INTEGER_CST
4268f174 6272 && TREE_CODE (subop) != REAL_CST)
2bc77e10 6273 /* Note that TREE_CONSTANT isn't enough:
6274 static var addresses are constant but we can't
6275 do arithmetic on them. */
6276 wins = 0;
6277
6278 if (i == 0)
6279 arg0 = op;
6280 else if (i == 1)
6281 arg1 = op;
6282 }
6283 }
6284
6285 /* If this is a commutative operation, and ARG0 is a constant, move it
6286 to ARG1 to reduce the number of tests below. */
21dff555 6287 if (commutative_tree_code (code)
bd214d13 6288 && tree_swap_operands_p (arg0, arg1, true))
fd96eeef 6289 return fold (build2 (code, type, TREE_OPERAND (t, 1),
6290 TREE_OPERAND (t, 0)));
2bc77e10 6291
6292 /* Now WINS is set as described above,
6293 ARG0 is the first operand of EXPR,
6294 and ARG1 is the second operand (if it has more than one operand).
6295
6296 First check for cases where an arithmetic operation is applied to a
6297 compound, conditional, or comparison operation. Push the arithmetic
6298 operation inside the compound or conditional to see if any folding
6299 can then be done. Convert comparison to conditional for this purpose.
6300 The also optimizes non-constant cases that used to be done in
b5ab1edd 6301 expand_expr.
6302
ea7a28cf 6303 Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
8b94828f 6304 one of the operands is a comparison and the other is a comparison, a
6305 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
6306 code below would make the expression more complex. Change it to a
cc049fa3 6307 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
5c0dba00 6308 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
b5ab1edd 6309
5c0dba00 6310 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
6311 || code == EQ_EXPR || code == NE_EXPR)
8b94828f 6312 && ((truth_value_p (TREE_CODE (arg0))
6313 && (truth_value_p (TREE_CODE (arg1))
b5ab1edd 6314 || (TREE_CODE (arg1) == BIT_AND_EXPR
6315 && integer_onep (TREE_OPERAND (arg1, 1)))))
8b94828f 6316 || (truth_value_p (TREE_CODE (arg1))
6317 && (truth_value_p (TREE_CODE (arg0))
b5ab1edd 6318 || (TREE_CODE (arg0) == BIT_AND_EXPR
6319 && integer_onep (TREE_OPERAND (arg0, 1)))))))
5c0dba00 6320 {
fd96eeef 6321 tem = fold (build2 (code == BIT_AND_EXPR ? TRUTH_AND_EXPR
6322 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
6323 : TRUTH_XOR_EXPR,
6324 type, fold_convert (boolean_type_node, arg0),
6325 fold_convert (boolean_type_node, arg1)));
5c0dba00 6326
6327 if (code == EQ_EXPR)
53f78329 6328 tem = invert_truthvalue (tem);
5c0dba00 6329
53f78329 6330 return tem;
5c0dba00 6331 }
b5ab1edd 6332
ce45a448 6333 if (TREE_CODE_CLASS (code) == tcc_unary)
2bc77e10 6334 {
6335 if (TREE_CODE (arg0) == COMPOUND_EXPR)
fd96eeef 6336 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
6337 fold (build1 (code, type, TREE_OPERAND (arg0, 1))));
2bc77e10 6338 else if (TREE_CODE (arg0) == COND_EXPR)
abd9ac9c 6339 {
09f309b8 6340 tree arg01 = TREE_OPERAND (arg0, 1);
6341 tree arg02 = TREE_OPERAND (arg0, 2);
6342 if (! VOID_TYPE_P (TREE_TYPE (arg01)))
6343 arg01 = fold (build1 (code, type, arg01));
6344 if (! VOID_TYPE_P (TREE_TYPE (arg02)))
6345 arg02 = fold (build1 (code, type, arg02));
fd96eeef 6346 tem = fold (build3 (COND_EXPR, type, TREE_OPERAND (arg0, 0),
6347 arg01, arg02));
abd9ac9c 6348
6349 /* If this was a conversion, and all we did was to move into
2483911d 6350 inside the COND_EXPR, bring it back out. But leave it if
6351 it is a conversion from integer to integer and the
6352 result precision is no wider than a word since such a
6353 conversion is cheap and may be optimized away by combine,
6354 while it couldn't if it were outside the COND_EXPR. Then return
6355 so we don't get into an infinite recursion loop taking the
6356 conversion out and then back in. */
abd9ac9c 6357
6358 if ((code == NOP_EXPR || code == CONVERT_EXPR
6359 || code == NON_LVALUE_EXPR)
53f78329 6360 && TREE_CODE (tem) == COND_EXPR
6361 && TREE_CODE (TREE_OPERAND (tem, 1)) == code
6362 && TREE_CODE (TREE_OPERAND (tem, 2)) == code
6363 && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
6364 && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
6365 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
6366 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
6367 && ! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
083a2b5e 6368 && (INTEGRAL_TYPE_P
53f78329 6369 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
6370 && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD))
6371 tem = build1 (code, type,
fd96eeef 6372 build3 (COND_EXPR,
6373 TREE_TYPE (TREE_OPERAND
6374 (TREE_OPERAND (tem, 1), 0)),
6375 TREE_OPERAND (tem, 0),
6376 TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
6377 TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
53f78329 6378 return tem;
abd9ac9c 6379 }
ce45a448 6380 else if (COMPARISON_CLASS_P (arg0))
4ee9c684 6381 {
6382 if (TREE_CODE (type) == BOOLEAN_TYPE)
6383 {
6384 arg0 = copy_node (arg0);
6385 TREE_TYPE (arg0) = type;
6386 return arg0;
6387 }
6388 else if (TREE_CODE (type) != INTEGER_TYPE)
fd96eeef 6389 return fold (build3 (COND_EXPR, type, arg0,
6390 fold (build1 (code, type,
6391 integer_one_node)),
6392 fold (build1 (code, type,
6393 integer_zero_node))));
4ee9c684 6394 }
2bc77e10 6395 }
ce45a448 6396 else if (TREE_CODE_CLASS (code) == tcc_comparison
d3221b32 6397 && TREE_CODE (arg0) == COMPOUND_EXPR)
fd96eeef 6398 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
6399 fold (build2 (code, type, TREE_OPERAND (arg0, 1), arg1)));
ce45a448 6400 else if (TREE_CODE_CLASS (code) == tcc_comparison
d3221b32 6401 && TREE_CODE (arg1) == COMPOUND_EXPR)
fd96eeef 6402 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
6403 fold (build2 (code, type, arg0, TREE_OPERAND (arg1, 1))));
ce45a448 6404 else if (TREE_CODE_CLASS (code) == tcc_binary
6405 || TREE_CODE_CLASS (code) == tcc_comparison)
2bc77e10 6406 {
a6661800 6407 if (TREE_CODE (arg0) == COMPOUND_EXPR)
fd96eeef 6408 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
6409 fold (build2 (code, type, TREE_OPERAND (arg0, 1),
6410 arg1)));
0a50b321 6411 if (TREE_CODE (arg1) == COMPOUND_EXPR
a6661800 6412 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
fd96eeef 6413 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
6414 fold (build2 (code, type,
6415 arg0, TREE_OPERAND (arg1, 1))));
a6661800 6416
ce45a448 6417 if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
a6661800 6418 {
6419 tem = fold_binary_op_with_conditional_arg (code, type, arg0, arg1,
6420 /*cond_first_p=*/1);
6421 if (tem != NULL_TREE)
6422 return tem;
6423 }
6424
ce45a448 6425 if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
a6661800 6426 {
6427 tem = fold_binary_op_with_conditional_arg (code, type, arg1, arg0,
6428 /*cond_first_p=*/0);
6429 if (tem != NULL_TREE)
6430 return tem;
6431 }
2bc77e10 6432 }
cc049fa3 6433
2bc77e10 6434 switch (code)
6435 {
2bc77e10 6436 case CONST_DECL:
6437 return fold (DECL_INITIAL (t));
6438
6439 case NOP_EXPR:
6440 case FLOAT_EXPR:
6441 case CONVERT_EXPR:
6442 case FIX_TRUNC_EXPR:
04b253e8 6443 case FIX_CEIL_EXPR:
6444 case FIX_FLOOR_EXPR:
50c90ea2 6445 case FIX_ROUND_EXPR:
2b03eaaf 6446 if (TREE_TYPE (TREE_OPERAND (t, 0)) == type)
2483911d 6447 return TREE_OPERAND (t, 0);
6448
fa4ebe56 6449 /* Handle cases of two conversions in a row. */
6450 if (TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
6451 || TREE_CODE (TREE_OPERAND (t, 0)) == CONVERT_EXPR)
6452 {
6453 tree inside_type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
6454 tree inter_type = TREE_TYPE (TREE_OPERAND (t, 0));
fa4ebe56 6455 int inside_int = INTEGRAL_TYPE_P (inside_type);
cc58e392 6456 int inside_ptr = POINTER_TYPE_P (inside_type);
fa4ebe56 6457 int inside_float = FLOAT_TYPE_P (inside_type);
02e7a332 6458 unsigned int inside_prec = TYPE_PRECISION (inside_type);
78a8ed03 6459 int inside_unsignedp = TYPE_UNSIGNED (inside_type);
fa4ebe56 6460 int inter_int = INTEGRAL_TYPE_P (inter_type);
cc58e392 6461 int inter_ptr = POINTER_TYPE_P (inter_type);
fa4ebe56 6462 int inter_float = FLOAT_TYPE_P (inter_type);
02e7a332 6463 unsigned int inter_prec = TYPE_PRECISION (inter_type);
78a8ed03 6464 int inter_unsignedp = TYPE_UNSIGNED (inter_type);
041207ec 6465 int final_int = INTEGRAL_TYPE_P (type);
6466 int final_ptr = POINTER_TYPE_P (type);
6467 int final_float = FLOAT_TYPE_P (type);
6468 unsigned int final_prec = TYPE_PRECISION (type);
78a8ed03 6469 int final_unsignedp = TYPE_UNSIGNED (type);
fa4ebe56 6470
cc049fa3 6471 /* In addition to the cases of two conversions in a row
fa4ebe56 6472 handled below, if we are converting something to its own
6473 type via an object of identical or wider precision, neither
6474 conversion is needed. */
041207ec 6475 if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
fa4ebe56 6476 && ((inter_int && final_int) || (inter_float && final_float))
6477 && inter_prec >= final_prec)
041207ec 6478 return fold (build1 (code, type,
beecf0c3 6479 TREE_OPERAND (TREE_OPERAND (t, 0), 0)));
fa4ebe56 6480
6481 /* Likewise, if the intermediate and final types are either both
6482 float or both integer, we don't need the middle conversion if
6483 it is wider than the final type and doesn't change the signedness
cc58e392 6484 (for integers). Avoid this if the final type is a pointer
7cf60649 6485 since then we sometimes need the inner conversion. Likewise if
6486 the outer has a precision not equal to the size of its mode. */
fa4ebe56 6487 if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
6488 || (inter_float && inside_float))
6489 && inter_prec >= inside_prec
cc58e392 6490 && (inter_float || inter_unsignedp == inside_unsignedp)
041207ec 6491 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6492 && TYPE_MODE (type) == TYPE_MODE (inter_type))
cc58e392 6493 && ! final_ptr)
041207ec 6494 return fold (build1 (code, type,
beecf0c3 6495 TREE_OPERAND (TREE_OPERAND (t, 0), 0)));
fa4ebe56 6496
6800ce58 6497 /* If we have a sign-extension of a zero-extended value, we can
6498 replace that by a single zero-extension. */
6499 if (inside_int && inter_int && final_int
6500 && inside_prec < inter_prec && inter_prec < final_prec
6501 && inside_unsignedp && !inter_unsignedp)
041207ec 6502 return fold (build1 (code, type,
beecf0c3 6503 TREE_OPERAND (TREE_OPERAND (t, 0), 0)));
6800ce58 6504
fa4ebe56 6505 /* Two conversions in a row are not needed unless:
6506 - some conversion is floating-point (overstrict for now), or
6507 - the intermediate type is narrower than both initial and
6508 final, or
6509 - the intermediate type and innermost type differ in signedness,
6510 and the outermost type is wider than the intermediate, or
6511 - the initial type is a pointer type and the precisions of the
6512 intermediate and final types differ, or
cc049fa3 6513 - the final type is a pointer type and the precisions of the
fa4ebe56 6514 initial and intermediate types differ. */
6515 if (! inside_float && ! inter_float && ! final_float
6516 && (inter_prec > inside_prec || inter_prec > final_prec)
6517 && ! (inside_int && inter_int
6518 && inter_unsignedp != inside_unsignedp
6519 && inter_prec < final_prec)
6520 && ((inter_unsignedp && inter_prec > inside_prec)
6521 == (final_unsignedp && final_prec > inter_prec))
6522 && ! (inside_ptr && inter_prec != final_prec)
7cf60649 6523 && ! (final_ptr && inside_prec != inter_prec)
041207ec 6524 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
6525 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7cf60649 6526 && ! final_ptr)
041207ec 6527 return fold (build1 (code, type,
beecf0c3 6528 TREE_OPERAND (TREE_OPERAND (t, 0), 0)));
fa4ebe56 6529 }
2bc77e10 6530
6531 if (TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR
e70afa40 6532 && TREE_CONSTANT (TREE_OPERAND (TREE_OPERAND (t, 0), 1))
6533 /* Detect assigning a bitfield. */
6534 && !(TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == COMPONENT_REF
6535 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 1))))
2bc77e10 6536 {
e70afa40 6537 /* Don't leave an assignment inside a conversion
eb2f80f3 6538 unless assigning a bitfield. */
2bc77e10 6539 tree prev = TREE_OPERAND (t, 0);
53f78329 6540 tem = copy_node (t);
6541 TREE_OPERAND (tem, 0) = TREE_OPERAND (prev, 1);
2bc77e10 6542 /* First do the assignment, then return converted constant. */
fd96eeef 6543 tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), prev, fold (tem));
4ee9c684 6544 TREE_NO_WARNING (tem) = 1;
53f78329 6545 TREE_USED (tem) = 1;
6546 return tem;
2bc77e10 6547 }
4c342eac 6548
6549 /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
6550 constants (if x has signed type, the sign bit cannot be set
6551 in c). This folds extension into the BIT_AND_EXPR. */
2b03eaaf 6552 if (INTEGRAL_TYPE_P (type)
6553 && TREE_CODE (type) != BOOLEAN_TYPE
4c342eac 6554 && TREE_CODE (TREE_OPERAND (t, 0)) == BIT_AND_EXPR
6555 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 1)) == INTEGER_CST)
6556 {
6557 tree and = TREE_OPERAND (t, 0);
6558 tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1);
6559 int change = 0;
6560
78a8ed03 6561 if (TYPE_UNSIGNED (TREE_TYPE (and))
2b03eaaf 6562 || (TYPE_PRECISION (type)
4c342eac 6563 <= TYPE_PRECISION (TREE_TYPE (and))))
6564 change = 1;
6565 else if (TYPE_PRECISION (TREE_TYPE (and1))
6566 <= HOST_BITS_PER_WIDE_INT
6567 && host_integerp (and1, 1))
6568 {
6569 unsigned HOST_WIDE_INT cst;
6570
6571 cst = tree_low_cst (and1, 1);
6572 cst &= (HOST_WIDE_INT) -1
6573 << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
6574 change = (cst == 0);
6575#ifdef LOAD_EXTEND_OP
6576 if (change
6577 && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
6578 == ZERO_EXTEND))
6579 {
fa8b888f 6580 tree uns = lang_hooks.types.unsigned_type (TREE_TYPE (and0));
b30e3dbc 6581 and0 = fold_convert (uns, and0);
6582 and1 = fold_convert (uns, and1);
4c342eac 6583 }
6584#endif
6585 }
6586 if (change)
fd96eeef 6587 return fold (build2 (BIT_AND_EXPR, type,
6588 fold_convert (type, and0),
6589 fold_convert (type, and1)));
4c342eac 6590 }
6591
4ee9c684 6592 /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
6593 T2 being pointers to types of the same size. */
6594 if (POINTER_TYPE_P (TREE_TYPE (t))
ce45a448 6595 && BINARY_CLASS_P (arg0)
4ee9c684 6596 && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
6597 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
6598 {
6599 tree arg00 = TREE_OPERAND (arg0, 0);
6600 tree t0 = TREE_TYPE (t);
6601 tree t1 = TREE_TYPE (arg00);
6602 tree tt0 = TREE_TYPE (t0);
6603 tree tt1 = TREE_TYPE (t1);
6604 tree s0 = TYPE_SIZE (tt0);
6605 tree s1 = TYPE_SIZE (tt1);
6606
6607 if (s0 && s1 && operand_equal_p (s0, s1, OEP_ONLY_CONST))
c0c67e38 6608 return build2 (TREE_CODE (arg0), t0, fold_convert (t0, arg00),
fd96eeef 6609 TREE_OPERAND (arg0, 1));
4ee9c684 6610 }
6611
2b03eaaf 6612 tem = fold_convert_const (code, type, arg0);
04b253e8 6613 return tem ? tem : t;
2bc77e10 6614
f96c43fb 6615 case VIEW_CONVERT_EXPR:
6616 if (TREE_CODE (TREE_OPERAND (t, 0)) == VIEW_CONVERT_EXPR)
6617 return build1 (VIEW_CONVERT_EXPR, type,
6618 TREE_OPERAND (TREE_OPERAND (t, 0), 0));
6619 return t;
6620
09a738e9 6621 case COMPONENT_REF:
ce3fb06e 6622 if (TREE_CODE (arg0) == CONSTRUCTOR
6623 && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
f5541a8b 6624 {
6625 tree m = purpose_member (arg1, CONSTRUCTOR_ELTS (arg0));
6626 if (m)
53f78329 6627 return TREE_VALUE (m);
f5541a8b 6628 }
09a738e9 6629 return t;
6630
2bc77e10 6631 case RANGE_EXPR:
fc3df357 6632 if (TREE_CONSTANT (t) != wins)
6633 {
53f78329 6634 tem = copy_node (t);
6635 TREE_CONSTANT (tem) = wins;
4ee9c684 6636 TREE_INVARIANT (tem) = wins;
53f78329 6637 return tem;
fc3df357 6638 }
2bc77e10 6639 return t;
6640
6641 case NEGATE_EXPR:
bd214d13 6642 if (negate_expr_p (arg0))
3bcc1a80 6643 return fold_convert (type, negate_expr (arg0));
2bc77e10 6644 return t;
6645
6646 case ABS_EXPR:
c183306c 6647 if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
5221d284 6648 return fold_abs_const (arg0, type);
c63f4ad3 6649 else if (TREE_CODE (arg0) == NEGATE_EXPR)
6650 return fold (build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0)));
25bf8ba3 6651 /* Convert fabs((double)float) into (double)fabsf(float). */
6652 else if (TREE_CODE (arg0) == NOP_EXPR
6653 && TREE_CODE (type) == REAL_TYPE)
6654 {
6655 tree targ0 = strip_float_extensions (arg0);
6656 if (targ0 != arg0)
b30e3dbc 6657 return fold_convert (type, fold (build1 (ABS_EXPR,
6658 TREE_TYPE (targ0),
6659 targ0)));
805e22b2 6660 }
c63f4ad3 6661 else if (tree_expr_nonnegative_p (arg0))
6662 return arg0;
2bc77e10 6663 return t;
6664
03aa4df2 6665 case CONJ_EXPR:
6666 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
b30e3dbc 6667 return fold_convert (type, arg0);
03aa4df2 6668 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
fd96eeef 6669 return build2 (COMPLEX_EXPR, type,
6670 TREE_OPERAND (arg0, 0),
6671 negate_expr (TREE_OPERAND (arg0, 1)));
03aa4df2 6672 else if (TREE_CODE (arg0) == COMPLEX_CST)
8b3ab5d0 6673 return build_complex (type, TREE_REALPART (arg0),
6674 negate_expr (TREE_IMAGPART (arg0)));
03aa4df2 6675 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
fd96eeef 6676 return fold (build2 (TREE_CODE (arg0), type,
6677 fold (build1 (CONJ_EXPR, type,
6678 TREE_OPERAND (arg0, 0))),
6679 fold (build1 (CONJ_EXPR, type,
6680 TREE_OPERAND (arg0, 1)))));
03aa4df2 6681 else if (TREE_CODE (arg0) == CONJ_EXPR)
6682 return TREE_OPERAND (arg0, 0);
6683 return t;
6684
2bc77e10 6685 case BIT_NOT_EXPR:
c183306c 6686 if (TREE_CODE (arg0) == INTEGER_CST)
6687 return fold_not_const (arg0, type);
2bc77e10 6688 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
6689 return TREE_OPERAND (arg0, 0);
6690 return t;
6691
6692 case PLUS_EXPR:
6693 /* A + (-B) -> A - B */
6694 if (TREE_CODE (arg1) == NEGATE_EXPR)
fd96eeef 6695 return fold (build2 (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
88b41b10 6696 /* (-A) + B -> B - A */
38e9cdc3 6697 if (TREE_CODE (arg0) == NEGATE_EXPR
6698 && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
fd96eeef 6699 return fold (build2 (MINUS_EXPR, type, arg1, TREE_OPERAND (arg0, 0)));
38e9cdc3 6700 if (! FLOAT_TYPE_P (type))
2bc77e10 6701 {
6702 if (integer_zerop (arg1))
b30e3dbc 6703 return non_lvalue (fold_convert (type, arg0));
2bc77e10 6704
6705 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
6706 with a constant, and the two constants have no bits in common,
6707 we should treat this as a BIT_IOR_EXPR since this may produce more
6708 simplifications. */
6709 if (TREE_CODE (arg0) == BIT_AND_EXPR
6710 && TREE_CODE (arg1) == BIT_AND_EXPR
6711 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
6712 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
6713 && integer_zerop (const_binop (BIT_AND_EXPR,
6714 TREE_OPERAND (arg0, 1),
5485823f 6715 TREE_OPERAND (arg1, 1), 0)))
2bc77e10 6716 {
6717 code = BIT_IOR_EXPR;
6718 goto bit_ior;
6719 }
e4142c0f 6720
578e821c 6721 /* Reassociate (plus (plus (mult) (foo)) (mult)) as
cc049fa3 6722 (plus (plus (mult) (mult)) (foo)) so that we can
578e821c 6723 take advantage of the factoring cases below. */
97c2d44f 6724 if (((TREE_CODE (arg0) == PLUS_EXPR
6725 || TREE_CODE (arg0) == MINUS_EXPR)
578e821c 6726 && TREE_CODE (arg1) == MULT_EXPR)
97c2d44f 6727 || ((TREE_CODE (arg1) == PLUS_EXPR
6728 || TREE_CODE (arg1) == MINUS_EXPR)
cc049fa3 6729 && TREE_CODE (arg0) == MULT_EXPR))
578e821c 6730 {
6731 tree parg0, parg1, parg, marg;
97c2d44f 6732 enum tree_code pcode;
578e821c 6733
97c2d44f 6734 if (TREE_CODE (arg1) == MULT_EXPR)
578e821c 6735 parg = arg0, marg = arg1;
6736 else
6737 parg = arg1, marg = arg0;
97c2d44f 6738 pcode = TREE_CODE (parg);
578e821c 6739 parg0 = TREE_OPERAND (parg, 0);
6740 parg1 = TREE_OPERAND (parg, 1);
6741 STRIP_NOPS (parg0);
6742 STRIP_NOPS (parg1);
6743
6744 if (TREE_CODE (parg0) == MULT_EXPR
6745 && TREE_CODE (parg1) != MULT_EXPR)
97c2d44f 6746 return fold (build2 (pcode, type,
fd96eeef 6747 fold (build2 (PLUS_EXPR, type,
6748 fold_convert (type, parg0),
6749 fold_convert (type, marg))),
6750 fold_convert (type, parg1)));
578e821c 6751 if (TREE_CODE (parg0) != MULT_EXPR
6752 && TREE_CODE (parg1) == MULT_EXPR)
fd96eeef 6753 return fold (build2 (PLUS_EXPR, type,
97c2d44f 6754 fold_convert (type, parg0),
6755 fold (build2 (pcode, type,
6756 fold_convert (type, marg),
6757 fold_convert (type,
6758 parg1)))));
578e821c 6759 }
6760
1d322a97 6761 if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR)
6762 {
6763 tree arg00, arg01, arg10, arg11;
5b7dad94 6764 tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
1d322a97 6765
6766 /* (A * C) + (B * C) -> (A+B) * C.
6767 We are most concerned about the case where C is a constant,
6768 but other combinations show up during loop reduction. Since
6769 it is not difficult, try all four possibilities. */
6770
6771 arg00 = TREE_OPERAND (arg0, 0);
6772 arg01 = TREE_OPERAND (arg0, 1);
6773 arg10 = TREE_OPERAND (arg1, 0);
6774 arg11 = TREE_OPERAND (arg1, 1);
6775 same = NULL_TREE;
6776
6777 if (operand_equal_p (arg01, arg11, 0))
6778 same = arg01, alt0 = arg00, alt1 = arg10;
6779 else if (operand_equal_p (arg00, arg10, 0))
6780 same = arg00, alt0 = arg01, alt1 = arg11;
6781 else if (operand_equal_p (arg00, arg11, 0))
6782 same = arg00, alt0 = arg01, alt1 = arg10;
6783 else if (operand_equal_p (arg01, arg10, 0))
6784 same = arg01, alt0 = arg00, alt1 = arg11;
6785
578e821c 6786 /* No identical multiplicands; see if we can find a common
6787 power-of-two factor in non-power-of-two multiplies. This
6788 can help in multi-dimensional array access. */
6789 else if (TREE_CODE (arg01) == INTEGER_CST
6790 && TREE_CODE (arg11) == INTEGER_CST
6791 && TREE_INT_CST_HIGH (arg01) == 0
6792 && TREE_INT_CST_HIGH (arg11) == 0)
6793 {
6794 HOST_WIDE_INT int01, int11, tmp;
6795 int01 = TREE_INT_CST_LOW (arg01);
6796 int11 = TREE_INT_CST_LOW (arg11);
6797
6798 /* Move min of absolute values to int11. */
6799 if ((int01 >= 0 ? int01 : -int01)
6800 < (int11 >= 0 ? int11 : -int11))
6801 {
6802 tmp = int01, int01 = int11, int11 = tmp;
6803 alt0 = arg00, arg00 = arg10, arg10 = alt0;
6804 alt0 = arg01, arg01 = arg11, arg11 = alt0;
6805 }
6806
6807 if (exact_log2 (int11) > 0 && int01 % int11 == 0)
6808 {
fd96eeef 6809 alt0 = fold (build2 (MULT_EXPR, type, arg00,
7c446c95 6810 build_int_cst (NULL_TREE,
7016c612 6811 int01 / int11)));
578e821c 6812 alt1 = arg10;
6813 same = arg11;
6814 }
6815 }
6816
1d322a97 6817 if (same)
fd96eeef 6818 return fold (build2 (MULT_EXPR, type,
6819 fold (build2 (PLUS_EXPR, type,
97c2d44f 6820 fold_convert (type, alt0),
6821 fold_convert (type, alt1))),
fd96eeef 6822 same));
1d322a97 6823 }
dede8dcc 6824
6825 /* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
6826 of the array. Loop optimizer sometimes produce this type of
6827 expressions. */
6828 if (TREE_CODE (arg0) == ADDR_EXPR
6829 && TREE_CODE (arg1) == MULT_EXPR)
6830 {
6831 tem = try_move_mult_to_index (type, PLUS_EXPR, arg0, arg1);
6832 if (tem)
6833 return fold (tem);
6834 }
6835 else if (TREE_CODE (arg1) == ADDR_EXPR
6836 && TREE_CODE (arg0) == MULT_EXPR)
6837 {
6838 tem = try_move_mult_to_index (type, PLUS_EXPR, arg1, arg0);
6839 if (tem)
6840 return fold (tem);
6841 }
2bc77e10 6842 }
cf58ef1d 6843 else
6844 {
6845 /* See if ARG1 is zero and X + ARG1 reduces to X. */
6846 if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
b30e3dbc 6847 return non_lvalue (fold_convert (type, arg0));
920d0fb5 6848
cf58ef1d 6849 /* Likewise if the operands are reversed. */
6850 if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
b30e3dbc 6851 return non_lvalue (fold_convert (type, arg1));
cf58ef1d 6852
94721878 6853 /* Convert X + -C into X - C. */
6854 if (TREE_CODE (arg1) == REAL_CST
6855 && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
6856 {
6857 tem = fold_negate_const (arg1, type);
6858 if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
6859 return fold (build2 (MINUS_EXPR, type,
6860 fold_convert (type, arg0),
6861 fold_convert (type, tem)));
6862 }
6863
cf58ef1d 6864 /* Convert x+x into x*2.0. */
4b69983d 6865 if (operand_equal_p (arg0, arg1, 0)
6866 && SCALAR_FLOAT_TYPE_P (type))
fd96eeef 6867 return fold (build2 (MULT_EXPR, type, arg0,
6868 build_real (type, dconst2)));
cf58ef1d 6869
6870 /* Convert x*c+x into x*(c+1). */
6871 if (flag_unsafe_math_optimizations
6872 && TREE_CODE (arg0) == MULT_EXPR
6873 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
6874 && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
6875 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
6876 {
6877 REAL_VALUE_TYPE c;
6878
6879 c = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
6880 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
fd96eeef 6881 return fold (build2 (MULT_EXPR, type, arg1,
6882 build_real (type, c)));
cf58ef1d 6883 }
6884
6885 /* Convert x+x*c into x*(c+1). */
6886 if (flag_unsafe_math_optimizations
6887 && TREE_CODE (arg1) == MULT_EXPR
6888 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
6889 && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
6890 && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
6891 {
6892 REAL_VALUE_TYPE c;
88b41b10 6893
cf58ef1d 6894 c = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
6895 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
fd96eeef 6896 return fold (build2 (MULT_EXPR, type, arg0,
6897 build_real (type, c)));
cf58ef1d 6898 }
6899
6900 /* Convert x*c1+x*c2 into x*(c1+c2). */
6901 if (flag_unsafe_math_optimizations
6902 && TREE_CODE (arg0) == MULT_EXPR
6903 && TREE_CODE (arg1) == MULT_EXPR
6904 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
6905 && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg0, 1))
6906 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST
6907 && ! TREE_CONSTANT_OVERFLOW (TREE_OPERAND (arg1, 1))
6908 && operand_equal_p (TREE_OPERAND (arg0, 0),
6909 TREE_OPERAND (arg1, 0), 0))
6910 {
6911 REAL_VALUE_TYPE c1, c2;
6912
6913 c1 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
6914 c2 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
6915 real_arithmetic (&c1, PLUS_EXPR, &c1, &c2);
fd96eeef 6916 return fold (build2 (MULT_EXPR, type,
6917 TREE_OPERAND (arg0, 0),
6918 build_real (type, c1)));
cf58ef1d 6919 }
778ac06a 6920 /* Convert a + (b*c + d*e) into (a + b*c) + d*e. */
edbb2b78 6921 if (flag_unsafe_math_optimizations
6922 && TREE_CODE (arg1) == PLUS_EXPR
6923 && TREE_CODE (arg0) != MULT_EXPR)
6924 {
6925 tree tree10 = TREE_OPERAND (arg1, 0);
6926 tree tree11 = TREE_OPERAND (arg1, 1);
6927 if (TREE_CODE (tree11) == MULT_EXPR
6928 && TREE_CODE (tree10) == MULT_EXPR)
6929 {
6930 tree tree0;
fd96eeef 6931 tree0 = fold (build2 (PLUS_EXPR, type, arg0, tree10));
6932 return fold (build2 (PLUS_EXPR, type, tree0, tree11));
edbb2b78 6933 }
6934 }
778ac06a 6935 /* Convert (b*c + d*e) + a into b*c + (d*e +a). */
edbb2b78 6936 if (flag_unsafe_math_optimizations
6937 && TREE_CODE (arg0) == PLUS_EXPR
6938 && TREE_CODE (arg1) != MULT_EXPR)
6939 {
6940 tree tree00 = TREE_OPERAND (arg0, 0);
6941 tree tree01 = TREE_OPERAND (arg0, 1);
6942 if (TREE_CODE (tree01) == MULT_EXPR
6943 && TREE_CODE (tree00) == MULT_EXPR)
6944 {
6945 tree tree0;
fd96eeef 6946 tree0 = fold (build2 (PLUS_EXPR, type, tree01, arg1));
6947 return fold (build2 (PLUS_EXPR, type, tree00, tree0));
edbb2b78 6948 }
6949 }
cf58ef1d 6950 }
920d0fb5 6951
0e1e143e 6952 bit_rotate:
6953 /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
6954 is a rotate of A by C1 bits. */
6955 /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
6956 is a rotate of A by B bits. */
6957 {
19cb6b50 6958 enum tree_code code0, code1;
cc049fa3 6959 code0 = TREE_CODE (arg0);
6960 code1 = TREE_CODE (arg1);
6961 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
6962 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
0e1e143e 6963 && operand_equal_p (TREE_OPERAND (arg0, 0),
cc049fa3 6964 TREE_OPERAND (arg1, 0), 0)
78a8ed03 6965 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
0e1e143e 6966 {
19cb6b50 6967 tree tree01, tree11;
6968 enum tree_code code01, code11;
0e1e143e 6969
6970 tree01 = TREE_OPERAND (arg0, 1);
6971 tree11 = TREE_OPERAND (arg1, 1);
6972 STRIP_NOPS (tree01);
6973 STRIP_NOPS (tree11);
6974 code01 = TREE_CODE (tree01);
6975 code11 = TREE_CODE (tree11);
6976 if (code01 == INTEGER_CST
cc049fa3 6977 && code11 == INTEGER_CST
6978 && TREE_INT_CST_HIGH (tree01) == 0
6979 && TREE_INT_CST_HIGH (tree11) == 0
6980 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
6981 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
fd96eeef 6982 return build2 (LROTATE_EXPR, type, TREE_OPERAND (arg0, 0),
6983 code0 == LSHIFT_EXPR ? tree01 : tree11);
0e1e143e 6984 else if (code11 == MINUS_EXPR)
6985 {
cc049fa3 6986 tree tree110, tree111;
6987 tree110 = TREE_OPERAND (tree11, 0);
6988 tree111 = TREE_OPERAND (tree11, 1);
6989 STRIP_NOPS (tree110);
6990 STRIP_NOPS (tree111);
6991 if (TREE_CODE (tree110) == INTEGER_CST
a0c2c45b 6992 && 0 == compare_tree_int (tree110,
6993 TYPE_PRECISION
6994 (TREE_TYPE (TREE_OPERAND
6995 (arg0, 0))))
0e1e143e 6996 && operand_equal_p (tree01, tree111, 0))
fd96eeef 6997 return build2 ((code0 == LSHIFT_EXPR
6998 ? LROTATE_EXPR
6999 : RROTATE_EXPR),
7000 type, TREE_OPERAND (arg0, 0), tree01);
0e1e143e 7001 }
7002 else if (code01 == MINUS_EXPR)
7003 {
cc049fa3 7004 tree tree010, tree011;
7005 tree010 = TREE_OPERAND (tree01, 0);
7006 tree011 = TREE_OPERAND (tree01, 1);
7007 STRIP_NOPS (tree010);
7008 STRIP_NOPS (tree011);
7009 if (TREE_CODE (tree010) == INTEGER_CST
a0c2c45b 7010 && 0 == compare_tree_int (tree010,
7011 TYPE_PRECISION
7012 (TREE_TYPE (TREE_OPERAND
7013 (arg0, 0))))
0e1e143e 7014 && operand_equal_p (tree11, tree011, 0))
fd96eeef 7015 return build2 ((code0 != LSHIFT_EXPR
7016 ? LROTATE_EXPR
7017 : RROTATE_EXPR),
7018 type, TREE_OPERAND (arg0, 0), tree11);
0e1e143e 7019 }
7020 }
7021 }
88b41b10 7022
2bc77e10 7023 associate:
23ec2d5e 7024 /* In most languages, can't associate operations on floats through
7025 parentheses. Rather than remember where the parentheses were, we
c9192f9a 7026 don't associate floats at all, unless the user has specified
7027 -funsafe-math-optimizations. */
23ec2d5e 7028
7029 if (! wins
c9192f9a 7030 && (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
2bc77e10 7031 {
b07ba9ff 7032 tree var0, con0, lit0, minus_lit0;
7033 tree var1, con1, lit1, minus_lit1;
23ec2d5e 7034
7035 /* Split both trees into variables, constants, and literals. Then
7036 associate each group together, the constants with literals,
7037 then the result with variables. This increases the chances of
7038 literals being recombined later and of generating relocatable
6312a35e 7039 expressions for the sum of a constant and literal. */
b07ba9ff 7040 var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
7041 var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
7042 code == MINUS_EXPR);
23ec2d5e 7043
7044 /* Only do something if we found more than two objects. Otherwise,
7045 nothing has changed and we risk infinite recursion. */
b07ba9ff 7046 if (2 < ((var0 != 0) + (var1 != 0)
7047 + (con0 != 0) + (con1 != 0)
7048 + (lit0 != 0) + (lit1 != 0)
7049 + (minus_lit0 != 0) + (minus_lit1 != 0)))
2bc77e10 7050 {
b07ba9ff 7051 /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
7052 if (code == MINUS_EXPR)
7053 code = PLUS_EXPR;
7054
23ec2d5e 7055 var0 = associate_trees (var0, var1, code, type);
7056 con0 = associate_trees (con0, con1, code, type);
7057 lit0 = associate_trees (lit0, lit1, code, type);
b07ba9ff 7058 minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
7059
7060 /* Preserve the MINUS_EXPR if the negative part of the literal is
7061 greater than the positive part. Otherwise, the multiplicative
7062 folding code (i.e extract_muldiv) may be fooled in case
d01481af 7063 unsigned constants are subtracted, like in the following
b07ba9ff 7064 example: ((X*2 + 4) - 8U)/2. */
7065 if (minus_lit0 && lit0)
7066 {
1aa79290 7067 if (TREE_CODE (lit0) == INTEGER_CST
7068 && TREE_CODE (minus_lit0) == INTEGER_CST
7069 && tree_int_cst_lt (lit0, minus_lit0))
b07ba9ff 7070 {
7071 minus_lit0 = associate_trees (minus_lit0, lit0,
7072 MINUS_EXPR, type);
7073 lit0 = 0;
7074 }
7075 else
7076 {
7077 lit0 = associate_trees (lit0, minus_lit0,
7078 MINUS_EXPR, type);
7079 minus_lit0 = 0;
7080 }
7081 }
7082 if (minus_lit0)
7083 {
7084 if (con0 == 0)
b30e3dbc 7085 return fold_convert (type,
7086 associate_trees (var0, minus_lit0,
7087 MINUS_EXPR, type));
b07ba9ff 7088 else
7089 {
7090 con0 = associate_trees (con0, minus_lit0,
7091 MINUS_EXPR, type);
b30e3dbc 7092 return fold_convert (type,
7093 associate_trees (var0, con0,
7094 PLUS_EXPR, type));
b07ba9ff 7095 }
7096 }
7097
23ec2d5e 7098 con0 = associate_trees (con0, lit0, code, type);
b30e3dbc 7099 return fold_convert (type, associate_trees (var0, con0,
7100 code, type));
2bc77e10 7101 }
7102 }
23ec2d5e 7103
2bc77e10 7104 binary:
2bc77e10 7105 if (wins)
5485823f 7106 t1 = const_binop (code, arg0, arg1, 0);
2bc77e10 7107 if (t1 != NULL_TREE)
7108 {
7109 /* The return value should always have
7110 the same type as the original expression. */
2b03eaaf 7111 if (TREE_TYPE (t1) != type)
7112 t1 = fold_convert (type, t1);
a3f1e3ec 7113
2bc77e10 7114 return t1;
7115 }
7116 return t;
7117
7118 case MINUS_EXPR:
88b41b10 7119 /* A - (-B) -> A + B */
7120 if (TREE_CODE (arg1) == NEGATE_EXPR)
fd96eeef 7121 return fold (build2 (PLUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0)));
22331643 7122 /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */
7123 if (TREE_CODE (arg0) == NEGATE_EXPR
b24bee03 7124 && (FLOAT_TYPE_P (type)
7125 || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))
22331643 7126 && negate_expr_p (arg1)
bd214d13 7127 && reorder_operands_p (arg0, arg1))
fd96eeef 7128 return fold (build2 (MINUS_EXPR, type, negate_expr (arg1),
7129 TREE_OPERAND (arg0, 0)));
88b41b10 7130
780a4395 7131 if (! FLOAT_TYPE_P (type))
2bc77e10 7132 {
7133 if (! wins && integer_zerop (arg0))
b30e3dbc 7134 return negate_expr (fold_convert (type, arg1));
2bc77e10 7135 if (integer_zerop (arg1))
b30e3dbc 7136 return non_lvalue (fold_convert (type, arg0));
e4142c0f 7137
161c8849 7138 /* Fold A - (A & B) into ~B & A. */
7139 if (!TREE_SIDE_EFFECTS (arg0)
7140 && TREE_CODE (arg1) == BIT_AND_EXPR)
7141 {
7142 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
fd96eeef 7143 return fold (build2 (BIT_AND_EXPR, type,
7144 fold (build1 (BIT_NOT_EXPR, type,
7145 TREE_OPERAND (arg1, 0))),
7146 arg0));
161c8849 7147 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
fd96eeef 7148 return fold (build2 (BIT_AND_EXPR, type,
7149 fold (build1 (BIT_NOT_EXPR, type,
7150 TREE_OPERAND (arg1, 1))),
7151 arg0));
161c8849 7152 }
79e45861 7153
6439555e 7154 /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
79e45861 7155 any power of 2 minus 1. */
7156 if (TREE_CODE (arg0) == BIT_AND_EXPR
7157 && TREE_CODE (arg1) == BIT_AND_EXPR
7158 && operand_equal_p (TREE_OPERAND (arg0, 0),
dcb467b4 7159 TREE_OPERAND (arg1, 0), 0))
79e45861 7160 {
7161 tree mask0 = TREE_OPERAND (arg0, 1);
7162 tree mask1 = TREE_OPERAND (arg1, 1);
7163 tree tem = fold (build1 (BIT_NOT_EXPR, type, mask0));
7206da1b 7164
dcb467b4 7165 if (operand_equal_p (tem, mask1, 0))
79e45861 7166 {
fd96eeef 7167 tem = fold (build2 (BIT_XOR_EXPR, type,
7168 TREE_OPERAND (arg0, 0), mask1));
7169 return fold (build2 (MINUS_EXPR, type, tem, mask1));
79e45861 7170 }
7171 }
2bc77e10 7172 }
8045c7c3 7173
920d0fb5 7174 /* See if ARG1 is zero and X - ARG1 reduces to X. */
7175 else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
b30e3dbc 7176 return non_lvalue (fold_convert (type, arg0));
920d0fb5 7177
7178 /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether
7179 ARG0 is zero and X + ARG0 reduces to X, since that would mean
7180 (-ARG1 + ARG0) reduces to -ARG1. */
7181 else if (!wins && fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
b30e3dbc 7182 return negate_expr (fold_convert (type, arg1));
b2c6bec0 7183
cc049fa3 7184 /* Fold &x - &x. This can happen from &x.foo - &x.
8045c7c3 7185 This is unsafe for certain floats even in non-IEEE formats.
7186 In IEEE, it is unsafe because it does wrong for NaNs.
7187 Also note that operand_equal_p is always false if an operand
7188 is volatile. */
7189
7f3be425 7190 if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
d3d5ed2a 7191 && operand_equal_p (arg0, arg1, 0))
b30e3dbc 7192 return fold_convert (type, integer_zero_node);
b2c6bec0 7193
2169cab6 7194 /* A - B -> A + (-B) if B is easily negatable. */
7195 if (!wins && negate_expr_p (arg1)
94721878 7196 && ((FLOAT_TYPE_P (type)
7197 /* Avoid this transformation if B is a positive REAL_CST. */
7198 && (TREE_CODE (arg1) != REAL_CST
7199 || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
2169cab6 7200 || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
fd96eeef 7201 return fold (build2 (PLUS_EXPR, type, arg0, negate_expr (arg1)));
2169cab6 7202
dbc64c75 7203 /* Try folding difference of addresses. */
7204 {
7205 HOST_WIDE_INT diff;
7206
eb91f88e 7207 if ((TREE_CODE (arg0) == ADDR_EXPR
7208 || TREE_CODE (arg1) == ADDR_EXPR)
7209 && ptr_difference_const (arg0, arg1, &diff))
dbc64c75 7210 return build_int_cst_type (type, diff);
7211 }
dede8dcc 7212
7213 /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
7214 of the array. Loop optimizer sometimes produce this type of
7215 expressions. */
7216 if (TREE_CODE (arg0) == ADDR_EXPR
7217 && TREE_CODE (arg1) == MULT_EXPR)
7218 {
7219 tem = try_move_mult_to_index (type, MINUS_EXPR, arg0, arg1);
7220 if (tem)
7221 return fold (tem);
7222 }
dbc64c75 7223
2169cab6 7224 if (TREE_CODE (arg0) == MULT_EXPR
7225 && TREE_CODE (arg1) == MULT_EXPR
97c2d44f 7226 && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
2169cab6 7227 {
7228 /* (A * C) - (B * C) -> (A-B) * C. */
7229 if (operand_equal_p (TREE_OPERAND (arg0, 1),
7230 TREE_OPERAND (arg1, 1), 0))
fd96eeef 7231 return fold (build2 (MULT_EXPR, type,
7232 fold (build2 (MINUS_EXPR, type,
7233 TREE_OPERAND (arg0, 0),
7234 TREE_OPERAND (arg1, 0))),
7235 TREE_OPERAND (arg0, 1)));
2169cab6 7236 /* (A * C1) - (A * C2) -> A * (C1-C2). */
7237 if (operand_equal_p (TREE_OPERAND (arg0, 0),
7238 TREE_OPERAND (arg1, 0), 0))
fd96eeef 7239 return fold (build2 (MULT_EXPR, type,
7240 TREE_OPERAND (arg0, 0),
7241 fold (build2 (MINUS_EXPR, type,
7242 TREE_OPERAND (arg0, 1),
7243 TREE_OPERAND (arg1, 1)))));
2169cab6 7244 }
7245
2bc77e10 7246 goto associate;
7247
7248 case MULT_EXPR:
88b41b10 7249 /* (-A) * (-B) -> A * B */
a12ecaaa 7250 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
fd96eeef 7251 return fold (build2 (MULT_EXPR, type,
7252 TREE_OPERAND (arg0, 0),
7253 negate_expr (arg1)));
a12ecaaa 7254 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
fd96eeef 7255 return fold (build2 (MULT_EXPR, type,
7256 negate_expr (arg0),
7257 TREE_OPERAND (arg1, 0)));
88b41b10 7258
780a4395 7259 if (! FLOAT_TYPE_P (type))
2bc77e10 7260 {
7261 if (integer_zerop (arg1))
7262 return omit_one_operand (type, arg1, arg0);
7263 if (integer_onep (arg1))
b30e3dbc 7264 return non_lvalue (fold_convert (type, arg0));
2bc77e10 7265
7266 /* (a * (1 << b)) is (a << b) */
7267 if (TREE_CODE (arg1) == LSHIFT_EXPR
7268 && integer_onep (TREE_OPERAND (arg1, 0)))
fd96eeef 7269 return fold (build2 (LSHIFT_EXPR, type, arg0,
7270 TREE_OPERAND (arg1, 1)));
2bc77e10 7271 if (TREE_CODE (arg0) == LSHIFT_EXPR
7272 && integer_onep (TREE_OPERAND (arg0, 0)))
fd96eeef 7273 return fold (build2 (LSHIFT_EXPR, type, arg1,
7274 TREE_OPERAND (arg0, 1)));
23ec2d5e 7275
7276 if (TREE_CODE (arg1) == INTEGER_CST
f2fa1510 7277 && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0),
b30e3dbc 7278 fold_convert (type, arg1),
23ec2d5e 7279 code, NULL_TREE)))
b30e3dbc 7280 return fold_convert (type, tem);
23ec2d5e 7281
2bc77e10 7282 }
2bc77e10 7283 else
7284 {
920d0fb5 7285 /* Maybe fold x * 0 to 0. The expressions aren't the same
7286 when x is NaN, since x * 0 is also NaN. Nor are they the
7287 same in modes with signed zeros, since multiplying a
7288 negative value by 0 gives -0, not +0. */
7289 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
7290 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
2bc77e10 7291 && real_zerop (arg1))
7292 return omit_one_operand (type, arg1, arg0);
0a8176f3 7293 /* In IEEE floating point, x*1 is not equivalent to x for snans. */
7294 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7295 && real_onep (arg1))
b30e3dbc 7296 return non_lvalue (fold_convert (type, arg0));
19fe5401 7297
0a8176f3 7298 /* Transform x * -1.0 into -x. */
7299 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
19fe5401 7300 && real_minus_onep (arg1))
a1ebe36a 7301 return fold_convert (type, negate_expr (arg0));
19fe5401 7302
f45a882c 7303 /* Convert (C1/X)*C2 into (C1*C2)/X. */
7304 if (flag_unsafe_math_optimizations
7305 && TREE_CODE (arg0) == RDIV_EXPR
7306 && TREE_CODE (arg1) == REAL_CST
7307 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
7308 {
7309 tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
7310 arg1, 0);
7311 if (tem)
fd96eeef 7312 return fold (build2 (RDIV_EXPR, type, tem,
7313 TREE_OPERAND (arg0, 1)));
f45a882c 7314 }
7315
805e22b2 7316 if (flag_unsafe_math_optimizations)
7317 {
7318 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
7319 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
7320
3bc5c41b 7321 /* Optimizations of root(...)*root(...). */
7322 if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
805e22b2 7323 {
3bc5c41b 7324 tree rootfn, arg, arglist;
0e83f63c 7325 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7326 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7327
7328 /* Optimize sqrt(x)*sqrt(x) as x. */
3bc5c41b 7329 if (BUILTIN_SQRT_P (fcode0)
7330 && operand_equal_p (arg00, arg10, 0)
0e83f63c 7331 && ! HONOR_SNANS (TYPE_MODE (type)))
7332 return arg00;
7333
3bc5c41b 7334 /* Optimize root(x)*root(y) as root(x*y). */
7335 rootfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
fd96eeef 7336 arg = fold (build2 (MULT_EXPR, type, arg00, arg10));
0e83f63c 7337 arglist = build_tree_list (NULL_TREE, arg);
3bc5c41b 7338 return build_function_call_expr (rootfn, arglist);
805e22b2 7339 }
7340
8918c507 7341 /* Optimize expN(x)*expN(y) as expN(x+y). */
852da3c3 7342 if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
805e22b2 7343 {
7344 tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
fd96eeef 7345 tree arg = build2 (PLUS_EXPR, type,
7346 TREE_VALUE (TREE_OPERAND (arg0, 1)),
7347 TREE_VALUE (TREE_OPERAND (arg1, 1)));
0e83f63c 7348 tree arglist = build_tree_list (NULL_TREE, fold (arg));
7349 return build_function_call_expr (expfn, arglist);
7350 }
7351
7352 /* Optimizations of pow(...)*pow(...). */
7353 if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
7354 || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
7355 || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
7356 {
7357 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7358 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
7359 1)));
7360 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7361 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
7362 1)));
7363
7364 /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y). */
7365 if (operand_equal_p (arg01, arg11, 0))
7366 {
7367 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
fd96eeef 7368 tree arg = build2 (MULT_EXPR, type, arg00, arg10);
0e83f63c 7369 tree arglist = tree_cons (NULL_TREE, fold (arg),
7370 build_tree_list (NULL_TREE,
7371 arg01));
7372 return build_function_call_expr (powfn, arglist);
7373 }
7374
7375 /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z). */
7376 if (operand_equal_p (arg00, arg10, 0))
7377 {
7378 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
fd96eeef 7379 tree arg = fold (build2 (PLUS_EXPR, type, arg01, arg11));
0e83f63c 7380 tree arglist = tree_cons (NULL_TREE, arg00,
7381 build_tree_list (NULL_TREE,
7382 arg));
7383 return build_function_call_expr (powfn, arglist);
7384 }
805e22b2 7385 }
a4a686a7 7386
7387 /* Optimize tan(x)*cos(x) as sin(x). */
7388 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
7389 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
7390 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
7391 || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
7392 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
7393 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
7394 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
7395 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
7396 {
0da0dbfa 7397 tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
a4a686a7 7398
7399 if (sinfn != NULL_TREE)
7400 return build_function_call_expr (sinfn,
7401 TREE_OPERAND (arg0, 1));
7402 }
8c5cac78 7403
7404 /* Optimize x*pow(x,c) as pow(x,c+1). */
7405 if (fcode1 == BUILT_IN_POW
7406 || fcode1 == BUILT_IN_POWF
7407 || fcode1 == BUILT_IN_POWL)
7408 {
7409 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7410 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1,
7411 1)));
7412 if (TREE_CODE (arg11) == REAL_CST
7413 && ! TREE_CONSTANT_OVERFLOW (arg11)
7414 && operand_equal_p (arg0, arg10, 0))
7415 {
7416 tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
7417 REAL_VALUE_TYPE c;
7418 tree arg, arglist;
7419
7420 c = TREE_REAL_CST (arg11);
7421 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7422 arg = build_real (type, c);
7423 arglist = build_tree_list (NULL_TREE, arg);
7424 arglist = tree_cons (NULL_TREE, arg0, arglist);
7425 return build_function_call_expr (powfn, arglist);
7426 }
7427 }
7428
7429 /* Optimize pow(x,c)*x as pow(x,c+1). */
7430 if (fcode0 == BUILT_IN_POW
7431 || fcode0 == BUILT_IN_POWF
7432 || fcode0 == BUILT_IN_POWL)
7433 {
7434 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7435 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0,
7436 1)));
7437 if (TREE_CODE (arg01) == REAL_CST
7438 && ! TREE_CONSTANT_OVERFLOW (arg01)
7439 && operand_equal_p (arg1, arg00, 0))
7440 {
7441 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7442 REAL_VALUE_TYPE c;
7443 tree arg, arglist;
7444
7445 c = TREE_REAL_CST (arg01);
7446 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
7447 arg = build_real (type, c);
7448 arglist = build_tree_list (NULL_TREE, arg);
7449 arglist = tree_cons (NULL_TREE, arg1, arglist);
7450 return build_function_call_expr (powfn, arglist);
7451 }
7452 }
7453
7454 /* Optimize x*x as pow(x,2.0), which is expanded as x*x. */
7455 if (! optimize_size
7456 && operand_equal_p (arg0, arg1, 0))
7457 {
0da0dbfa 7458 tree powfn = mathfn_built_in (type, BUILT_IN_POW);
8c5cac78 7459
7460 if (powfn)
7461 {
7462 tree arg = build_real (type, dconst2);
7463 tree arglist = build_tree_list (NULL_TREE, arg);
7464 arglist = tree_cons (NULL_TREE, arg0, arglist);
7465 return build_function_call_expr (powfn, arglist);
7466 }
7467 }
805e22b2 7468 }
2bc77e10 7469 }
7470 goto associate;
7471
7472 case BIT_IOR_EXPR:
7473 bit_ior:
7474 if (integer_all_onesp (arg1))
7475 return omit_one_operand (type, arg1, arg0);
7476 if (integer_zerop (arg1))
b30e3dbc 7477 return non_lvalue (fold_convert (type, arg0));
f3983262 7478 if (operand_equal_p (arg0, arg1, 0))
7479 return non_lvalue (fold_convert (type, arg0));
990bbbfa 7480
7481 /* ~X | X is -1. */
7482 if (TREE_CODE (arg0) == BIT_NOT_EXPR
7483 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
7484 {
7016c612 7485 t1 = build_int_cst (type, -1);
4d28c5d1 7486 t1 = force_fit_type (t1, 0, false, false);
990bbbfa 7487 return omit_one_operand (type, t1, arg1);
7488 }
7489
7490 /* X | ~X is -1. */
7491 if (TREE_CODE (arg1) == BIT_NOT_EXPR
7492 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
7493 {
7016c612 7494 t1 = build_int_cst (type, -1);
4d28c5d1 7495 t1 = force_fit_type (t1, 0, false, false);
990bbbfa 7496 return omit_one_operand (type, t1, arg0);
7497 }
7498
2bc77e10 7499 t1 = distribute_bit_expr (code, type, arg0, arg1);
7500 if (t1 != NULL_TREE)
7501 return t1;
3bba0206 7502
71c3029a 7503 /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
7504
cc049fa3 7505 This results in more efficient code for machines without a NAND
71c3029a 7506 instruction. Combine will canonicalize to the first form
7507 which will allow use of NAND instructions provided by the
7508 backend if they exist. */
7509 if (TREE_CODE (arg0) == BIT_NOT_EXPR
7510 && TREE_CODE (arg1) == BIT_NOT_EXPR)
7511 {
7512 return fold (build1 (BIT_NOT_EXPR, type,
fd96eeef 7513 build2 (BIT_AND_EXPR, type,
7514 TREE_OPERAND (arg0, 0),
7515 TREE_OPERAND (arg1, 0))));
71c3029a 7516 }
7517
0e1e143e 7518 /* See if this can be simplified into a rotate first. If that
7519 is unsuccessful continue in the association code. */
7520 goto bit_rotate;
2bc77e10 7521
7522 case BIT_XOR_EXPR:
7523 if (integer_zerop (arg1))
b30e3dbc 7524 return non_lvalue (fold_convert (type, arg0));
2bc77e10 7525 if (integer_all_onesp (arg1))
7526 return fold (build1 (BIT_NOT_EXPR, type, arg0));
f3983262 7527 if (operand_equal_p (arg0, arg1, 0))
7528 return omit_one_operand (type, integer_zero_node, arg0);
0e1e143e 7529
990bbbfa 7530 /* ~X ^ X is -1. */
7531 if (TREE_CODE (arg0) == BIT_NOT_EXPR
7532 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
7533 {
7016c612 7534 t1 = build_int_cst (type, -1);
4d28c5d1 7535 t1 = force_fit_type (t1, 0, false, false);
990bbbfa 7536 return omit_one_operand (type, t1, arg1);
7537 }
7538
7539 /* X ^ ~X is -1. */
7540 if (TREE_CODE (arg1) == BIT_NOT_EXPR
7541 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
7542 {
7016c612 7543 t1 = build_int_cst (type, -1);
4d28c5d1 7544 t1 = force_fit_type (t1, 0, false, false);
990bbbfa 7545 return omit_one_operand (type, t1, arg0);
7546 }
7547
0e1e143e 7548 /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
7549 with a constant, and the two constants have no bits in common,
7550 we should treat this as a BIT_IOR_EXPR since this may produce more
7551 simplifications. */
7552 if (TREE_CODE (arg0) == BIT_AND_EXPR
7553 && TREE_CODE (arg1) == BIT_AND_EXPR
7554 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7555 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
7556 && integer_zerop (const_binop (BIT_AND_EXPR,
7557 TREE_OPERAND (arg0, 1),
7558 TREE_OPERAND (arg1, 1), 0)))
cc049fa3 7559 {
7560 code = BIT_IOR_EXPR;
7561 goto bit_ior;
7562 }
0e1e143e 7563
6d94dc5c 7564 /* See if this can be simplified into a rotate first. If that
0e1e143e 7565 is unsuccessful continue in the association code. */
6d94dc5c 7566 goto bit_rotate;
2bc77e10 7567
7568 case BIT_AND_EXPR:
2bc77e10 7569 if (integer_all_onesp (arg1))
b30e3dbc 7570 return non_lvalue (fold_convert (type, arg0));
2bc77e10 7571 if (integer_zerop (arg1))
7572 return omit_one_operand (type, arg1, arg0);
f3983262 7573 if (operand_equal_p (arg0, arg1, 0))
7574 return non_lvalue (fold_convert (type, arg0));
990bbbfa 7575
7576 /* ~X & X is always zero. */
7577 if (TREE_CODE (arg0) == BIT_NOT_EXPR
7578 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
7579 return omit_one_operand (type, integer_zero_node, arg1);
7580
7581 /* X & ~X is always zero. */
7582 if (TREE_CODE (arg1) == BIT_NOT_EXPR
7583 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
7584 return omit_one_operand (type, integer_zero_node, arg0);
7585
2bc77e10 7586 t1 = distribute_bit_expr (code, type, arg0, arg1);
7587 if (t1 != NULL_TREE)
7588 return t1;
959abd38 7589 /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */
2bc77e10 7590 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
78a8ed03 7591 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
2bc77e10 7592 {
02e7a332 7593 unsigned int prec
7594 = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
7595
b572011e 7596 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
7597 && (~TREE_INT_CST_LOW (arg1)
7598 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
b30e3dbc 7599 return fold_convert (type, TREE_OPERAND (arg0, 0));
2bc77e10 7600 }
71c3029a 7601
965506c6 7602 /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
71c3029a 7603
cc049fa3 7604 This results in more efficient code for machines without a NOR
71c3029a 7605 instruction. Combine will canonicalize to the first form
7606 which will allow use of NOR instructions provided by the
7607 backend if they exist. */
7608 if (TREE_CODE (arg0) == BIT_NOT_EXPR
7609 && TREE_CODE (arg1) == BIT_NOT_EXPR)
7610 {
7611 return fold (build1 (BIT_NOT_EXPR, type,
fd96eeef 7612 build2 (BIT_IOR_EXPR, type,
7613 TREE_OPERAND (arg0, 0),
7614 TREE_OPERAND (arg1, 0))));
71c3029a 7615 }
7616
2bc77e10 7617 goto associate;
7618
0f586b9b 7619 case RDIV_EXPR:
badfe841 7620 /* Don't touch a floating-point divide by zero unless the mode
7621 of the constant can represent infinity. */
7622 if (TREE_CODE (arg1) == REAL_CST
7623 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
7624 && real_zerop (arg1))
0f586b9b 7625 return t;
0f586b9b 7626
88b41b10 7627 /* (-A) / (-B) -> A / B */
a12ecaaa 7628 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
fd96eeef 7629 return fold (build2 (RDIV_EXPR, type,
7630 TREE_OPERAND (arg0, 0),
7631 negate_expr (arg1)));
a12ecaaa 7632 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
fd96eeef 7633 return fold (build2 (RDIV_EXPR, type,
7634 negate_expr (arg0),
7635 TREE_OPERAND (arg1, 0)));
88b41b10 7636
0a8176f3 7637 /* In IEEE floating point, x/1 is not equivalent to x for snans. */
7638 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7639 && real_onep (arg1))
b30e3dbc 7640 return non_lvalue (fold_convert (type, arg0));
0f586b9b 7641
a12ecaaa 7642 /* In IEEE floating point, x/-1 is not equivalent to -x for snans. */
7643 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
7644 && real_minus_onep (arg1))
b30e3dbc 7645 return non_lvalue (fold_convert (type, negate_expr (arg0)));
a12ecaaa 7646
0f586b9b 7647 /* If ARG1 is a constant, we can convert this to a multiply by the
7648 reciprocal. This does not have the same rounding properties,
7f3be425 7649 so only do this if -funsafe-math-optimizations. We can actually
7650 always safely do it if ARG1 is a power of two, but it's hard to
7651 tell if it is or not in a portable manner. */
88181ec5 7652 if (TREE_CODE (arg1) == REAL_CST)
7653 {
7f3be425 7654 if (flag_unsafe_math_optimizations
88181ec5 7655 && 0 != (tem = const_binop (code, build_real (type, dconst1),
7656 arg1, 0)))
fd96eeef 7657 return fold (build2 (MULT_EXPR, type, arg0, tem));
6312a35e 7658 /* Find the reciprocal if optimizing and the result is exact. */
f45a882c 7659 if (optimize)
88181ec5 7660 {
7661 REAL_VALUE_TYPE r;
7662 r = TREE_REAL_CST (arg1);
7663 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
cc049fa3 7664 {
7665 tem = build_real (type, r);
fd96eeef 7666 return fold (build2 (MULT_EXPR, type, arg0, tem));
cc049fa3 7667 }
88181ec5 7668 }
7669 }
d82dc0a7 7670 /* Convert A/B/C to A/(B*C). */
7671 if (flag_unsafe_math_optimizations
7672 && TREE_CODE (arg0) == RDIV_EXPR)
fd96eeef 7673 return fold (build2 (RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
7674 fold (build2 (MULT_EXPR, type,
7675 TREE_OPERAND (arg0, 1), arg1))));
f45a882c 7676
d82dc0a7 7677 /* Convert A/(B/C) to (A/B)*C. */
7678 if (flag_unsafe_math_optimizations
7679 && TREE_CODE (arg1) == RDIV_EXPR)
fd96eeef 7680 return fold (build2 (MULT_EXPR, type,
7681 fold (build2 (RDIV_EXPR, type, arg0,
7682 TREE_OPERAND (arg1, 0))),
7683 TREE_OPERAND (arg1, 1)));
f45a882c 7684
7685 /* Convert C1/(X*C2) into (C1/C2)/X. */
7686 if (flag_unsafe_math_optimizations
7687 && TREE_CODE (arg1) == MULT_EXPR
7688 && TREE_CODE (arg0) == REAL_CST
7689 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
d82dc0a7 7690 {
f45a882c 7691 tree tem = const_binop (RDIV_EXPR, arg0,
7692 TREE_OPERAND (arg1, 1), 0);
7693 if (tem)
fd96eeef 7694 return fold (build2 (RDIV_EXPR, type, tem,
7695 TREE_OPERAND (arg1, 0)));
d82dc0a7 7696 }
805e22b2 7697
805e22b2 7698 if (flag_unsafe_math_optimizations)
7699 {
7700 enum built_in_function fcode = builtin_mathfn_code (arg1);
8918c507 7701 /* Optimize x/expN(y) into x*expN(-y). */
852da3c3 7702 if (BUILTIN_EXPONENT_P (fcode))
805e22b2 7703 {
7704 tree expfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
a1ebe36a 7705 tree arg = negate_expr (TREE_VALUE (TREE_OPERAND (arg1, 1)));
7706 tree arglist = build_tree_list (NULL_TREE,
7707 fold_convert (type, arg));
805e22b2 7708 arg1 = build_function_call_expr (expfn, arglist);
fd96eeef 7709 return fold (build2 (MULT_EXPR, type, arg0, arg1));
805e22b2 7710 }
0e83f63c 7711
7712 /* Optimize x/pow(y,z) into x*pow(y,-z). */
7713 if (fcode == BUILT_IN_POW
7714 || fcode == BUILT_IN_POWF
7715 || fcode == BUILT_IN_POWL)
7716 {
7717 tree powfn = TREE_OPERAND (TREE_OPERAND (arg1, 0), 0);
7718 tree arg10 = TREE_VALUE (TREE_OPERAND (arg1, 1));
7719 tree arg11 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg1, 1)));
a1ebe36a 7720 tree neg11 = fold_convert (type, negate_expr (arg11));
0e83f63c 7721 tree arglist = tree_cons(NULL_TREE, arg10,
7722 build_tree_list (NULL_TREE, neg11));
7723 arg1 = build_function_call_expr (powfn, arglist);
fd96eeef 7724 return fold (build2 (MULT_EXPR, type, arg0, arg1));
0e83f63c 7725 }
805e22b2 7726 }
a4a686a7 7727
7728 if (flag_unsafe_math_optimizations)
7729 {
7730 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
7731 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
7732
7733 /* Optimize sin(x)/cos(x) as tan(x). */
7734 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
7735 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
7736 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
7737 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
7738 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
7739 {
0da0dbfa 7740 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
a4a686a7 7741
7742 if (tanfn != NULL_TREE)
7743 return build_function_call_expr (tanfn,
7744 TREE_OPERAND (arg0, 1));
7745 }
7746
7747 /* Optimize cos(x)/sin(x) as 1.0/tan(x). */
7748 if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
7749 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
7750 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
7751 && operand_equal_p (TREE_VALUE (TREE_OPERAND (arg0, 1)),
7752 TREE_VALUE (TREE_OPERAND (arg1, 1)), 0))
7753 {
0da0dbfa 7754 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
a4a686a7 7755
7756 if (tanfn != NULL_TREE)
7757 {
7758 tree tmp = TREE_OPERAND (arg0, 1);
7759 tmp = build_function_call_expr (tanfn, tmp);
fd96eeef 7760 return fold (build2 (RDIV_EXPR, type,
7761 build_real (type, dconst1), tmp));
a4a686a7 7762 }
7763 }
8c5cac78 7764
7765 /* Optimize pow(x,c)/x as pow(x,c-1). */
7766 if (fcode0 == BUILT_IN_POW
7767 || fcode0 == BUILT_IN_POWF
7768 || fcode0 == BUILT_IN_POWL)
7769 {
7770 tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
7771 tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
7772 if (TREE_CODE (arg01) == REAL_CST
7773 && ! TREE_CONSTANT_OVERFLOW (arg01)
7774 && operand_equal_p (arg1, arg00, 0))
7775 {
7776 tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
7777 REAL_VALUE_TYPE c;
7778 tree arg, arglist;
7779
7780 c = TREE_REAL_CST (arg01);
7781 real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
7782 arg = build_real (type, c);
7783 arglist = build_tree_list (NULL_TREE, arg);
7784 arglist = tree_cons (NULL_TREE, arg1, arglist);
7785 return build_function_call_expr (powfn, arglist);
7786 }
7787 }
a4a686a7 7788 }
0f586b9b 7789 goto binary;
7790
2bc77e10 7791 case TRUNC_DIV_EXPR:
7792 case ROUND_DIV_EXPR:
7793 case FLOOR_DIV_EXPR:
7794 case CEIL_DIV_EXPR:
7795 case EXACT_DIV_EXPR:
2bc77e10 7796 if (integer_onep (arg1))
b30e3dbc 7797 return non_lvalue (fold_convert (type, arg0));
2bc77e10 7798 if (integer_zerop (arg1))
7799 return t;
a1ebe36a 7800 /* X / -1 is -X. */
7801 if (!TYPE_UNSIGNED (type)
7802 && TREE_CODE (arg1) == INTEGER_CST
7803 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
7804 && TREE_INT_CST_HIGH (arg1) == -1)
7805 return fold_convert (type, negate_expr (arg0));
39635df9 7806
76a0ced5 7807 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
7808 operation, EXACT_DIV_EXPR.
7809
a433cd39 7810 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
7811 At one time others generated faster code, it's not clear if they do
7812 after the last round to changes to the DIV code in expmed.c. */
7813 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
76a0ced5 7814 && multiple_of_p (type, arg0, arg1))
fd96eeef 7815 return fold (build2 (EXACT_DIV_EXPR, type, arg0, arg1));
76a0ced5 7816
cc049fa3 7817 if (TREE_CODE (arg1) == INTEGER_CST
23ec2d5e 7818 && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), arg1,
7819 code, NULL_TREE)))
b30e3dbc 7820 return fold_convert (type, tem);
39635df9 7821
2bc77e10 7822 goto binary;
7823
7824 case CEIL_MOD_EXPR:
7825 case FLOOR_MOD_EXPR:
7826 case ROUND_MOD_EXPR:
7827 case TRUNC_MOD_EXPR:
7828 if (integer_onep (arg1))
7829 return omit_one_operand (type, integer_zero_node, arg0);
7830 if (integer_zerop (arg1))
7831 return t;
662f41e4 7832
a1ebe36a 7833 /* X % -1 is zero. */
7834 if (!TYPE_UNSIGNED (type)
7835 && TREE_CODE (arg1) == INTEGER_CST
7836 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
7837 && TREE_INT_CST_HIGH (arg1) == -1)
7838 return omit_one_operand (type, integer_zero_node, arg0);
e4142c0f 7839
662f41e4 7840 /* Optimize unsigned TRUNC_MOD_EXPR by a power of two into a
7841 BIT_AND_EXPR, i.e. "X % C" into "X & C2". */
7842 if (code == TRUNC_MOD_EXPR
7843 && TYPE_UNSIGNED (type)
7844 && integer_pow2p (arg1))
7845 {
7846 unsigned HOST_WIDE_INT high, low;
7847 tree mask;
7848 int l;
7849
7850 l = tree_log2 (arg1);
7851 if (l >= HOST_BITS_PER_WIDE_INT)
7852 {
7853 high = ((unsigned HOST_WIDE_INT) 1
7854 << (l - HOST_BITS_PER_WIDE_INT)) - 1;
7855 low = -1;
7856 }
7857 else
7858 {
7859 high = 0;
7860 low = ((unsigned HOST_WIDE_INT) 1 << l) - 1;
7861 }
7862
7016c612 7863 mask = build_int_cst_wide (type, low, high);
662f41e4 7864 return fold (build2 (BIT_AND_EXPR, type,
7865 fold_convert (type, arg0), mask));
7866 }
7867
2729135a 7868 /* X % -C is the same as X % C. */
7869 if (code == TRUNC_MOD_EXPR
7870 && !TYPE_UNSIGNED (type)
662f41e4 7871 && TREE_CODE (arg1) == INTEGER_CST
7872 && TREE_INT_CST_HIGH (arg1) < 0
7873 && !flag_trapv
7874 /* Avoid this transformation if C is INT_MIN, i.e. C == -C. */
7875 && !sign_bit_p (arg1, arg1))
7876 return fold (build2 (code, type, fold_convert (type, arg0),
7877 fold_convert (type, negate_expr (arg1))));
7878
2729135a 7879 /* X % -Y is the same as X % Y. */
7880 if (code == TRUNC_MOD_EXPR
7881 && !TYPE_UNSIGNED (type)
662f41e4 7882 && TREE_CODE (arg1) == NEGATE_EXPR
7883 && !flag_trapv)
7884 return fold (build2 (code, type, fold_convert (type, arg0),
7885 fold_convert (type, TREE_OPERAND (arg1, 0))));
7886
e4142c0f 7887 if (TREE_CODE (arg1) == INTEGER_CST
23ec2d5e 7888 && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), arg1,
7889 code, NULL_TREE)))
b30e3dbc 7890 return fold_convert (type, tem);
e4142c0f 7891
2bc77e10 7892 goto binary;
7893
2bc77e10 7894 case LROTATE_EXPR:
7895 case RROTATE_EXPR:
805e22b2 7896 if (integer_all_onesp (arg0))
7897 return omit_one_operand (type, arg0, arg1);
7898 goto shift;
7899
7900 case RSHIFT_EXPR:
7901 /* Optimize -1 >> x for arithmetic right shifts. */
78a8ed03 7902 if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type))
805e22b2 7903 return omit_one_operand (type, arg0, arg1);
7904 /* ... fall through ... */
7905
7906 case LSHIFT_EXPR:
7907 shift:
2bc77e10 7908 if (integer_zerop (arg1))
b30e3dbc 7909 return non_lvalue (fold_convert (type, arg0));
805e22b2 7910 if (integer_zerop (arg0))
7911 return omit_one_operand (type, arg0, arg1);
7912
2bc77e10 7913 /* Since negative shift count is not well-defined,
7914 don't try to compute it in the compiler. */
7a1b56a9 7915 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
2bc77e10 7916 return t;
7a1b56a9 7917 /* Rewrite an LROTATE_EXPR by a constant into an
7918 RROTATE_EXPR by a new constant. */
7919 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
7920 {
7c446c95 7921 tree tem = build_int_cst (NULL_TREE,
7016c612 7922 GET_MODE_BITSIZE (TYPE_MODE (type)));
b30e3dbc 7923 tem = fold_convert (TREE_TYPE (arg1), tem);
88e11d8f 7924 tem = const_binop (MINUS_EXPR, tem, arg1, 0);
fd96eeef 7925 return fold (build2 (RROTATE_EXPR, type, arg0, tem));
7a1b56a9 7926 }
7927
7928 /* If we have a rotate of a bit operation with the rotate count and
7929 the second operand of the bit operation both constant,
7930 permute the two operations. */
7931 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
7932 && (TREE_CODE (arg0) == BIT_AND_EXPR
7a1b56a9 7933 || TREE_CODE (arg0) == BIT_IOR_EXPR
7934 || TREE_CODE (arg0) == BIT_XOR_EXPR)
7935 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
fd96eeef 7936 return fold (build2 (TREE_CODE (arg0), type,
7937 fold (build2 (code, type,
7938 TREE_OPERAND (arg0, 0), arg1)),
7939 fold (build2 (code, type,
7940 TREE_OPERAND (arg0, 1), arg1))));
7a1b56a9 7941
7942 /* Two consecutive rotates adding up to the width of the mode can
7943 be ignored. */
7944 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
7945 && TREE_CODE (arg0) == RROTATE_EXPR
7946 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
7947 && TREE_INT_CST_HIGH (arg1) == 0
7948 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
7949 && ((TREE_INT_CST_LOW (arg1)
7950 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
a0c2c45b 7951 == (unsigned int) GET_MODE_BITSIZE (TYPE_MODE (type))))
7a1b56a9 7952 return TREE_OPERAND (arg0, 0);
7953
2bc77e10 7954 goto binary;
7955
7956 case MIN_EXPR:
7957 if (operand_equal_p (arg0, arg1, 0))
3a6656ad 7958 return omit_one_operand (type, arg0, arg1);
780a4395 7959 if (INTEGRAL_TYPE_P (type)
4ee9c684 7960 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
2bc77e10 7961 return omit_one_operand (type, arg1, arg0);
7962 goto associate;
7963
7964 case MAX_EXPR:
7965 if (operand_equal_p (arg0, arg1, 0))
3a6656ad 7966 return omit_one_operand (type, arg0, arg1);
780a4395 7967 if (INTEGRAL_TYPE_P (type)
f52483b5 7968 && TYPE_MAX_VALUE (type)
4ee9c684 7969 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
2bc77e10 7970 return omit_one_operand (type, arg1, arg0);
7971 goto associate;
7972
7973 case TRUTH_NOT_EXPR:
2dcc623a 7974 /* The argument to invert_truthvalue must have Boolean type. */
7975 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
7976 arg0 = fold_convert (boolean_type_node, arg0);
7206da1b 7977
2bc77e10 7978 /* Note that the operand of this must be an int
7979 and its values must be 0 or 1.
7980 ("true" is a fixed value perhaps depending on the language,
7981 but we don't handle values other than 1 correctly yet.) */
7bbc42b5 7982 tem = invert_truthvalue (arg0);
7983 /* Avoid infinite recursion. */
7984 if (TREE_CODE (tem) == TRUTH_NOT_EXPR)
6881f973 7985 {
7986 tem = fold_single_bit_test (code, arg0, arg1, type);
7987 if (tem)
7988 return tem;
7989 return t;
7990 }
b30e3dbc 7991 return fold_convert (type, tem);
2bc77e10 7992
7993 case TRUTH_ANDIF_EXPR:
7994 /* Note that the operands of this must be ints
7995 and their values must be 0 or 1.
7996 ("true" is a fixed value perhaps depending on the language.) */
7997 /* If first arg is constant zero, return it. */
9a7b73a1 7998 if (integer_zerop (arg0))
b30e3dbc 7999 return fold_convert (type, arg0);
2bc77e10 8000 case TRUTH_AND_EXPR:
8001 /* If either arg is constant true, drop it. */
8002 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
b30e3dbc 8003 return non_lvalue (fold_convert (type, arg1));
4e91a871 8004 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
8005 /* Preserve sequence points. */
8006 && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
b30e3dbc 8007 return non_lvalue (fold_convert (type, arg0));
9a7b73a1 8008 /* If second arg is constant zero, result is zero, but first arg
8009 must be evaluated. */
8010 if (integer_zerop (arg1))
8011 return omit_one_operand (type, arg1, arg0);
f83854c8 8012 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
8013 case will be handled here. */
8014 if (integer_zerop (arg0))
8015 return omit_one_operand (type, arg0, arg1);
2bc77e10 8016
990bbbfa 8017 /* !X && X is always false. */
8018 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8019 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8020 return omit_one_operand (type, integer_zero_node, arg1);
8021 /* X && !X is always false. */
8022 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8023 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8024 return omit_one_operand (type, integer_zero_node, arg0);
8025
2bc77e10 8026 truth_andor:
935abd69 8027 /* We only do these simplifications if we are optimizing. */
8028 if (!optimize)
8029 return t;
8030
8031 /* Check for things like (A || B) && (A || C). We can convert this
8032 to A || (B && C). Note that either operator can be any of the four
8033 truth and/or operations and the transformation will still be
8034 valid. Also note that we only care about order for the
a8149ca2 8035 ANDIF and ORIF operators. If B contains side effects, this
6312a35e 8036 might change the truth-value of A. */
935abd69 8037 if (TREE_CODE (arg0) == TREE_CODE (arg1)
8038 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8039 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8040 || TREE_CODE (arg0) == TRUTH_AND_EXPR
a8149ca2 8041 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8042 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
935abd69 8043 {
8044 tree a00 = TREE_OPERAND (arg0, 0);
8045 tree a01 = TREE_OPERAND (arg0, 1);
8046 tree a10 = TREE_OPERAND (arg1, 0);
8047 tree a11 = TREE_OPERAND (arg1, 1);
8048 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8049 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8050 && (code == TRUTH_AND_EXPR
8051 || code == TRUTH_OR_EXPR));
8052
8053 if (operand_equal_p (a00, a10, 0))
fd96eeef 8054 return fold (build2 (TREE_CODE (arg0), type, a00,
8055 fold (build2 (code, type, a01, a11))));
935abd69 8056 else if (commutative && operand_equal_p (a00, a11, 0))
fd96eeef 8057 return fold (build2 (TREE_CODE (arg0), type, a00,
8058 fold (build2 (code, type, a01, a10))));
935abd69 8059 else if (commutative && operand_equal_p (a01, a10, 0))
fd96eeef 8060 return fold (build2 (TREE_CODE (arg0), type, a01,
8061 fold (build2 (code, type, a00, a11))));
935abd69 8062
8063 /* This case if tricky because we must either have commutative
8064 operators or else A10 must not have side-effects. */
8065
8066 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8067 && operand_equal_p (a01, a11, 0))
fd96eeef 8068 return fold (build2 (TREE_CODE (arg0), type,
8069 fold (build2 (code, type, a00, a10)),
8070 a01));
935abd69 8071 }
8072
12ec0a8a 8073 /* See if we can build a range comparison. */
8074 if (0 != (tem = fold_range_test (t)))
8075 return tem;
8076
2bc77e10 8077 /* Check for the possibility of merging component references. If our
8078 lhs is another similar operation, try to merge its rhs with our
8079 rhs. Then try to merge our lhs and rhs. */
935abd69 8080 if (TREE_CODE (arg0) == code
8081 && 0 != (tem = fold_truthop (code, type,
8082 TREE_OPERAND (arg0, 1), arg1)))
fd96eeef 8083 return fold (build2 (code, type, TREE_OPERAND (arg0, 0), tem));
2bc77e10 8084
935abd69 8085 if ((tem = fold_truthop (code, type, arg0, arg1)) != 0)
8086 return tem;
8b94828f 8087
2bc77e10 8088 return t;
8089
8090 case TRUTH_ORIF_EXPR:
8091 /* Note that the operands of this must be ints
8092 and their values must be 0 or true.
8093 ("true" is a fixed value perhaps depending on the language.) */
8094 /* If first arg is constant true, return it. */
8095 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
b30e3dbc 8096 return fold_convert (type, arg0);
2bc77e10 8097 case TRUTH_OR_EXPR:
8098 /* If either arg is constant zero, drop it. */
8099 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
b30e3dbc 8100 return non_lvalue (fold_convert (type, arg1));
4e91a871 8101 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
8102 /* Preserve sequence points. */
8103 && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
b30e3dbc 8104 return non_lvalue (fold_convert (type, arg0));
9a7b73a1 8105 /* If second arg is constant true, result is true, but we must
8106 evaluate first arg. */
8107 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
8108 return omit_one_operand (type, arg1, arg0);
f83854c8 8109 /* Likewise for first arg, but note this only occurs here for
8110 TRUTH_OR_EXPR. */
8111 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
8112 return omit_one_operand (type, arg0, arg1);
990bbbfa 8113
8114 /* !X || X is always true. */
8115 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8116 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8117 return omit_one_operand (type, integer_one_node, arg1);
8118 /* X || !X is always true. */
8119 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8120 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8121 return omit_one_operand (type, integer_one_node, arg0);
8122
2bc77e10 8123 goto truth_andor;
8124
9a7b73a1 8125 case TRUTH_XOR_EXPR:
990bbbfa 8126 /* If the second arg is constant zero, drop it. */
9a7b73a1 8127 if (integer_zerop (arg1))
b30e3dbc 8128 return non_lvalue (fold_convert (type, arg0));
990bbbfa 8129 /* If the second arg is constant true, this is a logical inversion. */
9a7b73a1 8130 if (integer_onep (arg1))
b30e3dbc 8131 return non_lvalue (fold_convert (type, invert_truthvalue (arg0)));
4ee9c684 8132 /* Identical arguments cancel to zero. */
8133 if (operand_equal_p (arg0, arg1, 0))
8134 return omit_one_operand (type, integer_zero_node, arg0);
990bbbfa 8135
8136 /* !X ^ X is always true. */
8137 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
8138 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
8139 return omit_one_operand (type, integer_one_node, arg1);
8140
8141 /* X ^ !X is always true. */
8142 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
8143 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
8144 return omit_one_operand (type, integer_one_node, arg0);
8145
54e99035 8146 return t;
9a7b73a1 8147
2bc77e10 8148 case EQ_EXPR:
8149 case NE_EXPR:
8150 case LT_EXPR:
8151 case GT_EXPR:
8152 case LE_EXPR:
8153 case GE_EXPR:
f4185d2b 8154 /* If one arg is a real or integer constant, put it last. */
bd214d13 8155 if (tree_swap_operands_p (arg0, arg1, true))
fd96eeef 8156 return fold (build2 (swap_tree_comparison (code), type, arg1, arg0));
f4185d2b 8157
4a755ae7 8158 /* If this is an equality comparison of the address of a non-weak
8159 object against zero, then we know the result. */
8160 if ((code == EQ_EXPR || code == NE_EXPR)
8161 && TREE_CODE (arg0) == ADDR_EXPR
8162 && DECL_P (TREE_OPERAND (arg0, 0))
8163 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8164 && integer_zerop (arg1))
20783f07 8165 return constant_boolean_node (code != EQ_EXPR, type);
4a755ae7 8166
8167 /* If this is an equality comparison of the address of two non-weak,
8168 unaliased symbols neither of which are extern (since we do not
8169 have access to attributes for externs), then we know the result. */
8170 if ((code == EQ_EXPR || code == NE_EXPR)
8171 && TREE_CODE (arg0) == ADDR_EXPR
8172 && DECL_P (TREE_OPERAND (arg0, 0))
8173 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
8174 && ! lookup_attribute ("alias",
8175 DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
8176 && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
8177 && TREE_CODE (arg1) == ADDR_EXPR
8178 && DECL_P (TREE_OPERAND (arg1, 0))
8179 && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
8180 && ! lookup_attribute ("alias",
8181 DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
8182 && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
20783f07 8183 return constant_boolean_node (operand_equal_p (arg0, arg1, 0)
8184 ? code == EQ_EXPR : code != EQ_EXPR,
8185 type);
4a755ae7 8186
88b41b10 8187 if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
8188 {
8cce4b41 8189 tree targ0 = strip_float_extensions (arg0);
8190 tree targ1 = strip_float_extensions (arg1);
8191 tree newtype = TREE_TYPE (targ0);
8192
8193 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8194 newtype = TREE_TYPE (targ1);
8195
8196 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
8197 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
fd96eeef 8198 return fold (build2 (code, type, fold_convert (newtype, targ0),
8199 fold_convert (newtype, targ1)));
8cce4b41 8200
88b41b10 8201 /* (-a) CMP (-b) -> b CMP a */
8202 if (TREE_CODE (arg0) == NEGATE_EXPR
8203 && TREE_CODE (arg1) == NEGATE_EXPR)
fd96eeef 8204 return fold (build2 (code, type, TREE_OPERAND (arg1, 0),
8205 TREE_OPERAND (arg0, 0)));
6d2e901f 8206
8207 if (TREE_CODE (arg1) == REAL_CST)
8208 {
8209 REAL_VALUE_TYPE cst;
8210 cst = TREE_REAL_CST (arg1);
8211
8212 /* (-a) CMP CST -> a swap(CMP) (-CST) */
8213 if (TREE_CODE (arg0) == NEGATE_EXPR)
8214 return
fd96eeef 8215 fold (build2 (swap_tree_comparison (code), type,
8216 TREE_OPERAND (arg0, 0),
8217 build_real (TREE_TYPE (arg1),
8218 REAL_VALUE_NEGATE (cst))));
6d2e901f 8219
8220 /* IEEE doesn't distinguish +0 and -0 in comparisons. */
8221 /* a CMP (-0) -> a CMP 0 */
8222 if (REAL_VALUE_MINUS_ZERO (cst))
fd96eeef 8223 return fold (build2 (code, type, arg0,
8224 build_real (TREE_TYPE (arg1), dconst0)));
6d2e901f 8225
8226 /* x != NaN is always true, other ops are always false. */
8227 if (REAL_VALUE_ISNAN (cst)
8228 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
8229 {
53f78329 8230 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
20783f07 8231 return omit_one_operand (type, tem, arg0);
6d2e901f 8232 }
8233
8234 /* Fold comparisons against infinity. */
8235 if (REAL_VALUE_ISINF (cst))
8236 {
8237 tem = fold_inf_compare (code, type, arg0, arg1);
8238 if (tem != NULL_TREE)
8239 return tem;
8240 }
8241 }
88b41b10 8242
f4185d2b 8243 /* If this is a comparison of a real constant with a PLUS_EXPR
8244 or a MINUS_EXPR of a real constant, we can convert it into a
8245 comparison with a revised real constant as long as no overflow
8246 occurs when unsafe_math_optimizations are enabled. */
8247 if (flag_unsafe_math_optimizations
8248 && TREE_CODE (arg1) == REAL_CST
8249 && (TREE_CODE (arg0) == PLUS_EXPR
8250 || TREE_CODE (arg0) == MINUS_EXPR)
8251 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
8252 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8253 ? MINUS_EXPR : PLUS_EXPR,
8254 arg1, TREE_OPERAND (arg0, 1), 0))
8255 && ! TREE_CONSTANT_OVERFLOW (tem))
fd96eeef 8256 return fold (build2 (code, type, TREE_OPERAND (arg0, 0), tem));
4b0b9adb 8257
edc21ba8 8258 /* Likewise, we can simplify a comparison of a real constant with
8259 a MINUS_EXPR whose first operand is also a real constant, i.e.
8260 (c1 - x) < c2 becomes x > c1-c2. */
8261 if (flag_unsafe_math_optimizations
8262 && TREE_CODE (arg1) == REAL_CST
8263 && TREE_CODE (arg0) == MINUS_EXPR
8264 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
8265 && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
8266 arg1, 0))
8267 && ! TREE_CONSTANT_OVERFLOW (tem))
fd96eeef 8268 return fold (build2 (swap_tree_comparison (code), type,
8269 TREE_OPERAND (arg0, 1), tem));
edc21ba8 8270
4b0b9adb 8271 /* Fold comparisons against built-in math functions. */
8272 if (TREE_CODE (arg1) == REAL_CST
8273 && flag_unsafe_math_optimizations
8274 && ! flag_errno_math)
8275 {
8276 enum built_in_function fcode = builtin_mathfn_code (arg0);
8277
8278 if (fcode != END_BUILTINS)
8279 {
8280 tem = fold_mathfn_compare (fcode, code, type, arg0, arg1);
8281 if (tem != NULL_TREE)
8282 return tem;
8283 }
8284 }
2bc77e10 8285 }
8286
0e2fb02d 8287 /* Convert foo++ == CONST into ++foo == CONST + INCR. */
8288 if (TREE_CONSTANT (arg1)
8289 && (TREE_CODE (arg0) == POSTINCREMENT_EXPR
8290 || TREE_CODE (arg0) == POSTDECREMENT_EXPR)
8291 /* This optimization is invalid for ordered comparisons
8292 if CONST+INCR overflows or if foo+incr might overflow.
8293 This optimization is invalid for floating point due to rounding.
8294 For pointer types we assume overflow doesn't happen. */
8295 && (POINTER_TYPE_P (TREE_TYPE (arg0))
8296 || (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8297 && (code == EQ_EXPR || code == NE_EXPR))))
8298 {
8299 tree varop, newconst;
2bc77e10 8300
0e2fb02d 8301 if (TREE_CODE (arg0) == POSTINCREMENT_EXPR)
8302 {
8303 newconst = fold (build2 (PLUS_EXPR, TREE_TYPE (arg0),
8304 arg1, TREE_OPERAND (arg0, 1)));
8305 varop = build2 (PREINCREMENT_EXPR, TREE_TYPE (arg0),
8306 TREE_OPERAND (arg0, 0),
8307 TREE_OPERAND (arg0, 1));
8308 }
8309 else
8310 {
8311 newconst = fold (build2 (MINUS_EXPR, TREE_TYPE (arg0),
8312 arg1, TREE_OPERAND (arg0, 1)));
8313 varop = build2 (PREDECREMENT_EXPR, TREE_TYPE (arg0),
8314 TREE_OPERAND (arg0, 0),
8315 TREE_OPERAND (arg0, 1));
8316 }
2bc77e10 8317
0e2fb02d 8318
8319 /* If VAROP is a reference to a bitfield, we must mask
8320 the constant by the width of the field. */
8321 if (TREE_CODE (TREE_OPERAND (varop, 0)) == COMPONENT_REF
6374121b 8322 && DECL_BIT_FIELD (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))
8323 && host_integerp (DECL_SIZE (TREE_OPERAND
8324 (TREE_OPERAND (varop, 0), 1)), 1))
0e2fb02d 8325 {
8326 tree fielddecl = TREE_OPERAND (TREE_OPERAND (varop, 0), 1);
6374121b 8327 HOST_WIDE_INT size = tree_low_cst (DECL_SIZE (fielddecl), 1);
9ab9151d 8328 tree folded_compare, shift;
0e2fb02d 8329
8330 /* First check whether the comparison would come out
8331 always the same. If we don't do that we would
8332 change the meaning with the masking. */
8333 folded_compare = fold (build2 (code, type,
6374121b 8334 TREE_OPERAND (varop, 0), arg1));
0e2fb02d 8335 if (integer_zerop (folded_compare)
8336 || integer_onep (folded_compare))
8337 return omit_one_operand (type, folded_compare, varop);
8338
7c446c95 8339 shift = build_int_cst (NULL_TREE,
7016c612 8340 TYPE_PRECISION (TREE_TYPE (varop)) - size);
6374121b 8341 shift = fold_convert (TREE_TYPE (varop), shift);
9ab9151d 8342 newconst = fold (build2 (LSHIFT_EXPR, TREE_TYPE (varop),
8343 newconst, shift));
8344 newconst = fold (build2 (RSHIFT_EXPR, TREE_TYPE (varop),
8345 newconst, shift));
0e2fb02d 8346 }
8347
8348 return fold (build2 (code, type, varop, newconst));
8349 }
2bc77e10 8350
7df2ee7b 8351 /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
8352 This transformation affects the cases which are handled in later
8353 optimizations involving comparisons with non-negative constants. */
8354 if (TREE_CODE (arg1) == INTEGER_CST
8355 && TREE_CODE (arg0) != INTEGER_CST
8356 && tree_int_cst_sgn (arg1) > 0)
8357 {
8358 switch (code)
8359 {
8360 case GE_EXPR:
7df2ee7b 8361 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8362 return fold (build2 (GT_EXPR, type, arg0, arg1));
7df2ee7b 8363
8364 case LT_EXPR:
7df2ee7b 8365 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8366 return fold (build2 (LE_EXPR, type, arg0, arg1));
7df2ee7b 8367
8368 default:
8369 break;
8370 }
8371 }
8372
8539da5e 8373 /* Comparisons with the highest or lowest possible integer of
7206da1b 8374 the specified size will have known values.
4ee9c684 8375
8376 This is quite similar to fold_relational_hi_lo; however, my
8377 attempts to share the code have been nothing but trouble.
8378 I give up for now. */
8539da5e 8379 {
8380 int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg1)));
8381
8382 if (TREE_CODE (arg1) == INTEGER_CST
8383 && ! TREE_CONSTANT_OVERFLOW (arg1)
8384 && width <= HOST_BITS_PER_WIDE_INT
8385 && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
8386 || POINTER_TYPE_P (TREE_TYPE (arg1))))
8387 {
7df2ee7b 8388 unsigned HOST_WIDE_INT signed_max;
8389 unsigned HOST_WIDE_INT max, min;
8390
8391 signed_max = ((unsigned HOST_WIDE_INT) 1 << (width - 1)) - 1;
8392
78a8ed03 8393 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
7df2ee7b 8394 {
8395 max = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
8396 min = 0;
8397 }
8398 else
8399 {
8400 max = signed_max;
8401 min = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
8402 }
8403
8539da5e 8404 if (TREE_INT_CST_HIGH (arg1) == 0
7df2ee7b 8405 && TREE_INT_CST_LOW (arg1) == max)
8406 switch (code)
8539da5e 8407 {
8408 case GT_EXPR:
20783f07 8409 return omit_one_operand (type, integer_zero_node, arg0);
8410
8539da5e 8411 case GE_EXPR:
fd96eeef 8412 return fold (build2 (EQ_EXPR, type, arg0, arg1));
88e11d8f 8413
8539da5e 8414 case LE_EXPR:
20783f07 8415 return omit_one_operand (type, integer_one_node, arg0);
8416
8539da5e 8417 case LT_EXPR:
fd96eeef 8418 return fold (build2 (NE_EXPR, type, arg0, arg1));
8539da5e 8419
7df2ee7b 8420 /* The GE_EXPR and LT_EXPR cases above are not normally
88e11d8f 8421 reached because of previous transformations. */
7df2ee7b 8422
8539da5e 8423 default:
8424 break;
8425 }
7df2ee7b 8426 else if (TREE_INT_CST_HIGH (arg1) == 0
8427 && TREE_INT_CST_LOW (arg1) == max - 1)
8428 switch (code)
8429 {
8430 case GT_EXPR:
7df2ee7b 8431 arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8432 return fold (build2 (EQ_EXPR, type, arg0, arg1));
7df2ee7b 8433 case LE_EXPR:
7df2ee7b 8434 arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8435 return fold (build2 (NE_EXPR, type, arg0, arg1));
7df2ee7b 8436 default:
8437 break;
8438 }
8439 else if (TREE_INT_CST_HIGH (arg1) == (min ? -1 : 0)
8440 && TREE_INT_CST_LOW (arg1) == min)
8441 switch (code)
8539da5e 8442 {
8443 case LT_EXPR:
20783f07 8444 return omit_one_operand (type, integer_zero_node, arg0);
8445
8539da5e 8446 case LE_EXPR:
fd96eeef 8447 return fold (build2 (EQ_EXPR, type, arg0, arg1));
8539da5e 8448
8449 case GE_EXPR:
20783f07 8450 return omit_one_operand (type, integer_one_node, arg0);
8451
8539da5e 8452 case GT_EXPR:
fd96eeef 8453 return fold (build2 (NE_EXPR, type, arg0, arg1));
8539da5e 8454
8455 default:
8456 break;
8457 }
7df2ee7b 8458 else if (TREE_INT_CST_HIGH (arg1) == (min ? -1 : 0)
8459 && TREE_INT_CST_LOW (arg1) == min + 1)
8460 switch (code)
8461 {
8462 case GE_EXPR:
7df2ee7b 8463 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8464 return fold (build2 (NE_EXPR, type, arg0, arg1));
7df2ee7b 8465 case LT_EXPR:
7df2ee7b 8466 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
fd96eeef 8467 return fold (build2 (EQ_EXPR, type, arg0, arg1));
7df2ee7b 8468 default:
8469 break;
8470 }
8539da5e 8471
4ee9c684 8472 else if (!in_gimple_form
8473 && TREE_INT_CST_HIGH (arg1) == 0
7df2ee7b 8474 && TREE_INT_CST_LOW (arg1) == signed_max
78a8ed03 8475 && TYPE_UNSIGNED (TREE_TYPE (arg1))
8539da5e 8476 /* signed_type does not work on pointer types. */
8477 && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
8478 {
7df2ee7b 8479 /* The following case also applies to X < signed_max+1
8480 and X >= signed_max+1 because previous transformations. */
8481 if (code == LE_EXPR || code == GT_EXPR)
8539da5e 8482 {
8483 tree st0, st1;
fa8b888f 8484 st0 = lang_hooks.types.signed_type (TREE_TYPE (arg0));
8485 st1 = lang_hooks.types.signed_type (TREE_TYPE (arg1));
8539da5e 8486 return fold
fd96eeef 8487 (build2 (code == LE_EXPR ? GE_EXPR: LT_EXPR,
8488 type, fold_convert (st0, arg0),
8489 fold_convert (st1, integer_zero_node)));
8539da5e 8490 }
8491 }
8539da5e 8492 }
8493 }
8494
155b05dc 8495 /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
8496 a MINUS_EXPR of a constant, we can convert it into a comparison with
8497 a revised constant as long as no overflow occurs. */
8498 if ((code == EQ_EXPR || code == NE_EXPR)
8499 && TREE_CODE (arg1) == INTEGER_CST
8500 && (TREE_CODE (arg0) == PLUS_EXPR
8501 || TREE_CODE (arg0) == MINUS_EXPR)
8502 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8503 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
8504 ? MINUS_EXPR : PLUS_EXPR,
8505 arg1, TREE_OPERAND (arg0, 1), 0))
8506 && ! TREE_CONSTANT_OVERFLOW (tem))
fd96eeef 8507 return fold (build2 (code, type, TREE_OPERAND (arg0, 0), tem));
155b05dc 8508
8509 /* Similarly for a NEGATE_EXPR. */
8510 else if ((code == EQ_EXPR || code == NE_EXPR)
8511 && TREE_CODE (arg0) == NEGATE_EXPR
8512 && TREE_CODE (arg1) == INTEGER_CST
23ec2d5e 8513 && 0 != (tem = negate_expr (arg1))
155b05dc 8514 && TREE_CODE (tem) == INTEGER_CST
8515 && ! TREE_CONSTANT_OVERFLOW (tem))
fd96eeef 8516 return fold (build2 (code, type, TREE_OPERAND (arg0, 0), tem));
155b05dc 8517
8518 /* If we have X - Y == 0, we can convert that to X == Y and similarly
8519 for !=. Don't do this for ordered comparisons due to overflow. */
8520 else if ((code == NE_EXPR || code == EQ_EXPR)
8521 && integer_zerop (arg1) && TREE_CODE (arg0) == MINUS_EXPR)
fd96eeef 8522 return fold (build2 (code, type,
8523 TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1)));
155b05dc 8524
155b05dc 8525 else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
faab57e3 8526 && TREE_CODE (arg0) == NOP_EXPR)
8527 {
8528 /* If we are widening one operand of an integer comparison,
8529 see if the other operand is similarly being widened. Perhaps we
8530 can do the comparison in the narrower type. */
8531 tem = fold_widened_comparison (code, type, arg0, arg1);
8532 if (tem)
8533 return tem;
8534
8535 /* Or if we are changing signedness. */
8536 tem = fold_sign_changed_comparison (code, type, arg0, arg1);
8537 if (tem)
8538 return tem;
8539 }
cc049fa3 8540
155b05dc 8541 /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
8542 constant, we can simplify it. */
8543 else if (TREE_CODE (arg1) == INTEGER_CST
8544 && (TREE_CODE (arg0) == MIN_EXPR
8545 || TREE_CODE (arg0) == MAX_EXPR)
8546 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8547 return optimize_minmax_comparison (t);
8548
8549 /* If we are comparing an ABS_EXPR with a constant, we can
8550 convert all the cases into explicit comparisons, but they may
8551 well not be faster than doing the ABS and one comparison.
8552 But ABS (X) <= C is a range comparison, which becomes a subtraction
8553 and a comparison, and is probably faster. */
8554 else if (code == LE_EXPR && TREE_CODE (arg1) == INTEGER_CST
8555 && TREE_CODE (arg0) == ABS_EXPR
23ec2d5e 8556 && ! TREE_SIDE_EFFECTS (arg0)
8557 && (0 != (tem = negate_expr (arg1)))
8558 && TREE_CODE (tem) == INTEGER_CST
8559 && ! TREE_CONSTANT_OVERFLOW (tem))
fd96eeef 8560 return fold (build2 (TRUTH_ANDIF_EXPR, type,
8561 build2 (GE_EXPR, type,
8562 TREE_OPERAND (arg0, 0), tem),
8563 build2 (LE_EXPR, type,
8564 TREE_OPERAND (arg0, 0), arg1)));
cc049fa3 8565
2bc77e10 8566 /* If this is an EQ or NE comparison with zero and ARG0 is
8567 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
8568 two operations, but the latter can be done in one less insn
0dbd1c74 8569 on machines that have only two-operand insns or on which a
2bc77e10 8570 constant cannot be the first operand. */
8571 if (integer_zerop (arg1) && (code == EQ_EXPR || code == NE_EXPR)
8572 && TREE_CODE (arg0) == BIT_AND_EXPR)
8573 {
fd96eeef 8574 tree arg00 = TREE_OPERAND (arg0, 0);
8575 tree arg01 = TREE_OPERAND (arg0, 1);
8576 if (TREE_CODE (arg00) == LSHIFT_EXPR
8577 && integer_onep (TREE_OPERAND (arg00, 0)))
2bc77e10 8578 return
fd96eeef 8579 fold (build2 (code, type,
8580 build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
8581 build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
8582 arg01, TREE_OPERAND (arg00, 1)),
8583 fold_convert (TREE_TYPE (arg0),
8584 integer_one_node)),
8585 arg1));
2bc77e10 8586 else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
8587 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
8588 return
fd96eeef 8589 fold (build2 (code, type,
8590 build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
8591 build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
8592 arg00, TREE_OPERAND (arg01, 1)),
8593 fold_convert (TREE_TYPE (arg0),
8594 integer_one_node)),
8595 arg1));
2bc77e10 8596 }
8597
c393c7ff 8598 /* If this is an NE or EQ comparison of zero against the result of a
722b90ac 8599 signed MOD operation whose second operand is a power of 2, make
8600 the MOD operation unsigned since it is simpler and equivalent. */
c393c7ff 8601 if ((code == NE_EXPR || code == EQ_EXPR)
8602 && integer_zerop (arg1)
78a8ed03 8603 && !TYPE_UNSIGNED (TREE_TYPE (arg0))
c393c7ff 8604 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
8605 || TREE_CODE (arg0) == CEIL_MOD_EXPR
8606 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
722b90ac 8607 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
8608 && integer_pow2p (TREE_OPERAND (arg0, 1)))
c393c7ff 8609 {
fa8b888f 8610 tree newtype = lang_hooks.types.unsigned_type (TREE_TYPE (arg0));
662f41e4 8611 tree newmod = fold (build2 (TREE_CODE (arg0), newtype,
8612 fold_convert (newtype,
8613 TREE_OPERAND (arg0, 0)),
8614 fold_convert (newtype,
8615 TREE_OPERAND (arg0, 1))));
8616
8617 return fold (build2 (code, type, newmod,
8618 fold_convert (newtype, arg1)));
c393c7ff 8619 }
8620
2bc77e10 8621 /* If this is an NE comparison of zero with an AND of one, remove the
8622 comparison since the AND will give the correct value. */
8623 if (code == NE_EXPR && integer_zerop (arg1)
8624 && TREE_CODE (arg0) == BIT_AND_EXPR
8625 && integer_onep (TREE_OPERAND (arg0, 1)))
b30e3dbc 8626 return fold_convert (type, arg0);
2bc77e10 8627
8628 /* If we have (A & C) == C where C is a power of 2, convert this into
8629 (A & C) != 0. Similarly for NE_EXPR. */
8630 if ((code == EQ_EXPR || code == NE_EXPR)
8631 && TREE_CODE (arg0) == BIT_AND_EXPR
8632 && integer_pow2p (TREE_OPERAND (arg0, 1))
8633 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
fd96eeef 8634 return fold (build2 (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
5c9198bd 8635 arg0, fold_convert (TREE_TYPE (arg0),
8636 integer_zero_node)));
203a24c4 8637
6881f973 8638 /* If we have (A & C) != 0 or (A & C) == 0 and C is a power of
8639 2, then fold the expression into shifts and logical operations. */
8640 tem = fold_single_bit_test (code, arg0, arg1, type);
8641 if (tem)
8642 return tem;
2bc77e10 8643
0e0b35f9 8644 /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
8645 Similarly for NE_EXPR. */
8646 if ((code == EQ_EXPR || code == NE_EXPR)
8647 && TREE_CODE (arg0) == BIT_AND_EXPR
8648 && TREE_CODE (arg1) == INTEGER_CST
8649 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8650 {
ddc4113b 8651 tree notc = fold (build1 (BIT_NOT_EXPR,
8652 TREE_TYPE (TREE_OPERAND (arg0, 1)),
8653 TREE_OPERAND (arg0, 1)));
8654 tree dandnotc = fold (build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
8655 arg1, notc));
0e0b35f9 8656 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
53c0bbc0 8657 if (integer_nonzerop (dandnotc))
0e0b35f9 8658 return omit_one_operand (type, rslt, arg0);
8659 }
8660
8661 /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
8662 Similarly for NE_EXPR. */
8663 if ((code == EQ_EXPR || code == NE_EXPR)
8664 && TREE_CODE (arg0) == BIT_IOR_EXPR
8665 && TREE_CODE (arg1) == INTEGER_CST
8666 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8667 {
ddc4113b 8668 tree notd = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (arg1), arg1));
8669 tree candnotd = fold (build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
8670 TREE_OPERAND (arg0, 1), notd));
0e0b35f9 8671 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
53c0bbc0 8672 if (integer_nonzerop (candnotd))
0e0b35f9 8673 return omit_one_operand (type, rslt, arg0);
8674 }
8675
898bfb9d 8676 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
e8526af9 8677 and similarly for >= into !=. */
898bfb9d 8678 if ((code == LT_EXPR || code == GE_EXPR)
78a8ed03 8679 && TYPE_UNSIGNED (TREE_TYPE (arg0))
898bfb9d 8680 && TREE_CODE (arg1) == LSHIFT_EXPR
8681 && integer_onep (TREE_OPERAND (arg1, 0)))
fd96eeef 8682 return build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
8683 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
8684 TREE_OPERAND (arg1, 1)),
8685 fold_convert (TREE_TYPE (arg0), integer_zero_node));
898bfb9d 8686
8687 else if ((code == LT_EXPR || code == GE_EXPR)
78a8ed03 8688 && TYPE_UNSIGNED (TREE_TYPE (arg0))
898bfb9d 8689 && (TREE_CODE (arg1) == NOP_EXPR
8690 || TREE_CODE (arg1) == CONVERT_EXPR)
8691 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
8692 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
8693 return
fd96eeef 8694 build2 (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
8695 fold_convert (TREE_TYPE (arg0),
8696 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
8697 TREE_OPERAND (TREE_OPERAND (arg1, 0),
8698 1))),
8699 fold_convert (TREE_TYPE (arg0), integer_zero_node));
898bfb9d 8700
e233264a 8701 /* Simplify comparison of something with itself. (For IEEE
8702 floating-point, we can only do some of these simplifications.) */
8703 if (operand_equal_p (arg0, arg1, 0))
2bc77e10 8704 {
8705 switch (code)
8706 {
8707 case EQ_EXPR:
88e11d8f 8708 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8709 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
8710 return constant_boolean_node (1, type);
8711 break;
8712
2bc77e10 8713 case GE_EXPR:
8714 case LE_EXPR:
d150f981 8715 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
8716 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
b4af30fd 8717 return constant_boolean_node (1, type);
fd96eeef 8718 return fold (build2 (EQ_EXPR, type, arg0, arg1));
e233264a 8719
2bc77e10 8720 case NE_EXPR:
d150f981 8721 /* For NE, we can only do this simplification if integer
8722 or we don't honor IEEE floating point NaNs. */
8723 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
8724 && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
e233264a 8725 break;
a92771b8 8726 /* ... fall through ... */
2bc77e10 8727 case GT_EXPR:
8728 case LT_EXPR:
b4af30fd 8729 return constant_boolean_node (0, type);
0dbd1c74 8730 default:
fdada98f 8731 gcc_unreachable ();
2bc77e10 8732 }
8733 }
8734
e233264a 8735 /* If we are comparing an expression that just has comparisons
8736 of two integer values, arithmetic expressions of those comparisons,
8737 and constants, we can simplify it. There are only three cases
8738 to check: the two values can either be equal, the first can be
8739 greater, or the second can be greater. Fold the expression for
8740 those three values. Since each value must be 0 or 1, we have
8741 eight possibilities, each of which corresponds to the constant 0
8742 or 1 or one of the six possible comparisons.
8743
8744 This handles common cases like (a > b) == 0 but also handles
8745 expressions like ((x > y) - (y > x)) > 0, which supposedly
8746 occur in macroized code. */
8747
8748 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
8749 {
8750 tree cval1 = 0, cval2 = 0;
d0314131 8751 int save_p = 0;
e233264a 8752
d0314131 8753 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
e233264a 8754 /* Don't handle degenerate cases here; they should already
8755 have been handled anyway. */
8756 && cval1 != 0 && cval2 != 0
8757 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
8758 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
780a4395 8759 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
f52483b5 8760 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
8761 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
e233264a 8762 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
8763 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
8764 {
8765 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
8766 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
8767
8768 /* We can't just pass T to eval_subst in case cval1 or cval2
8769 was the same as ARG1. */
8770
8771 tree high_result
fd96eeef 8772 = fold (build2 (code, type,
8773 eval_subst (arg0, cval1, maxval,
8774 cval2, minval),
8775 arg1));
e233264a 8776 tree equal_result
fd96eeef 8777 = fold (build2 (code, type,
8778 eval_subst (arg0, cval1, maxval,
8779 cval2, maxval),
8780 arg1));
e233264a 8781 tree low_result
fd96eeef 8782 = fold (build2 (code, type,
8783 eval_subst (arg0, cval1, minval,
8784 cval2, maxval),
8785 arg1));
e233264a 8786
8787 /* All three of these results should be 0 or 1. Confirm they
8788 are. Then use those values to select the proper code
8789 to use. */
8790
8791 if ((integer_zerop (high_result)
8792 || integer_onep (high_result))
8793 && (integer_zerop (equal_result)
8794 || integer_onep (equal_result))
8795 && (integer_zerop (low_result)
8796 || integer_onep (low_result)))
8797 {
8798 /* Make a 3-bit mask with the high-order bit being the
8799 value for `>', the next for '=', and the low for '<'. */
8800 switch ((integer_onep (high_result) * 4)
8801 + (integer_onep (equal_result) * 2)
8802 + integer_onep (low_result))
8803 {
8804 case 0:
8805 /* Always false. */
88d56342 8806 return omit_one_operand (type, integer_zero_node, arg0);
e233264a 8807 case 1:
8808 code = LT_EXPR;
8809 break;
8810 case 2:
8811 code = EQ_EXPR;
8812 break;
8813 case 3:
8814 code = LE_EXPR;
8815 break;
8816 case 4:
8817 code = GT_EXPR;
8818 break;
8819 case 5:
8820 code = NE_EXPR;
8821 break;
8822 case 6:
8823 code = GE_EXPR;
8824 break;
8825 case 7:
8826 /* Always true. */
88d56342 8827 return omit_one_operand (type, integer_one_node, arg0);
e233264a 8828 }
8829
fd96eeef 8830 tem = build2 (code, type, cval1, cval2);
d0314131 8831 if (save_p)
53f78329 8832 return save_expr (tem);
d0314131 8833 else
53f78329 8834 return fold (tem);
e233264a 8835 }
8836 }
8837 }
8838
8839 /* If this is a comparison of a field, we may be able to simplify it. */
d50b22af 8840 if (((TREE_CODE (arg0) == COMPONENT_REF
fa8b888f 8841 && lang_hooks.can_use_bit_fields_p ())
6bc517c5 8842 || TREE_CODE (arg0) == BIT_FIELD_REF)
8843 && (code == EQ_EXPR || code == NE_EXPR)
8844 /* Handle the constant case even without -O
8845 to make sure the warnings are given. */
8846 && (optimize || TREE_CODE (arg1) == INTEGER_CST))
8847 {
8848 t1 = optimize_bit_field_compare (code, type, arg0, arg1);
155257be 8849 if (t1)
8850 return t1;
6bc517c5 8851 }
e233264a 8852
9e042f31 8853 /* If this is a comparison of complex values and either or both sides
8854 are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
8855 comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
8856 This may prevent needless evaluations. */
a77cc7ac 8857 if ((code == EQ_EXPR || code == NE_EXPR)
8858 && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
8859 && (TREE_CODE (arg0) == COMPLEX_EXPR
9e042f31 8860 || TREE_CODE (arg1) == COMPLEX_EXPR
8861 || TREE_CODE (arg0) == COMPLEX_CST
8862 || TREE_CODE (arg1) == COMPLEX_CST))
a77cc7ac 8863 {
8864 tree subtype = TREE_TYPE (TREE_TYPE (arg0));
a0748b7d 8865 tree real0, imag0, real1, imag1;
8866
8867 arg0 = save_expr (arg0);
8868 arg1 = save_expr (arg1);
8869 real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
8870 imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
8871 real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
8872 imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
a77cc7ac 8873
fd96eeef 8874 return fold (build2 ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
8875 : TRUTH_ORIF_EXPR),
8876 type,
8877 fold (build2 (code, type, real0, real1)),
8878 fold (build2 (code, type, imag0, imag1))));
a77cc7ac 8879 }
8880
53e0ea7e 8881 /* Optimize comparisons of strlen vs zero to a compare of the
d3371fcd 8882 first character of the string vs zero. To wit,
de1b648b 8883 strlen(ptr) == 0 => *ptr == 0
53e0ea7e 8884 strlen(ptr) != 0 => *ptr != 0
8885 Other cases should reduce to one of these two (or a constant)
8886 due to the return value of strlen being unsigned. */
8887 if ((code == EQ_EXPR || code == NE_EXPR)
8888 && integer_zerop (arg1)
c6e6ecb1 8889 && TREE_CODE (arg0) == CALL_EXPR)
53e0ea7e 8890 {
c6e6ecb1 8891 tree fndecl = get_callee_fndecl (arg0);
53e0ea7e 8892 tree arglist;
8893
c6e6ecb1 8894 if (fndecl
53e0ea7e 8895 && DECL_BUILT_IN (fndecl)
8896 && DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_MD
8897 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
8898 && (arglist = TREE_OPERAND (arg0, 1))
8899 && TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
8900 && ! TREE_CHAIN (arglist))
fd96eeef 8901 return fold (build2 (code, type,
8902 build1 (INDIRECT_REF, char_type_node,
5c9198bd 8903 TREE_VALUE (arglist)),
8904 fold_convert (char_type_node,
8905 integer_zero_node)));
53e0ea7e 8906 }
8907
270029e0 8908 /* We can fold X/C1 op C2 where C1 and C2 are integer constants
8909 into a single range test. */
8910 if (TREE_CODE (arg0) == TRUNC_DIV_EXPR
8911 && TREE_CODE (arg1) == INTEGER_CST
8912 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8913 && !integer_zerop (TREE_OPERAND (arg0, 1))
8914 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8915 && !TREE_OVERFLOW (arg1))
8916 {
8917 t1 = fold_div_compare (code, type, arg0, arg1);
8918 if (t1 != NULL_TREE)
8919 return t1;
8920 }
8921
990af12c 8922 if ((code == EQ_EXPR || code == NE_EXPR)
8923 && !TREE_SIDE_EFFECTS (arg0)
8924 && integer_zerop (arg1)
8925 && tree_expr_nonzero_p (arg0))
8926 return constant_boolean_node (code==NE_EXPR, type);
8927
ad46984d 8928 t1 = fold_relational_const (code, type, arg0, arg1);
990af12c 8929 return t1 == NULL_TREE ? t : t1;
2bc77e10 8930
2f64c430 8931 case UNORDERED_EXPR:
8932 case ORDERED_EXPR:
8933 case UNLT_EXPR:
8934 case UNLE_EXPR:
8935 case UNGT_EXPR:
8936 case UNGE_EXPR:
8937 case UNEQ_EXPR:
8938 case LTGT_EXPR:
8939 if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
8940 {
8941 t1 = fold_relational_const (code, type, arg0, arg1);
8942 if (t1 != NULL_TREE)
8943 return t1;
8944 }
8945
8946 /* If the first operand is NaN, the result is constant. */
8947 if (TREE_CODE (arg0) == REAL_CST
8948 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
8949 && (code != LTGT_EXPR || ! flag_trapping_math))
8950 {
8951 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
8952 ? integer_zero_node
8953 : integer_one_node;
8954 return omit_one_operand (type, t1, arg1);
8955 }
8956
8957 /* If the second operand is NaN, the result is constant. */
8958 if (TREE_CODE (arg1) == REAL_CST
8959 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
8960 && (code != LTGT_EXPR || ! flag_trapping_math))
8961 {
8962 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
8963 ? integer_zero_node
8964 : integer_one_node;
8965 return omit_one_operand (type, t1, arg0);
8966 }
8967
990af12c 8968 /* Simplify unordered comparison of something with itself. */
8969 if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
8970 && operand_equal_p (arg0, arg1, 0))
8971 return constant_boolean_node (1, type);
8972
8973 if (code == LTGT_EXPR
8974 && !flag_trapping_math
8975 && operand_equal_p (arg0, arg1, 0))
8976 return constant_boolean_node (0, type);
8977
2f64c430 8978 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
8979 {
8980 tree targ0 = strip_float_extensions (arg0);
8981 tree targ1 = strip_float_extensions (arg1);
8982 tree newtype = TREE_TYPE (targ0);
8983
8984 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
8985 newtype = TREE_TYPE (targ1);
8986
8987 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
8988 return fold (build2 (code, type, fold_convert (newtype, targ0),
8989 fold_convert (newtype, targ1)));
8990 }
8991
8992 return t;
8993
2bc77e10 8994 case COND_EXPR:
56753054 8995 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
8996 so all simple results must be passed through pedantic_non_lvalue. */
2bc77e10 8997 if (TREE_CODE (arg0) == INTEGER_CST)
5383eda4 8998 {
8999 tem = TREE_OPERAND (t, (integer_zerop (arg0) ? 2 : 1));
9000 /* Only optimize constant conditions when the selected branch
9001 has the same type as the COND_EXPR. This avoids optimizing
9002 away "c ? x : throw", where the throw has a void type. */
cf0518b3 9003 if (! VOID_TYPE_P (TREE_TYPE (tem))
2b03eaaf 9004 || VOID_TYPE_P (type))
5383eda4 9005 return pedantic_non_lvalue (tem);
9006 return t;
9007 }
dc3c829a 9008 if (operand_equal_p (arg1, TREE_OPERAND (t, 2), 0))
6df5edfa 9009 return pedantic_omit_one_operand (type, arg1, arg0);
2bc77e10 9010
e233264a 9011 /* If we have A op B ? A : C, we may be able to convert this to a
9012 simpler expression, depending on the operation and the values
920d0fb5 9013 of B and C. Signed zeros prevent all of these transformations,
0023616d 9014 for reasons given above each one.
2bc77e10 9015
0023616d 9016 Also try swapping the arguments and inverting the conditional. */
ce45a448 9017 if (COMPARISON_CLASS_P (arg0)
e233264a 9018 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
920d0fb5 9019 arg1, TREE_OPERAND (arg0, 1))
9020 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
2bc77e10 9021 {
0023616d 9022 tem = fold_cond_expr_with_comparison (type, arg0,
9b1fa4a0 9023 TREE_OPERAND (t, 1),
0023616d 9024 TREE_OPERAND (t, 2));
9025 if (tem)
9026 return tem;
9027 }
e233264a 9028
ce45a448 9029 if (COMPARISON_CLASS_P (arg0)
0023616d 9030 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
9031 TREE_OPERAND (t, 2),
9032 TREE_OPERAND (arg0, 1))
9033 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 2)))))
9034 {
9035 tem = invert_truthvalue (arg0);
ce45a448 9036 if (COMPARISON_CLASS_P (tem))
5923aeca 9037 {
9b1fa4a0 9038 tem = fold_cond_expr_with_comparison (type, tem,
9039 TREE_OPERAND (t, 2),
9040 TREE_OPERAND (t, 1));
0023616d 9041 if (tem)
9042 return tem;
5923aeca 9043 }
2bc77e10 9044 }
9045
2483911d 9046 /* If the second operand is simpler than the third, swap them
9047 since that produces better jump optimization results. */
bd214d13 9048 if (tree_swap_operands_p (TREE_OPERAND (t, 1),
9049 TREE_OPERAND (t, 2), false))
2483911d 9050 {
9051 /* See if this can be inverted. If it can't, possibly because
9052 it was a floating-point inequality comparison, don't do
9053 anything. */
9054 tem = invert_truthvalue (arg0);
9055
9056 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
fd96eeef 9057 return fold (build3 (code, type, tem,
9058 TREE_OPERAND (t, 2), TREE_OPERAND (t, 1)));
2483911d 9059 }
9060
e233264a 9061 /* Convert A ? 1 : 0 to simply A. */
9062 if (integer_onep (TREE_OPERAND (t, 1))
9063 && integer_zerop (TREE_OPERAND (t, 2))
9064 /* If we try to convert TREE_OPERAND (t, 0) to our type, the
cc049fa3 9065 call to fold will try to move the conversion inside
e233264a 9066 a COND, which will recurse. In that case, the COND_EXPR
9067 is probably the best choice, so leave it alone. */
9068 && type == TREE_TYPE (arg0))
56753054 9069 return pedantic_non_lvalue (arg0);
2bc77e10 9070
7687025a 9071 /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR
9072 over COND_EXPR in cases such as floating point comparisons. */
9073 if (integer_zerop (TREE_OPERAND (t, 1))
9074 && integer_onep (TREE_OPERAND (t, 2))
9075 && truth_value_p (TREE_CODE (arg0)))
b30e3dbc 9076 return pedantic_non_lvalue (fold_convert (type,
9077 invert_truthvalue (arg0)));
7687025a 9078
0023616d 9079 /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>). */
9080 if (TREE_CODE (arg0) == LT_EXPR
9081 && integer_zerop (TREE_OPERAND (arg0, 1))
9082 && integer_zerop (TREE_OPERAND (t, 2))
9083 && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
9084 return fold_convert (type, fold (build2 (BIT_AND_EXPR,
9085 TREE_TYPE (tem), tem, arg1)));
9086
9087 /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was
9088 already handled above. */
9089 if (TREE_CODE (arg0) == BIT_AND_EXPR
9090 && integer_onep (TREE_OPERAND (arg0, 1))
9091 && integer_zerop (TREE_OPERAND (t, 2))
9092 && integer_pow2p (arg1))
9093 {
9094 tree tem = TREE_OPERAND (arg0, 0);
9095 STRIP_NOPS (tem);
9096 if (TREE_CODE (tem) == RSHIFT_EXPR
c738d48d 9097 && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
0023616d 9098 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
9099 TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
9100 return fold (build2 (BIT_AND_EXPR, type,
9101 TREE_OPERAND (tem, 0), arg1));
9102 }
2bc77e10 9103
0023616d 9104 /* A & N ? N : 0 is simply A & N if N is a power of two. This
9105 is probably obsolete because the first operand should be a
9106 truth value (that's why we have the two cases above), but let's
9107 leave it in until we can confirm this for all front-ends. */
2bc77e10 9108 if (integer_zerop (TREE_OPERAND (t, 2))
9109 && TREE_CODE (arg0) == NE_EXPR
9110 && integer_zerop (TREE_OPERAND (arg0, 1))
e233264a 9111 && integer_pow2p (arg1)
9112 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
9113 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
4ee9c684 9114 arg1, OEP_ONLY_CONST))
b30e3dbc 9115 return pedantic_non_lvalue (fold_convert (type,
9116 TREE_OPERAND (arg0, 0)));
2bc77e10 9117
7687025a 9118 /* Convert A ? B : 0 into A && B if A and B are truth values. */
9119 if (integer_zerop (TREE_OPERAND (t, 2))
9120 && truth_value_p (TREE_CODE (arg0))
9121 && truth_value_p (TREE_CODE (arg1)))
0023616d 9122 return fold (build2 (TRUTH_ANDIF_EXPR, type, arg0, arg1));
7687025a 9123
9124 /* Convert A ? B : 1 into !A || B if A and B are truth values. */
9125 if (integer_onep (TREE_OPERAND (t, 2))
9126 && truth_value_p (TREE_CODE (arg0))
9127 && truth_value_p (TREE_CODE (arg1)))
9128 {
9129 /* Only perform transformation if ARG0 is easily inverted. */
9130 tem = invert_truthvalue (arg0);
9131 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
0023616d 9132 return fold (build2 (TRUTH_ORIF_EXPR, type, tem, arg1));
7687025a 9133 }
9134
0023616d 9135 /* Convert A ? 0 : B into !A && B if A and B are truth values. */
9136 if (integer_zerop (arg1)
9137 && truth_value_p (TREE_CODE (arg0))
9138 && truth_value_p (TREE_CODE (TREE_OPERAND (t, 2))))
9139 {
9140 /* Only perform transformation if ARG0 is easily inverted. */
9141 tem = invert_truthvalue (arg0);
9142 if (TREE_CODE (tem) != TRUTH_NOT_EXPR)
9143 return fold (build2 (TRUTH_ANDIF_EXPR, type, tem,
9144 TREE_OPERAND (t, 2)));
9145 }
9146
9147 /* Convert A ? 1 : B into A || B if A and B are truth values. */
9148 if (integer_onep (arg1)
9149 && truth_value_p (TREE_CODE (arg0))
9150 && truth_value_p (TREE_CODE (TREE_OPERAND (t, 2))))
9151 return fold (build2 (TRUTH_ORIF_EXPR, type, arg0,
9152 TREE_OPERAND (t, 2)));
9153
2bc77e10 9154 return t;
9155
9156 case COMPOUND_EXPR:
b468bbc6 9157 /* When pedantic, a compound expression can be neither an lvalue
9158 nor an integer constant expression. */
a7ea5e81 9159 if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
c3ce5d04 9160 return t;
9161 /* Don't let (0, 0) be null pointer constant. */
b30e3dbc 9162 tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
9163 : fold_convert (type, arg1);
9164 return pedantic_non_lvalue (tem);
2bc77e10 9165
bb6b5123 9166 case COMPLEX_EXPR:
9167 if (wins)
5b2ade4d 9168 return build_complex (type, arg0, arg1);
bb6b5123 9169 return t;
9170
9171 case REALPART_EXPR:
27395c25 9172 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
bb6b5123 9173 return t;
9174 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
9175 return omit_one_operand (type, TREE_OPERAND (arg0, 0),
9176 TREE_OPERAND (arg0, 1));
9177 else if (TREE_CODE (arg0) == COMPLEX_CST)
9178 return TREE_REALPART (arg0);
9179 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
fd96eeef 9180 return fold (build2 (TREE_CODE (arg0), type,
9181 fold (build1 (REALPART_EXPR, type,
9182 TREE_OPERAND (arg0, 0))),
9183 fold (build1 (REALPART_EXPR, type,
9184 TREE_OPERAND (arg0, 1)))));
bb6b5123 9185 return t;
9186
9187 case IMAGPART_EXPR:
27395c25 9188 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
b30e3dbc 9189 return fold_convert (type, integer_zero_node);
bb6b5123 9190 else if (TREE_CODE (arg0) == COMPLEX_EXPR)
9191 return omit_one_operand (type, TREE_OPERAND (arg0, 1),
9192 TREE_OPERAND (arg0, 0));
9193 else if (TREE_CODE (arg0) == COMPLEX_CST)
9194 return TREE_IMAGPART (arg0);
9195 else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
fd96eeef 9196 return fold (build2 (TREE_CODE (arg0), type,
9197 fold (build1 (IMAGPART_EXPR, type,
9198 TREE_OPERAND (arg0, 0))),
9199 fold (build1 (IMAGPART_EXPR, type,
9200 TREE_OPERAND (arg0, 1)))));
bb6b5123 9201 return t;
9202
650e4c94 9203 case CALL_EXPR:
9204 /* Check for a built-in function. */
dc3c829a 9205 if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
9206 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0))
650e4c94 9207 == FUNCTION_DECL)
dc3c829a 9208 && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
650e4c94 9209 {
f0613857 9210 tree tmp = fold_builtin (t, false);
650e4c94 9211 if (tmp)
9212 return tmp;
9213 }
9214 return t;
9215
2bc77e10 9216 default:
9217 return t;
9218 } /* switch (code) */
9219}
76a0ced5 9220
fc3df357 9221#ifdef ENABLE_FOLD_CHECKING
9222#undef fold
9223
9224static void fold_checksum_tree (tree, struct md5_ctx *, htab_t);
9225static void fold_check_failed (tree, tree);
9226void print_fold_checksum (tree);
9227
9228/* When --enable-checking=fold, compute a digest of expr before
9229 and after actual fold call to see if fold did not accidentally
9230 change original expr. */
9231
9232tree
9233fold (tree expr)
9234{
9235 tree ret;
9236 struct md5_ctx ctx;
9237 unsigned char checksum_before[16], checksum_after[16];
9238 htab_t ht;
9239
9240 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
9241 md5_init_ctx (&ctx);
9242 fold_checksum_tree (expr, &ctx, ht);
9243 md5_finish_ctx (&ctx, checksum_before);
9244 htab_empty (ht);
9245
9246 ret = fold_1 (expr);
9247
9248 md5_init_ctx (&ctx);
9249 fold_checksum_tree (expr, &ctx, ht);
9250 md5_finish_ctx (&ctx, checksum_after);
9251 htab_delete (ht);
9252
9253 if (memcmp (checksum_before, checksum_after, 16))
9254 fold_check_failed (expr, ret);
9255
9256 return ret;
9257}
9258
9259void
9260print_fold_checksum (tree expr)
9261{
9262 struct md5_ctx ctx;
9263 unsigned char checksum[16], cnt;
9264 htab_t ht;
9265
9266 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
9267 md5_init_ctx (&ctx);
9268 fold_checksum_tree (expr, &ctx, ht);
9269 md5_finish_ctx (&ctx, checksum);
9270 htab_delete (ht);
9271 for (cnt = 0; cnt < 16; ++cnt)
9272 fprintf (stderr, "%02x", checksum[cnt]);
9273 putc ('\n', stderr);
9274}
9275
9276static void
9277fold_check_failed (tree expr ATTRIBUTE_UNUSED, tree ret ATTRIBUTE_UNUSED)
9278{
9279 internal_error ("fold check: original tree changed by fold");
9280}
9281
9282static void
9283fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
9284{
9285 void **slot;
9286 enum tree_code code;
9287 char buf[sizeof (struct tree_decl)];
9288 int i, len;
9289
fdada98f 9290 gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
9291 <= sizeof (struct tree_decl))
9292 && sizeof (struct tree_type) <= sizeof (struct tree_decl));
fc3df357 9293 if (expr == NULL)
9294 return;
9295 slot = htab_find_slot (ht, expr, INSERT);
9296 if (*slot != NULL)
9297 return;
9298 *slot = expr;
9299 code = TREE_CODE (expr);
ce45a448 9300 if (TREE_CODE_CLASS (code) == tcc_declaration
9301 && DECL_ASSEMBLER_NAME_SET_P (expr))
fc3df357 9302 {
9303 /* Allow DECL_ASSEMBLER_NAME to be modified. */
9304 memcpy (buf, expr, tree_size (expr));
9305 expr = (tree) buf;
9306 SET_DECL_ASSEMBLER_NAME (expr, NULL);
9307 }
ce45a448 9308 else if (TREE_CODE_CLASS (code) == tcc_type
6b29892c 9309 && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
9310 || TYPE_CACHED_VALUES_P (expr)))
fc3df357 9311 {
6b29892c 9312 /* Allow these fields to be modified. */
fc3df357 9313 memcpy (buf, expr, tree_size (expr));
9314 expr = (tree) buf;
9315 TYPE_POINTER_TO (expr) = NULL;
9316 TYPE_REFERENCE_TO (expr) = NULL;
6b29892c 9317 TYPE_CACHED_VALUES_P (expr) = 0;
9318 TYPE_CACHED_VALUES (expr) = NULL;
fc3df357 9319 }
9320 md5_process_bytes (expr, tree_size (expr), ctx);
9321 fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
ce45a448 9322 if (TREE_CODE_CLASS (code) != tcc_type
9323 && TREE_CODE_CLASS (code) != tcc_declaration)
fc3df357 9324 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
fc3df357 9325 switch (TREE_CODE_CLASS (code))
9326 {
ce45a448 9327 case tcc_constant:
fc3df357 9328 switch (code)
9329 {
9330 case STRING_CST:
9331 md5_process_bytes (TREE_STRING_POINTER (expr),
9332 TREE_STRING_LENGTH (expr), ctx);
9333 break;
9334 case COMPLEX_CST:
9335 fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
9336 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
9337 break;
9338 case VECTOR_CST:
9339 fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
9340 break;
9341 default:
9342 break;
9343 }
9344 break;
ce45a448 9345 case tcc_exceptional:
fc3df357 9346 switch (code)
9347 {
9348 case TREE_LIST:
9349 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
9350 fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
9351 break;
9352 case TREE_VEC:
9353 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
9354 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
9355 break;
9356 default:
9357 break;
9358 }
9359 break;
ce45a448 9360 case tcc_expression:
9361 case tcc_reference:
9362 case tcc_comparison:
9363 case tcc_unary:
9364 case tcc_binary:
9365 case tcc_statement:
6388f9f7 9366 len = first_rtl_op (code);
fc3df357 9367 for (i = 0; i < len; ++i)
9368 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
9369 break;
ce45a448 9370 case tcc_declaration:
fc3df357 9371 fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
9372 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
9373 fold_checksum_tree (DECL_NAME (expr), ctx, ht);
9374 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
9375 fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
9376 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
9377 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
9378 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
9379 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
9380 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
9381 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
9382 break;
ce45a448 9383 case tcc_type:
419ec660 9384 if (TREE_CODE (expr) == ENUMERAL_TYPE)
9385 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
fc3df357 9386 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
9387 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
9388 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
9389 fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
419ec660 9390 if (INTEGRAL_TYPE_P (expr)
9391 || SCALAR_FLOAT_TYPE_P (expr))
9392 {
9393 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
9394 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
9395 }
fc3df357 9396 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
6b29892c 9397 if (TREE_CODE (expr) == RECORD_TYPE
9398 || TREE_CODE (expr) == UNION_TYPE
9399 || TREE_CODE (expr) == QUAL_UNION_TYPE)
9400 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
fc3df357 9401 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
9402 break;
9403 default:
9404 break;
9405 }
9406}
9407
9408#endif
9409
91c82c20 9410/* Perform constant folding and related simplification of initializer
276beea2 9411 expression EXPR. This behaves identically to "fold" but ignores
9412 potential run-time traps and exceptions that fold must preserve. */
9413
9414tree
9415fold_initializer (tree expr)
9416{
9417 int saved_signaling_nans = flag_signaling_nans;
9418 int saved_trapping_math = flag_trapping_math;
9419 int saved_trapv = flag_trapv;
9420 tree result;
9421
9422 flag_signaling_nans = 0;
9423 flag_trapping_math = 0;
9424 flag_trapv = 0;
9425
9426 result = fold (expr);
9427
9428 flag_signaling_nans = saved_signaling_nans;
9429 flag_trapping_math = saved_trapping_math;
9430 flag_trapv = saved_trapv;
9431
9432 return result;
9433}
9434
7014838c 9435/* Determine if first argument is a multiple of second argument. Return 0 if
9436 it is not, or we cannot easily determined it to be.
76a0ced5 9437
7014838c 9438 An example of the sort of thing we care about (at this point; this routine
9439 could surely be made more general, and expanded to do what the *_DIV_EXPR's
9440 fold cases do now) is discovering that
76a0ced5 9441
9442 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
9443
9444 is a multiple of
9445
9446 SAVE_EXPR (J * 8)
9447
7014838c 9448 when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
76a0ced5 9449
9450 This code also handles discovering that
9451
9452 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
9453
7014838c 9454 is a multiple of 8 so we don't have to worry about dealing with a
76a0ced5 9455 possible remainder.
9456
7014838c 9457 Note that we *look* inside a SAVE_EXPR only to determine how it was
9458 calculated; it is not safe for fold to do much of anything else with the
9459 internals of a SAVE_EXPR, since it cannot know when it will be evaluated
9460 at run time. For example, the latter example above *cannot* be implemented
9461 as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
9462 evaluation time of the original SAVE_EXPR is not necessarily the same at
9463 the time the new expression is evaluated. The only optimization of this
76a0ced5 9464 sort that would be valid is changing
9465
9466 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
76a0ced5 9467
7014838c 9468 divided by 8 to
76a0ced5 9469
9470 SAVE_EXPR (I) * SAVE_EXPR (J)
9471
9472 (where the same SAVE_EXPR (J) is used in the original and the
9473 transformed version). */
9474
9475static int
de1b648b 9476multiple_of_p (tree type, tree top, tree bottom)
76a0ced5 9477{
9478 if (operand_equal_p (top, bottom, 0))
9479 return 1;
9480
9481 if (TREE_CODE (type) != INTEGER_TYPE)
9482 return 0;
9483
9484 switch (TREE_CODE (top))
9485 {
9486 case MULT_EXPR:
9487 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
9488 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
9489
9490 case PLUS_EXPR:
9491 case MINUS_EXPR:
9492 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
9493 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
9494
17e3940f 9495 case LSHIFT_EXPR:
9496 if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
9497 {
9498 tree op1, t1;
9499
9500 op1 = TREE_OPERAND (top, 1);
9501 /* const_binop may not detect overflow correctly,
9502 so check for it explicitly here. */
9503 if (TYPE_PRECISION (TREE_TYPE (size_one_node))
9504 > TREE_INT_CST_LOW (op1)
9505 && TREE_INT_CST_HIGH (op1) == 0
b30e3dbc 9506 && 0 != (t1 = fold_convert (type,
9507 const_binop (LSHIFT_EXPR,
9508 size_one_node,
9509 op1, 0)))
17e3940f 9510 && ! TREE_OVERFLOW (t1))
9511 return multiple_of_p (type, t1, bottom);
9512 }
9513 return 0;
9514
76a0ced5 9515 case NOP_EXPR:
7014838c 9516 /* Can't handle conversions from non-integral or wider integral type. */
76a0ced5 9517 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
9518 || (TYPE_PRECISION (type)
9519 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
9520 return 0;
7014838c 9521
6312a35e 9522 /* .. fall through ... */
7014838c 9523
76a0ced5 9524 case SAVE_EXPR:
9525 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
9526
9527 case INTEGER_CST:
17e3940f 9528 if (TREE_CODE (bottom) != INTEGER_CST
78a8ed03 9529 || (TYPE_UNSIGNED (type)
17e3940f 9530 && (tree_int_cst_sgn (top) < 0
9531 || tree_int_cst_sgn (bottom) < 0)))
76a0ced5 9532 return 0;
9533 return integer_zerop (const_binop (TRUNC_MOD_EXPR,
9534 top, bottom, 0));
9535
9536 default:
9537 return 0;
9538 }
9539}
0f221fb7 9540
9541/* Return true if `t' is known to be non-negative. */
9542
9543int
de1b648b 9544tree_expr_nonnegative_p (tree t)
0f221fb7 9545{
9546 switch (TREE_CODE (t))
9547 {
cde9d0c7 9548 case ABS_EXPR:
cde9d0c7 9549 return 1;
8f4be2be 9550
0f221fb7 9551 case INTEGER_CST:
9552 return tree_int_cst_sgn (t) >= 0;
cfb7235b 9553
9554 case REAL_CST:
9555 return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
9556
9557 case PLUS_EXPR:
ae98dc4b 9558 if (FLOAT_TYPE_P (TREE_TYPE (t)))
9559 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
9560 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9561
dfcd8f35 9562 /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
2b8ef647 9563 both unsigned and at least 2 bits shorter than the result. */
ae98dc4b 9564 if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
9565 && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
9566 && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
9567 {
9568 tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
9569 tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
78a8ed03 9570 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
9571 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
ae98dc4b 9572 {
9573 unsigned int prec = MAX (TYPE_PRECISION (inner1),
9574 TYPE_PRECISION (inner2)) + 1;
9575 return prec < TYPE_PRECISION (TREE_TYPE (t));
9576 }
9577 }
9578 break;
cfb7235b 9579
9580 case MULT_EXPR:
9581 if (FLOAT_TYPE_P (TREE_TYPE (t)))
9582 {
9583 /* x * x for floating point x is always non-negative. */
9584 if (operand_equal_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1), 0))
9585 return 1;
9586 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
9587 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9588 }
ae98dc4b 9589
dfcd8f35 9590 /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
ae98dc4b 9591 both unsigned and their total bits is shorter than the result. */
9592 if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
9593 && TREE_CODE (TREE_OPERAND (t, 0)) == NOP_EXPR
9594 && TREE_CODE (TREE_OPERAND (t, 1)) == NOP_EXPR)
9595 {
9596 tree inner1 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
9597 tree inner2 = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 1), 0));
78a8ed03 9598 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
9599 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
ae98dc4b 9600 return TYPE_PRECISION (inner1) + TYPE_PRECISION (inner2)
9601 < TYPE_PRECISION (TREE_TYPE (t));
9602 }
cfb7235b 9603 return 0;
9604
a9436f5c 9605 case TRUNC_DIV_EXPR:
9606 case CEIL_DIV_EXPR:
9607 case FLOOR_DIV_EXPR:
9608 case ROUND_DIV_EXPR:
9609 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
ae98dc4b 9610 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9611
a9436f5c 9612 case TRUNC_MOD_EXPR:
9613 case CEIL_MOD_EXPR:
9614 case FLOOR_MOD_EXPR:
9615 case ROUND_MOD_EXPR:
9616 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
ae98dc4b 9617
9618 case RDIV_EXPR:
9619 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
9620 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9621
44c9fd6a 9622 case BIT_AND_EXPR:
9623 return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
9624 || tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
9625 case BIT_IOR_EXPR:
76c22522 9626 case BIT_XOR_EXPR:
44c9fd6a 9627 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
9628 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9629
ae98dc4b 9630 case NOP_EXPR:
9631 {
9632 tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
9633 tree outer_type = TREE_TYPE (t);
9634
9635 if (TREE_CODE (outer_type) == REAL_TYPE)
9636 {
9637 if (TREE_CODE (inner_type) == REAL_TYPE)
9638 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
9639 if (TREE_CODE (inner_type) == INTEGER_TYPE)
9640 {
78a8ed03 9641 if (TYPE_UNSIGNED (inner_type))
ae98dc4b 9642 return 1;
9643 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
9644 }
9645 }
9646 else if (TREE_CODE (outer_type) == INTEGER_TYPE)
9647 {
9648 if (TREE_CODE (inner_type) == REAL_TYPE)
9649 return tree_expr_nonnegative_p (TREE_OPERAND (t,0));
9650 if (TREE_CODE (inner_type) == INTEGER_TYPE)
9651 return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
78a8ed03 9652 && TYPE_UNSIGNED (inner_type);
ae98dc4b 9653 }
9654 }
9655 break;
9656
0f221fb7 9657 case COND_EXPR:
9658 return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
9659 && tree_expr_nonnegative_p (TREE_OPERAND (t, 2));
cde9d0c7 9660 case COMPOUND_EXPR:
9661 return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9662 case MIN_EXPR:
9663 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
d3371fcd 9664 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
cde9d0c7 9665 case MAX_EXPR:
9666 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
d3371fcd 9667 || tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
cde9d0c7 9668 case MODIFY_EXPR:
9669 return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
0f221fb7 9670 case BIND_EXPR:
2363ef00 9671 return tree_expr_nonnegative_p (expr_last (TREE_OPERAND (t, 1)));
a9436f5c 9672 case SAVE_EXPR:
9673 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
9674 case NON_LVALUE_EXPR:
9675 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
277f8dd2 9676 case FLOAT_EXPR:
9677 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
d3371fcd 9678
2569a1be 9679 case TARGET_EXPR:
9680 {
9681 tree temp = TARGET_EXPR_SLOT (t);
9682 t = TARGET_EXPR_INITIAL (t);
9683
9684 /* If the initializer is non-void, then it's a normal expression
9685 that will be assigned to the slot. */
9686 if (!VOID_TYPE_P (t))
9687 return tree_expr_nonnegative_p (t);
9688
9689 /* Otherwise, the initializer sets the slot in some way. One common
9690 way is an assignment statement at the end of the initializer. */
9691 while (1)
9692 {
9693 if (TREE_CODE (t) == BIND_EXPR)
9694 t = expr_last (BIND_EXPR_BODY (t));
9695 else if (TREE_CODE (t) == TRY_FINALLY_EXPR
9696 || TREE_CODE (t) == TRY_CATCH_EXPR)
9697 t = expr_last (TREE_OPERAND (t, 0));
9698 else if (TREE_CODE (t) == STATEMENT_LIST)
9699 t = expr_last (t);
9700 else
9701 break;
9702 }
9703 if (TREE_CODE (t) == MODIFY_EXPR
9704 && TREE_OPERAND (t, 0) == temp)
9705 return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
9706
9707 return 0;
9708 }
9709
c63f4ad3 9710 case CALL_EXPR:
c6e6ecb1 9711 {
9712 tree fndecl = get_callee_fndecl (t);
9713 tree arglist = TREE_OPERAND (t, 1);
9714 if (fndecl
9715 && DECL_BUILT_IN (fndecl)
9716 && DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_MD)
9717 switch (DECL_FUNCTION_CODE (fndecl))
9718 {
2df2df75 9719#define CASE_BUILTIN_F(BUILT_IN_FN) \
9720 case BUILT_IN_FN: case BUILT_IN_FN##F: case BUILT_IN_FN##L:
9721#define CASE_BUILTIN_I(BUILT_IN_FN) \
9722 case BUILT_IN_FN: case BUILT_IN_FN##L: case BUILT_IN_FN##LL:
9723
e63e0041 9724 CASE_BUILTIN_F (BUILT_IN_ACOS)
9725 CASE_BUILTIN_F (BUILT_IN_ACOSH)
2df2df75 9726 CASE_BUILTIN_F (BUILT_IN_CABS)
e63e0041 9727 CASE_BUILTIN_F (BUILT_IN_COSH)
9728 CASE_BUILTIN_F (BUILT_IN_ERFC)
2df2df75 9729 CASE_BUILTIN_F (BUILT_IN_EXP)
9730 CASE_BUILTIN_F (BUILT_IN_EXP10)
9731 CASE_BUILTIN_F (BUILT_IN_EXP2)
9732 CASE_BUILTIN_F (BUILT_IN_FABS)
e63e0041 9733 CASE_BUILTIN_F (BUILT_IN_FDIM)
9734 CASE_BUILTIN_F (BUILT_IN_FREXP)
9735 CASE_BUILTIN_F (BUILT_IN_HYPOT)
2df2df75 9736 CASE_BUILTIN_F (BUILT_IN_POW10)
2df2df75 9737 CASE_BUILTIN_I (BUILT_IN_FFS)
9738 CASE_BUILTIN_I (BUILT_IN_PARITY)
9739 CASE_BUILTIN_I (BUILT_IN_POPCOUNT)
e63e0041 9740 /* Always true. */
c6e6ecb1 9741 return 1;
9742
467214fd 9743 CASE_BUILTIN_F (BUILT_IN_SQRT)
9744 /* sqrt(-0.0) is -0.0. */
9745 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (t))))
9746 return 1;
9747 return tree_expr_nonnegative_p (TREE_VALUE (arglist));
9748
e63e0041 9749 CASE_BUILTIN_F (BUILT_IN_ASINH)
2df2df75 9750 CASE_BUILTIN_F (BUILT_IN_ATAN)
e63e0041 9751 CASE_BUILTIN_F (BUILT_IN_ATANH)
9752 CASE_BUILTIN_F (BUILT_IN_CBRT)
2df2df75 9753 CASE_BUILTIN_F (BUILT_IN_CEIL)
e63e0041 9754 CASE_BUILTIN_F (BUILT_IN_ERF)
9755 CASE_BUILTIN_F (BUILT_IN_EXPM1)
2df2df75 9756 CASE_BUILTIN_F (BUILT_IN_FLOOR)
e63e0041 9757 CASE_BUILTIN_F (BUILT_IN_FMOD)
9758 CASE_BUILTIN_F (BUILT_IN_LDEXP)
9759 CASE_BUILTIN_F (BUILT_IN_LLRINT)
9760 CASE_BUILTIN_F (BUILT_IN_LLROUND)
9761 CASE_BUILTIN_F (BUILT_IN_LRINT)
9762 CASE_BUILTIN_F (BUILT_IN_LROUND)
9763 CASE_BUILTIN_F (BUILT_IN_MODF)
2df2df75 9764 CASE_BUILTIN_F (BUILT_IN_NEARBYINT)
9765 CASE_BUILTIN_F (BUILT_IN_POW)
e63e0041 9766 CASE_BUILTIN_F (BUILT_IN_RINT)
2df2df75 9767 CASE_BUILTIN_F (BUILT_IN_ROUND)
e63e0041 9768 CASE_BUILTIN_F (BUILT_IN_SIGNBIT)
9769 CASE_BUILTIN_F (BUILT_IN_SINH)
9770 CASE_BUILTIN_F (BUILT_IN_TANH)
2df2df75 9771 CASE_BUILTIN_F (BUILT_IN_TRUNC)
e63e0041 9772 /* True if the 1st argument is nonnegative. */
c6e6ecb1 9773 return tree_expr_nonnegative_p (TREE_VALUE (arglist));
c63f4ad3 9774
467214fd 9775 CASE_BUILTIN_F (BUILT_IN_FMAX)
e63e0041 9776 /* True if the 1st OR 2nd arguments are nonnegative. */
9777 return tree_expr_nonnegative_p (TREE_VALUE (arglist))
9778 || tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
9779
467214fd 9780 CASE_BUILTIN_F (BUILT_IN_FMIN)
e63e0041 9781 /* True if the 1st AND 2nd arguments are nonnegative. */
9782 return tree_expr_nonnegative_p (TREE_VALUE (arglist))
9783 && tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
9784
467214fd 9785 CASE_BUILTIN_F (BUILT_IN_COPYSIGN)
e63e0041 9786 /* True if the 2nd argument is nonnegative. */
9787 return tree_expr_nonnegative_p (TREE_VALUE (TREE_CHAIN (arglist)));
9788
c6e6ecb1 9789 default:
9790 break;
2df2df75 9791#undef CASE_BUILTIN_F
9792#undef CASE_BUILTIN_I
c6e6ecb1 9793 }
9794 }
c63f4ad3 9795
6473f3f4 9796 /* ... fall through ... */
c63f4ad3 9797
0f221fb7 9798 default:
88e6440b 9799 if (truth_value_p (TREE_CODE (t)))
9800 /* Truth values evaluate to 0 or 1, which is nonnegative. */
9801 return 1;
0f221fb7 9802 }
ae98dc4b 9803
9804 /* We don't know sign of `t', so be conservative and return false. */
9805 return 0;
0f221fb7 9806}
9807
ad46984d 9808/* Return true when T is an address and is known to be nonzero.
9809 For floating point we further ensure that T is not denormal.
778ac06a 9810 Similar logic is present in nonzero_address in rtlanal.h. */
ad46984d 9811
9812static bool
9813tree_expr_nonzero_p (tree t)
9814{
9815 tree type = TREE_TYPE (t);
9816
7bd28bba 9817 /* Doing something useful for floating point would need more work. */
ad46984d 9818 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
9819 return false;
9820
9821 switch (TREE_CODE (t))
9822 {
9823 case ABS_EXPR:
78a8ed03 9824 if (!TYPE_UNSIGNED (type) && !flag_wrapv)
ad46984d 9825 return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
9826
9827 case INTEGER_CST:
bb445479 9828 /* We used to test for !integer_zerop here. This does not work correctly
9829 if TREE_CONSTANT_OVERFLOW (t). */
9830 return (TREE_INT_CST_LOW (t) != 0
9831 || TREE_INT_CST_HIGH (t) != 0);
ad46984d 9832
9833 case PLUS_EXPR:
78a8ed03 9834 if (!TYPE_UNSIGNED (type) && !flag_wrapv)
ad46984d 9835 {
9836 /* With the presence of negative values it is hard
9837 to say something. */
9838 if (!tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
9839 || !tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
9840 return false;
9841 /* One of operands must be positive and the other non-negative. */
9842 return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
9843 || tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
9844 }
9845 break;
9846
9847 case MULT_EXPR:
78a8ed03 9848 if (!TYPE_UNSIGNED (type) && !flag_wrapv)
ad46984d 9849 {
9850 return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
9851 && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
9852 }
9853 break;
9854
9855 case NOP_EXPR:
9856 {
9857 tree inner_type = TREE_TYPE (TREE_OPERAND (t, 0));
9858 tree outer_type = TREE_TYPE (t);
9859
9860 return (TYPE_PRECISION (inner_type) >= TYPE_PRECISION (outer_type)
9861 && tree_expr_nonzero_p (TREE_OPERAND (t, 0)));
9862 }
9863 break;
9864
9865 case ADDR_EXPR:
3d1c55e6 9866 {
9867 tree base = get_base_address (TREE_OPERAND (t, 0));
9868
9869 if (!base)
9870 return false;
9871
9872 /* Weak declarations may link to NULL. */
9873 if (DECL_P (base))
9874 return !DECL_WEAK (base);
9875
9876 /* Constants are never weak. */
ce45a448 9877 if (CONSTANT_CLASS_P (base))
3d1c55e6 9878 return true;
9879
9880 return false;
9881 }
ad46984d 9882
9883 case COND_EXPR:
9884 return (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
9885 && tree_expr_nonzero_p (TREE_OPERAND (t, 2)));
9886
9887 case MIN_EXPR:
9888 return (tree_expr_nonzero_p (TREE_OPERAND (t, 0))
9889 && tree_expr_nonzero_p (TREE_OPERAND (t, 1)));
9890
9891 case MAX_EXPR:
9892 if (tree_expr_nonzero_p (TREE_OPERAND (t, 0)))
9893 {
9894 /* When both operands are nonzero, then MAX must be too. */
9895 if (tree_expr_nonzero_p (TREE_OPERAND (t, 1)))
9896 return true;
9897
9898 /* MAX where operand 0 is positive is positive. */
9899 return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
9900 }
9901 /* MAX where operand 1 is positive is positive. */
9902 else if (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
9903 && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)))
9904 return true;
9905 break;
9906
9907 case COMPOUND_EXPR:
9908 case MODIFY_EXPR:
9909 case BIND_EXPR:
9910 return tree_expr_nonzero_p (TREE_OPERAND (t, 1));
9911
9912 case SAVE_EXPR:
9913 case NON_LVALUE_EXPR:
9914 return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
9915
44c9fd6a 9916 case BIT_IOR_EXPR:
9917 return tree_expr_nonzero_p (TREE_OPERAND (t, 1))
9918 || tree_expr_nonzero_p (TREE_OPERAND (t, 0));
9919
ad46984d 9920 default:
9921 break;
9922 }
9923 return false;
9924}
9925
4ee9c684 9926/* See if we are applying CODE, a relational to the highest or lowest
9927 possible integer of TYPE. If so, then the result is a compile
9928 time constant. */
9929
9930static tree
9931fold_relational_hi_lo (enum tree_code *code_p, const tree type, tree *op0_p,
9932 tree *op1_p)
9933{
9934 tree op0 = *op0_p;
9935 tree op1 = *op1_p;
9936 enum tree_code code = *code_p;
9937 int width = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (op1)));
9938
9939 if (TREE_CODE (op1) == INTEGER_CST
9940 && ! TREE_CONSTANT_OVERFLOW (op1)
9941 && width <= HOST_BITS_PER_WIDE_INT
9942 && (INTEGRAL_TYPE_P (TREE_TYPE (op1))
9943 || POINTER_TYPE_P (TREE_TYPE (op1))))
9944 {
9945 unsigned HOST_WIDE_INT signed_max;
9946 unsigned HOST_WIDE_INT max, min;
9947
9948 signed_max = ((unsigned HOST_WIDE_INT) 1 << (width - 1)) - 1;
9949
9950 if (TYPE_UNSIGNED (TREE_TYPE (op1)))
9951 {
9952 max = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
9953 min = 0;
9954 }
9955 else
9956 {
9957 max = signed_max;
9958 min = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
9959 }
9960
9961 if (TREE_INT_CST_HIGH (op1) == 0
9962 && TREE_INT_CST_LOW (op1) == max)
9963 switch (code)
9964 {
9965 case GT_EXPR:
20783f07 9966 return omit_one_operand (type, integer_zero_node, op0);
9967
4ee9c684 9968 case GE_EXPR:
9969 *code_p = EQ_EXPR;
9970 break;
9971 case LE_EXPR:
20783f07 9972 return omit_one_operand (type, integer_one_node, op0);
9973
4ee9c684 9974 case LT_EXPR:
9975 *code_p = NE_EXPR;
9976 break;
9977
9978 /* The GE_EXPR and LT_EXPR cases above are not normally
9979 reached because of previous transformations. */
9980
9981 default:
9982 break;
9983 }
9984 else if (TREE_INT_CST_HIGH (op1) == 0
9985 && TREE_INT_CST_LOW (op1) == max - 1)
9986 switch (code)
9987 {
9988 case GT_EXPR:
9989 *code_p = EQ_EXPR;
9990 *op1_p = const_binop (PLUS_EXPR, op1, integer_one_node, 0);
9991 break;
9992 case LE_EXPR:
9993 *code_p = NE_EXPR;
9994 *op1_p = const_binop (PLUS_EXPR, op1, integer_one_node, 0);
9995 break;
9996 default:
9997 break;
9998 }
9999 else if (TREE_INT_CST_HIGH (op1) == (min ? -1 : 0)
10000 && TREE_INT_CST_LOW (op1) == min)
10001 switch (code)
10002 {
10003 case LT_EXPR:
20783f07 10004 return omit_one_operand (type, integer_zero_node, op0);
10005
4ee9c684 10006 case LE_EXPR:
10007 *code_p = EQ_EXPR;
10008 break;
10009
10010 case GE_EXPR:
20783f07 10011 return omit_one_operand (type, integer_one_node, op0);
10012
4ee9c684 10013 case GT_EXPR:
10014 *code_p = NE_EXPR;
10015 break;
10016
10017 default:
10018 break;
10019 }
10020 else if (TREE_INT_CST_HIGH (op1) == (min ? -1 : 0)
10021 && TREE_INT_CST_LOW (op1) == min + 1)
10022 switch (code)
10023 {
10024 case GE_EXPR:
10025 *code_p = NE_EXPR;
10026 *op1_p = const_binop (MINUS_EXPR, op1, integer_one_node, 0);
10027 break;
10028 case LT_EXPR:
10029 *code_p = EQ_EXPR;
10030 *op1_p = const_binop (MINUS_EXPR, op1, integer_one_node, 0);
10031 break;
10032 default:
10033 break;
10034 }
10035
10036 else if (TREE_INT_CST_HIGH (op1) == 0
10037 && TREE_INT_CST_LOW (op1) == signed_max
10038 && TYPE_UNSIGNED (TREE_TYPE (op1))
10039 /* signed_type does not work on pointer types. */
10040 && INTEGRAL_TYPE_P (TREE_TYPE (op1)))
10041 {
10042 /* The following case also applies to X < signed_max+1
10043 and X >= signed_max+1 because previous transformations. */
10044 if (code == LE_EXPR || code == GT_EXPR)
10045 {
10046 tree st0, st1, exp, retval;
5135beeb 10047 st0 = lang_hooks.types.signed_type (TREE_TYPE (op0));
10048 st1 = lang_hooks.types.signed_type (TREE_TYPE (op1));
4ee9c684 10049
fd96eeef 10050 exp = build2 (code == LE_EXPR ? GE_EXPR: LT_EXPR,
10051 type,
c0c67e38 10052 fold_convert (st0, op0),
10053 fold_convert (st1, integer_zero_node));
4ee9c684 10054
10055 retval
10056 = nondestructive_fold_binary_to_constant (TREE_CODE (exp),
10057 TREE_TYPE (exp),
10058 TREE_OPERAND (exp, 0),
10059 TREE_OPERAND (exp, 1));
10060
10061 /* If we are in gimple form, then returning EXP would create
10062 non-gimple expressions. Clearing it is safe and insures
10063 we do not allow a non-gimple expression to escape. */
10064 if (in_gimple_form)
10065 exp = NULL;
10066
10067 return (retval ? retval : exp);
10068 }
10069 }
10070 }
10071
10072 return NULL_TREE;
10073}
10074
10075
10076/* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
10077 attempt to fold the expression to a constant without modifying TYPE,
10078 OP0 or OP1.
10079
10080 If the expression could be simplified to a constant, then return
10081 the constant. If the expression would not be simplified to a
10082 constant, then return NULL_TREE.
10083
10084 Note this is primarily designed to be called after gimplification
10085 of the tree structures and when at least one operand is a constant.
10086 As a result of those simplifying assumptions this routine is far
10087 simpler than the generic fold routine. */
10088
10089tree
10090nondestructive_fold_binary_to_constant (enum tree_code code, tree type,
10091 tree op0, tree op1)
10092{
10093 int wins = 1;
10094 tree subop0;
10095 tree subop1;
10096 tree tem;
10097
10098 /* If this is a commutative operation, and ARG0 is a constant, move it
10099 to ARG1 to reduce the number of tests below. */
10100 if (commutative_tree_code (code)
10101 && (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST))
10102 {
10103 tem = op0;
10104 op0 = op1;
10105 op1 = tem;
10106 }
10107
10108 /* If either operand is a complex type, extract its real component. */
10109 if (TREE_CODE (op0) == COMPLEX_CST)
10110 subop0 = TREE_REALPART (op0);
10111 else
10112 subop0 = op0;
10113
10114 if (TREE_CODE (op1) == COMPLEX_CST)
10115 subop1 = TREE_REALPART (op1);
10116 else
10117 subop1 = op1;
10118
10119 /* Note if either argument is not a real or integer constant.
10120 With a few exceptions, simplification is limited to cases
10121 where both arguments are constants. */
10122 if ((TREE_CODE (subop0) != INTEGER_CST
10123 && TREE_CODE (subop0) != REAL_CST)
10124 || (TREE_CODE (subop1) != INTEGER_CST
10125 && TREE_CODE (subop1) != REAL_CST))
10126 wins = 0;
10127
10128 switch (code)
10129 {
10130 case PLUS_EXPR:
10131 /* (plus (address) (const_int)) is a constant. */
10132 if (TREE_CODE (op0) == PLUS_EXPR
10133 && TREE_CODE (op1) == INTEGER_CST
10134 && (TREE_CODE (TREE_OPERAND (op0, 0)) == ADDR_EXPR
10135 || (TREE_CODE (TREE_OPERAND (op0, 0)) == NOP_EXPR
10136 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (op0, 0), 0))
10137 == ADDR_EXPR)))
10138 && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
10139 {
fd96eeef 10140 return build2 (PLUS_EXPR, type, TREE_OPERAND (op0, 0),
10141 const_binop (PLUS_EXPR, op1,
10142 TREE_OPERAND (op0, 1), 0));
4ee9c684 10143 }
10144 case BIT_XOR_EXPR:
10145
10146 binary:
10147 if (!wins)
10148 return NULL_TREE;
10149
10150 /* Both arguments are constants. Simplify. */
10151 tem = const_binop (code, op0, op1, 0);
10152 if (tem != NULL_TREE)
10153 {
10154 /* The return value should always have the same type as
10155 the original expression. */
10156 if (TREE_TYPE (tem) != type)
c0c67e38 10157 tem = fold_convert (type, tem);
4ee9c684 10158
10159 return tem;
10160 }
10161 return NULL_TREE;
7206da1b 10162
4ee9c684 10163 case MINUS_EXPR:
10164 /* Fold &x - &x. This can happen from &x.foo - &x.
10165 This is unsafe for certain floats even in non-IEEE formats.
10166 In IEEE, it is unsafe because it does wrong for NaNs.
10167 Also note that operand_equal_p is always false if an
10168 operand is volatile. */
10169 if (! FLOAT_TYPE_P (type) && operand_equal_p (op0, op1, 0))
c0c67e38 10170 return fold_convert (type, integer_zero_node);
4ee9c684 10171
10172 goto binary;
10173
10174 case MULT_EXPR:
10175 case BIT_AND_EXPR:
10176 /* Special case multiplication or bitwise AND where one argument
10177 is zero. */
10178 if (! FLOAT_TYPE_P (type) && integer_zerop (op1))
10179 return omit_one_operand (type, op1, op0);
10180 else
10181 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (op0)))
10182 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op0)))
10183 && real_zerop (op1))
10184 return omit_one_operand (type, op1, op0);
10185
10186 goto binary;
10187
10188 case BIT_IOR_EXPR:
10189 /* Special case when we know the result will be all ones. */
10190 if (integer_all_onesp (op1))
10191 return omit_one_operand (type, op1, op0);
10192
10193 goto binary;
7206da1b 10194
4ee9c684 10195 case TRUNC_DIV_EXPR:
10196 case ROUND_DIV_EXPR:
10197 case FLOOR_DIV_EXPR:
10198 case CEIL_DIV_EXPR:
10199 case EXACT_DIV_EXPR:
10200 case TRUNC_MOD_EXPR:
10201 case ROUND_MOD_EXPR:
10202 case FLOOR_MOD_EXPR:
10203 case CEIL_MOD_EXPR:
10204 case RDIV_EXPR:
10205 /* Division by zero is undefined. */
10206 if (integer_zerop (op1))
10207 return NULL_TREE;
10208
10209 if (TREE_CODE (op1) == REAL_CST
10210 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (op1)))
10211 && real_zerop (op1))
10212 return NULL_TREE;
10213
10214 goto binary;
10215
10216 case MIN_EXPR:
10217 if (INTEGRAL_TYPE_P (type)
10218 && operand_equal_p (op1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
10219 return omit_one_operand (type, op1, op0);
10220
10221 goto binary;
10222
10223 case MAX_EXPR:
10224 if (INTEGRAL_TYPE_P (type)
10225 && TYPE_MAX_VALUE (type)
10226 && operand_equal_p (op1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
10227 return omit_one_operand (type, op1, op0);
10228
10229 goto binary;
10230
10231 case RSHIFT_EXPR:
10232 /* Optimize -1 >> x for arithmetic right shifts. */
10233 if (integer_all_onesp (op0) && ! TYPE_UNSIGNED (type))
10234 return omit_one_operand (type, op0, op1);
10235 /* ... fall through ... */
10236
10237 case LSHIFT_EXPR:
10238 if (integer_zerop (op0))
10239 return omit_one_operand (type, op0, op1);
10240
10241 /* Since negative shift count is not well-defined, don't
10242 try to compute it in the compiler. */
10243 if (TREE_CODE (op1) == INTEGER_CST && tree_int_cst_sgn (op1) < 0)
10244 return NULL_TREE;
10245
10246 goto binary;
10247
10248 case LROTATE_EXPR:
10249 case RROTATE_EXPR:
10250 /* -1 rotated either direction by any amount is still -1. */
10251 if (integer_all_onesp (op0))
10252 return omit_one_operand (type, op0, op1);
10253
10254 /* 0 rotated either direction by any amount is still zero. */
10255 if (integer_zerop (op0))
10256 return omit_one_operand (type, op0, op1);
10257
10258 goto binary;
10259
10260 case COMPLEX_EXPR:
10261 if (wins)
10262 return build_complex (type, op0, op1);
10263 return NULL_TREE;
10264
10265 case LT_EXPR:
10266 case LE_EXPR:
10267 case GT_EXPR:
10268 case GE_EXPR:
10269 case EQ_EXPR:
10270 case NE_EXPR:
10271 /* If one arg is a real or integer constant, put it last. */
10272 if ((TREE_CODE (op0) == INTEGER_CST
10273 && TREE_CODE (op1) != INTEGER_CST)
10274 || (TREE_CODE (op0) == REAL_CST
10275 && TREE_CODE (op0) != REAL_CST))
10276 {
10277 tree temp;
10278
10279 temp = op0;
10280 op0 = op1;
10281 op1 = temp;
10282 code = swap_tree_comparison (code);
10283 }
10284
10285 /* Change X >= C to X > (C - 1) and X < C to X <= (C - 1) if C > 0.
10286 This transformation affects the cases which are handled in later
10287 optimizations involving comparisons with non-negative constants. */
10288 if (TREE_CODE (op1) == INTEGER_CST
10289 && TREE_CODE (op0) != INTEGER_CST
10290 && tree_int_cst_sgn (op1) > 0)
10291 {
10292 switch (code)
10293 {
10294 case GE_EXPR:
10295 code = GT_EXPR;
10296 op1 = const_binop (MINUS_EXPR, op1, integer_one_node, 0);
10297 break;
10298
10299 case LT_EXPR:
10300 code = LE_EXPR;
10301 op1 = const_binop (MINUS_EXPR, op1, integer_one_node, 0);
10302 break;
10303
10304 default:
10305 break;
10306 }
10307 }
10308
10309 tem = fold_relational_hi_lo (&code, type, &op0, &op1);
10310 if (tem)
10311 return tem;
10312
2f64c430 10313 /* Fall through. */
10314
10315 case ORDERED_EXPR:
10316 case UNORDERED_EXPR:
10317 case UNLT_EXPR:
10318 case UNLE_EXPR:
10319 case UNGT_EXPR:
10320 case UNGE_EXPR:
10321 case UNEQ_EXPR:
10322 case LTGT_EXPR:
4ee9c684 10323 if (!wins)
10324 return NULL_TREE;
10325
10326 return fold_relational_const (code, type, op0, op1);
10327
10328 case RANGE_EXPR:
10329 /* This could probably be handled. */
10330 return NULL_TREE;
10331
10332 case TRUTH_AND_EXPR:
10333 /* If second arg is constant zero, result is zero, but first arg
10334 must be evaluated. */
10335 if (integer_zerop (op1))
10336 return omit_one_operand (type, op1, op0);
10337 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
10338 case will be handled here. */
10339 if (integer_zerop (op0))
10340 return omit_one_operand (type, op0, op1);
10341 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
20783f07 10342 return constant_boolean_node (true, type);
4ee9c684 10343 return NULL_TREE;
10344
10345 case TRUTH_OR_EXPR:
10346 /* If second arg is constant true, result is true, but we must
10347 evaluate first arg. */
10348 if (TREE_CODE (op1) == INTEGER_CST && ! integer_zerop (op1))
10349 return omit_one_operand (type, op1, op0);
10350 /* Likewise for first arg, but note this only occurs here for
10351 TRUTH_OR_EXPR. */
10352 if (TREE_CODE (op0) == INTEGER_CST && ! integer_zerop (op0))
10353 return omit_one_operand (type, op0, op1);
10354 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
20783f07 10355 return constant_boolean_node (false, type);
4ee9c684 10356 return NULL_TREE;
10357
10358 case TRUTH_XOR_EXPR:
10359 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
10360 {
20783f07 10361 int x = ! integer_zerop (op0) ^ ! integer_zerop (op1);
10362 return constant_boolean_node (x, type);
4ee9c684 10363 }
10364 return NULL_TREE;
10365
10366 default:
10367 return NULL_TREE;
10368 }
10369}
10370
10371/* Given the components of a unary expression CODE, TYPE and OP0,
10372 attempt to fold the expression to a constant without modifying
7206da1b 10373 TYPE or OP0.
4ee9c684 10374
10375 If the expression could be simplified to a constant, then return
10376 the constant. If the expression would not be simplified to a
10377 constant, then return NULL_TREE.
10378
10379 Note this is primarily designed to be called after gimplification
10380 of the tree structures and when op0 is a constant. As a result
10381 of those simplifying assumptions this routine is far simpler than
10382 the generic fold routine. */
10383
10384tree
10385nondestructive_fold_unary_to_constant (enum tree_code code, tree type,
10386 tree op0)
10387{
4ee9c684 10388 /* Make sure we have a suitable constant argument. */
10389 if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
10390 {
10391 tree subop;
10392
10393 if (TREE_CODE (op0) == COMPLEX_CST)
10394 subop = TREE_REALPART (op0);
10395 else
10396 subop = op0;
10397
10398 if (TREE_CODE (subop) != INTEGER_CST && TREE_CODE (subop) != REAL_CST)
10399 return NULL_TREE;
10400 }
10401
10402 switch (code)
10403 {
10404 case NOP_EXPR:
10405 case FLOAT_EXPR:
10406 case CONVERT_EXPR:
10407 case FIX_TRUNC_EXPR:
10408 case FIX_FLOOR_EXPR:
10409 case FIX_CEIL_EXPR:
10410 return fold_convert_const (code, type, op0);
10411
10412 case NEGATE_EXPR:
10413 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
10414 return fold_negate_const (op0, type);
10415 else
10416 return NULL_TREE;
10417
10418 case ABS_EXPR:
10419 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST)
10420 return fold_abs_const (op0, type);
10421 else
10422 return NULL_TREE;
10423
10424 case BIT_NOT_EXPR:
c183306c 10425 if (TREE_CODE (op0) == INTEGER_CST)
10426 return fold_not_const (op0, type);
4ee9c684 10427 else
10428 return NULL_TREE;
10429
10430 case REALPART_EXPR:
10431 if (TREE_CODE (op0) == COMPLEX_CST)
10432 return TREE_REALPART (op0);
10433 else
10434 return NULL_TREE;
10435
10436 case IMAGPART_EXPR:
10437 if (TREE_CODE (op0) == COMPLEX_CST)
10438 return TREE_IMAGPART (op0);
10439 else
10440 return NULL_TREE;
10441
10442 case CONJ_EXPR:
10443 if (TREE_CODE (op0) == COMPLEX_CST
10444 && TREE_CODE (TREE_TYPE (op0)) == COMPLEX_TYPE)
10445 return build_complex (type, TREE_REALPART (op0),
10446 negate_expr (TREE_IMAGPART (op0)));
10447 return NULL_TREE;
10448
10449 default:
10450 return NULL_TREE;
10451 }
10452}
10453
10454/* If EXP represents referencing an element in a constant string
10455 (either via pointer arithmetic or array indexing), return the
10456 tree representing the value accessed, otherwise return NULL. */
10457
10458tree
10459fold_read_from_constant_string (tree exp)
10460{
10461 if (TREE_CODE (exp) == INDIRECT_REF || TREE_CODE (exp) == ARRAY_REF)
10462 {
10463 tree exp1 = TREE_OPERAND (exp, 0);
10464 tree index;
10465 tree string;
10466
10467 if (TREE_CODE (exp) == INDIRECT_REF)
6374121b 10468 string = string_constant (exp1, &index);
4ee9c684 10469 else
10470 {
6374121b 10471 tree low_bound = array_ref_low_bound (exp);
c0c67e38 10472 index = fold_convert (sizetype, TREE_OPERAND (exp, 1));
7206da1b 10473
4ee9c684 10474 /* Optimize the special-case of a zero lower bound.
10475
10476 We convert the low_bound to sizetype to avoid some problems
10477 with constant folding. (E.g. suppose the lower bound is 1,
10478 and its mode is QI. Without the conversion,l (ARRAY
10479 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
10480 +INDEX), which becomes (ARRAY+255+INDEX). Opps!) */
10481 if (! integer_zerop (low_bound))
c0c67e38 10482 index = size_diffop (index, fold_convert (sizetype, low_bound));
4ee9c684 10483
10484 string = exp1;
10485 }
10486
10487 if (string
6374121b 10488 && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (string))
4ee9c684 10489 && TREE_CODE (string) == STRING_CST
10490 && TREE_CODE (index) == INTEGER_CST
10491 && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
10492 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
10493 == MODE_INT)
10494 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
9d14ee5b 10495 return fold_convert (TREE_TYPE (exp),
7c446c95 10496 build_int_cst (NULL_TREE,
10497 (TREE_STRING_POINTER (string)
7016c612 10498 [TREE_INT_CST_LOW (index)])));
4ee9c684 10499 }
10500 return NULL;
10501}
10502
9d77437d 10503/* Return the tree for neg (ARG0) when ARG0 is known to be either
10504 an integer constant or real constant.
10505
10506 TYPE is the type of the result. */
10507
10508static tree
10509fold_negate_const (tree arg0, tree type)
10510{
10511 tree t = NULL_TREE;
10512
fdada98f 10513 switch (TREE_CODE (arg0))
9d77437d 10514 {
fdada98f 10515 case INTEGER_CST:
10516 {
10517 unsigned HOST_WIDE_INT low;
10518 HOST_WIDE_INT high;
10519 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
10520 TREE_INT_CST_HIGH (arg0),
10521 &low, &high);
10522 t = build_int_cst_wide (type, low, high);
10523 t = force_fit_type (t, 1,
10524 (overflow | TREE_OVERFLOW (arg0))
10525 && !TYPE_UNSIGNED (type),
10526 TREE_CONSTANT_OVERFLOW (arg0));
10527 break;
10528 }
0c5713a2 10529
fdada98f 10530 case REAL_CST:
10531 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
10532 break;
7206da1b 10533
fdada98f 10534 default:
10535 gcc_unreachable ();
10536 }
0c5713a2 10537
9d77437d 10538 return t;
10539}
10540
5221d284 10541/* Return the tree for abs (ARG0) when ARG0 is known to be either
10542 an integer constant or real constant.
10543
10544 TYPE is the type of the result. */
10545
d1aade50 10546tree
5221d284 10547fold_abs_const (tree arg0, tree type)
10548{
10549 tree t = NULL_TREE;
10550
fdada98f 10551 switch (TREE_CODE (arg0))
5221d284 10552 {
fdada98f 10553 case INTEGER_CST:
5221d284 10554 /* If the value is unsigned, then the absolute value is
10555 the same as the ordinary value. */
78a8ed03 10556 if (TYPE_UNSIGNED (type))
fdada98f 10557 t = arg0;
5221d284 10558 /* Similarly, if the value is non-negative. */
10559 else if (INT_CST_LT (integer_minus_one_node, arg0))
fdada98f 10560 t = arg0;
5221d284 10561 /* If the value is negative, then the absolute value is
10562 its negation. */
10563 else
10564 {
10565 unsigned HOST_WIDE_INT low;
10566 HOST_WIDE_INT high;
10567 int overflow = neg_double (TREE_INT_CST_LOW (arg0),
10568 TREE_INT_CST_HIGH (arg0),
10569 &low, &high);
7016c612 10570 t = build_int_cst_wide (type, low, high);
4d28c5d1 10571 t = force_fit_type (t, -1, overflow | TREE_OVERFLOW (arg0),
10572 TREE_CONSTANT_OVERFLOW (arg0));
5221d284 10573 }
fdada98f 10574 break;
0c5713a2 10575
fdada98f 10576 case REAL_CST:
5221d284 10577 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
fdada98f 10578 t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
5221d284 10579 else
fdada98f 10580 t = arg0;
10581 break;
0c5713a2 10582
fdada98f 10583 default:
10584 gcc_unreachable ();
5221d284 10585 }
0c5713a2 10586
5221d284 10587 return t;
10588}
10589
c183306c 10590/* Return the tree for not (ARG0) when ARG0 is known to be an integer
10591 constant. TYPE is the type of the result. */
10592
10593static tree
10594fold_not_const (tree arg0, tree type)
10595{
10596 tree t = NULL_TREE;
10597
fdada98f 10598 gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
0c5713a2 10599
fdada98f 10600 t = build_int_cst_wide (type,
10601 ~ TREE_INT_CST_LOW (arg0),
10602 ~ TREE_INT_CST_HIGH (arg0));
10603 t = force_fit_type (t, 0, TREE_OVERFLOW (arg0),
10604 TREE_CONSTANT_OVERFLOW (arg0));
0c5713a2 10605
c183306c 10606 return t;
10607}
10608
ad46984d 10609/* Given CODE, a relational operator, the target type, TYPE and two
10610 constant operands OP0 and OP1, return the result of the
10611 relational operation. If the result is not a compile time
10612 constant, then return NULL_TREE. */
10613
10614static tree
10615fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
10616{
39d4c6de 10617 int result, invert;
ad46984d 10618
10619 /* From here on, the only cases we handle are when the result is
2f64c430 10620 known to be a constant. */
10621
10622 if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
10623 {
990af12c 10624 const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
10625 const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
10626
2f64c430 10627 /* Handle the cases where either operand is a NaN. */
990af12c 10628 if (real_isnan (c0) || real_isnan (c1))
2f64c430 10629 {
10630 switch (code)
10631 {
10632 case EQ_EXPR:
10633 case ORDERED_EXPR:
10634 result = 0;
10635 break;
10636
10637 case NE_EXPR:
10638 case UNORDERED_EXPR:
10639 case UNLT_EXPR:
10640 case UNLE_EXPR:
10641 case UNGT_EXPR:
10642 case UNGE_EXPR:
10643 case UNEQ_EXPR:
10644 result = 1;
10645 break;
10646
10647 case LT_EXPR:
10648 case LE_EXPR:
10649 case GT_EXPR:
10650 case GE_EXPR:
10651 case LTGT_EXPR:
10652 if (flag_trapping_math)
10653 return NULL_TREE;
10654 result = 0;
10655 break;
10656
10657 default:
fdada98f 10658 gcc_unreachable ();
2f64c430 10659 }
10660
10661 return constant_boolean_node (result, type);
10662 }
10663
990af12c 10664 return constant_boolean_node (real_compare (code, c0, c1), type);
2f64c430 10665 }
10666
10667 /* From here on we only handle LT, LE, GT, GE, EQ and NE.
ad46984d 10668
10669 To compute GT, swap the arguments and do LT.
10670 To compute GE, do LT and invert the result.
10671 To compute LE, swap the arguments, do LT and invert the result.
10672 To compute NE, do EQ and invert the result.
10673
10674 Therefore, the code below must handle only EQ and LT. */
10675
10676 if (code == LE_EXPR || code == GT_EXPR)
10677 {
39d4c6de 10678 tree tem = op0;
10679 op0 = op1;
10680 op1 = tem;
ad46984d 10681 code = swap_tree_comparison (code);
10682 }
10683
10684 /* Note that it is safe to invert for real values here because we
2f64c430 10685 have already handled the one case that it matters. */
ad46984d 10686
ad46984d 10687 invert = 0;
10688 if (code == NE_EXPR || code == GE_EXPR)
10689 {
10690 invert = 1;
318a728f 10691 code = invert_tree_comparison (code, false);
ad46984d 10692 }
10693
10694 /* Compute a result for LT or EQ if args permit;
10695 Otherwise return T. */
10696 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
10697 {
10698 if (code == EQ_EXPR)
39d4c6de 10699 result = tree_int_cst_equal (op0, op1);
10700 else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
10701 result = INT_CST_LT_UNSIGNED (op0, op1);
ad46984d 10702 else
39d4c6de 10703 result = INT_CST_LT (op0, op1);
ad46984d 10704 }
39d4c6de 10705 else
ad46984d 10706 return NULL_TREE;
10707
10708 if (invert)
39d4c6de 10709 result ^= 1;
10710 return constant_boolean_node (result, type);
ad46984d 10711}
10712
acbc760a 10713/* Build an expression for the a clean point containing EXPR with type TYPE.
10714 Don't build a cleanup point expression for EXPR which don't have side
10715 effects. */
10716
10717tree
10718fold_build_cleanup_point_expr (tree type, tree expr)
10719{
10720 /* If the expression does not have side effects then we don't have to wrap
10721 it with a cleanup point expression. */
10722 if (!TREE_SIDE_EFFECTS (expr))
10723 return expr;
10724
10725 return build1 (CLEANUP_POINT_EXPR, type, expr);
10726}
10727
fcdd3ab3 10728/* Build an expression for the address of T. Folds away INDIRECT_REF to
10729 avoid confusing the gimplify process. */
10730
10731tree
10732build_fold_addr_expr_with_type (tree t, tree ptrtype)
10733{
41dc12b4 10734 /* The size of the object is not relevant when talking about its address. */
10735 if (TREE_CODE (t) == WITH_SIZE_EXPR)
10736 t = TREE_OPERAND (t, 0);
10737
b056d812 10738 /* Note: doesn't apply to ALIGN_INDIRECT_REF */
10739 if (TREE_CODE (t) == INDIRECT_REF
10740 || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
fcdd3ab3 10741 {
10742 t = TREE_OPERAND (t, 0);
10743 if (TREE_TYPE (t) != ptrtype)
10744 t = build1 (NOP_EXPR, ptrtype, t);
10745 }
10746 else
10747 {
10748 tree base = t;
2de46a1b 10749
10750 while (handled_component_p (base)
10751 || TREE_CODE (base) == REALPART_EXPR
10752 || TREE_CODE (base) == IMAGPART_EXPR)
fcdd3ab3 10753 base = TREE_OPERAND (base, 0);
10754 if (DECL_P (base))
10755 TREE_ADDRESSABLE (base) = 1;
10756
10757 t = build1 (ADDR_EXPR, ptrtype, t);
10758 }
10759
10760 return t;
10761}
10762
10763tree
10764build_fold_addr_expr (tree t)
10765{
10766 return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
10767}
10768
10769/* Builds an expression for an indirection through T, simplifying some
10770 cases. */
10771
10772tree
10773build_fold_indirect_ref (tree t)
10774{
10775 tree type = TREE_TYPE (TREE_TYPE (t));
10776 tree sub = t;
10777 tree subtype;
10778
10779 STRIP_NOPS (sub);
10780 if (TREE_CODE (sub) == ADDR_EXPR)
10781 {
10782 tree op = TREE_OPERAND (sub, 0);
10783 tree optype = TREE_TYPE (op);
10784 /* *&p => p */
10785 if (lang_hooks.types_compatible_p (type, optype))
10786 return op;
10787 /* *(foo *)&fooarray => fooarray[0] */
10788 else if (TREE_CODE (optype) == ARRAY_TYPE
10789 && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
6374121b 10790 return build4 (ARRAY_REF, type, op, size_zero_node, NULL_TREE, NULL_TREE);
fcdd3ab3 10791 }
10792
10793 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
10794 subtype = TREE_TYPE (sub);
10795 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
10796 && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
10797 {
10798 sub = build_fold_indirect_ref (sub);
6374121b 10799 return build4 (ARRAY_REF, type, sub, size_zero_node, NULL_TREE, NULL_TREE);
fcdd3ab3 10800 }
10801
10802 return build1 (INDIRECT_REF, type, t);
10803}
10804
db97ad41 10805/* Strip non-trapping, non-side-effecting tree nodes from an expression
10806 whose result is ignored. The type of the returned tree need not be
10807 the same as the original expression. */
10808
10809tree
10810fold_ignored_result (tree t)
10811{
10812 if (!TREE_SIDE_EFFECTS (t))
10813 return integer_zero_node;
10814
10815 for (;;)
10816 switch (TREE_CODE_CLASS (TREE_CODE (t)))
10817 {
ce45a448 10818 case tcc_unary:
db97ad41 10819 t = TREE_OPERAND (t, 0);
10820 break;
10821
ce45a448 10822 case tcc_binary:
10823 case tcc_comparison:
db97ad41 10824 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
10825 t = TREE_OPERAND (t, 0);
10826 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
10827 t = TREE_OPERAND (t, 1);
10828 else
10829 return t;
10830 break;
10831
ce45a448 10832 case tcc_expression:
db97ad41 10833 switch (TREE_CODE (t))
10834 {
10835 case COMPOUND_EXPR:
10836 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
10837 return t;
10838 t = TREE_OPERAND (t, 0);
10839 break;
10840
10841 case COND_EXPR:
10842 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
10843 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
10844 return t;
10845 t = TREE_OPERAND (t, 0);
10846 break;
10847
10848 default:
10849 return t;
10850 }
10851 break;
10852
10853 default:
10854 return t;
10855 }
10856}
10857
59ff7b6e 10858/* Return the value of VALUE, rounded up to a multiple of DIVISOR.
10859 This can only be applied to objects of a sizetype. */
10860
10861tree
10862round_up (tree value, int divisor)
10863{
cda13ce3 10864 tree div = NULL_TREE;
59ff7b6e 10865
fdada98f 10866 gcc_assert (divisor > 0);
59ff7b6e 10867 if (divisor == 1)
10868 return value;
10869
59ff7b6e 10870 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
cda13ce3 10871 have to do anything. Only do this when we are not given a const,
10872 because in that case, this check is more expensive than just
fbf0afd1 10873 doing it. */
cda13ce3 10874 if (TREE_CODE (value) != INTEGER_CST)
10875 {
85390276 10876 div = build_int_cst (TREE_TYPE (value), divisor);
cda13ce3 10877
10878 if (multiple_of_p (TREE_TYPE (value), value, div))
10879 return value;
10880 }
59ff7b6e 10881
10882 /* If divisor is a power of two, simplify this to bit manipulation. */
10883 if (divisor == (divisor & -divisor))
10884 {
cda13ce3 10885 tree t;
0c5713a2 10886
7016c612 10887 t = build_int_cst (TREE_TYPE (value), divisor - 1);
59ff7b6e 10888 value = size_binop (PLUS_EXPR, value, t);
7016c612 10889 t = build_int_cst (TREE_TYPE (value), -divisor);
59ff7b6e 10890 value = size_binop (BIT_AND_EXPR, value, t);
10891 }
10892 else
10893 {
cda13ce3 10894 if (!div)
85390276 10895 div = build_int_cst (TREE_TYPE (value), divisor);
59ff7b6e 10896 value = size_binop (CEIL_DIV_EXPR, value, div);
10897 value = size_binop (MULT_EXPR, value, div);
10898 }
10899
10900 return value;
10901}
10902
10903/* Likewise, but round down. */
10904
10905tree
10906round_down (tree value, int divisor)
10907{
cda13ce3 10908 tree div = NULL_TREE;
59ff7b6e 10909
fdada98f 10910 gcc_assert (divisor > 0);
59ff7b6e 10911 if (divisor == 1)
10912 return value;
10913
59ff7b6e 10914 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
cda13ce3 10915 have to do anything. Only do this when we are not given a const,
10916 because in that case, this check is more expensive than just
fbf0afd1 10917 doing it. */
cda13ce3 10918 if (TREE_CODE (value) != INTEGER_CST)
10919 {
85390276 10920 div = build_int_cst (TREE_TYPE (value), divisor);
cda13ce3 10921
10922 if (multiple_of_p (TREE_TYPE (value), value, div))
10923 return value;
10924 }
59ff7b6e 10925
10926 /* If divisor is a power of two, simplify this to bit manipulation. */
10927 if (divisor == (divisor & -divisor))
10928 {
cda13ce3 10929 tree t;
0c5713a2 10930
7016c612 10931 t = build_int_cst (TREE_TYPE (value), -divisor);
59ff7b6e 10932 value = size_binop (BIT_AND_EXPR, value, t);
10933 }
10934 else
10935 {
cda13ce3 10936 if (!div)
85390276 10937 div = build_int_cst (TREE_TYPE (value), divisor);
59ff7b6e 10938 value = size_binop (FLOOR_DIV_EXPR, value, div);
10939 value = size_binop (MULT_EXPR, value, div);
10940 }
10941
10942 return value;
10943}
dbc64c75 10944
eb91f88e 10945/* Returns the pointer to the base of the object addressed by EXP and
10946 extracts the information about the offset of the access, storing it
10947 to PBITPOS and POFFSET. */
10948
10949static tree
10950split_address_to_core_and_offset (tree exp,
10951 HOST_WIDE_INT *pbitpos, tree *poffset)
10952{
10953 tree core;
10954 enum machine_mode mode;
10955 int unsignedp, volatilep;
10956 HOST_WIDE_INT bitsize;
10957
10958 if (TREE_CODE (exp) == ADDR_EXPR)
10959 {
10960 core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
10961 poffset, &mode, &unsignedp, &volatilep);
10962
10963 if (TREE_CODE (core) == INDIRECT_REF)
10964 core = TREE_OPERAND (core, 0);
10965 }
10966 else
10967 {
10968 core = exp;
10969 *pbitpos = 0;
10970 *poffset = NULL_TREE;
10971 }
10972
10973 return core;
10974}
10975
dbc64c75 10976/* Returns true if addresses of E1 and E2 differ by a constant, false
eb91f88e 10977 otherwise. If they do, E1 - E2 is stored in *DIFF. */
dbc64c75 10978
10979bool
10980ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
10981{
10982 tree core1, core2;
dbc64c75 10983 HOST_WIDE_INT bitpos1, bitpos2;
10984 tree toffset1, toffset2, tdiff, type;
0c5713a2 10985
eb91f88e 10986 core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
10987 core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
dbc64c75 10988
10989 if (bitpos1 % BITS_PER_UNIT != 0
10990 || bitpos2 % BITS_PER_UNIT != 0
10991 || !operand_equal_p (core1, core2, 0))
10992 return false;
10993
10994 if (toffset1 && toffset2)
10995 {
10996 type = TREE_TYPE (toffset1);
10997 if (type != TREE_TYPE (toffset2))
10998 toffset2 = fold_convert (type, toffset2);
10999
11000 tdiff = fold (build2 (MINUS_EXPR, type, toffset1, toffset2));
11001 if (!host_integerp (tdiff, 0))
11002 return false;
11003
11004 *diff = tree_low_cst (tdiff, 0);
11005 }
11006 else if (toffset1 || toffset2)
11007 {
11008 /* If only one of the offsets is non-constant, the difference cannot
11009 be a constant. */
11010 return false;
11011 }
11012 else
11013 *diff = 0;
11014
11015 *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
11016 return true;
11017}