kernel - Fix races created by a comedy of circumstansces (3)
[dragonfly.git] / contrib / gcc-4.7 / gcc / fold-const.c
blobc3c8f7e0ac30b23ed07c83160ed9e511dee0bcb8
1 /* Fold a constant sub-tree into a single node for C-compiler
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 2012 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /*@@ This file should be rewritten to use an arbitrary precision
23 @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
24 @@ Perhaps the routines could also be used for bc/dc, and made a lib.
25 @@ The routines that translate from the ap rep should
26 @@ warn if precision et. al. is lost.
27 @@ This would also make life easier when this technology is used
28 @@ for cross-compilers. */
30 /* The entry points in this file are fold, size_int_wide and size_binop.
32 fold takes a tree as argument and returns a simplified tree.
34 size_binop takes a tree code for an arithmetic operation
35 and two operands that are trees, and produces a tree for the
36 result, assuming the type comes from `sizetype'.
38 size_int takes an integer value, and creates a tree constant
39 with type from `sizetype'.
41 Note: Since the folders get called on non-gimple code as well as
42 gimple code, we need to handle GIMPLE tuples as well as their
43 corresponding tree equivalents. */
45 #include "config.h"
46 #include "system.h"
47 #include "coretypes.h"
48 #include "tm.h"
49 #include "flags.h"
50 #include "tree.h"
51 #include "realmpfr.h"
52 #include "rtl.h"
53 #include "expr.h"
54 #include "tm_p.h"
55 #include "target.h"
56 #include "diagnostic-core.h"
57 #include "intl.h"
58 #include "ggc.h"
59 #include "hashtab.h"
60 #include "langhooks.h"
61 #include "md5.h"
62 #include "gimple.h"
63 #include "tree-flow.h"
65 /* Nonzero if we are folding constants inside an initializer; zero
66 otherwise. */
67 int folding_initializer = 0;
69 /* The following constants represent a bit based encoding of GCC's
70 comparison operators. This encoding simplifies transformations
71 on relational comparison operators, such as AND and OR. */
72 enum comparison_code {
73 COMPCODE_FALSE = 0,
74 COMPCODE_LT = 1,
75 COMPCODE_EQ = 2,
76 COMPCODE_LE = 3,
77 COMPCODE_GT = 4,
78 COMPCODE_LTGT = 5,
79 COMPCODE_GE = 6,
80 COMPCODE_ORD = 7,
81 COMPCODE_UNORD = 8,
82 COMPCODE_UNLT = 9,
83 COMPCODE_UNEQ = 10,
84 COMPCODE_UNLE = 11,
85 COMPCODE_UNGT = 12,
86 COMPCODE_NE = 13,
87 COMPCODE_UNGE = 14,
88 COMPCODE_TRUE = 15
91 static bool negate_mathfn_p (enum built_in_function);
92 static bool negate_expr_p (tree);
93 static tree negate_expr (tree);
94 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
95 static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
96 static tree const_binop (enum tree_code, tree, tree);
97 static enum comparison_code comparison_to_compcode (enum tree_code);
98 static enum tree_code compcode_to_comparison (enum comparison_code);
99 static int operand_equal_for_comparison_p (tree, tree, tree);
100 static int twoval_comparison_p (tree, tree *, tree *, int *);
101 static tree eval_subst (location_t, tree, tree, tree, tree, tree);
102 static tree pedantic_omit_one_operand_loc (location_t, tree, tree, tree);
103 static tree distribute_bit_expr (location_t, enum tree_code, tree, tree, tree);
104 static tree make_bit_field_ref (location_t, tree, tree,
105 HOST_WIDE_INT, HOST_WIDE_INT, int);
106 static tree optimize_bit_field_compare (location_t, enum tree_code,
107 tree, tree, tree);
108 static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *,
109 HOST_WIDE_INT *,
110 enum machine_mode *, int *, int *,
111 tree *, tree *);
112 static int all_ones_mask_p (const_tree, int);
113 static tree sign_bit_p (tree, const_tree);
114 static int simple_operand_p (const_tree);
115 static bool simple_operand_p_2 (tree);
116 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
117 static tree range_predecessor (tree);
118 static tree range_successor (tree);
119 static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
120 static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree);
121 static tree unextend (tree, int, int, tree);
122 static tree optimize_minmax_comparison (location_t, enum tree_code,
123 tree, tree, tree);
124 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
125 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
126 static tree fold_binary_op_with_conditional_arg (location_t,
127 enum tree_code, tree,
128 tree, tree,
129 tree, tree, int);
130 static tree fold_mathfn_compare (location_t,
131 enum built_in_function, enum tree_code,
132 tree, tree, tree);
133 static tree fold_inf_compare (location_t, enum tree_code, tree, tree, tree);
134 static tree fold_div_compare (location_t, enum tree_code, tree, tree, tree);
135 static bool reorder_operands_p (const_tree, const_tree);
136 static tree fold_negate_const (tree, tree);
137 static tree fold_not_const (const_tree, tree);
138 static tree fold_relational_const (enum tree_code, tree, tree, tree);
139 static tree fold_convert_const (enum tree_code, tree, tree);
141 /* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION.
142 Otherwise, return LOC. */
144 static location_t
145 expr_location_or (tree t, location_t loc)
147 location_t tloc = EXPR_LOCATION (t);
148 return tloc != UNKNOWN_LOCATION ? tloc : loc;
151 /* Similar to protected_set_expr_location, but never modify x in place,
152 if location can and needs to be set, unshare it. */
154 static inline tree
155 protected_set_expr_location_unshare (tree x, location_t loc)
157 if (CAN_HAVE_LOCATION_P (x)
158 && EXPR_LOCATION (x) != loc
159 && !(TREE_CODE (x) == SAVE_EXPR
160 || TREE_CODE (x) == TARGET_EXPR
161 || TREE_CODE (x) == BIND_EXPR))
163 x = copy_node (x);
164 SET_EXPR_LOCATION (x, loc);
166 return x;
170 /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
171 overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
172 and SUM1. Then this yields nonzero if overflow occurred during the
173 addition.
175 Overflow occurs if A and B have the same sign, but A and SUM differ in
176 sign. Use `^' to test whether signs differ, and `< 0' to isolate the
177 sign. */
178 #define OVERFLOW_SUM_SIGN(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0)
180 /* If ARG2 divides ARG1 with zero remainder, carries out the division
181 of type CODE and returns the quotient.
182 Otherwise returns NULL_TREE. */
184 tree
185 div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2)
187 double_int quo, rem;
188 int uns;
190 /* The sign of the division is according to operand two, that
191 does the correct thing for POINTER_PLUS_EXPR where we want
192 a signed division. */
193 uns = TYPE_UNSIGNED (TREE_TYPE (arg2));
194 if (TREE_CODE (TREE_TYPE (arg2)) == INTEGER_TYPE
195 && TYPE_IS_SIZETYPE (TREE_TYPE (arg2)))
196 uns = false;
198 quo = double_int_divmod (tree_to_double_int (arg1),
199 tree_to_double_int (arg2),
200 uns, code, &rem);
202 if (double_int_zero_p (rem))
203 return build_int_cst_wide (TREE_TYPE (arg1), quo.low, quo.high);
205 return NULL_TREE;
208 /* This is nonzero if we should defer warnings about undefined
209 overflow. This facility exists because these warnings are a
210 special case. The code to estimate loop iterations does not want
211 to issue any warnings, since it works with expressions which do not
212 occur in user code. Various bits of cleanup code call fold(), but
213 only use the result if it has certain characteristics (e.g., is a
214 constant); that code only wants to issue a warning if the result is
215 used. */
217 static int fold_deferring_overflow_warnings;
219 /* If a warning about undefined overflow is deferred, this is the
220 warning. Note that this may cause us to turn two warnings into
221 one, but that is fine since it is sufficient to only give one
222 warning per expression. */
224 static const char* fold_deferred_overflow_warning;
226 /* If a warning about undefined overflow is deferred, this is the
227 level at which the warning should be emitted. */
229 static enum warn_strict_overflow_code fold_deferred_overflow_code;
231 /* Start deferring overflow warnings. We could use a stack here to
232 permit nested calls, but at present it is not necessary. */
234 void
235 fold_defer_overflow_warnings (void)
237 ++fold_deferring_overflow_warnings;
240 /* Stop deferring overflow warnings. If there is a pending warning,
241 and ISSUE is true, then issue the warning if appropriate. STMT is
242 the statement with which the warning should be associated (used for
243 location information); STMT may be NULL. CODE is the level of the
244 warning--a warn_strict_overflow_code value. This function will use
245 the smaller of CODE and the deferred code when deciding whether to
246 issue the warning. CODE may be zero to mean to always use the
247 deferred code. */
249 void
250 fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
252 const char *warnmsg;
253 location_t locus;
255 gcc_assert (fold_deferring_overflow_warnings > 0);
256 --fold_deferring_overflow_warnings;
257 if (fold_deferring_overflow_warnings > 0)
259 if (fold_deferred_overflow_warning != NULL
260 && code != 0
261 && code < (int) fold_deferred_overflow_code)
262 fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
263 return;
266 warnmsg = fold_deferred_overflow_warning;
267 fold_deferred_overflow_warning = NULL;
269 if (!issue || warnmsg == NULL)
270 return;
272 if (gimple_no_warning_p (stmt))
273 return;
275 /* Use the smallest code level when deciding to issue the
276 warning. */
277 if (code == 0 || code > (int) fold_deferred_overflow_code)
278 code = fold_deferred_overflow_code;
280 if (!issue_strict_overflow_warning (code))
281 return;
283 if (stmt == NULL)
284 locus = input_location;
285 else
286 locus = gimple_location (stmt);
287 warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
290 /* Stop deferring overflow warnings, ignoring any deferred
291 warnings. */
293 void
294 fold_undefer_and_ignore_overflow_warnings (void)
296 fold_undefer_overflow_warnings (false, NULL, 0);
299 /* Whether we are deferring overflow warnings. */
301 bool
302 fold_deferring_overflow_warnings_p (void)
304 return fold_deferring_overflow_warnings > 0;
307 /* This is called when we fold something based on the fact that signed
308 overflow is undefined. */
310 static void
311 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
313 if (fold_deferring_overflow_warnings > 0)
315 if (fold_deferred_overflow_warning == NULL
316 || wc < fold_deferred_overflow_code)
318 fold_deferred_overflow_warning = gmsgid;
319 fold_deferred_overflow_code = wc;
322 else if (issue_strict_overflow_warning (wc))
323 warning (OPT_Wstrict_overflow, gmsgid);
326 /* Return true if the built-in mathematical function specified by CODE
327 is odd, i.e. -f(x) == f(-x). */
329 static bool
330 negate_mathfn_p (enum built_in_function code)
332 switch (code)
334 CASE_FLT_FN (BUILT_IN_ASIN):
335 CASE_FLT_FN (BUILT_IN_ASINH):
336 CASE_FLT_FN (BUILT_IN_ATAN):
337 CASE_FLT_FN (BUILT_IN_ATANH):
338 CASE_FLT_FN (BUILT_IN_CASIN):
339 CASE_FLT_FN (BUILT_IN_CASINH):
340 CASE_FLT_FN (BUILT_IN_CATAN):
341 CASE_FLT_FN (BUILT_IN_CATANH):
342 CASE_FLT_FN (BUILT_IN_CBRT):
343 CASE_FLT_FN (BUILT_IN_CPROJ):
344 CASE_FLT_FN (BUILT_IN_CSIN):
345 CASE_FLT_FN (BUILT_IN_CSINH):
346 CASE_FLT_FN (BUILT_IN_CTAN):
347 CASE_FLT_FN (BUILT_IN_CTANH):
348 CASE_FLT_FN (BUILT_IN_ERF):
349 CASE_FLT_FN (BUILT_IN_LLROUND):
350 CASE_FLT_FN (BUILT_IN_LROUND):
351 CASE_FLT_FN (BUILT_IN_ROUND):
352 CASE_FLT_FN (BUILT_IN_SIN):
353 CASE_FLT_FN (BUILT_IN_SINH):
354 CASE_FLT_FN (BUILT_IN_TAN):
355 CASE_FLT_FN (BUILT_IN_TANH):
356 CASE_FLT_FN (BUILT_IN_TRUNC):
357 return true;
359 CASE_FLT_FN (BUILT_IN_LLRINT):
360 CASE_FLT_FN (BUILT_IN_LRINT):
361 CASE_FLT_FN (BUILT_IN_NEARBYINT):
362 CASE_FLT_FN (BUILT_IN_RINT):
363 return !flag_rounding_math;
365 default:
366 break;
368 return false;
371 /* Check whether we may negate an integer constant T without causing
372 overflow. */
374 bool
375 may_negate_without_overflow_p (const_tree t)
377 unsigned HOST_WIDE_INT val;
378 unsigned int prec;
379 tree type;
381 gcc_assert (TREE_CODE (t) == INTEGER_CST);
383 type = TREE_TYPE (t);
384 if (TYPE_UNSIGNED (type))
385 return false;
387 prec = TYPE_PRECISION (type);
388 if (prec > HOST_BITS_PER_WIDE_INT)
390 if (TREE_INT_CST_LOW (t) != 0)
391 return true;
392 prec -= HOST_BITS_PER_WIDE_INT;
393 val = TREE_INT_CST_HIGH (t);
395 else
396 val = TREE_INT_CST_LOW (t);
397 if (prec < HOST_BITS_PER_WIDE_INT)
398 val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
399 return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1));
402 /* Determine whether an expression T can be cheaply negated using
403 the function negate_expr without introducing undefined overflow. */
405 static bool
406 negate_expr_p (tree t)
408 tree type;
410 if (t == 0)
411 return false;
413 type = TREE_TYPE (t);
415 STRIP_SIGN_NOPS (t);
416 switch (TREE_CODE (t))
418 case INTEGER_CST:
419 if (TYPE_OVERFLOW_WRAPS (type))
420 return true;
422 /* Check that -CST will not overflow type. */
423 return may_negate_without_overflow_p (t);
424 case BIT_NOT_EXPR:
425 return (INTEGRAL_TYPE_P (type)
426 && TYPE_OVERFLOW_WRAPS (type));
428 case FIXED_CST:
429 case NEGATE_EXPR:
430 return true;
432 case REAL_CST:
433 /* We want to canonicalize to positive real constants. Pretend
434 that only negative ones can be easily negated. */
435 return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
437 case COMPLEX_CST:
438 return negate_expr_p (TREE_REALPART (t))
439 && negate_expr_p (TREE_IMAGPART (t));
441 case COMPLEX_EXPR:
442 return negate_expr_p (TREE_OPERAND (t, 0))
443 && negate_expr_p (TREE_OPERAND (t, 1));
445 case CONJ_EXPR:
446 return negate_expr_p (TREE_OPERAND (t, 0));
448 case PLUS_EXPR:
449 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
450 || HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
451 return false;
452 /* -(A + B) -> (-B) - A. */
453 if (negate_expr_p (TREE_OPERAND (t, 1))
454 && reorder_operands_p (TREE_OPERAND (t, 0),
455 TREE_OPERAND (t, 1)))
456 return true;
457 /* -(A + B) -> (-A) - B. */
458 return negate_expr_p (TREE_OPERAND (t, 0));
460 case MINUS_EXPR:
461 /* We can't turn -(A-B) into B-A when we honor signed zeros. */
462 return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
463 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
464 && reorder_operands_p (TREE_OPERAND (t, 0),
465 TREE_OPERAND (t, 1));
467 case MULT_EXPR:
468 if (TYPE_UNSIGNED (TREE_TYPE (t)))
469 break;
471 /* Fall through. */
473 case RDIV_EXPR:
474 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t))))
475 return negate_expr_p (TREE_OPERAND (t, 1))
476 || negate_expr_p (TREE_OPERAND (t, 0));
477 break;
479 case TRUNC_DIV_EXPR:
480 case ROUND_DIV_EXPR:
481 case FLOOR_DIV_EXPR:
482 case CEIL_DIV_EXPR:
483 case EXACT_DIV_EXPR:
484 /* In general we can't negate A / B, because if A is INT_MIN and
485 B is 1, we may turn this into INT_MIN / -1 which is undefined
486 and actually traps on some architectures. But if overflow is
487 undefined, we can negate, because - (INT_MIN / 1) is an
488 overflow. */
489 if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
491 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
492 break;
493 /* If overflow is undefined then we have to be careful because
494 we ask whether it's ok to associate the negate with the
495 division which is not ok for example for
496 -((a - b) / c) where (-(a - b)) / c may invoke undefined
497 overflow because of negating INT_MIN. So do not use
498 negate_expr_p here but open-code the two important cases. */
499 if (TREE_CODE (TREE_OPERAND (t, 0)) == NEGATE_EXPR
500 || (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
501 && may_negate_without_overflow_p (TREE_OPERAND (t, 0))))
502 return true;
504 else if (negate_expr_p (TREE_OPERAND (t, 0)))
505 return true;
506 return negate_expr_p (TREE_OPERAND (t, 1));
508 case NOP_EXPR:
509 /* Negate -((double)float) as (double)(-float). */
510 if (TREE_CODE (type) == REAL_TYPE)
512 tree tem = strip_float_extensions (t);
513 if (tem != t)
514 return negate_expr_p (tem);
516 break;
518 case CALL_EXPR:
519 /* Negate -f(x) as f(-x). */
520 if (negate_mathfn_p (builtin_mathfn_code (t)))
521 return negate_expr_p (CALL_EXPR_ARG (t, 0));
522 break;
524 case RSHIFT_EXPR:
525 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
526 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
528 tree op1 = TREE_OPERAND (t, 1);
529 if (TREE_INT_CST_HIGH (op1) == 0
530 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
531 == TREE_INT_CST_LOW (op1))
532 return true;
534 break;
536 default:
537 break;
539 return false;
542 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
543 simplification is possible.
544 If negate_expr_p would return true for T, NULL_TREE will never be
545 returned. */
547 static tree
548 fold_negate_expr (location_t loc, tree t)
550 tree type = TREE_TYPE (t);
551 tree tem;
553 switch (TREE_CODE (t))
555 /* Convert - (~A) to A + 1. */
556 case BIT_NOT_EXPR:
557 if (INTEGRAL_TYPE_P (type))
558 return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
559 build_int_cst (type, 1));
560 break;
562 case INTEGER_CST:
563 tem = fold_negate_const (t, type);
564 if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
565 || !TYPE_OVERFLOW_TRAPS (type))
566 return tem;
567 break;
569 case REAL_CST:
570 tem = fold_negate_const (t, type);
571 /* Two's complement FP formats, such as c4x, may overflow. */
572 if (!TREE_OVERFLOW (tem) || !flag_trapping_math)
573 return tem;
574 break;
576 case FIXED_CST:
577 tem = fold_negate_const (t, type);
578 return tem;
580 case COMPLEX_CST:
582 tree rpart = negate_expr (TREE_REALPART (t));
583 tree ipart = negate_expr (TREE_IMAGPART (t));
585 if ((TREE_CODE (rpart) == REAL_CST
586 && TREE_CODE (ipart) == REAL_CST)
587 || (TREE_CODE (rpart) == INTEGER_CST
588 && TREE_CODE (ipart) == INTEGER_CST))
589 return build_complex (type, rpart, ipart);
591 break;
593 case COMPLEX_EXPR:
594 if (negate_expr_p (t))
595 return fold_build2_loc (loc, COMPLEX_EXPR, type,
596 fold_negate_expr (loc, TREE_OPERAND (t, 0)),
597 fold_negate_expr (loc, TREE_OPERAND (t, 1)));
598 break;
600 case CONJ_EXPR:
601 if (negate_expr_p (t))
602 return fold_build1_loc (loc, CONJ_EXPR, type,
603 fold_negate_expr (loc, TREE_OPERAND (t, 0)));
604 break;
606 case NEGATE_EXPR:
607 return TREE_OPERAND (t, 0);
609 case PLUS_EXPR:
610 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
611 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
613 /* -(A + B) -> (-B) - A. */
614 if (negate_expr_p (TREE_OPERAND (t, 1))
615 && reorder_operands_p (TREE_OPERAND (t, 0),
616 TREE_OPERAND (t, 1)))
618 tem = negate_expr (TREE_OPERAND (t, 1));
619 return fold_build2_loc (loc, MINUS_EXPR, type,
620 tem, TREE_OPERAND (t, 0));
623 /* -(A + B) -> (-A) - B. */
624 if (negate_expr_p (TREE_OPERAND (t, 0)))
626 tem = negate_expr (TREE_OPERAND (t, 0));
627 return fold_build2_loc (loc, MINUS_EXPR, type,
628 tem, TREE_OPERAND (t, 1));
631 break;
633 case MINUS_EXPR:
634 /* - (A - B) -> B - A */
635 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
636 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
637 && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
638 return fold_build2_loc (loc, MINUS_EXPR, type,
639 TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
640 break;
642 case MULT_EXPR:
643 if (TYPE_UNSIGNED (type))
644 break;
646 /* Fall through. */
648 case RDIV_EXPR:
649 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)))
651 tem = TREE_OPERAND (t, 1);
652 if (negate_expr_p (tem))
653 return fold_build2_loc (loc, TREE_CODE (t), type,
654 TREE_OPERAND (t, 0), negate_expr (tem));
655 tem = TREE_OPERAND (t, 0);
656 if (negate_expr_p (tem))
657 return fold_build2_loc (loc, TREE_CODE (t), type,
658 negate_expr (tem), TREE_OPERAND (t, 1));
660 break;
662 case TRUNC_DIV_EXPR:
663 case ROUND_DIV_EXPR:
664 case FLOOR_DIV_EXPR:
665 case CEIL_DIV_EXPR:
666 case EXACT_DIV_EXPR:
667 /* In general we can't negate A / B, because if A is INT_MIN and
668 B is 1, we may turn this into INT_MIN / -1 which is undefined
669 and actually traps on some architectures. But if overflow is
670 undefined, we can negate, because - (INT_MIN / 1) is an
671 overflow. */
672 if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
674 const char * const warnmsg = G_("assuming signed overflow does not "
675 "occur when negating a division");
676 tem = TREE_OPERAND (t, 1);
677 if (negate_expr_p (tem))
679 if (INTEGRAL_TYPE_P (type)
680 && (TREE_CODE (tem) != INTEGER_CST
681 || integer_onep (tem)))
682 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
683 return fold_build2_loc (loc, TREE_CODE (t), type,
684 TREE_OPERAND (t, 0), negate_expr (tem));
686 /* If overflow is undefined then we have to be careful because
687 we ask whether it's ok to associate the negate with the
688 division which is not ok for example for
689 -((a - b) / c) where (-(a - b)) / c may invoke undefined
690 overflow because of negating INT_MIN. So do not use
691 negate_expr_p here but open-code the two important cases. */
692 tem = TREE_OPERAND (t, 0);
693 if ((INTEGRAL_TYPE_P (type)
694 && (TREE_CODE (tem) == NEGATE_EXPR
695 || (TREE_CODE (tem) == INTEGER_CST
696 && may_negate_without_overflow_p (tem))))
697 || !INTEGRAL_TYPE_P (type))
698 return fold_build2_loc (loc, TREE_CODE (t), type,
699 negate_expr (tem), TREE_OPERAND (t, 1));
701 break;
703 case NOP_EXPR:
704 /* Convert -((double)float) into (double)(-float). */
705 if (TREE_CODE (type) == REAL_TYPE)
707 tem = strip_float_extensions (t);
708 if (tem != t && negate_expr_p (tem))
709 return fold_convert_loc (loc, type, negate_expr (tem));
711 break;
713 case CALL_EXPR:
714 /* Negate -f(x) as f(-x). */
715 if (negate_mathfn_p (builtin_mathfn_code (t))
716 && negate_expr_p (CALL_EXPR_ARG (t, 0)))
718 tree fndecl, arg;
720 fndecl = get_callee_fndecl (t);
721 arg = negate_expr (CALL_EXPR_ARG (t, 0));
722 return build_call_expr_loc (loc, fndecl, 1, arg);
724 break;
726 case RSHIFT_EXPR:
727 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */
728 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
730 tree op1 = TREE_OPERAND (t, 1);
731 if (TREE_INT_CST_HIGH (op1) == 0
732 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1)
733 == TREE_INT_CST_LOW (op1))
735 tree ntype = TYPE_UNSIGNED (type)
736 ? signed_type_for (type)
737 : unsigned_type_for (type);
738 tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0));
739 temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1);
740 return fold_convert_loc (loc, type, temp);
743 break;
745 default:
746 break;
749 return NULL_TREE;
752 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
753 negated in a simpler way. Also allow for T to be NULL_TREE, in which case
754 return NULL_TREE. */
756 static tree
757 negate_expr (tree t)
759 tree type, tem;
760 location_t loc;
762 if (t == NULL_TREE)
763 return NULL_TREE;
765 loc = EXPR_LOCATION (t);
766 type = TREE_TYPE (t);
767 STRIP_SIGN_NOPS (t);
769 tem = fold_negate_expr (loc, t);
770 if (!tem)
771 tem = build1_loc (loc, NEGATE_EXPR, TREE_TYPE (t), t);
772 return fold_convert_loc (loc, type, tem);
775 /* Split a tree IN into a constant, literal and variable parts that could be
776 combined with CODE to make IN. "constant" means an expression with
777 TREE_CONSTANT but that isn't an actual constant. CODE must be a
778 commutative arithmetic operation. Store the constant part into *CONP,
779 the literal in *LITP and return the variable part. If a part isn't
780 present, set it to null. If the tree does not decompose in this way,
781 return the entire tree as the variable part and the other parts as null.
783 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that
784 case, we negate an operand that was subtracted. Except if it is a
785 literal for which we use *MINUS_LITP instead.
787 If NEGATE_P is true, we are negating all of IN, again except a literal
788 for which we use *MINUS_LITP instead.
790 If IN is itself a literal or constant, return it as appropriate.
792 Note that we do not guarantee that any of the three values will be the
793 same type as IN, but they will have the same signedness and mode. */
795 static tree
796 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
797 tree *minus_litp, int negate_p)
799 tree var = 0;
801 *conp = 0;
802 *litp = 0;
803 *minus_litp = 0;
805 /* Strip any conversions that don't change the machine mode or signedness. */
806 STRIP_SIGN_NOPS (in);
808 if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
809 || TREE_CODE (in) == FIXED_CST)
810 *litp = in;
811 else if (TREE_CODE (in) == code
812 || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
813 && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
814 /* We can associate addition and subtraction together (even
815 though the C standard doesn't say so) for integers because
816 the value is not affected. For reals, the value might be
817 affected, so we can't. */
818 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
819 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
821 tree op0 = TREE_OPERAND (in, 0);
822 tree op1 = TREE_OPERAND (in, 1);
823 int neg1_p = TREE_CODE (in) == MINUS_EXPR;
824 int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
826 /* First see if either of the operands is a literal, then a constant. */
827 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
828 || TREE_CODE (op0) == FIXED_CST)
829 *litp = op0, op0 = 0;
830 else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
831 || TREE_CODE (op1) == FIXED_CST)
832 *litp = op1, neg_litp_p = neg1_p, op1 = 0;
834 if (op0 != 0 && TREE_CONSTANT (op0))
835 *conp = op0, op0 = 0;
836 else if (op1 != 0 && TREE_CONSTANT (op1))
837 *conp = op1, neg_conp_p = neg1_p, op1 = 0;
839 /* If we haven't dealt with either operand, this is not a case we can
840 decompose. Otherwise, VAR is either of the ones remaining, if any. */
841 if (op0 != 0 && op1 != 0)
842 var = in;
843 else if (op0 != 0)
844 var = op0;
845 else
846 var = op1, neg_var_p = neg1_p;
848 /* Now do any needed negations. */
849 if (neg_litp_p)
850 *minus_litp = *litp, *litp = 0;
851 if (neg_conp_p)
852 *conp = negate_expr (*conp);
853 if (neg_var_p)
854 var = negate_expr (var);
856 else if (TREE_CONSTANT (in))
857 *conp = in;
858 else
859 var = in;
861 if (negate_p)
863 if (*litp)
864 *minus_litp = *litp, *litp = 0;
865 else if (*minus_litp)
866 *litp = *minus_litp, *minus_litp = 0;
867 *conp = negate_expr (*conp);
868 var = negate_expr (var);
871 return var;
874 /* Re-associate trees split by the above function. T1 and T2 are
875 either expressions to associate or null. Return the new
876 expression, if any. LOC is the location of the new expression. If
877 we build an operation, do it in TYPE and with CODE. */
879 static tree
880 associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type)
882 if (t1 == 0)
883 return t2;
884 else if (t2 == 0)
885 return t1;
887 /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
888 try to fold this since we will have infinite recursion. But do
889 deal with any NEGATE_EXPRs. */
890 if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
891 || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
893 if (code == PLUS_EXPR)
895 if (TREE_CODE (t1) == NEGATE_EXPR)
896 return build2_loc (loc, MINUS_EXPR, type,
897 fold_convert_loc (loc, type, t2),
898 fold_convert_loc (loc, type,
899 TREE_OPERAND (t1, 0)));
900 else if (TREE_CODE (t2) == NEGATE_EXPR)
901 return build2_loc (loc, MINUS_EXPR, type,
902 fold_convert_loc (loc, type, t1),
903 fold_convert_loc (loc, type,
904 TREE_OPERAND (t2, 0)));
905 else if (integer_zerop (t2))
906 return fold_convert_loc (loc, type, t1);
908 else if (code == MINUS_EXPR)
910 if (integer_zerop (t2))
911 return fold_convert_loc (loc, type, t1);
914 return build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
915 fold_convert_loc (loc, type, t2));
918 return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
919 fold_convert_loc (loc, type, t2));
922 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
923 for use in int_const_binop, size_binop and size_diffop. */
925 static bool
926 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
928 if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
929 return false;
930 if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
931 return false;
933 switch (code)
935 case LSHIFT_EXPR:
936 case RSHIFT_EXPR:
937 case LROTATE_EXPR:
938 case RROTATE_EXPR:
939 return true;
941 default:
942 break;
945 return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
946 && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
947 && TYPE_MODE (type1) == TYPE_MODE (type2);
951 /* Combine two integer constants ARG1 and ARG2 under operation CODE
952 to produce a new constant. Return NULL_TREE if we don't know how
953 to evaluate CODE at compile-time. */
955 tree
956 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2)
958 double_int op1, op2, res, tmp;
959 tree t;
960 tree type = TREE_TYPE (arg1);
961 bool uns = TYPE_UNSIGNED (type);
962 bool is_sizetype
963 = (TREE_CODE (type) == INTEGER_TYPE && TYPE_IS_SIZETYPE (type));
964 bool overflow = false;
966 op1 = tree_to_double_int (arg1);
967 op2 = tree_to_double_int (arg2);
969 switch (code)
971 case BIT_IOR_EXPR:
972 res = double_int_ior (op1, op2);
973 break;
975 case BIT_XOR_EXPR:
976 res = double_int_xor (op1, op2);
977 break;
979 case BIT_AND_EXPR:
980 res = double_int_and (op1, op2);
981 break;
983 case RSHIFT_EXPR:
984 res = double_int_rshift (op1, double_int_to_shwi (op2),
985 TYPE_PRECISION (type), !uns);
986 break;
988 case LSHIFT_EXPR:
989 /* It's unclear from the C standard whether shifts can overflow.
990 The following code ignores overflow; perhaps a C standard
991 interpretation ruling is needed. */
992 res = double_int_lshift (op1, double_int_to_shwi (op2),
993 TYPE_PRECISION (type), !uns);
994 break;
996 case RROTATE_EXPR:
997 res = double_int_rrotate (op1, double_int_to_shwi (op2),
998 TYPE_PRECISION (type));
999 break;
1001 case LROTATE_EXPR:
1002 res = double_int_lrotate (op1, double_int_to_shwi (op2),
1003 TYPE_PRECISION (type));
1004 break;
1006 case PLUS_EXPR:
1007 overflow = add_double (op1.low, op1.high, op2.low, op2.high,
1008 &res.low, &res.high);
1009 break;
1011 case MINUS_EXPR:
1012 neg_double (op2.low, op2.high, &res.low, &res.high);
1013 add_double (op1.low, op1.high, res.low, res.high,
1014 &res.low, &res.high);
1015 overflow = OVERFLOW_SUM_SIGN (res.high, op2.high, op1.high);
1016 break;
1018 case MULT_EXPR:
1019 overflow = mul_double (op1.low, op1.high, op2.low, op2.high,
1020 &res.low, &res.high);
1021 break;
1023 case TRUNC_DIV_EXPR:
1024 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR:
1025 case EXACT_DIV_EXPR:
1026 /* This is a shortcut for a common special case. */
1027 if (op2.high == 0 && (HOST_WIDE_INT) op2.low > 0
1028 && !TREE_OVERFLOW (arg1)
1029 && !TREE_OVERFLOW (arg2)
1030 && op1.high == 0 && (HOST_WIDE_INT) op1.low >= 0)
1032 if (code == CEIL_DIV_EXPR)
1033 op1.low += op2.low - 1;
1035 res.low = op1.low / op2.low, res.high = 0;
1036 break;
1039 /* ... fall through ... */
1041 case ROUND_DIV_EXPR:
1042 if (double_int_zero_p (op2))
1043 return NULL_TREE;
1044 if (double_int_one_p (op2))
1046 res = op1;
1047 break;
1049 if (double_int_equal_p (op1, op2)
1050 && ! double_int_zero_p (op1))
1052 res = double_int_one;
1053 break;
1055 overflow = div_and_round_double (code, uns,
1056 op1.low, op1.high, op2.low, op2.high,
1057 &res.low, &res.high,
1058 &tmp.low, &tmp.high);
1059 break;
1061 case TRUNC_MOD_EXPR:
1062 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR:
1063 /* This is a shortcut for a common special case. */
1064 if (op2.high == 0 && (HOST_WIDE_INT) op2.low > 0
1065 && !TREE_OVERFLOW (arg1)
1066 && !TREE_OVERFLOW (arg2)
1067 && op1.high == 0 && (HOST_WIDE_INT) op1.low >= 0)
1069 if (code == CEIL_MOD_EXPR)
1070 op1.low += op2.low - 1;
1071 res.low = op1.low % op2.low, res.high = 0;
1072 break;
1075 /* ... fall through ... */
1077 case ROUND_MOD_EXPR:
1078 if (double_int_zero_p (op2))
1079 return NULL_TREE;
1080 overflow = div_and_round_double (code, uns,
1081 op1.low, op1.high, op2.low, op2.high,
1082 &tmp.low, &tmp.high,
1083 &res.low, &res.high);
1084 break;
1086 case MIN_EXPR:
1087 res = double_int_min (op1, op2, uns);
1088 break;
1090 case MAX_EXPR:
1091 res = double_int_max (op1, op2, uns);
1092 break;
1094 default:
1095 return NULL_TREE;
1098 t = force_fit_type_double (TREE_TYPE (arg1), res, 1,
1099 ((!uns || is_sizetype) && overflow)
1100 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2));
1102 return t;
1105 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1106 constant. We assume ARG1 and ARG2 have the same data type, or at least
1107 are the same kind of constant and the same machine mode. Return zero if
1108 combining the constants is not allowed in the current operating mode. */
1110 static tree
1111 const_binop (enum tree_code code, tree arg1, tree arg2)
1113 /* Sanity check for the recursive cases. */
1114 if (!arg1 || !arg2)
1115 return NULL_TREE;
1117 STRIP_NOPS (arg1);
1118 STRIP_NOPS (arg2);
1120 if (TREE_CODE (arg1) == INTEGER_CST)
1121 return int_const_binop (code, arg1, arg2);
1123 if (TREE_CODE (arg1) == REAL_CST)
1125 enum machine_mode mode;
1126 REAL_VALUE_TYPE d1;
1127 REAL_VALUE_TYPE d2;
1128 REAL_VALUE_TYPE value;
1129 REAL_VALUE_TYPE result;
1130 bool inexact;
1131 tree t, type;
1133 /* The following codes are handled by real_arithmetic. */
1134 switch (code)
1136 case PLUS_EXPR:
1137 case MINUS_EXPR:
1138 case MULT_EXPR:
1139 case RDIV_EXPR:
1140 case MIN_EXPR:
1141 case MAX_EXPR:
1142 break;
1144 default:
1145 return NULL_TREE;
1148 d1 = TREE_REAL_CST (arg1);
1149 d2 = TREE_REAL_CST (arg2);
1151 type = TREE_TYPE (arg1);
1152 mode = TYPE_MODE (type);
1154 /* Don't perform operation if we honor signaling NaNs and
1155 either operand is a NaN. */
1156 if (HONOR_SNANS (mode)
1157 && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1158 return NULL_TREE;
1160 /* Don't perform operation if it would raise a division
1161 by zero exception. */
1162 if (code == RDIV_EXPR
1163 && REAL_VALUES_EQUAL (d2, dconst0)
1164 && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1165 return NULL_TREE;
1167 /* If either operand is a NaN, just return it. Otherwise, set up
1168 for floating-point trap; we return an overflow. */
1169 if (REAL_VALUE_ISNAN (d1))
1170 return arg1;
1171 else if (REAL_VALUE_ISNAN (d2))
1172 return arg2;
1174 inexact = real_arithmetic (&value, code, &d1, &d2);
1175 real_convert (&result, mode, &value);
1177 /* Don't constant fold this floating point operation if
1178 the result has overflowed and flag_trapping_math. */
1179 if (flag_trapping_math
1180 && MODE_HAS_INFINITIES (mode)
1181 && REAL_VALUE_ISINF (result)
1182 && !REAL_VALUE_ISINF (d1)
1183 && !REAL_VALUE_ISINF (d2))
1184 return NULL_TREE;
1186 /* Don't constant fold this floating point operation if the
1187 result may dependent upon the run-time rounding mode and
1188 flag_rounding_math is set, or if GCC's software emulation
1189 is unable to accurately represent the result. */
1190 if ((flag_rounding_math
1191 || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1192 && (inexact || !real_identical (&result, &value)))
1193 return NULL_TREE;
1195 t = build_real (type, result);
1197 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1198 return t;
1201 if (TREE_CODE (arg1) == FIXED_CST)
1203 FIXED_VALUE_TYPE f1;
1204 FIXED_VALUE_TYPE f2;
1205 FIXED_VALUE_TYPE result;
1206 tree t, type;
1207 int sat_p;
1208 bool overflow_p;
1210 /* The following codes are handled by fixed_arithmetic. */
1211 switch (code)
1213 case PLUS_EXPR:
1214 case MINUS_EXPR:
1215 case MULT_EXPR:
1216 case TRUNC_DIV_EXPR:
1217 f2 = TREE_FIXED_CST (arg2);
1218 break;
1220 case LSHIFT_EXPR:
1221 case RSHIFT_EXPR:
1222 f2.data.high = TREE_INT_CST_HIGH (arg2);
1223 f2.data.low = TREE_INT_CST_LOW (arg2);
1224 f2.mode = SImode;
1225 break;
1227 default:
1228 return NULL_TREE;
1231 f1 = TREE_FIXED_CST (arg1);
1232 type = TREE_TYPE (arg1);
1233 sat_p = TYPE_SATURATING (type);
1234 overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1235 t = build_fixed (type, result);
1236 /* Propagate overflow flags. */
1237 if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1238 TREE_OVERFLOW (t) = 1;
1239 return t;
1242 if (TREE_CODE (arg1) == COMPLEX_CST)
1244 tree type = TREE_TYPE (arg1);
1245 tree r1 = TREE_REALPART (arg1);
1246 tree i1 = TREE_IMAGPART (arg1);
1247 tree r2 = TREE_REALPART (arg2);
1248 tree i2 = TREE_IMAGPART (arg2);
1249 tree real, imag;
1251 switch (code)
1253 case PLUS_EXPR:
1254 case MINUS_EXPR:
1255 real = const_binop (code, r1, r2);
1256 imag = const_binop (code, i1, i2);
1257 break;
1259 case MULT_EXPR:
1260 if (COMPLEX_FLOAT_TYPE_P (type))
1261 return do_mpc_arg2 (arg1, arg2, type,
1262 /* do_nonfinite= */ folding_initializer,
1263 mpc_mul);
1265 real = const_binop (MINUS_EXPR,
1266 const_binop (MULT_EXPR, r1, r2),
1267 const_binop (MULT_EXPR, i1, i2));
1268 imag = const_binop (PLUS_EXPR,
1269 const_binop (MULT_EXPR, r1, i2),
1270 const_binop (MULT_EXPR, i1, r2));
1271 break;
1273 case RDIV_EXPR:
1274 if (COMPLEX_FLOAT_TYPE_P (type))
1275 return do_mpc_arg2 (arg1, arg2, type,
1276 /* do_nonfinite= */ folding_initializer,
1277 mpc_div);
1278 /* Fallthru ... */
1279 case TRUNC_DIV_EXPR:
1280 case CEIL_DIV_EXPR:
1281 case FLOOR_DIV_EXPR:
1282 case ROUND_DIV_EXPR:
1283 if (flag_complex_method == 0)
1285 /* Keep this algorithm in sync with
1286 tree-complex.c:expand_complex_div_straight().
1288 Expand complex division to scalars, straightforward algorithm.
1289 a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
1290 t = br*br + bi*bi
1292 tree magsquared
1293 = const_binop (PLUS_EXPR,
1294 const_binop (MULT_EXPR, r2, r2),
1295 const_binop (MULT_EXPR, i2, i2));
1296 tree t1
1297 = const_binop (PLUS_EXPR,
1298 const_binop (MULT_EXPR, r1, r2),
1299 const_binop (MULT_EXPR, i1, i2));
1300 tree t2
1301 = const_binop (MINUS_EXPR,
1302 const_binop (MULT_EXPR, i1, r2),
1303 const_binop (MULT_EXPR, r1, i2));
1305 real = const_binop (code, t1, magsquared);
1306 imag = const_binop (code, t2, magsquared);
1308 else
1310 /* Keep this algorithm in sync with
1311 tree-complex.c:expand_complex_div_wide().
1313 Expand complex division to scalars, modified algorithm to minimize
1314 overflow with wide input ranges. */
1315 tree compare = fold_build2 (LT_EXPR, boolean_type_node,
1316 fold_abs_const (r2, TREE_TYPE (type)),
1317 fold_abs_const (i2, TREE_TYPE (type)));
1319 if (integer_nonzerop (compare))
1321 /* In the TRUE branch, we compute
1322 ratio = br/bi;
1323 div = (br * ratio) + bi;
1324 tr = (ar * ratio) + ai;
1325 ti = (ai * ratio) - ar;
1326 tr = tr / div;
1327 ti = ti / div; */
1328 tree ratio = const_binop (code, r2, i2);
1329 tree div = const_binop (PLUS_EXPR, i2,
1330 const_binop (MULT_EXPR, r2, ratio));
1331 real = const_binop (MULT_EXPR, r1, ratio);
1332 real = const_binop (PLUS_EXPR, real, i1);
1333 real = const_binop (code, real, div);
1335 imag = const_binop (MULT_EXPR, i1, ratio);
1336 imag = const_binop (MINUS_EXPR, imag, r1);
1337 imag = const_binop (code, imag, div);
1339 else
1341 /* In the FALSE branch, we compute
1342 ratio = d/c;
1343 divisor = (d * ratio) + c;
1344 tr = (b * ratio) + a;
1345 ti = b - (a * ratio);
1346 tr = tr / div;
1347 ti = ti / div; */
1348 tree ratio = const_binop (code, i2, r2);
1349 tree div = const_binop (PLUS_EXPR, r2,
1350 const_binop (MULT_EXPR, i2, ratio));
1352 real = const_binop (MULT_EXPR, i1, ratio);
1353 real = const_binop (PLUS_EXPR, real, r1);
1354 real = const_binop (code, real, div);
1356 imag = const_binop (MULT_EXPR, r1, ratio);
1357 imag = const_binop (MINUS_EXPR, i1, imag);
1358 imag = const_binop (code, imag, div);
1361 break;
1363 default:
1364 return NULL_TREE;
1367 if (real && imag)
1368 return build_complex (type, real, imag);
1371 if (TREE_CODE (arg1) == VECTOR_CST)
1373 tree type = TREE_TYPE(arg1);
1374 int count = TYPE_VECTOR_SUBPARTS (type), i;
1375 tree elements1, elements2, list = NULL_TREE;
1377 if(TREE_CODE(arg2) != VECTOR_CST)
1378 return NULL_TREE;
1380 elements1 = TREE_VECTOR_CST_ELTS (arg1);
1381 elements2 = TREE_VECTOR_CST_ELTS (arg2);
1383 for (i = 0; i < count; i++)
1385 tree elem1, elem2, elem;
1387 /* The trailing elements can be empty and should be treated as 0 */
1388 if(!elements1)
1389 elem1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
1390 else
1392 elem1 = TREE_VALUE(elements1);
1393 elements1 = TREE_CHAIN (elements1);
1396 if(!elements2)
1397 elem2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
1398 else
1400 elem2 = TREE_VALUE(elements2);
1401 elements2 = TREE_CHAIN (elements2);
1404 elem = const_binop (code, elem1, elem2);
1406 /* It is possible that const_binop cannot handle the given
1407 code and return NULL_TREE */
1408 if(elem == NULL_TREE)
1409 return NULL_TREE;
1411 list = tree_cons (NULL_TREE, elem, list);
1413 return build_vector(type, nreverse(list));
1415 return NULL_TREE;
1418 /* Create a size type INT_CST node with NUMBER sign extended. KIND
1419 indicates which particular sizetype to create. */
1421 tree
1422 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1424 return build_int_cst (sizetype_tab[(int) kind], number);
1427 /* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE
1428 is a tree code. The type of the result is taken from the operands.
1429 Both must be equivalent integer types, ala int_binop_types_match_p.
1430 If the operands are constant, so is the result. */
1432 tree
1433 size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1)
1435 tree type = TREE_TYPE (arg0);
1437 if (arg0 == error_mark_node || arg1 == error_mark_node)
1438 return error_mark_node;
1440 gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
1441 TREE_TYPE (arg1)));
1443 /* Handle the special case of two integer constants faster. */
1444 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1446 /* And some specific cases even faster than that. */
1447 if (code == PLUS_EXPR)
1449 if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
1450 return arg1;
1451 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1452 return arg0;
1454 else if (code == MINUS_EXPR)
1456 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1457 return arg0;
1459 else if (code == MULT_EXPR)
1461 if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
1462 return arg1;
1465 /* Handle general case of two integer constants. */
1466 return int_const_binop (code, arg0, arg1);
1469 return fold_build2_loc (loc, code, type, arg0, arg1);
1472 /* Given two values, either both of sizetype or both of bitsizetype,
1473 compute the difference between the two values. Return the value
1474 in signed type corresponding to the type of the operands. */
1476 tree
1477 size_diffop_loc (location_t loc, tree arg0, tree arg1)
1479 tree type = TREE_TYPE (arg0);
1480 tree ctype;
1482 gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
1483 TREE_TYPE (arg1)));
1485 /* If the type is already signed, just do the simple thing. */
1486 if (!TYPE_UNSIGNED (type))
1487 return size_binop_loc (loc, MINUS_EXPR, arg0, arg1);
1489 if (type == sizetype)
1490 ctype = ssizetype;
1491 else if (type == bitsizetype)
1492 ctype = sbitsizetype;
1493 else
1494 ctype = signed_type_for (type);
1496 /* If either operand is not a constant, do the conversions to the signed
1497 type and subtract. The hardware will do the right thing with any
1498 overflow in the subtraction. */
1499 if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1500 return size_binop_loc (loc, MINUS_EXPR,
1501 fold_convert_loc (loc, ctype, arg0),
1502 fold_convert_loc (loc, ctype, arg1));
1504 /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1505 Otherwise, subtract the other way, convert to CTYPE (we know that can't
1506 overflow) and negate (which can't either). Special-case a result
1507 of zero while we're here. */
1508 if (tree_int_cst_equal (arg0, arg1))
1509 return build_int_cst (ctype, 0);
1510 else if (tree_int_cst_lt (arg1, arg0))
1511 return fold_convert_loc (loc, ctype,
1512 size_binop_loc (loc, MINUS_EXPR, arg0, arg1));
1513 else
1514 return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0),
1515 fold_convert_loc (loc, ctype,
1516 size_binop_loc (loc,
1517 MINUS_EXPR,
1518 arg1, arg0)));
1521 /* A subroutine of fold_convert_const handling conversions of an
1522 INTEGER_CST to another integer type. */
1524 static tree
1525 fold_convert_const_int_from_int (tree type, const_tree arg1)
1527 tree t;
1529 /* Given an integer constant, make new constant with new type,
1530 appropriately sign-extended or truncated. */
1531 t = force_fit_type_double (type, tree_to_double_int (arg1),
1532 !POINTER_TYPE_P (TREE_TYPE (arg1)),
1533 (TREE_INT_CST_HIGH (arg1) < 0
1534 && (TYPE_UNSIGNED (type)
1535 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1536 | TREE_OVERFLOW (arg1));
1538 return t;
1541 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1542 to an integer type. */
1544 static tree
1545 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
1547 int overflow = 0;
1548 tree t;
1550 /* The following code implements the floating point to integer
1551 conversion rules required by the Java Language Specification,
1552 that IEEE NaNs are mapped to zero and values that overflow
1553 the target precision saturate, i.e. values greater than
1554 INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1555 are mapped to INT_MIN. These semantics are allowed by the
1556 C and C++ standards that simply state that the behavior of
1557 FP-to-integer conversion is unspecified upon overflow. */
1559 double_int val;
1560 REAL_VALUE_TYPE r;
1561 REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
1563 switch (code)
1565 case FIX_TRUNC_EXPR:
1566 real_trunc (&r, VOIDmode, &x);
1567 break;
1569 default:
1570 gcc_unreachable ();
1573 /* If R is NaN, return zero and show we have an overflow. */
1574 if (REAL_VALUE_ISNAN (r))
1576 overflow = 1;
1577 val = double_int_zero;
1580 /* See if R is less than the lower bound or greater than the
1581 upper bound. */
1583 if (! overflow)
1585 tree lt = TYPE_MIN_VALUE (type);
1586 REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
1587 if (REAL_VALUES_LESS (r, l))
1589 overflow = 1;
1590 val = tree_to_double_int (lt);
1594 if (! overflow)
1596 tree ut = TYPE_MAX_VALUE (type);
1597 if (ut)
1599 REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
1600 if (REAL_VALUES_LESS (u, r))
1602 overflow = 1;
1603 val = tree_to_double_int (ut);
1608 if (! overflow)
1609 real_to_integer2 ((HOST_WIDE_INT *) &val.low, &val.high, &r);
1611 t = force_fit_type_double (type, val, -1, overflow | TREE_OVERFLOW (arg1));
1612 return t;
1615 /* A subroutine of fold_convert_const handling conversions of a
1616 FIXED_CST to an integer type. */
1618 static tree
1619 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
1621 tree t;
1622 double_int temp, temp_trunc;
1623 unsigned int mode;
1625 /* Right shift FIXED_CST to temp by fbit. */
1626 temp = TREE_FIXED_CST (arg1).data;
1627 mode = TREE_FIXED_CST (arg1).mode;
1628 if (GET_MODE_FBIT (mode) < 2 * HOST_BITS_PER_WIDE_INT)
1630 temp = double_int_rshift (temp, GET_MODE_FBIT (mode),
1631 HOST_BITS_PER_DOUBLE_INT,
1632 SIGNED_FIXED_POINT_MODE_P (mode));
1634 /* Left shift temp to temp_trunc by fbit. */
1635 temp_trunc = double_int_lshift (temp, GET_MODE_FBIT (mode),
1636 HOST_BITS_PER_DOUBLE_INT,
1637 SIGNED_FIXED_POINT_MODE_P (mode));
1639 else
1641 temp = double_int_zero;
1642 temp_trunc = double_int_zero;
1645 /* If FIXED_CST is negative, we need to round the value toward 0.
1646 By checking if the fractional bits are not zero to add 1 to temp. */
1647 if (SIGNED_FIXED_POINT_MODE_P (mode)
1648 && double_int_negative_p (temp_trunc)
1649 && !double_int_equal_p (TREE_FIXED_CST (arg1).data, temp_trunc))
1650 temp = double_int_add (temp, double_int_one);
1652 /* Given a fixed-point constant, make new constant with new type,
1653 appropriately sign-extended or truncated. */
1654 t = force_fit_type_double (type, temp, -1,
1655 (double_int_negative_p (temp)
1656 && (TYPE_UNSIGNED (type)
1657 < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1658 | TREE_OVERFLOW (arg1));
1660 return t;
1663 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1664 to another floating point type. */
1666 static tree
1667 fold_convert_const_real_from_real (tree type, const_tree arg1)
1669 REAL_VALUE_TYPE value;
1670 tree t;
1672 real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
1673 t = build_real (type, value);
1675 /* If converting an infinity or NAN to a representation that doesn't
1676 have one, set the overflow bit so that we can produce some kind of
1677 error message at the appropriate point if necessary. It's not the
1678 most user-friendly message, but it's better than nothing. */
1679 if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
1680 && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
1681 TREE_OVERFLOW (t) = 1;
1682 else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
1683 && !MODE_HAS_NANS (TYPE_MODE (type)))
1684 TREE_OVERFLOW (t) = 1;
1685 /* Regular overflow, conversion produced an infinity in a mode that
1686 can't represent them. */
1687 else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
1688 && REAL_VALUE_ISINF (value)
1689 && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
1690 TREE_OVERFLOW (t) = 1;
1691 else
1692 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
1693 return t;
1696 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
1697 to a floating point type. */
1699 static tree
1700 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
1702 REAL_VALUE_TYPE value;
1703 tree t;
1705 real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
1706 t = build_real (type, value);
1708 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
1709 return t;
1712 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
1713 to another fixed-point type. */
1715 static tree
1716 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
1718 FIXED_VALUE_TYPE value;
1719 tree t;
1720 bool overflow_p;
1722 overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
1723 TYPE_SATURATING (type));
1724 t = build_fixed (type, value);
1726 /* Propagate overflow flags. */
1727 if (overflow_p | TREE_OVERFLOW (arg1))
1728 TREE_OVERFLOW (t) = 1;
1729 return t;
1732 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
1733 to a fixed-point type. */
1735 static tree
1736 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
1738 FIXED_VALUE_TYPE value;
1739 tree t;
1740 bool overflow_p;
1742 overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type),
1743 TREE_INT_CST (arg1),
1744 TYPE_UNSIGNED (TREE_TYPE (arg1)),
1745 TYPE_SATURATING (type));
1746 t = build_fixed (type, value);
1748 /* Propagate overflow flags. */
1749 if (overflow_p | TREE_OVERFLOW (arg1))
1750 TREE_OVERFLOW (t) = 1;
1751 return t;
1754 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1755 to a fixed-point type. */
1757 static tree
1758 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
1760 FIXED_VALUE_TYPE value;
1761 tree t;
1762 bool overflow_p;
1764 overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
1765 &TREE_REAL_CST (arg1),
1766 TYPE_SATURATING (type));
1767 t = build_fixed (type, value);
1769 /* Propagate overflow flags. */
1770 if (overflow_p | TREE_OVERFLOW (arg1))
1771 TREE_OVERFLOW (t) = 1;
1772 return t;
1775 /* Attempt to fold type conversion operation CODE of expression ARG1 to
1776 type TYPE. If no simplification can be done return NULL_TREE. */
1778 static tree
1779 fold_convert_const (enum tree_code code, tree type, tree arg1)
1781 if (TREE_TYPE (arg1) == type)
1782 return arg1;
1784 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
1785 || TREE_CODE (type) == OFFSET_TYPE)
1787 if (TREE_CODE (arg1) == INTEGER_CST)
1788 return fold_convert_const_int_from_int (type, arg1);
1789 else if (TREE_CODE (arg1) == REAL_CST)
1790 return fold_convert_const_int_from_real (code, type, arg1);
1791 else if (TREE_CODE (arg1) == FIXED_CST)
1792 return fold_convert_const_int_from_fixed (type, arg1);
1794 else if (TREE_CODE (type) == REAL_TYPE)
1796 if (TREE_CODE (arg1) == INTEGER_CST)
1797 return build_real_from_int_cst (type, arg1);
1798 else if (TREE_CODE (arg1) == REAL_CST)
1799 return fold_convert_const_real_from_real (type, arg1);
1800 else if (TREE_CODE (arg1) == FIXED_CST)
1801 return fold_convert_const_real_from_fixed (type, arg1);
1803 else if (TREE_CODE (type) == FIXED_POINT_TYPE)
1805 if (TREE_CODE (arg1) == FIXED_CST)
1806 return fold_convert_const_fixed_from_fixed (type, arg1);
1807 else if (TREE_CODE (arg1) == INTEGER_CST)
1808 return fold_convert_const_fixed_from_int (type, arg1);
1809 else if (TREE_CODE (arg1) == REAL_CST)
1810 return fold_convert_const_fixed_from_real (type, arg1);
1812 return NULL_TREE;
1815 /* Construct a vector of zero elements of vector type TYPE. */
1817 static tree
1818 build_zero_vector (tree type)
1820 tree t;
1822 t = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
1823 return build_vector_from_val (type, t);
1826 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR. */
1828 bool
1829 fold_convertible_p (const_tree type, const_tree arg)
1831 tree orig = TREE_TYPE (arg);
1833 if (type == orig)
1834 return true;
1836 if (TREE_CODE (arg) == ERROR_MARK
1837 || TREE_CODE (type) == ERROR_MARK
1838 || TREE_CODE (orig) == ERROR_MARK)
1839 return false;
1841 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
1842 return true;
1844 switch (TREE_CODE (type))
1846 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
1847 case POINTER_TYPE: case REFERENCE_TYPE:
1848 case OFFSET_TYPE:
1849 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1850 || TREE_CODE (orig) == OFFSET_TYPE)
1851 return true;
1852 return (TREE_CODE (orig) == VECTOR_TYPE
1853 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1855 case REAL_TYPE:
1856 case FIXED_POINT_TYPE:
1857 case COMPLEX_TYPE:
1858 case VECTOR_TYPE:
1859 case VOID_TYPE:
1860 return TREE_CODE (type) == TREE_CODE (orig);
1862 default:
1863 return false;
1867 /* Convert expression ARG to type TYPE. Used by the middle-end for
1868 simple conversions in preference to calling the front-end's convert. */
1870 tree
1871 fold_convert_loc (location_t loc, tree type, tree arg)
1873 tree orig = TREE_TYPE (arg);
1874 tree tem;
1876 if (type == orig)
1877 return arg;
1879 if (TREE_CODE (arg) == ERROR_MARK
1880 || TREE_CODE (type) == ERROR_MARK
1881 || TREE_CODE (orig) == ERROR_MARK)
1882 return error_mark_node;
1884 switch (TREE_CODE (type))
1886 case POINTER_TYPE:
1887 case REFERENCE_TYPE:
1888 /* Handle conversions between pointers to different address spaces. */
1889 if (POINTER_TYPE_P (orig)
1890 && (TYPE_ADDR_SPACE (TREE_TYPE (type))
1891 != TYPE_ADDR_SPACE (TREE_TYPE (orig))))
1892 return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg);
1893 /* fall through */
1895 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
1896 case OFFSET_TYPE:
1897 if (TREE_CODE (arg) == INTEGER_CST)
1899 tem = fold_convert_const (NOP_EXPR, type, arg);
1900 if (tem != NULL_TREE)
1901 return tem;
1903 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
1904 || TREE_CODE (orig) == OFFSET_TYPE)
1905 return fold_build1_loc (loc, NOP_EXPR, type, arg);
1906 if (TREE_CODE (orig) == COMPLEX_TYPE)
1907 return fold_convert_loc (loc, type,
1908 fold_build1_loc (loc, REALPART_EXPR,
1909 TREE_TYPE (orig), arg));
1910 gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
1911 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
1912 return fold_build1_loc (loc, NOP_EXPR, type, arg);
1914 case REAL_TYPE:
1915 if (TREE_CODE (arg) == INTEGER_CST)
1917 tem = fold_convert_const (FLOAT_EXPR, type, arg);
1918 if (tem != NULL_TREE)
1919 return tem;
1921 else if (TREE_CODE (arg) == REAL_CST)
1923 tem = fold_convert_const (NOP_EXPR, type, arg);
1924 if (tem != NULL_TREE)
1925 return tem;
1927 else if (TREE_CODE (arg) == FIXED_CST)
1929 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
1930 if (tem != NULL_TREE)
1931 return tem;
1934 switch (TREE_CODE (orig))
1936 case INTEGER_TYPE:
1937 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1938 case POINTER_TYPE: case REFERENCE_TYPE:
1939 return fold_build1_loc (loc, FLOAT_EXPR, type, arg);
1941 case REAL_TYPE:
1942 return fold_build1_loc (loc, NOP_EXPR, type, arg);
1944 case FIXED_POINT_TYPE:
1945 return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
1947 case COMPLEX_TYPE:
1948 tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
1949 return fold_convert_loc (loc, type, tem);
1951 default:
1952 gcc_unreachable ();
1955 case FIXED_POINT_TYPE:
1956 if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
1957 || TREE_CODE (arg) == REAL_CST)
1959 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
1960 if (tem != NULL_TREE)
1961 goto fold_convert_exit;
1964 switch (TREE_CODE (orig))
1966 case FIXED_POINT_TYPE:
1967 case INTEGER_TYPE:
1968 case ENUMERAL_TYPE:
1969 case BOOLEAN_TYPE:
1970 case REAL_TYPE:
1971 return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
1973 case COMPLEX_TYPE:
1974 tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
1975 return fold_convert_loc (loc, type, tem);
1977 default:
1978 gcc_unreachable ();
1981 case COMPLEX_TYPE:
1982 switch (TREE_CODE (orig))
1984 case INTEGER_TYPE:
1985 case BOOLEAN_TYPE: case ENUMERAL_TYPE:
1986 case POINTER_TYPE: case REFERENCE_TYPE:
1987 case REAL_TYPE:
1988 case FIXED_POINT_TYPE:
1989 return fold_build2_loc (loc, COMPLEX_EXPR, type,
1990 fold_convert_loc (loc, TREE_TYPE (type), arg),
1991 fold_convert_loc (loc, TREE_TYPE (type),
1992 integer_zero_node));
1993 case COMPLEX_TYPE:
1995 tree rpart, ipart;
1997 if (TREE_CODE (arg) == COMPLEX_EXPR)
1999 rpart = fold_convert_loc (loc, TREE_TYPE (type),
2000 TREE_OPERAND (arg, 0));
2001 ipart = fold_convert_loc (loc, TREE_TYPE (type),
2002 TREE_OPERAND (arg, 1));
2003 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2006 arg = save_expr (arg);
2007 rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2008 ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg);
2009 rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart);
2010 ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart);
2011 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2014 default:
2015 gcc_unreachable ();
2018 case VECTOR_TYPE:
2019 if (integer_zerop (arg))
2020 return build_zero_vector (type);
2021 gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2022 gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2023 || TREE_CODE (orig) == VECTOR_TYPE);
2024 return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg);
2026 case VOID_TYPE:
2027 tem = fold_ignored_result (arg);
2028 return fold_build1_loc (loc, NOP_EXPR, type, tem);
2030 default:
2031 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2032 return fold_build1_loc (loc, NOP_EXPR, type, arg);
2033 gcc_unreachable ();
2035 fold_convert_exit:
2036 protected_set_expr_location_unshare (tem, loc);
2037 return tem;
2040 /* Return false if expr can be assumed not to be an lvalue, true
2041 otherwise. */
2043 static bool
2044 maybe_lvalue_p (const_tree x)
2046 /* We only need to wrap lvalue tree codes. */
2047 switch (TREE_CODE (x))
2049 case VAR_DECL:
2050 case PARM_DECL:
2051 case RESULT_DECL:
2052 case LABEL_DECL:
2053 case FUNCTION_DECL:
2054 case SSA_NAME:
2056 case COMPONENT_REF:
2057 case MEM_REF:
2058 case INDIRECT_REF:
2059 case ARRAY_REF:
2060 case ARRAY_RANGE_REF:
2061 case BIT_FIELD_REF:
2062 case OBJ_TYPE_REF:
2064 case REALPART_EXPR:
2065 case IMAGPART_EXPR:
2066 case PREINCREMENT_EXPR:
2067 case PREDECREMENT_EXPR:
2068 case SAVE_EXPR:
2069 case TRY_CATCH_EXPR:
2070 case WITH_CLEANUP_EXPR:
2071 case COMPOUND_EXPR:
2072 case MODIFY_EXPR:
2073 case TARGET_EXPR:
2074 case COND_EXPR:
2075 case BIND_EXPR:
2076 break;
2078 default:
2079 /* Assume the worst for front-end tree codes. */
2080 if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2081 break;
2082 return false;
2085 return true;
2088 /* Return an expr equal to X but certainly not valid as an lvalue. */
2090 tree
2091 non_lvalue_loc (location_t loc, tree x)
2093 /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2094 us. */
2095 if (in_gimple_form)
2096 return x;
2098 if (! maybe_lvalue_p (x))
2099 return x;
2100 return build1_loc (loc, NON_LVALUE_EXPR, TREE_TYPE (x), x);
2103 /* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
2104 Zero means allow extended lvalues. */
2106 int pedantic_lvalues;
2108 /* When pedantic, return an expr equal to X but certainly not valid as a
2109 pedantic lvalue. Otherwise, return X. */
2111 static tree
2112 pedantic_non_lvalue_loc (location_t loc, tree x)
2114 if (pedantic_lvalues)
2115 return non_lvalue_loc (loc, x);
2117 return protected_set_expr_location_unshare (x, loc);
2120 /* Given a tree comparison code, return the code that is the logical inverse.
2121 It is generally not safe to do this for floating-point comparisons, except
2122 for EQ_EXPR and NE_EXPR, so we return ERROR_MARK in this case. */
2124 enum tree_code
2125 invert_tree_comparison (enum tree_code code, bool honor_nans)
2127 if (honor_nans && flag_trapping_math && code != EQ_EXPR && code != NE_EXPR)
2128 return ERROR_MARK;
2130 switch (code)
2132 case EQ_EXPR:
2133 return NE_EXPR;
2134 case NE_EXPR:
2135 return EQ_EXPR;
2136 case GT_EXPR:
2137 return honor_nans ? UNLE_EXPR : LE_EXPR;
2138 case GE_EXPR:
2139 return honor_nans ? UNLT_EXPR : LT_EXPR;
2140 case LT_EXPR:
2141 return honor_nans ? UNGE_EXPR : GE_EXPR;
2142 case LE_EXPR:
2143 return honor_nans ? UNGT_EXPR : GT_EXPR;
2144 case LTGT_EXPR:
2145 return UNEQ_EXPR;
2146 case UNEQ_EXPR:
2147 return LTGT_EXPR;
2148 case UNGT_EXPR:
2149 return LE_EXPR;
2150 case UNGE_EXPR:
2151 return LT_EXPR;
2152 case UNLT_EXPR:
2153 return GE_EXPR;
2154 case UNLE_EXPR:
2155 return GT_EXPR;
2156 case ORDERED_EXPR:
2157 return UNORDERED_EXPR;
2158 case UNORDERED_EXPR:
2159 return ORDERED_EXPR;
2160 default:
2161 gcc_unreachable ();
2165 /* Similar, but return the comparison that results if the operands are
2166 swapped. This is safe for floating-point. */
2168 enum tree_code
2169 swap_tree_comparison (enum tree_code code)
2171 switch (code)
2173 case EQ_EXPR:
2174 case NE_EXPR:
2175 case ORDERED_EXPR:
2176 case UNORDERED_EXPR:
2177 case LTGT_EXPR:
2178 case UNEQ_EXPR:
2179 return code;
2180 case GT_EXPR:
2181 return LT_EXPR;
2182 case GE_EXPR:
2183 return LE_EXPR;
2184 case LT_EXPR:
2185 return GT_EXPR;
2186 case LE_EXPR:
2187 return GE_EXPR;
2188 case UNGT_EXPR:
2189 return UNLT_EXPR;
2190 case UNGE_EXPR:
2191 return UNLE_EXPR;
2192 case UNLT_EXPR:
2193 return UNGT_EXPR;
2194 case UNLE_EXPR:
2195 return UNGE_EXPR;
2196 default:
2197 gcc_unreachable ();
2202 /* Convert a comparison tree code from an enum tree_code representation
2203 into a compcode bit-based encoding. This function is the inverse of
2204 compcode_to_comparison. */
2206 static enum comparison_code
2207 comparison_to_compcode (enum tree_code code)
2209 switch (code)
2211 case LT_EXPR:
2212 return COMPCODE_LT;
2213 case EQ_EXPR:
2214 return COMPCODE_EQ;
2215 case LE_EXPR:
2216 return COMPCODE_LE;
2217 case GT_EXPR:
2218 return COMPCODE_GT;
2219 case NE_EXPR:
2220 return COMPCODE_NE;
2221 case GE_EXPR:
2222 return COMPCODE_GE;
2223 case ORDERED_EXPR:
2224 return COMPCODE_ORD;
2225 case UNORDERED_EXPR:
2226 return COMPCODE_UNORD;
2227 case UNLT_EXPR:
2228 return COMPCODE_UNLT;
2229 case UNEQ_EXPR:
2230 return COMPCODE_UNEQ;
2231 case UNLE_EXPR:
2232 return COMPCODE_UNLE;
2233 case UNGT_EXPR:
2234 return COMPCODE_UNGT;
2235 case LTGT_EXPR:
2236 return COMPCODE_LTGT;
2237 case UNGE_EXPR:
2238 return COMPCODE_UNGE;
2239 default:
2240 gcc_unreachable ();
2244 /* Convert a compcode bit-based encoding of a comparison operator back
2245 to GCC's enum tree_code representation. This function is the
2246 inverse of comparison_to_compcode. */
2248 static enum tree_code
2249 compcode_to_comparison (enum comparison_code code)
2251 switch (code)
2253 case COMPCODE_LT:
2254 return LT_EXPR;
2255 case COMPCODE_EQ:
2256 return EQ_EXPR;
2257 case COMPCODE_LE:
2258 return LE_EXPR;
2259 case COMPCODE_GT:
2260 return GT_EXPR;
2261 case COMPCODE_NE:
2262 return NE_EXPR;
2263 case COMPCODE_GE:
2264 return GE_EXPR;
2265 case COMPCODE_ORD:
2266 return ORDERED_EXPR;
2267 case COMPCODE_UNORD:
2268 return UNORDERED_EXPR;
2269 case COMPCODE_UNLT:
2270 return UNLT_EXPR;
2271 case COMPCODE_UNEQ:
2272 return UNEQ_EXPR;
2273 case COMPCODE_UNLE:
2274 return UNLE_EXPR;
2275 case COMPCODE_UNGT:
2276 return UNGT_EXPR;
2277 case COMPCODE_LTGT:
2278 return LTGT_EXPR;
2279 case COMPCODE_UNGE:
2280 return UNGE_EXPR;
2281 default:
2282 gcc_unreachable ();
2286 /* Return a tree for the comparison which is the combination of
2287 doing the AND or OR (depending on CODE) of the two operations LCODE
2288 and RCODE on the identical operands LL_ARG and LR_ARG. Take into account
2289 the possibility of trapping if the mode has NaNs, and return NULL_TREE
2290 if this makes the transformation invalid. */
2292 tree
2293 combine_comparisons (location_t loc,
2294 enum tree_code code, enum tree_code lcode,
2295 enum tree_code rcode, tree truth_type,
2296 tree ll_arg, tree lr_arg)
2298 bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg)));
2299 enum comparison_code lcompcode = comparison_to_compcode (lcode);
2300 enum comparison_code rcompcode = comparison_to_compcode (rcode);
2301 int compcode;
2303 switch (code)
2305 case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2306 compcode = lcompcode & rcompcode;
2307 break;
2309 case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2310 compcode = lcompcode | rcompcode;
2311 break;
2313 default:
2314 return NULL_TREE;
2317 if (!honor_nans)
2319 /* Eliminate unordered comparisons, as well as LTGT and ORD
2320 which are not used unless the mode has NaNs. */
2321 compcode &= ~COMPCODE_UNORD;
2322 if (compcode == COMPCODE_LTGT)
2323 compcode = COMPCODE_NE;
2324 else if (compcode == COMPCODE_ORD)
2325 compcode = COMPCODE_TRUE;
2327 else if (flag_trapping_math)
2329 /* Check that the original operation and the optimized ones will trap
2330 under the same condition. */
2331 bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2332 && (lcompcode != COMPCODE_EQ)
2333 && (lcompcode != COMPCODE_ORD);
2334 bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2335 && (rcompcode != COMPCODE_EQ)
2336 && (rcompcode != COMPCODE_ORD);
2337 bool trap = (compcode & COMPCODE_UNORD) == 0
2338 && (compcode != COMPCODE_EQ)
2339 && (compcode != COMPCODE_ORD);
2341 /* In a short-circuited boolean expression the LHS might be
2342 such that the RHS, if evaluated, will never trap. For
2343 example, in ORD (x, y) && (x < y), we evaluate the RHS only
2344 if neither x nor y is NaN. (This is a mixed blessing: for
2345 example, the expression above will never trap, hence
2346 optimizing it to x < y would be invalid). */
2347 if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2348 || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2349 rtrap = false;
2351 /* If the comparison was short-circuited, and only the RHS
2352 trapped, we may now generate a spurious trap. */
2353 if (rtrap && !ltrap
2354 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2355 return NULL_TREE;
2357 /* If we changed the conditions that cause a trap, we lose. */
2358 if ((ltrap || rtrap) != trap)
2359 return NULL_TREE;
2362 if (compcode == COMPCODE_TRUE)
2363 return constant_boolean_node (true, truth_type);
2364 else if (compcode == COMPCODE_FALSE)
2365 return constant_boolean_node (false, truth_type);
2366 else
2368 enum tree_code tcode;
2370 tcode = compcode_to_comparison ((enum comparison_code) compcode);
2371 return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg);
2375 /* Return nonzero if two operands (typically of the same tree node)
2376 are necessarily equal. If either argument has side-effects this
2377 function returns zero. FLAGS modifies behavior as follows:
2379 If OEP_ONLY_CONST is set, only return nonzero for constants.
2380 This function tests whether the operands are indistinguishable;
2381 it does not test whether they are equal using C's == operation.
2382 The distinction is important for IEEE floating point, because
2383 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2384 (2) two NaNs may be indistinguishable, but NaN!=NaN.
2386 If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2387 even though it may hold multiple values during a function.
2388 This is because a GCC tree node guarantees that nothing else is
2389 executed between the evaluation of its "operands" (which may often
2390 be evaluated in arbitrary order). Hence if the operands themselves
2391 don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2392 same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST
2393 unset means assuming isochronic (or instantaneous) tree equivalence.
2394 Unless comparing arbitrary expression trees, such as from different
2395 statements, this flag can usually be left unset.
2397 If OEP_PURE_SAME is set, then pure functions with identical arguments
2398 are considered the same. It is used when the caller has other ways
2399 to ensure that global memory is unchanged in between. */
2402 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
2404 /* If either is ERROR_MARK, they aren't equal. */
2405 if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK
2406 || TREE_TYPE (arg0) == error_mark_node
2407 || TREE_TYPE (arg1) == error_mark_node)
2408 return 0;
2410 /* Similar, if either does not have a type (like a released SSA name),
2411 they aren't equal. */
2412 if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1))
2413 return 0;
2415 /* Check equality of integer constants before bailing out due to
2416 precision differences. */
2417 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2418 return tree_int_cst_equal (arg0, arg1);
2420 /* If both types don't have the same signedness, then we can't consider
2421 them equal. We must check this before the STRIP_NOPS calls
2422 because they may change the signedness of the arguments. As pointers
2423 strictly don't have a signedness, require either two pointers or
2424 two non-pointers as well. */
2425 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
2426 || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
2427 return 0;
2429 /* We cannot consider pointers to different address space equal. */
2430 if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1))
2431 && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))
2432 != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))))
2433 return 0;
2435 /* If both types don't have the same precision, then it is not safe
2436 to strip NOPs. */
2437 if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
2438 return 0;
2440 STRIP_NOPS (arg0);
2441 STRIP_NOPS (arg1);
2443 /* In case both args are comparisons but with different comparison
2444 code, try to swap the comparison operands of one arg to produce
2445 a match and compare that variant. */
2446 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2447 && COMPARISON_CLASS_P (arg0)
2448 && COMPARISON_CLASS_P (arg1))
2450 enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
2452 if (TREE_CODE (arg0) == swap_code)
2453 return operand_equal_p (TREE_OPERAND (arg0, 0),
2454 TREE_OPERAND (arg1, 1), flags)
2455 && operand_equal_p (TREE_OPERAND (arg0, 1),
2456 TREE_OPERAND (arg1, 0), flags);
2459 if (TREE_CODE (arg0) != TREE_CODE (arg1)
2460 /* This is needed for conversions and for COMPONENT_REF.
2461 Might as well play it safe and always test this. */
2462 || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2463 || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2464 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2465 return 0;
2467 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2468 We don't care about side effects in that case because the SAVE_EXPR
2469 takes care of that for us. In all other cases, two expressions are
2470 equal if they have no side effects. If we have two identical
2471 expressions with side effects that should be treated the same due
2472 to the only side effects being identical SAVE_EXPR's, that will
2473 be detected in the recursive calls below.
2474 If we are taking an invariant address of two identical objects
2475 they are necessarily equal as well. */
2476 if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2477 && (TREE_CODE (arg0) == SAVE_EXPR
2478 || (flags & OEP_CONSTANT_ADDRESS_OF)
2479 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2480 return 1;
2482 /* Next handle constant cases, those for which we can return 1 even
2483 if ONLY_CONST is set. */
2484 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2485 switch (TREE_CODE (arg0))
2487 case INTEGER_CST:
2488 return tree_int_cst_equal (arg0, arg1);
2490 case FIXED_CST:
2491 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
2492 TREE_FIXED_CST (arg1));
2494 case REAL_CST:
2495 if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2496 TREE_REAL_CST (arg1)))
2497 return 1;
2500 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
2502 /* If we do not distinguish between signed and unsigned zero,
2503 consider them equal. */
2504 if (real_zerop (arg0) && real_zerop (arg1))
2505 return 1;
2507 return 0;
2509 case VECTOR_CST:
2511 tree v1, v2;
2513 v1 = TREE_VECTOR_CST_ELTS (arg0);
2514 v2 = TREE_VECTOR_CST_ELTS (arg1);
2515 while (v1 && v2)
2517 if (!operand_equal_p (TREE_VALUE (v1), TREE_VALUE (v2),
2518 flags))
2519 return 0;
2520 v1 = TREE_CHAIN (v1);
2521 v2 = TREE_CHAIN (v2);
2524 return v1 == v2;
2527 case COMPLEX_CST:
2528 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2529 flags)
2530 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2531 flags));
2533 case STRING_CST:
2534 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2535 && ! memcmp (TREE_STRING_POINTER (arg0),
2536 TREE_STRING_POINTER (arg1),
2537 TREE_STRING_LENGTH (arg0)));
2539 case ADDR_EXPR:
2540 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2541 TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)
2542 ? OEP_CONSTANT_ADDRESS_OF : 0);
2543 default:
2544 break;
2547 if (flags & OEP_ONLY_CONST)
2548 return 0;
2550 /* Define macros to test an operand from arg0 and arg1 for equality and a
2551 variant that allows null and views null as being different from any
2552 non-null value. In the latter case, if either is null, the both
2553 must be; otherwise, do the normal comparison. */
2554 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N), \
2555 TREE_OPERAND (arg1, N), flags)
2557 #define OP_SAME_WITH_NULL(N) \
2558 ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
2559 ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2561 switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2563 case tcc_unary:
2564 /* Two conversions are equal only if signedness and modes match. */
2565 switch (TREE_CODE (arg0))
2567 CASE_CONVERT:
2568 case FIX_TRUNC_EXPR:
2569 if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2570 != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2571 return 0;
2572 break;
2573 default:
2574 break;
2577 return OP_SAME (0);
2580 case tcc_comparison:
2581 case tcc_binary:
2582 if (OP_SAME (0) && OP_SAME (1))
2583 return 1;
2585 /* For commutative ops, allow the other order. */
2586 return (commutative_tree_code (TREE_CODE (arg0))
2587 && operand_equal_p (TREE_OPERAND (arg0, 0),
2588 TREE_OPERAND (arg1, 1), flags)
2589 && operand_equal_p (TREE_OPERAND (arg0, 1),
2590 TREE_OPERAND (arg1, 0), flags));
2592 case tcc_reference:
2593 /* If either of the pointer (or reference) expressions we are
2594 dereferencing contain a side effect, these cannot be equal. */
2595 if (TREE_SIDE_EFFECTS (arg0)
2596 || TREE_SIDE_EFFECTS (arg1))
2597 return 0;
2599 switch (TREE_CODE (arg0))
2601 case INDIRECT_REF:
2602 case REALPART_EXPR:
2603 case IMAGPART_EXPR:
2604 return OP_SAME (0);
2606 case MEM_REF:
2607 /* Require equal access sizes, and similar pointer types.
2608 We can have incomplete types for array references of
2609 variable-sized arrays from the Fortran frontent
2610 though. */
2611 return ((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
2612 || (TYPE_SIZE (TREE_TYPE (arg0))
2613 && TYPE_SIZE (TREE_TYPE (arg1))
2614 && operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
2615 TYPE_SIZE (TREE_TYPE (arg1)), flags)))
2616 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 1)))
2617 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg1, 1))))
2618 && OP_SAME (0) && OP_SAME (1));
2620 case ARRAY_REF:
2621 case ARRAY_RANGE_REF:
2622 /* Operands 2 and 3 may be null.
2623 Compare the array index by value if it is constant first as we
2624 may have different types but same value here. */
2625 return (OP_SAME (0)
2626 && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
2627 TREE_OPERAND (arg1, 1))
2628 || OP_SAME (1))
2629 && OP_SAME_WITH_NULL (2)
2630 && OP_SAME_WITH_NULL (3));
2632 case COMPONENT_REF:
2633 /* Handle operand 2 the same as for ARRAY_REF. Operand 0
2634 may be NULL when we're called to compare MEM_EXPRs. */
2635 return OP_SAME_WITH_NULL (0)
2636 && OP_SAME (1)
2637 && OP_SAME_WITH_NULL (2);
2639 case BIT_FIELD_REF:
2640 return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
2642 default:
2643 return 0;
2646 case tcc_expression:
2647 switch (TREE_CODE (arg0))
2649 case ADDR_EXPR:
2650 case TRUTH_NOT_EXPR:
2651 return OP_SAME (0);
2653 case TRUTH_ANDIF_EXPR:
2654 case TRUTH_ORIF_EXPR:
2655 return OP_SAME (0) && OP_SAME (1);
2657 case FMA_EXPR:
2658 case WIDEN_MULT_PLUS_EXPR:
2659 case WIDEN_MULT_MINUS_EXPR:
2660 if (!OP_SAME (2))
2661 return 0;
2662 /* The multiplcation operands are commutative. */
2663 /* FALLTHRU */
2665 case TRUTH_AND_EXPR:
2666 case TRUTH_OR_EXPR:
2667 case TRUTH_XOR_EXPR:
2668 if (OP_SAME (0) && OP_SAME (1))
2669 return 1;
2671 /* Otherwise take into account this is a commutative operation. */
2672 return (operand_equal_p (TREE_OPERAND (arg0, 0),
2673 TREE_OPERAND (arg1, 1), flags)
2674 && operand_equal_p (TREE_OPERAND (arg0, 1),
2675 TREE_OPERAND (arg1, 0), flags));
2677 case COND_EXPR:
2678 case VEC_COND_EXPR:
2679 case DOT_PROD_EXPR:
2680 return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
2682 default:
2683 return 0;
2686 case tcc_vl_exp:
2687 switch (TREE_CODE (arg0))
2689 case CALL_EXPR:
2690 /* If the CALL_EXPRs call different functions, then they
2691 clearly can not be equal. */
2692 if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
2693 flags))
2694 return 0;
2697 unsigned int cef = call_expr_flags (arg0);
2698 if (flags & OEP_PURE_SAME)
2699 cef &= ECF_CONST | ECF_PURE;
2700 else
2701 cef &= ECF_CONST;
2702 if (!cef)
2703 return 0;
2706 /* Now see if all the arguments are the same. */
2708 const_call_expr_arg_iterator iter0, iter1;
2709 const_tree a0, a1;
2710 for (a0 = first_const_call_expr_arg (arg0, &iter0),
2711 a1 = first_const_call_expr_arg (arg1, &iter1);
2712 a0 && a1;
2713 a0 = next_const_call_expr_arg (&iter0),
2714 a1 = next_const_call_expr_arg (&iter1))
2715 if (! operand_equal_p (a0, a1, flags))
2716 return 0;
2718 /* If we get here and both argument lists are exhausted
2719 then the CALL_EXPRs are equal. */
2720 return ! (a0 || a1);
2722 default:
2723 return 0;
2726 case tcc_declaration:
2727 /* Consider __builtin_sqrt equal to sqrt. */
2728 return (TREE_CODE (arg0) == FUNCTION_DECL
2729 && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
2730 && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
2731 && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
2733 default:
2734 return 0;
2737 #undef OP_SAME
2738 #undef OP_SAME_WITH_NULL
2741 /* Similar to operand_equal_p, but see if ARG0 might have been made by
2742 shorten_compare from ARG1 when ARG1 was being compared with OTHER.
2744 When in doubt, return 0. */
2746 static int
2747 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
2749 int unsignedp1, unsignedpo;
2750 tree primarg0, primarg1, primother;
2751 unsigned int correct_width;
2753 if (operand_equal_p (arg0, arg1, 0))
2754 return 1;
2756 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
2757 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
2758 return 0;
2760 /* Discard any conversions that don't change the modes of ARG0 and ARG1
2761 and see if the inner values are the same. This removes any
2762 signedness comparison, which doesn't matter here. */
2763 primarg0 = arg0, primarg1 = arg1;
2764 STRIP_NOPS (primarg0);
2765 STRIP_NOPS (primarg1);
2766 if (operand_equal_p (primarg0, primarg1, 0))
2767 return 1;
2769 /* Duplicate what shorten_compare does to ARG1 and see if that gives the
2770 actual comparison operand, ARG0.
2772 First throw away any conversions to wider types
2773 already present in the operands. */
2775 primarg1 = get_narrower (arg1, &unsignedp1);
2776 primother = get_narrower (other, &unsignedpo);
2778 correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
2779 if (unsignedp1 == unsignedpo
2780 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
2781 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
2783 tree type = TREE_TYPE (arg0);
2785 /* Make sure shorter operand is extended the right way
2786 to match the longer operand. */
2787 primarg1 = fold_convert (signed_or_unsigned_type_for
2788 (unsignedp1, TREE_TYPE (primarg1)), primarg1);
2790 if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
2791 return 1;
2794 return 0;
2797 /* See if ARG is an expression that is either a comparison or is performing
2798 arithmetic on comparisons. The comparisons must only be comparing
2799 two different values, which will be stored in *CVAL1 and *CVAL2; if
2800 they are nonzero it means that some operands have already been found.
2801 No variables may be used anywhere else in the expression except in the
2802 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around
2803 the expression and save_expr needs to be called with CVAL1 and CVAL2.
2805 If this is true, return 1. Otherwise, return zero. */
2807 static int
2808 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
2810 enum tree_code code = TREE_CODE (arg);
2811 enum tree_code_class tclass = TREE_CODE_CLASS (code);
2813 /* We can handle some of the tcc_expression cases here. */
2814 if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
2815 tclass = tcc_unary;
2816 else if (tclass == tcc_expression
2817 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
2818 || code == COMPOUND_EXPR))
2819 tclass = tcc_binary;
2821 else if (tclass == tcc_expression && code == SAVE_EXPR
2822 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
2824 /* If we've already found a CVAL1 or CVAL2, this expression is
2825 two complex to handle. */
2826 if (*cval1 || *cval2)
2827 return 0;
2829 tclass = tcc_unary;
2830 *save_p = 1;
2833 switch (tclass)
2835 case tcc_unary:
2836 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
2838 case tcc_binary:
2839 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
2840 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2841 cval1, cval2, save_p));
2843 case tcc_constant:
2844 return 1;
2846 case tcc_expression:
2847 if (code == COND_EXPR)
2848 return (twoval_comparison_p (TREE_OPERAND (arg, 0),
2849 cval1, cval2, save_p)
2850 && twoval_comparison_p (TREE_OPERAND (arg, 1),
2851 cval1, cval2, save_p)
2852 && twoval_comparison_p (TREE_OPERAND (arg, 2),
2853 cval1, cval2, save_p));
2854 return 0;
2856 case tcc_comparison:
2857 /* First see if we can handle the first operand, then the second. For
2858 the second operand, we know *CVAL1 can't be zero. It must be that
2859 one side of the comparison is each of the values; test for the
2860 case where this isn't true by failing if the two operands
2861 are the same. */
2863 if (operand_equal_p (TREE_OPERAND (arg, 0),
2864 TREE_OPERAND (arg, 1), 0))
2865 return 0;
2867 if (*cval1 == 0)
2868 *cval1 = TREE_OPERAND (arg, 0);
2869 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
2871 else if (*cval2 == 0)
2872 *cval2 = TREE_OPERAND (arg, 0);
2873 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
2875 else
2876 return 0;
2878 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
2880 else if (*cval2 == 0)
2881 *cval2 = TREE_OPERAND (arg, 1);
2882 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
2884 else
2885 return 0;
2887 return 1;
2889 default:
2890 return 0;
2894 /* ARG is a tree that is known to contain just arithmetic operations and
2895 comparisons. Evaluate the operations in the tree substituting NEW0 for
2896 any occurrence of OLD0 as an operand of a comparison and likewise for
2897 NEW1 and OLD1. */
2899 static tree
2900 eval_subst (location_t loc, tree arg, tree old0, tree new0,
2901 tree old1, tree new1)
2903 tree type = TREE_TYPE (arg);
2904 enum tree_code code = TREE_CODE (arg);
2905 enum tree_code_class tclass = TREE_CODE_CLASS (code);
2907 /* We can handle some of the tcc_expression cases here. */
2908 if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
2909 tclass = tcc_unary;
2910 else if (tclass == tcc_expression
2911 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2912 tclass = tcc_binary;
2914 switch (tclass)
2916 case tcc_unary:
2917 return fold_build1_loc (loc, code, type,
2918 eval_subst (loc, TREE_OPERAND (arg, 0),
2919 old0, new0, old1, new1));
2921 case tcc_binary:
2922 return fold_build2_loc (loc, code, type,
2923 eval_subst (loc, TREE_OPERAND (arg, 0),
2924 old0, new0, old1, new1),
2925 eval_subst (loc, TREE_OPERAND (arg, 1),
2926 old0, new0, old1, new1));
2928 case tcc_expression:
2929 switch (code)
2931 case SAVE_EXPR:
2932 return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0,
2933 old1, new1);
2935 case COMPOUND_EXPR:
2936 return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0,
2937 old1, new1);
2939 case COND_EXPR:
2940 return fold_build3_loc (loc, code, type,
2941 eval_subst (loc, TREE_OPERAND (arg, 0),
2942 old0, new0, old1, new1),
2943 eval_subst (loc, TREE_OPERAND (arg, 1),
2944 old0, new0, old1, new1),
2945 eval_subst (loc, TREE_OPERAND (arg, 2),
2946 old0, new0, old1, new1));
2947 default:
2948 break;
2950 /* Fall through - ??? */
2952 case tcc_comparison:
2954 tree arg0 = TREE_OPERAND (arg, 0);
2955 tree arg1 = TREE_OPERAND (arg, 1);
2957 /* We need to check both for exact equality and tree equality. The
2958 former will be true if the operand has a side-effect. In that
2959 case, we know the operand occurred exactly once. */
2961 if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
2962 arg0 = new0;
2963 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
2964 arg0 = new1;
2966 if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
2967 arg1 = new0;
2968 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
2969 arg1 = new1;
2971 return fold_build2_loc (loc, code, type, arg0, arg1);
2974 default:
2975 return arg;
2979 /* Return a tree for the case when the result of an expression is RESULT
2980 converted to TYPE and OMITTED was previously an operand of the expression
2981 but is now not needed (e.g., we folded OMITTED * 0).
2983 If OMITTED has side effects, we must evaluate it. Otherwise, just do
2984 the conversion of RESULT to TYPE. */
2986 tree
2987 omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted)
2989 tree t = fold_convert_loc (loc, type, result);
2991 /* If the resulting operand is an empty statement, just return the omitted
2992 statement casted to void. */
2993 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
2994 return build1_loc (loc, NOP_EXPR, void_type_node,
2995 fold_ignored_result (omitted));
2997 if (TREE_SIDE_EFFECTS (omitted))
2998 return build2_loc (loc, COMPOUND_EXPR, type,
2999 fold_ignored_result (omitted), t);
3001 return non_lvalue_loc (loc, t);
3004 /* Similar, but call pedantic_non_lvalue instead of non_lvalue. */
3006 static tree
3007 pedantic_omit_one_operand_loc (location_t loc, tree type, tree result,
3008 tree omitted)
3010 tree t = fold_convert_loc (loc, type, result);
3012 /* If the resulting operand is an empty statement, just return the omitted
3013 statement casted to void. */
3014 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3015 return build1_loc (loc, NOP_EXPR, void_type_node,
3016 fold_ignored_result (omitted));
3018 if (TREE_SIDE_EFFECTS (omitted))
3019 return build2_loc (loc, COMPOUND_EXPR, type,
3020 fold_ignored_result (omitted), t);
3022 return pedantic_non_lvalue_loc (loc, t);
3025 /* Return a tree for the case when the result of an expression is RESULT
3026 converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3027 of the expression but are now not needed.
3029 If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3030 If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3031 evaluated before OMITTED2. Otherwise, if neither has side effects,
3032 just do the conversion of RESULT to TYPE. */
3034 tree
3035 omit_two_operands_loc (location_t loc, tree type, tree result,
3036 tree omitted1, tree omitted2)
3038 tree t = fold_convert_loc (loc, type, result);
3040 if (TREE_SIDE_EFFECTS (omitted2))
3041 t = build2_loc (loc, COMPOUND_EXPR, type, omitted2, t);
3042 if (TREE_SIDE_EFFECTS (omitted1))
3043 t = build2_loc (loc, COMPOUND_EXPR, type, omitted1, t);
3045 return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t;
3049 /* Return a simplified tree node for the truth-negation of ARG. This
3050 never alters ARG itself. We assume that ARG is an operation that
3051 returns a truth value (0 or 1).
3053 FIXME: one would think we would fold the result, but it causes
3054 problems with the dominator optimizer. */
3056 tree
3057 fold_truth_not_expr (location_t loc, tree arg)
3059 tree type = TREE_TYPE (arg);
3060 enum tree_code code = TREE_CODE (arg);
3061 location_t loc1, loc2;
3063 /* If this is a comparison, we can simply invert it, except for
3064 floating-point non-equality comparisons, in which case we just
3065 enclose a TRUTH_NOT_EXPR around what we have. */
3067 if (TREE_CODE_CLASS (code) == tcc_comparison)
3069 tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3070 if (FLOAT_TYPE_P (op_type)
3071 && flag_trapping_math
3072 && code != ORDERED_EXPR && code != UNORDERED_EXPR
3073 && code != NE_EXPR && code != EQ_EXPR)
3074 return NULL_TREE;
3076 code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (op_type)));
3077 if (code == ERROR_MARK)
3078 return NULL_TREE;
3080 return build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
3081 TREE_OPERAND (arg, 1));
3084 switch (code)
3086 case INTEGER_CST:
3087 return constant_boolean_node (integer_zerop (arg), type);
3089 case TRUTH_AND_EXPR:
3090 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3091 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3092 return build2_loc (loc, TRUTH_OR_EXPR, type,
3093 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3094 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3096 case TRUTH_OR_EXPR:
3097 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3098 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3099 return build2_loc (loc, TRUTH_AND_EXPR, type,
3100 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3101 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3103 case TRUTH_XOR_EXPR:
3104 /* Here we can invert either operand. We invert the first operand
3105 unless the second operand is a TRUTH_NOT_EXPR in which case our
3106 result is the XOR of the first operand with the inside of the
3107 negation of the second operand. */
3109 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3110 return build2_loc (loc, TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3111 TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3112 else
3113 return build2_loc (loc, TRUTH_XOR_EXPR, type,
3114 invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)),
3115 TREE_OPERAND (arg, 1));
3117 case TRUTH_ANDIF_EXPR:
3118 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3119 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3120 return build2_loc (loc, TRUTH_ORIF_EXPR, type,
3121 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3122 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3124 case TRUTH_ORIF_EXPR:
3125 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3126 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3127 return build2_loc (loc, TRUTH_ANDIF_EXPR, type,
3128 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3129 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3131 case TRUTH_NOT_EXPR:
3132 return TREE_OPERAND (arg, 0);
3134 case COND_EXPR:
3136 tree arg1 = TREE_OPERAND (arg, 1);
3137 tree arg2 = TREE_OPERAND (arg, 2);
3139 loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3140 loc2 = expr_location_or (TREE_OPERAND (arg, 2), loc);
3142 /* A COND_EXPR may have a throw as one operand, which
3143 then has void type. Just leave void operands
3144 as they are. */
3145 return build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg, 0),
3146 VOID_TYPE_P (TREE_TYPE (arg1))
3147 ? arg1 : invert_truthvalue_loc (loc1, arg1),
3148 VOID_TYPE_P (TREE_TYPE (arg2))
3149 ? arg2 : invert_truthvalue_loc (loc2, arg2));
3152 case COMPOUND_EXPR:
3153 loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3154 return build2_loc (loc, COMPOUND_EXPR, type,
3155 TREE_OPERAND (arg, 0),
3156 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)));
3158 case NON_LVALUE_EXPR:
3159 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3160 return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0));
3162 CASE_CONVERT:
3163 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3164 return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3166 /* ... fall through ... */
3168 case FLOAT_EXPR:
3169 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3170 return build1_loc (loc, TREE_CODE (arg), type,
3171 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3173 case BIT_AND_EXPR:
3174 if (!integer_onep (TREE_OPERAND (arg, 1)))
3175 return NULL_TREE;
3176 return build2_loc (loc, EQ_EXPR, type, arg, build_int_cst (type, 0));
3178 case SAVE_EXPR:
3179 return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3181 case CLEANUP_POINT_EXPR:
3182 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3183 return build1_loc (loc, CLEANUP_POINT_EXPR, type,
3184 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3186 default:
3187 return NULL_TREE;
3191 /* Return a simplified tree node for the truth-negation of ARG. This
3192 never alters ARG itself. We assume that ARG is an operation that
3193 returns a truth value (0 or 1).
3195 FIXME: one would think we would fold the result, but it causes
3196 problems with the dominator optimizer. */
3198 tree
3199 invert_truthvalue_loc (location_t loc, tree arg)
3201 tree tem;
3203 if (TREE_CODE (arg) == ERROR_MARK)
3204 return arg;
3206 tem = fold_truth_not_expr (loc, arg);
3207 if (!tem)
3208 tem = build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg), arg);
3210 return tem;
3213 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3214 operands are another bit-wise operation with a common input. If so,
3215 distribute the bit operations to save an operation and possibly two if
3216 constants are involved. For example, convert
3217 (A | B) & (A | C) into A | (B & C)
3218 Further simplification will occur if B and C are constants.
3220 If this optimization cannot be done, 0 will be returned. */
3222 static tree
3223 distribute_bit_expr (location_t loc, enum tree_code code, tree type,
3224 tree arg0, tree arg1)
3226 tree common;
3227 tree left, right;
3229 if (TREE_CODE (arg0) != TREE_CODE (arg1)
3230 || TREE_CODE (arg0) == code
3231 || (TREE_CODE (arg0) != BIT_AND_EXPR
3232 && TREE_CODE (arg0) != BIT_IOR_EXPR))
3233 return 0;
3235 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3237 common = TREE_OPERAND (arg0, 0);
3238 left = TREE_OPERAND (arg0, 1);
3239 right = TREE_OPERAND (arg1, 1);
3241 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3243 common = TREE_OPERAND (arg0, 0);
3244 left = TREE_OPERAND (arg0, 1);
3245 right = TREE_OPERAND (arg1, 0);
3247 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3249 common = TREE_OPERAND (arg0, 1);
3250 left = TREE_OPERAND (arg0, 0);
3251 right = TREE_OPERAND (arg1, 1);
3253 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3255 common = TREE_OPERAND (arg0, 1);
3256 left = TREE_OPERAND (arg0, 0);
3257 right = TREE_OPERAND (arg1, 0);
3259 else
3260 return 0;
3262 common = fold_convert_loc (loc, type, common);
3263 left = fold_convert_loc (loc, type, left);
3264 right = fold_convert_loc (loc, type, right);
3265 return fold_build2_loc (loc, TREE_CODE (arg0), type, common,
3266 fold_build2_loc (loc, code, type, left, right));
3269 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3270 with code CODE. This optimization is unsafe. */
3271 static tree
3272 distribute_real_division (location_t loc, enum tree_code code, tree type,
3273 tree arg0, tree arg1)
3275 bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3276 bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3278 /* (A / C) +- (B / C) -> (A +- B) / C. */
3279 if (mul0 == mul1
3280 && operand_equal_p (TREE_OPERAND (arg0, 1),
3281 TREE_OPERAND (arg1, 1), 0))
3282 return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type,
3283 fold_build2_loc (loc, code, type,
3284 TREE_OPERAND (arg0, 0),
3285 TREE_OPERAND (arg1, 0)),
3286 TREE_OPERAND (arg0, 1));
3288 /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2). */
3289 if (operand_equal_p (TREE_OPERAND (arg0, 0),
3290 TREE_OPERAND (arg1, 0), 0)
3291 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3292 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3294 REAL_VALUE_TYPE r0, r1;
3295 r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3296 r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3297 if (!mul0)
3298 real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3299 if (!mul1)
3300 real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3301 real_arithmetic (&r0, code, &r0, &r1);
3302 return fold_build2_loc (loc, MULT_EXPR, type,
3303 TREE_OPERAND (arg0, 0),
3304 build_real (type, r0));
3307 return NULL_TREE;
3310 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3311 starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */
3313 static tree
3314 make_bit_field_ref (location_t loc, tree inner, tree type,
3315 HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp)
3317 tree result, bftype;
3319 if (bitpos == 0)
3321 tree size = TYPE_SIZE (TREE_TYPE (inner));
3322 if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3323 || POINTER_TYPE_P (TREE_TYPE (inner)))
3324 && host_integerp (size, 0)
3325 && tree_low_cst (size, 0) == bitsize)
3326 return fold_convert_loc (loc, type, inner);
3329 bftype = type;
3330 if (TYPE_PRECISION (bftype) != bitsize
3331 || TYPE_UNSIGNED (bftype) == !unsignedp)
3332 bftype = build_nonstandard_integer_type (bitsize, 0);
3334 result = build3_loc (loc, BIT_FIELD_REF, bftype, inner,
3335 size_int (bitsize), bitsize_int (bitpos));
3337 if (bftype != type)
3338 result = fold_convert_loc (loc, type, result);
3340 return result;
3343 /* Optimize a bit-field compare.
3345 There are two cases: First is a compare against a constant and the
3346 second is a comparison of two items where the fields are at the same
3347 bit position relative to the start of a chunk (byte, halfword, word)
3348 large enough to contain it. In these cases we can avoid the shift
3349 implicit in bitfield extractions.
3351 For constants, we emit a compare of the shifted constant with the
3352 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3353 compared. For two fields at the same position, we do the ANDs with the
3354 similar mask and compare the result of the ANDs.
3356 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3357 COMPARE_TYPE is the type of the comparison, and LHS and RHS
3358 are the left and right operands of the comparison, respectively.
3360 If the optimization described above can be done, we return the resulting
3361 tree. Otherwise we return zero. */
3363 static tree
3364 optimize_bit_field_compare (location_t loc, enum tree_code code,
3365 tree compare_type, tree lhs, tree rhs)
3367 HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3368 tree type = TREE_TYPE (lhs);
3369 tree signed_type, unsigned_type;
3370 int const_p = TREE_CODE (rhs) == INTEGER_CST;
3371 enum machine_mode lmode, rmode, nmode;
3372 int lunsignedp, runsignedp;
3373 int lvolatilep = 0, rvolatilep = 0;
3374 tree linner, rinner = NULL_TREE;
3375 tree mask;
3376 tree offset;
3378 /* Get all the information about the extractions being done. If the bit size
3379 if the same as the size of the underlying object, we aren't doing an
3380 extraction at all and so can do nothing. We also don't want to
3381 do anything if the inner expression is a PLACEHOLDER_EXPR since we
3382 then will no longer be able to replace it. */
3383 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3384 &lunsignedp, &lvolatilep, false);
3385 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3386 || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR)
3387 return 0;
3389 if (!const_p)
3391 /* If this is not a constant, we can only do something if bit positions,
3392 sizes, and signedness are the same. */
3393 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3394 &runsignedp, &rvolatilep, false);
3396 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3397 || lunsignedp != runsignedp || offset != 0
3398 || TREE_CODE (rinner) == PLACEHOLDER_EXPR)
3399 return 0;
3402 /* See if we can find a mode to refer to this field. We should be able to,
3403 but fail if we can't. */
3404 if (lvolatilep
3405 && GET_MODE_BITSIZE (lmode) > 0
3406 && flag_strict_volatile_bitfields > 0)
3407 nmode = lmode;
3408 else
3409 nmode = get_best_mode (lbitsize, lbitpos, 0, 0,
3410 const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3411 : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3412 TYPE_ALIGN (TREE_TYPE (rinner))),
3413 word_mode, lvolatilep || rvolatilep);
3414 if (nmode == VOIDmode)
3415 return 0;
3417 /* Set signed and unsigned types of the precision of this mode for the
3418 shifts below. */
3419 signed_type = lang_hooks.types.type_for_mode (nmode, 0);
3420 unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3422 /* Compute the bit position and size for the new reference and our offset
3423 within it. If the new reference is the same size as the original, we
3424 won't optimize anything, so return zero. */
3425 nbitsize = GET_MODE_BITSIZE (nmode);
3426 nbitpos = lbitpos & ~ (nbitsize - 1);
3427 lbitpos -= nbitpos;
3428 if (nbitsize == lbitsize)
3429 return 0;
3431 if (BYTES_BIG_ENDIAN)
3432 lbitpos = nbitsize - lbitsize - lbitpos;
3434 /* Make the mask to be used against the extracted field. */
3435 mask = build_int_cst_type (unsigned_type, -1);
3436 mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize));
3437 mask = const_binop (RSHIFT_EXPR, mask,
3438 size_int (nbitsize - lbitsize - lbitpos));
3440 if (! const_p)
3441 /* If not comparing with constant, just rework the comparison
3442 and return. */
3443 return fold_build2_loc (loc, code, compare_type,
3444 fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3445 make_bit_field_ref (loc, linner,
3446 unsigned_type,
3447 nbitsize, nbitpos,
3449 mask),
3450 fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3451 make_bit_field_ref (loc, rinner,
3452 unsigned_type,
3453 nbitsize, nbitpos,
3455 mask));
3457 /* Otherwise, we are handling the constant case. See if the constant is too
3458 big for the field. Warn and return a tree of for 0 (false) if so. We do
3459 this not only for its own sake, but to avoid having to test for this
3460 error case below. If we didn't, we might generate wrong code.
3462 For unsigned fields, the constant shifted right by the field length should
3463 be all zero. For signed fields, the high-order bits should agree with
3464 the sign bit. */
3466 if (lunsignedp)
3468 if (! integer_zerop (const_binop (RSHIFT_EXPR,
3469 fold_convert_loc (loc,
3470 unsigned_type, rhs),
3471 size_int (lbitsize))))
3473 warning (0, "comparison is always %d due to width of bit-field",
3474 code == NE_EXPR);
3475 return constant_boolean_node (code == NE_EXPR, compare_type);
3478 else
3480 tree tem = const_binop (RSHIFT_EXPR,
3481 fold_convert_loc (loc, signed_type, rhs),
3482 size_int (lbitsize - 1));
3483 if (! integer_zerop (tem) && ! integer_all_onesp (tem))
3485 warning (0, "comparison is always %d due to width of bit-field",
3486 code == NE_EXPR);
3487 return constant_boolean_node (code == NE_EXPR, compare_type);
3491 /* Single-bit compares should always be against zero. */
3492 if (lbitsize == 1 && ! integer_zerop (rhs))
3494 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3495 rhs = build_int_cst (type, 0);
3498 /* Make a new bitfield reference, shift the constant over the
3499 appropriate number of bits and mask it with the computed mask
3500 (in case this was a signed field). If we changed it, make a new one. */
3501 lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1);
3502 if (lvolatilep)
3504 TREE_SIDE_EFFECTS (lhs) = 1;
3505 TREE_THIS_VOLATILE (lhs) = 1;
3508 rhs = const_binop (BIT_AND_EXPR,
3509 const_binop (LSHIFT_EXPR,
3510 fold_convert_loc (loc, unsigned_type, rhs),
3511 size_int (lbitpos)),
3512 mask);
3514 lhs = build2_loc (loc, code, compare_type,
3515 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs);
3516 return lhs;
3519 /* Subroutine for fold_truth_andor_1: decode a field reference.
3521 If EXP is a comparison reference, we return the innermost reference.
3523 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3524 set to the starting bit number.
3526 If the innermost field can be completely contained in a mode-sized
3527 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode.
3529 *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3530 otherwise it is not changed.
3532 *PUNSIGNEDP is set to the signedness of the field.
3534 *PMASK is set to the mask used. This is either contained in a
3535 BIT_AND_EXPR or derived from the width of the field.
3537 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3539 Return 0 if this is not a component reference or is one that we can't
3540 do anything with. */
3542 static tree
3543 decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
3544 HOST_WIDE_INT *pbitpos, enum machine_mode *pmode,
3545 int *punsignedp, int *pvolatilep,
3546 tree *pmask, tree *pand_mask)
3548 tree outer_type = 0;
3549 tree and_mask = 0;
3550 tree mask, inner, offset;
3551 tree unsigned_type;
3552 unsigned int precision;
3554 /* All the optimizations using this function assume integer fields.
3555 There are problems with FP fields since the type_for_size call
3556 below can fail for, e.g., XFmode. */
3557 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3558 return 0;
3560 /* We are interested in the bare arrangement of bits, so strip everything
3561 that doesn't affect the machine mode. However, record the type of the
3562 outermost expression if it may matter below. */
3563 if (CONVERT_EXPR_P (exp)
3564 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3565 outer_type = TREE_TYPE (exp);
3566 STRIP_NOPS (exp);
3568 if (TREE_CODE (exp) == BIT_AND_EXPR)
3570 and_mask = TREE_OPERAND (exp, 1);
3571 exp = TREE_OPERAND (exp, 0);
3572 STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3573 if (TREE_CODE (and_mask) != INTEGER_CST)
3574 return 0;
3577 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3578 punsignedp, pvolatilep, false);
3579 if ((inner == exp && and_mask == 0)
3580 || *pbitsize < 0 || offset != 0
3581 || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3582 return 0;
3584 /* If the number of bits in the reference is the same as the bitsize of
3585 the outer type, then the outer type gives the signedness. Otherwise
3586 (in case of a small bitfield) the signedness is unchanged. */
3587 if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3588 *punsignedp = TYPE_UNSIGNED (outer_type);
3590 /* Compute the mask to access the bitfield. */
3591 unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3592 precision = TYPE_PRECISION (unsigned_type);
3594 mask = build_int_cst_type (unsigned_type, -1);
3596 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3597 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3599 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */
3600 if (and_mask != 0)
3601 mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3602 fold_convert_loc (loc, unsigned_type, and_mask), mask);
3604 *pmask = mask;
3605 *pand_mask = and_mask;
3606 return inner;
3609 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3610 bit positions. */
3612 static int
3613 all_ones_mask_p (const_tree mask, int size)
3615 tree type = TREE_TYPE (mask);
3616 unsigned int precision = TYPE_PRECISION (type);
3617 tree tmask;
3619 tmask = build_int_cst_type (signed_type_for (type), -1);
3621 return
3622 tree_int_cst_equal (mask,
3623 const_binop (RSHIFT_EXPR,
3624 const_binop (LSHIFT_EXPR, tmask,
3625 size_int (precision - size)),
3626 size_int (precision - size)));
3629 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3630 represents the sign bit of EXP's type. If EXP represents a sign
3631 or zero extension, also test VAL against the unextended type.
3632 The return value is the (sub)expression whose sign bit is VAL,
3633 or NULL_TREE otherwise. */
3635 static tree
3636 sign_bit_p (tree exp, const_tree val)
3638 unsigned HOST_WIDE_INT mask_lo, lo;
3639 HOST_WIDE_INT mask_hi, hi;
3640 int width;
3641 tree t;
3643 /* Tree EXP must have an integral type. */
3644 t = TREE_TYPE (exp);
3645 if (! INTEGRAL_TYPE_P (t))
3646 return NULL_TREE;
3648 /* Tree VAL must be an integer constant. */
3649 if (TREE_CODE (val) != INTEGER_CST
3650 || TREE_OVERFLOW (val))
3651 return NULL_TREE;
3653 width = TYPE_PRECISION (t);
3654 if (width > HOST_BITS_PER_WIDE_INT)
3656 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
3657 lo = 0;
3659 mask_hi = ((unsigned HOST_WIDE_INT) -1
3660 >> (2 * HOST_BITS_PER_WIDE_INT - width));
3661 mask_lo = -1;
3663 else
3665 hi = 0;
3666 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
3668 mask_hi = 0;
3669 mask_lo = ((unsigned HOST_WIDE_INT) -1
3670 >> (HOST_BITS_PER_WIDE_INT - width));
3673 /* We mask off those bits beyond TREE_TYPE (exp) so that we can
3674 treat VAL as if it were unsigned. */
3675 if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi
3676 && (TREE_INT_CST_LOW (val) & mask_lo) == lo)
3677 return exp;
3679 /* Handle extension from a narrower type. */
3680 if (TREE_CODE (exp) == NOP_EXPR
3681 && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
3682 return sign_bit_p (TREE_OPERAND (exp, 0), val);
3684 return NULL_TREE;
3687 /* Subroutine for fold_truth_andor_1: determine if an operand is simple enough
3688 to be evaluated unconditionally. */
3690 static int
3691 simple_operand_p (const_tree exp)
3693 /* Strip any conversions that don't change the machine mode. */
3694 STRIP_NOPS (exp);
3696 return (CONSTANT_CLASS_P (exp)
3697 || TREE_CODE (exp) == SSA_NAME
3698 || (DECL_P (exp)
3699 && ! TREE_ADDRESSABLE (exp)
3700 && ! TREE_THIS_VOLATILE (exp)
3701 && ! DECL_NONLOCAL (exp)
3702 /* Don't regard global variables as simple. They may be
3703 allocated in ways unknown to the compiler (shared memory,
3704 #pragma weak, etc). */
3705 && ! TREE_PUBLIC (exp)
3706 && ! DECL_EXTERNAL (exp)
3707 /* Loading a static variable is unduly expensive, but global
3708 registers aren't expensive. */
3709 && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
3712 /* Subroutine for fold_truth_andor: determine if an operand is simple enough
3713 to be evaluated unconditionally.
3714 I addition to simple_operand_p, we assume that comparisons, conversions,
3715 and logic-not operations are simple, if their operands are simple, too. */
3717 static bool
3718 simple_operand_p_2 (tree exp)
3720 enum tree_code code;
3722 if (TREE_SIDE_EFFECTS (exp)
3723 || tree_could_trap_p (exp))
3724 return false;
3726 while (CONVERT_EXPR_P (exp))
3727 exp = TREE_OPERAND (exp, 0);
3729 code = TREE_CODE (exp);
3731 if (TREE_CODE_CLASS (code) == tcc_comparison)
3732 return (simple_operand_p (TREE_OPERAND (exp, 0))
3733 && simple_operand_p (TREE_OPERAND (exp, 1)));
3735 if (code == TRUTH_NOT_EXPR)
3736 return simple_operand_p_2 (TREE_OPERAND (exp, 0));
3738 return simple_operand_p (exp);
3742 /* The following functions are subroutines to fold_range_test and allow it to
3743 try to change a logical combination of comparisons into a range test.
3745 For example, both
3746 X == 2 || X == 3 || X == 4 || X == 5
3748 X >= 2 && X <= 5
3749 are converted to
3750 (unsigned) (X - 2) <= 3
3752 We describe each set of comparisons as being either inside or outside
3753 a range, using a variable named like IN_P, and then describe the
3754 range with a lower and upper bound. If one of the bounds is omitted,
3755 it represents either the highest or lowest value of the type.
3757 In the comments below, we represent a range by two numbers in brackets
3758 preceded by a "+" to designate being inside that range, or a "-" to
3759 designate being outside that range, so the condition can be inverted by
3760 flipping the prefix. An omitted bound is represented by a "-". For
3761 example, "- [-, 10]" means being outside the range starting at the lowest
3762 possible value and ending at 10, in other words, being greater than 10.
3763 The range "+ [-, -]" is always true and hence the range "- [-, -]" is
3764 always false.
3766 We set up things so that the missing bounds are handled in a consistent
3767 manner so neither a missing bound nor "true" and "false" need to be
3768 handled using a special case. */
3770 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
3771 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
3772 and UPPER1_P are nonzero if the respective argument is an upper bound
3773 and zero for a lower. TYPE, if nonzero, is the type of the result; it
3774 must be specified for a comparison. ARG1 will be converted to ARG0's
3775 type if both are specified. */
3777 static tree
3778 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
3779 tree arg1, int upper1_p)
3781 tree tem;
3782 int result;
3783 int sgn0, sgn1;
3785 /* If neither arg represents infinity, do the normal operation.
3786 Else, if not a comparison, return infinity. Else handle the special
3787 comparison rules. Note that most of the cases below won't occur, but
3788 are handled for consistency. */
3790 if (arg0 != 0 && arg1 != 0)
3792 tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
3793 arg0, fold_convert (TREE_TYPE (arg0), arg1));
3794 STRIP_NOPS (tem);
3795 return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
3798 if (TREE_CODE_CLASS (code) != tcc_comparison)
3799 return 0;
3801 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
3802 for neither. In real maths, we cannot assume open ended ranges are
3803 the same. But, this is computer arithmetic, where numbers are finite.
3804 We can therefore make the transformation of any unbounded range with
3805 the value Z, Z being greater than any representable number. This permits
3806 us to treat unbounded ranges as equal. */
3807 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
3808 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
3809 switch (code)
3811 case EQ_EXPR:
3812 result = sgn0 == sgn1;
3813 break;
3814 case NE_EXPR:
3815 result = sgn0 != sgn1;
3816 break;
3817 case LT_EXPR:
3818 result = sgn0 < sgn1;
3819 break;
3820 case LE_EXPR:
3821 result = sgn0 <= sgn1;
3822 break;
3823 case GT_EXPR:
3824 result = sgn0 > sgn1;
3825 break;
3826 case GE_EXPR:
3827 result = sgn0 >= sgn1;
3828 break;
3829 default:
3830 gcc_unreachable ();
3833 return constant_boolean_node (result, type);
3836 /* Helper routine for make_range. Perform one step for it, return
3837 new expression if the loop should continue or NULL_TREE if it should
3838 stop. */
3840 tree
3841 make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
3842 tree exp_type, tree *p_low, tree *p_high, int *p_in_p,
3843 bool *strict_overflow_p)
3845 tree arg0_type = TREE_TYPE (arg0);
3846 tree n_low, n_high, low = *p_low, high = *p_high;
3847 int in_p = *p_in_p, n_in_p;
3849 switch (code)
3851 case TRUTH_NOT_EXPR:
3852 /* We can only do something if the range is testing for zero. */
3853 if (low == NULL_TREE || high == NULL_TREE
3854 || ! integer_zerop (low) || ! integer_zerop (high))
3855 return NULL_TREE;
3856 *p_in_p = ! in_p;
3857 return arg0;
3859 case EQ_EXPR: case NE_EXPR:
3860 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
3861 /* We can only do something if the range is testing for zero
3862 and if the second operand is an integer constant. Note that
3863 saying something is "in" the range we make is done by
3864 complementing IN_P since it will set in the initial case of
3865 being not equal to zero; "out" is leaving it alone. */
3866 if (low == NULL_TREE || high == NULL_TREE
3867 || ! integer_zerop (low) || ! integer_zerop (high)
3868 || TREE_CODE (arg1) != INTEGER_CST)
3869 return NULL_TREE;
3871 switch (code)
3873 case NE_EXPR: /* - [c, c] */
3874 low = high = arg1;
3875 break;
3876 case EQ_EXPR: /* + [c, c] */
3877 in_p = ! in_p, low = high = arg1;
3878 break;
3879 case GT_EXPR: /* - [-, c] */
3880 low = 0, high = arg1;
3881 break;
3882 case GE_EXPR: /* + [c, -] */
3883 in_p = ! in_p, low = arg1, high = 0;
3884 break;
3885 case LT_EXPR: /* - [c, -] */
3886 low = arg1, high = 0;
3887 break;
3888 case LE_EXPR: /* + [-, c] */
3889 in_p = ! in_p, low = 0, high = arg1;
3890 break;
3891 default:
3892 gcc_unreachable ();
3895 /* If this is an unsigned comparison, we also know that EXP is
3896 greater than or equal to zero. We base the range tests we make
3897 on that fact, so we record it here so we can parse existing
3898 range tests. We test arg0_type since often the return type
3899 of, e.g. EQ_EXPR, is boolean. */
3900 if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
3902 if (! merge_ranges (&n_in_p, &n_low, &n_high,
3903 in_p, low, high, 1,
3904 build_int_cst (arg0_type, 0),
3905 NULL_TREE))
3906 return NULL_TREE;
3908 in_p = n_in_p, low = n_low, high = n_high;
3910 /* If the high bound is missing, but we have a nonzero low
3911 bound, reverse the range so it goes from zero to the low bound
3912 minus 1. */
3913 if (high == 0 && low && ! integer_zerop (low))
3915 in_p = ! in_p;
3916 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
3917 integer_one_node, 0);
3918 low = build_int_cst (arg0_type, 0);
3922 *p_low = low;
3923 *p_high = high;
3924 *p_in_p = in_p;
3925 return arg0;
3927 case NEGATE_EXPR:
3928 /* If flag_wrapv and ARG0_TYPE is signed, make sure
3929 low and high are non-NULL, then normalize will DTRT. */
3930 if (!TYPE_UNSIGNED (arg0_type)
3931 && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
3933 if (low == NULL_TREE)
3934 low = TYPE_MIN_VALUE (arg0_type);
3935 if (high == NULL_TREE)
3936 high = TYPE_MAX_VALUE (arg0_type);
3939 /* (-x) IN [a,b] -> x in [-b, -a] */
3940 n_low = range_binop (MINUS_EXPR, exp_type,
3941 build_int_cst (exp_type, 0),
3942 0, high, 1);
3943 n_high = range_binop (MINUS_EXPR, exp_type,
3944 build_int_cst (exp_type, 0),
3945 0, low, 0);
3946 if (n_high != 0 && TREE_OVERFLOW (n_high))
3947 return NULL_TREE;
3948 goto normalize;
3950 case BIT_NOT_EXPR:
3951 /* ~ X -> -X - 1 */
3952 return build2_loc (loc, MINUS_EXPR, exp_type, negate_expr (arg0),
3953 build_int_cst (exp_type, 1));
3955 case PLUS_EXPR:
3956 case MINUS_EXPR:
3957 if (TREE_CODE (arg1) != INTEGER_CST)
3958 return NULL_TREE;
3960 /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
3961 move a constant to the other side. */
3962 if (!TYPE_UNSIGNED (arg0_type)
3963 && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
3964 return NULL_TREE;
3966 /* If EXP is signed, any overflow in the computation is undefined,
3967 so we don't worry about it so long as our computations on
3968 the bounds don't overflow. For unsigned, overflow is defined
3969 and this is exactly the right thing. */
3970 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3971 arg0_type, low, 0, arg1, 0);
3972 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
3973 arg0_type, high, 1, arg1, 0);
3974 if ((n_low != 0 && TREE_OVERFLOW (n_low))
3975 || (n_high != 0 && TREE_OVERFLOW (n_high)))
3976 return NULL_TREE;
3978 if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
3979 *strict_overflow_p = true;
3981 normalize:
3982 /* Check for an unsigned range which has wrapped around the maximum
3983 value thus making n_high < n_low, and normalize it. */
3984 if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
3986 low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
3987 integer_one_node, 0);
3988 high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
3989 integer_one_node, 0);
3991 /* If the range is of the form +/- [ x+1, x ], we won't
3992 be able to normalize it. But then, it represents the
3993 whole range or the empty set, so make it
3994 +/- [ -, - ]. */
3995 if (tree_int_cst_equal (n_low, low)
3996 && tree_int_cst_equal (n_high, high))
3997 low = high = 0;
3998 else
3999 in_p = ! in_p;
4001 else
4002 low = n_low, high = n_high;
4004 *p_low = low;
4005 *p_high = high;
4006 *p_in_p = in_p;
4007 return arg0;
4009 CASE_CONVERT:
4010 case NON_LVALUE_EXPR:
4011 if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4012 return NULL_TREE;
4014 if (! INTEGRAL_TYPE_P (arg0_type)
4015 || (low != 0 && ! int_fits_type_p (low, arg0_type))
4016 || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4017 return NULL_TREE;
4019 n_low = low, n_high = high;
4021 if (n_low != 0)
4022 n_low = fold_convert_loc (loc, arg0_type, n_low);
4024 if (n_high != 0)
4025 n_high = fold_convert_loc (loc, arg0_type, n_high);
4027 /* If we're converting arg0 from an unsigned type, to exp,
4028 a signed type, we will be doing the comparison as unsigned.
4029 The tests above have already verified that LOW and HIGH
4030 are both positive.
4032 So we have to ensure that we will handle large unsigned
4033 values the same way that the current signed bounds treat
4034 negative values. */
4036 if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4038 tree high_positive;
4039 tree equiv_type;
4040 /* For fixed-point modes, we need to pass the saturating flag
4041 as the 2nd parameter. */
4042 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4043 equiv_type
4044 = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type),
4045 TYPE_SATURATING (arg0_type));
4046 else
4047 equiv_type
4048 = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type), 1);
4050 /* A range without an upper bound is, naturally, unbounded.
4051 Since convert would have cropped a very large value, use
4052 the max value for the destination type. */
4053 high_positive
4054 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4055 : TYPE_MAX_VALUE (arg0_type);
4057 if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4058 high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type,
4059 fold_convert_loc (loc, arg0_type,
4060 high_positive),
4061 build_int_cst (arg0_type, 1));
4063 /* If the low bound is specified, "and" the range with the
4064 range for which the original unsigned value will be
4065 positive. */
4066 if (low != 0)
4068 if (! merge_ranges (&n_in_p, &n_low, &n_high, 1, n_low, n_high,
4069 1, fold_convert_loc (loc, arg0_type,
4070 integer_zero_node),
4071 high_positive))
4072 return NULL_TREE;
4074 in_p = (n_in_p == in_p);
4076 else
4078 /* Otherwise, "or" the range with the range of the input
4079 that will be interpreted as negative. */
4080 if (! merge_ranges (&n_in_p, &n_low, &n_high, 0, n_low, n_high,
4081 1, fold_convert_loc (loc, arg0_type,
4082 integer_zero_node),
4083 high_positive))
4084 return NULL_TREE;
4086 in_p = (in_p != n_in_p);
4090 *p_low = n_low;
4091 *p_high = n_high;
4092 *p_in_p = in_p;
4093 return arg0;
4095 default:
4096 return NULL_TREE;
4100 /* Given EXP, a logical expression, set the range it is testing into
4101 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression
4102 actually being tested. *PLOW and *PHIGH will be made of the same
4103 type as the returned expression. If EXP is not a comparison, we
4104 will most likely not be returning a useful value and range. Set
4105 *STRICT_OVERFLOW_P to true if the return value is only valid
4106 because signed overflow is undefined; otherwise, do not change
4107 *STRICT_OVERFLOW_P. */
4109 tree
4110 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4111 bool *strict_overflow_p)
4113 enum tree_code code;
4114 tree arg0, arg1 = NULL_TREE;
4115 tree exp_type, nexp;
4116 int in_p;
4117 tree low, high;
4118 location_t loc = EXPR_LOCATION (exp);
4120 /* Start with simply saying "EXP != 0" and then look at the code of EXP
4121 and see if we can refine the range. Some of the cases below may not
4122 happen, but it doesn't seem worth worrying about this. We "continue"
4123 the outer loop when we've changed something; otherwise we "break"
4124 the switch, which will "break" the while. */
4126 in_p = 0;
4127 low = high = build_int_cst (TREE_TYPE (exp), 0);
4129 while (1)
4131 code = TREE_CODE (exp);
4132 exp_type = TREE_TYPE (exp);
4133 arg0 = NULL_TREE;
4135 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4137 if (TREE_OPERAND_LENGTH (exp) > 0)
4138 arg0 = TREE_OPERAND (exp, 0);
4139 if (TREE_CODE_CLASS (code) == tcc_binary
4140 || TREE_CODE_CLASS (code) == tcc_comparison
4141 || (TREE_CODE_CLASS (code) == tcc_expression
4142 && TREE_OPERAND_LENGTH (exp) > 1))
4143 arg1 = TREE_OPERAND (exp, 1);
4145 if (arg0 == NULL_TREE)
4146 break;
4148 nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low,
4149 &high, &in_p, strict_overflow_p);
4150 if (nexp == NULL_TREE)
4151 break;
4152 exp = nexp;
4155 /* If EXP is a constant, we can evaluate whether this is true or false. */
4156 if (TREE_CODE (exp) == INTEGER_CST)
4158 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4159 exp, 0, low, 0))
4160 && integer_onep (range_binop (LE_EXPR, integer_type_node,
4161 exp, 1, high, 1)));
4162 low = high = 0;
4163 exp = 0;
4166 *pin_p = in_p, *plow = low, *phigh = high;
4167 return exp;
4170 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4171 type, TYPE, return an expression to test if EXP is in (or out of, depending
4172 on IN_P) the range. Return 0 if the test couldn't be created. */
4174 tree
4175 build_range_check (location_t loc, tree type, tree exp, int in_p,
4176 tree low, tree high)
4178 tree etype = TREE_TYPE (exp), value;
4180 #ifdef HAVE_canonicalize_funcptr_for_compare
4181 /* Disable this optimization for function pointer expressions
4182 on targets that require function pointer canonicalization. */
4183 if (HAVE_canonicalize_funcptr_for_compare
4184 && TREE_CODE (etype) == POINTER_TYPE
4185 && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4186 return NULL_TREE;
4187 #endif
4189 if (! in_p)
4191 value = build_range_check (loc, type, exp, 1, low, high);
4192 if (value != 0)
4193 return invert_truthvalue_loc (loc, value);
4195 return 0;
4198 if (low == 0 && high == 0)
4199 return build_int_cst (type, 1);
4201 if (low == 0)
4202 return fold_build2_loc (loc, LE_EXPR, type, exp,
4203 fold_convert_loc (loc, etype, high));
4205 if (high == 0)
4206 return fold_build2_loc (loc, GE_EXPR, type, exp,
4207 fold_convert_loc (loc, etype, low));
4209 if (operand_equal_p (low, high, 0))
4210 return fold_build2_loc (loc, EQ_EXPR, type, exp,
4211 fold_convert_loc (loc, etype, low));
4213 if (integer_zerop (low))
4215 if (! TYPE_UNSIGNED (etype))
4217 etype = unsigned_type_for (etype);
4218 high = fold_convert_loc (loc, etype, high);
4219 exp = fold_convert_loc (loc, etype, exp);
4221 return build_range_check (loc, type, exp, 1, 0, high);
4224 /* Optimize (c>=1) && (c<=127) into (signed char)c > 0. */
4225 if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4227 unsigned HOST_WIDE_INT lo;
4228 HOST_WIDE_INT hi;
4229 int prec;
4231 prec = TYPE_PRECISION (etype);
4232 if (prec <= HOST_BITS_PER_WIDE_INT)
4234 hi = 0;
4235 lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1;
4237 else
4239 hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1;
4240 lo = (unsigned HOST_WIDE_INT) -1;
4243 if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo)
4245 if (TYPE_UNSIGNED (etype))
4247 tree signed_etype = signed_type_for (etype);
4248 if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4249 etype
4250 = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4251 else
4252 etype = signed_etype;
4253 exp = fold_convert_loc (loc, etype, exp);
4255 return fold_build2_loc (loc, GT_EXPR, type, exp,
4256 build_int_cst (etype, 0));
4260 /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4261 This requires wrap-around arithmetics for the type of the expression.
4262 First make sure that arithmetics in this type is valid, then make sure
4263 that it wraps around. */
4264 if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE)
4265 etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4266 TYPE_UNSIGNED (etype));
4268 if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype))
4270 tree utype, minv, maxv;
4272 /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4273 for the type in question, as we rely on this here. */
4274 utype = unsigned_type_for (etype);
4275 maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype));
4276 maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4277 integer_one_node, 1);
4278 minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype));
4280 if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4281 minv, 1, maxv, 1)))
4282 etype = utype;
4283 else
4284 return 0;
4287 high = fold_convert_loc (loc, etype, high);
4288 low = fold_convert_loc (loc, etype, low);
4289 exp = fold_convert_loc (loc, etype, exp);
4291 value = const_binop (MINUS_EXPR, high, low);
4294 if (POINTER_TYPE_P (etype))
4296 if (value != 0 && !TREE_OVERFLOW (value))
4298 low = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (low), low);
4299 return build_range_check (loc, type,
4300 fold_build_pointer_plus_loc (loc, exp, low),
4301 1, build_int_cst (etype, 0), value);
4303 return 0;
4306 if (value != 0 && !TREE_OVERFLOW (value))
4307 return build_range_check (loc, type,
4308 fold_build2_loc (loc, MINUS_EXPR, etype, exp, low),
4309 1, build_int_cst (etype, 0), value);
4311 return 0;
4314 /* Return the predecessor of VAL in its type, handling the infinite case. */
4316 static tree
4317 range_predecessor (tree val)
4319 tree type = TREE_TYPE (val);
4321 if (INTEGRAL_TYPE_P (type)
4322 && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4323 return 0;
4324 else
4325 return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4328 /* Return the successor of VAL in its type, handling the infinite case. */
4330 static tree
4331 range_successor (tree val)
4333 tree type = TREE_TYPE (val);
4335 if (INTEGRAL_TYPE_P (type)
4336 && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4337 return 0;
4338 else
4339 return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0);
4342 /* Given two ranges, see if we can merge them into one. Return 1 if we
4343 can, 0 if we can't. Set the output range into the specified parameters. */
4345 bool
4346 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4347 tree high0, int in1_p, tree low1, tree high1)
4349 int no_overlap;
4350 int subset;
4351 int temp;
4352 tree tem;
4353 int in_p;
4354 tree low, high;
4355 int lowequal = ((low0 == 0 && low1 == 0)
4356 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4357 low0, 0, low1, 0)));
4358 int highequal = ((high0 == 0 && high1 == 0)
4359 || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4360 high0, 1, high1, 1)));
4362 /* Make range 0 be the range that starts first, or ends last if they
4363 start at the same value. Swap them if it isn't. */
4364 if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4365 low0, 0, low1, 0))
4366 || (lowequal
4367 && integer_onep (range_binop (GT_EXPR, integer_type_node,
4368 high1, 1, high0, 1))))
4370 temp = in0_p, in0_p = in1_p, in1_p = temp;
4371 tem = low0, low0 = low1, low1 = tem;
4372 tem = high0, high0 = high1, high1 = tem;
4375 /* Now flag two cases, whether the ranges are disjoint or whether the
4376 second range is totally subsumed in the first. Note that the tests
4377 below are simplified by the ones above. */
4378 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4379 high0, 1, low1, 0));
4380 subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4381 high1, 1, high0, 1));
4383 /* We now have four cases, depending on whether we are including or
4384 excluding the two ranges. */
4385 if (in0_p && in1_p)
4387 /* If they don't overlap, the result is false. If the second range
4388 is a subset it is the result. Otherwise, the range is from the start
4389 of the second to the end of the first. */
4390 if (no_overlap)
4391 in_p = 0, low = high = 0;
4392 else if (subset)
4393 in_p = 1, low = low1, high = high1;
4394 else
4395 in_p = 1, low = low1, high = high0;
4398 else if (in0_p && ! in1_p)
4400 /* If they don't overlap, the result is the first range. If they are
4401 equal, the result is false. If the second range is a subset of the
4402 first, and the ranges begin at the same place, we go from just after
4403 the end of the second range to the end of the first. If the second
4404 range is not a subset of the first, or if it is a subset and both
4405 ranges end at the same place, the range starts at the start of the
4406 first range and ends just before the second range.
4407 Otherwise, we can't describe this as a single range. */
4408 if (no_overlap)
4409 in_p = 1, low = low0, high = high0;
4410 else if (lowequal && highequal)
4411 in_p = 0, low = high = 0;
4412 else if (subset && lowequal)
4414 low = range_successor (high1);
4415 high = high0;
4416 in_p = 1;
4417 if (low == 0)
4419 /* We are in the weird situation where high0 > high1 but
4420 high1 has no successor. Punt. */
4421 return 0;
4424 else if (! subset || highequal)
4426 low = low0;
4427 high = range_predecessor (low1);
4428 in_p = 1;
4429 if (high == 0)
4431 /* low0 < low1 but low1 has no predecessor. Punt. */
4432 return 0;
4435 else
4436 return 0;
4439 else if (! in0_p && in1_p)
4441 /* If they don't overlap, the result is the second range. If the second
4442 is a subset of the first, the result is false. Otherwise,
4443 the range starts just after the first range and ends at the
4444 end of the second. */
4445 if (no_overlap)
4446 in_p = 1, low = low1, high = high1;
4447 else if (subset || highequal)
4448 in_p = 0, low = high = 0;
4449 else
4451 low = range_successor (high0);
4452 high = high1;
4453 in_p = 1;
4454 if (low == 0)
4456 /* high1 > high0 but high0 has no successor. Punt. */
4457 return 0;
4462 else
4464 /* The case where we are excluding both ranges. Here the complex case
4465 is if they don't overlap. In that case, the only time we have a
4466 range is if they are adjacent. If the second is a subset of the
4467 first, the result is the first. Otherwise, the range to exclude
4468 starts at the beginning of the first range and ends at the end of the
4469 second. */
4470 if (no_overlap)
4472 if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4473 range_successor (high0),
4474 1, low1, 0)))
4475 in_p = 0, low = low0, high = high1;
4476 else
4478 /* Canonicalize - [min, x] into - [-, x]. */
4479 if (low0 && TREE_CODE (low0) == INTEGER_CST)
4480 switch (TREE_CODE (TREE_TYPE (low0)))
4482 case ENUMERAL_TYPE:
4483 if (TYPE_PRECISION (TREE_TYPE (low0))
4484 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4485 break;
4486 /* FALLTHROUGH */
4487 case INTEGER_TYPE:
4488 if (tree_int_cst_equal (low0,
4489 TYPE_MIN_VALUE (TREE_TYPE (low0))))
4490 low0 = 0;
4491 break;
4492 case POINTER_TYPE:
4493 if (TYPE_UNSIGNED (TREE_TYPE (low0))
4494 && integer_zerop (low0))
4495 low0 = 0;
4496 break;
4497 default:
4498 break;
4501 /* Canonicalize - [x, max] into - [x, -]. */
4502 if (high1 && TREE_CODE (high1) == INTEGER_CST)
4503 switch (TREE_CODE (TREE_TYPE (high1)))
4505 case ENUMERAL_TYPE:
4506 if (TYPE_PRECISION (TREE_TYPE (high1))
4507 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4508 break;
4509 /* FALLTHROUGH */
4510 case INTEGER_TYPE:
4511 if (tree_int_cst_equal (high1,
4512 TYPE_MAX_VALUE (TREE_TYPE (high1))))
4513 high1 = 0;
4514 break;
4515 case POINTER_TYPE:
4516 if (TYPE_UNSIGNED (TREE_TYPE (high1))
4517 && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4518 high1, 1,
4519 integer_one_node, 1)))
4520 high1 = 0;
4521 break;
4522 default:
4523 break;
4526 /* The ranges might be also adjacent between the maximum and
4527 minimum values of the given type. For
4528 - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4529 return + [x + 1, y - 1]. */
4530 if (low0 == 0 && high1 == 0)
4532 low = range_successor (high0);
4533 high = range_predecessor (low1);
4534 if (low == 0 || high == 0)
4535 return 0;
4537 in_p = 1;
4539 else
4540 return 0;
4543 else if (subset)
4544 in_p = 0, low = low0, high = high0;
4545 else
4546 in_p = 0, low = low0, high = high1;
4549 *pin_p = in_p, *plow = low, *phigh = high;
4550 return 1;
4554 /* Subroutine of fold, looking inside expressions of the form
4555 A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4556 of the COND_EXPR. This function is being used also to optimize
4557 A op B ? C : A, by reversing the comparison first.
4559 Return a folded expression whose code is not a COND_EXPR
4560 anymore, or NULL_TREE if no folding opportunity is found. */
4562 static tree
4563 fold_cond_expr_with_comparison (location_t loc, tree type,
4564 tree arg0, tree arg1, tree arg2)
4566 enum tree_code comp_code = TREE_CODE (arg0);
4567 tree arg00 = TREE_OPERAND (arg0, 0);
4568 tree arg01 = TREE_OPERAND (arg0, 1);
4569 tree arg1_type = TREE_TYPE (arg1);
4570 tree tem;
4572 STRIP_NOPS (arg1);
4573 STRIP_NOPS (arg2);
4575 /* If we have A op 0 ? A : -A, consider applying the following
4576 transformations:
4578 A == 0? A : -A same as -A
4579 A != 0? A : -A same as A
4580 A >= 0? A : -A same as abs (A)
4581 A > 0? A : -A same as abs (A)
4582 A <= 0? A : -A same as -abs (A)
4583 A < 0? A : -A same as -abs (A)
4585 None of these transformations work for modes with signed
4586 zeros. If A is +/-0, the first two transformations will
4587 change the sign of the result (from +0 to -0, or vice
4588 versa). The last four will fix the sign of the result,
4589 even though the original expressions could be positive or
4590 negative, depending on the sign of A.
4592 Note that all these transformations are correct if A is
4593 NaN, since the two alternatives (A and -A) are also NaNs. */
4594 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4595 && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4596 ? real_zerop (arg01)
4597 : integer_zerop (arg01))
4598 && ((TREE_CODE (arg2) == NEGATE_EXPR
4599 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4600 /* In the case that A is of the form X-Y, '-A' (arg2) may
4601 have already been folded to Y-X, check for that. */
4602 || (TREE_CODE (arg1) == MINUS_EXPR
4603 && TREE_CODE (arg2) == MINUS_EXPR
4604 && operand_equal_p (TREE_OPERAND (arg1, 0),
4605 TREE_OPERAND (arg2, 1), 0)
4606 && operand_equal_p (TREE_OPERAND (arg1, 1),
4607 TREE_OPERAND (arg2, 0), 0))))
4608 switch (comp_code)
4610 case EQ_EXPR:
4611 case UNEQ_EXPR:
4612 tem = fold_convert_loc (loc, arg1_type, arg1);
4613 return pedantic_non_lvalue_loc (loc,
4614 fold_convert_loc (loc, type,
4615 negate_expr (tem)));
4616 case NE_EXPR:
4617 case LTGT_EXPR:
4618 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4619 case UNGE_EXPR:
4620 case UNGT_EXPR:
4621 if (flag_trapping_math)
4622 break;
4623 /* Fall through. */
4624 case GE_EXPR:
4625 case GT_EXPR:
4626 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4627 arg1 = fold_convert_loc (loc, signed_type_for
4628 (TREE_TYPE (arg1)), arg1);
4629 tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4630 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
4631 case UNLE_EXPR:
4632 case UNLT_EXPR:
4633 if (flag_trapping_math)
4634 break;
4635 case LE_EXPR:
4636 case LT_EXPR:
4637 if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4638 arg1 = fold_convert_loc (loc, signed_type_for
4639 (TREE_TYPE (arg1)), arg1);
4640 tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4641 return negate_expr (fold_convert_loc (loc, type, tem));
4642 default:
4643 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4644 break;
4647 /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise
4648 A == 0 ? A : 0 is always 0 unless A is -0. Note that
4649 both transformations are correct when A is NaN: A != 0
4650 is then true, and A == 0 is false. */
4652 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4653 && integer_zerop (arg01) && integer_zerop (arg2))
4655 if (comp_code == NE_EXPR)
4656 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4657 else if (comp_code == EQ_EXPR)
4658 return build_int_cst (type, 0);
4661 /* Try some transformations of A op B ? A : B.
4663 A == B? A : B same as B
4664 A != B? A : B same as A
4665 A >= B? A : B same as max (A, B)
4666 A > B? A : B same as max (B, A)
4667 A <= B? A : B same as min (A, B)
4668 A < B? A : B same as min (B, A)
4670 As above, these transformations don't work in the presence
4671 of signed zeros. For example, if A and B are zeros of
4672 opposite sign, the first two transformations will change
4673 the sign of the result. In the last four, the original
4674 expressions give different results for (A=+0, B=-0) and
4675 (A=-0, B=+0), but the transformed expressions do not.
4677 The first two transformations are correct if either A or B
4678 is a NaN. In the first transformation, the condition will
4679 be false, and B will indeed be chosen. In the case of the
4680 second transformation, the condition A != B will be true,
4681 and A will be chosen.
4683 The conversions to max() and min() are not correct if B is
4684 a number and A is not. The conditions in the original
4685 expressions will be false, so all four give B. The min()
4686 and max() versions would give a NaN instead. */
4687 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
4688 && operand_equal_for_comparison_p (arg01, arg2, arg00)
4689 /* Avoid these transformations if the COND_EXPR may be used
4690 as an lvalue in the C++ front-end. PR c++/19199. */
4691 && (in_gimple_form
4692 || (strcmp (lang_hooks.name, "GNU C++") != 0
4693 && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
4694 || ! maybe_lvalue_p (arg1)
4695 || ! maybe_lvalue_p (arg2)))
4697 tree comp_op0 = arg00;
4698 tree comp_op1 = arg01;
4699 tree comp_type = TREE_TYPE (comp_op0);
4701 /* Avoid adding NOP_EXPRs in case this is an lvalue. */
4702 if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
4704 comp_type = type;
4705 comp_op0 = arg1;
4706 comp_op1 = arg2;
4709 switch (comp_code)
4711 case EQ_EXPR:
4712 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2));
4713 case NE_EXPR:
4714 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4715 case LE_EXPR:
4716 case LT_EXPR:
4717 case UNLE_EXPR:
4718 case UNLT_EXPR:
4719 /* In C++ a ?: expression can be an lvalue, so put the
4720 operand which will be used if they are equal first
4721 so that we can convert this back to the
4722 corresponding COND_EXPR. */
4723 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4725 comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
4726 comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
4727 tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
4728 ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1)
4729 : fold_build2_loc (loc, MIN_EXPR, comp_type,
4730 comp_op1, comp_op0);
4731 return pedantic_non_lvalue_loc (loc,
4732 fold_convert_loc (loc, type, tem));
4734 break;
4735 case GE_EXPR:
4736 case GT_EXPR:
4737 case UNGE_EXPR:
4738 case UNGT_EXPR:
4739 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4741 comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
4742 comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
4743 tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
4744 ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1)
4745 : fold_build2_loc (loc, MAX_EXPR, comp_type,
4746 comp_op1, comp_op0);
4747 return pedantic_non_lvalue_loc (loc,
4748 fold_convert_loc (loc, type, tem));
4750 break;
4751 case UNEQ_EXPR:
4752 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4753 return pedantic_non_lvalue_loc (loc,
4754 fold_convert_loc (loc, type, arg2));
4755 break;
4756 case LTGT_EXPR:
4757 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))))
4758 return pedantic_non_lvalue_loc (loc,
4759 fold_convert_loc (loc, type, arg1));
4760 break;
4761 default:
4762 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4763 break;
4767 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
4768 we might still be able to simplify this. For example,
4769 if C1 is one less or one more than C2, this might have started
4770 out as a MIN or MAX and been transformed by this function.
4771 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */
4773 if (INTEGRAL_TYPE_P (type)
4774 && TREE_CODE (arg01) == INTEGER_CST
4775 && TREE_CODE (arg2) == INTEGER_CST)
4776 switch (comp_code)
4778 case EQ_EXPR:
4779 if (TREE_CODE (arg1) == INTEGER_CST)
4780 break;
4781 /* We can replace A with C1 in this case. */
4782 arg1 = fold_convert_loc (loc, type, arg01);
4783 return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2);
4785 case LT_EXPR:
4786 /* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for
4787 MIN_EXPR, to preserve the signedness of the comparison. */
4788 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4789 OEP_ONLY_CONST)
4790 && operand_equal_p (arg01,
4791 const_binop (PLUS_EXPR, arg2,
4792 build_int_cst (type, 1)),
4793 OEP_ONLY_CONST))
4795 tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
4796 fold_convert_loc (loc, TREE_TYPE (arg00),
4797 arg2));
4798 return pedantic_non_lvalue_loc (loc,
4799 fold_convert_loc (loc, type, tem));
4801 break;
4803 case LE_EXPR:
4804 /* If C1 is C2 - 1, this is min(A, C2), with the same care
4805 as above. */
4806 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4807 OEP_ONLY_CONST)
4808 && operand_equal_p (arg01,
4809 const_binop (MINUS_EXPR, arg2,
4810 build_int_cst (type, 1)),
4811 OEP_ONLY_CONST))
4813 tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
4814 fold_convert_loc (loc, TREE_TYPE (arg00),
4815 arg2));
4816 return pedantic_non_lvalue_loc (loc,
4817 fold_convert_loc (loc, type, tem));
4819 break;
4821 case GT_EXPR:
4822 /* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
4823 MAX_EXPR, to preserve the signedness of the comparison. */
4824 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
4825 OEP_ONLY_CONST)
4826 && operand_equal_p (arg01,
4827 const_binop (MINUS_EXPR, arg2,
4828 build_int_cst (type, 1)),
4829 OEP_ONLY_CONST))
4831 tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
4832 fold_convert_loc (loc, TREE_TYPE (arg00),
4833 arg2));
4834 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
4836 break;
4838 case GE_EXPR:
4839 /* If C1 is C2 + 1, this is max(A, C2), with the same care as above. */
4840 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
4841 OEP_ONLY_CONST)
4842 && operand_equal_p (arg01,
4843 const_binop (PLUS_EXPR, arg2,
4844 build_int_cst (type, 1)),
4845 OEP_ONLY_CONST))
4847 tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
4848 fold_convert_loc (loc, TREE_TYPE (arg00),
4849 arg2));
4850 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
4852 break;
4853 case NE_EXPR:
4854 break;
4855 default:
4856 gcc_unreachable ();
4859 return NULL_TREE;
4864 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
4865 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
4866 (BRANCH_COST (optimize_function_for_speed_p (cfun), \
4867 false) >= 2)
4868 #endif
4870 /* EXP is some logical combination of boolean tests. See if we can
4871 merge it into some range test. Return the new tree if so. */
4873 static tree
4874 fold_range_test (location_t loc, enum tree_code code, tree type,
4875 tree op0, tree op1)
4877 int or_op = (code == TRUTH_ORIF_EXPR
4878 || code == TRUTH_OR_EXPR);
4879 int in0_p, in1_p, in_p;
4880 tree low0, low1, low, high0, high1, high;
4881 bool strict_overflow_p = false;
4882 tree tem, lhs, rhs;
4883 const char * const warnmsg = G_("assuming signed overflow does not occur "
4884 "when simplifying range test");
4886 if (!INTEGRAL_TYPE_P (type))
4887 return 0;
4889 lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
4890 rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
4892 /* If this is an OR operation, invert both sides; we will invert
4893 again at the end. */
4894 if (or_op)
4895 in0_p = ! in0_p, in1_p = ! in1_p;
4897 /* If both expressions are the same, if we can merge the ranges, and we
4898 can build the range test, return it or it inverted. If one of the
4899 ranges is always true or always false, consider it to be the same
4900 expression as the other. */
4901 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
4902 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
4903 in1_p, low1, high1)
4904 && 0 != (tem = (build_range_check (loc, type,
4905 lhs != 0 ? lhs
4906 : rhs != 0 ? rhs : integer_zero_node,
4907 in_p, low, high))))
4909 if (strict_overflow_p)
4910 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
4911 return or_op ? invert_truthvalue_loc (loc, tem) : tem;
4914 /* On machines where the branch cost is expensive, if this is a
4915 short-circuited branch and the underlying object on both sides
4916 is the same, make a non-short-circuit operation. */
4917 else if (LOGICAL_OP_NON_SHORT_CIRCUIT
4918 && lhs != 0 && rhs != 0
4919 && (code == TRUTH_ANDIF_EXPR
4920 || code == TRUTH_ORIF_EXPR)
4921 && operand_equal_p (lhs, rhs, 0))
4923 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
4924 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
4925 which cases we can't do this. */
4926 if (simple_operand_p (lhs))
4927 return build2_loc (loc, code == TRUTH_ANDIF_EXPR
4928 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4929 type, op0, op1);
4931 else if (!lang_hooks.decls.global_bindings_p ()
4932 && !CONTAINS_PLACEHOLDER_P (lhs))
4934 tree common = save_expr (lhs);
4936 if (0 != (lhs = build_range_check (loc, type, common,
4937 or_op ? ! in0_p : in0_p,
4938 low0, high0))
4939 && (0 != (rhs = build_range_check (loc, type, common,
4940 or_op ? ! in1_p : in1_p,
4941 low1, high1))))
4943 if (strict_overflow_p)
4944 fold_overflow_warning (warnmsg,
4945 WARN_STRICT_OVERFLOW_COMPARISON);
4946 return build2_loc (loc, code == TRUTH_ANDIF_EXPR
4947 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
4948 type, lhs, rhs);
4953 return 0;
4956 /* Subroutine for fold_truth_andor_1: C is an INTEGER_CST interpreted as a P
4957 bit value. Arrange things so the extra bits will be set to zero if and
4958 only if C is signed-extended to its full width. If MASK is nonzero,
4959 it is an INTEGER_CST that should be AND'ed with the extra bits. */
4961 static tree
4962 unextend (tree c, int p, int unsignedp, tree mask)
4964 tree type = TREE_TYPE (c);
4965 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
4966 tree temp;
4968 if (p == modesize || unsignedp)
4969 return c;
4971 /* We work by getting just the sign bit into the low-order bit, then
4972 into the high-order bit, then sign-extend. We then XOR that value
4973 with C. */
4974 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1));
4975 temp = const_binop (BIT_AND_EXPR, temp, size_int (1));
4977 /* We must use a signed type in order to get an arithmetic right shift.
4978 However, we must also avoid introducing accidental overflows, so that
4979 a subsequent call to integer_zerop will work. Hence we must
4980 do the type conversion here. At this point, the constant is either
4981 zero or one, and the conversion to a signed type can never overflow.
4982 We could get an overflow if this conversion is done anywhere else. */
4983 if (TYPE_UNSIGNED (type))
4984 temp = fold_convert (signed_type_for (type), temp);
4986 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1));
4987 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1));
4988 if (mask != 0)
4989 temp = const_binop (BIT_AND_EXPR, temp,
4990 fold_convert (TREE_TYPE (c), mask));
4991 /* If necessary, convert the type back to match the type of C. */
4992 if (TYPE_UNSIGNED (type))
4993 temp = fold_convert (type, temp);
4995 return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp));
4998 /* For an expression that has the form
4999 (A && B) || ~B
5001 (A || B) && ~B,
5002 we can drop one of the inner expressions and simplify to
5003 A || ~B
5005 A && ~B
5006 LOC is the location of the resulting expression. OP is the inner
5007 logical operation; the left-hand side in the examples above, while CMPOP
5008 is the right-hand side. RHS_ONLY is used to prevent us from accidentally
5009 removing a condition that guards another, as in
5010 (A != NULL && A->...) || A == NULL
5011 which we must not transform. If RHS_ONLY is true, only eliminate the
5012 right-most operand of the inner logical operation. */
5014 static tree
5015 merge_truthop_with_opposite_arm (location_t loc, tree op, tree cmpop,
5016 bool rhs_only)
5018 tree type = TREE_TYPE (cmpop);
5019 enum tree_code code = TREE_CODE (cmpop);
5020 enum tree_code truthop_code = TREE_CODE (op);
5021 tree lhs = TREE_OPERAND (op, 0);
5022 tree rhs = TREE_OPERAND (op, 1);
5023 tree orig_lhs = lhs, orig_rhs = rhs;
5024 enum tree_code rhs_code = TREE_CODE (rhs);
5025 enum tree_code lhs_code = TREE_CODE (lhs);
5026 enum tree_code inv_code;
5028 if (TREE_SIDE_EFFECTS (op) || TREE_SIDE_EFFECTS (cmpop))
5029 return NULL_TREE;
5031 if (TREE_CODE_CLASS (code) != tcc_comparison)
5032 return NULL_TREE;
5034 if (rhs_code == truthop_code)
5036 tree newrhs = merge_truthop_with_opposite_arm (loc, rhs, cmpop, rhs_only);
5037 if (newrhs != NULL_TREE)
5039 rhs = newrhs;
5040 rhs_code = TREE_CODE (rhs);
5043 if (lhs_code == truthop_code && !rhs_only)
5045 tree newlhs = merge_truthop_with_opposite_arm (loc, lhs, cmpop, false);
5046 if (newlhs != NULL_TREE)
5048 lhs = newlhs;
5049 lhs_code = TREE_CODE (lhs);
5053 inv_code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (type)));
5054 if (inv_code == rhs_code
5055 && operand_equal_p (TREE_OPERAND (rhs, 0), TREE_OPERAND (cmpop, 0), 0)
5056 && operand_equal_p (TREE_OPERAND (rhs, 1), TREE_OPERAND (cmpop, 1), 0))
5057 return lhs;
5058 if (!rhs_only && inv_code == lhs_code
5059 && operand_equal_p (TREE_OPERAND (lhs, 0), TREE_OPERAND (cmpop, 0), 0)
5060 && operand_equal_p (TREE_OPERAND (lhs, 1), TREE_OPERAND (cmpop, 1), 0))
5061 return rhs;
5062 if (rhs != orig_rhs || lhs != orig_lhs)
5063 return fold_build2_loc (loc, truthop_code, TREE_TYPE (cmpop),
5064 lhs, rhs);
5065 return NULL_TREE;
5068 /* Find ways of folding logical expressions of LHS and RHS:
5069 Try to merge two comparisons to the same innermost item.
5070 Look for range tests like "ch >= '0' && ch <= '9'".
5071 Look for combinations of simple terms on machines with expensive branches
5072 and evaluate the RHS unconditionally.
5074 For example, if we have p->a == 2 && p->b == 4 and we can make an
5075 object large enough to span both A and B, we can do this with a comparison
5076 against the object ANDed with the a mask.
5078 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5079 operations to do this with one comparison.
5081 We check for both normal comparisons and the BIT_AND_EXPRs made this by
5082 function and the one above.
5084 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR,
5085 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5087 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5088 two operands.
5090 We return the simplified tree or 0 if no optimization is possible. */
5092 static tree
5093 fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
5094 tree lhs, tree rhs)
5096 /* If this is the "or" of two comparisons, we can do something if
5097 the comparisons are NE_EXPR. If this is the "and", we can do something
5098 if the comparisons are EQ_EXPR. I.e.,
5099 (a->b == 2 && a->c == 4) can become (a->new == NEW).
5101 WANTED_CODE is this operation code. For single bit fields, we can
5102 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5103 comparison for one-bit fields. */
5105 enum tree_code wanted_code;
5106 enum tree_code lcode, rcode;
5107 tree ll_arg, lr_arg, rl_arg, rr_arg;
5108 tree ll_inner, lr_inner, rl_inner, rr_inner;
5109 HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5110 HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5111 HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5112 HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5113 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5114 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5115 enum machine_mode lnmode, rnmode;
5116 tree ll_mask, lr_mask, rl_mask, rr_mask;
5117 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5118 tree l_const, r_const;
5119 tree lntype, rntype, result;
5120 HOST_WIDE_INT first_bit, end_bit;
5121 int volatilep;
5123 /* Start by getting the comparison codes. Fail if anything is volatile.
5124 If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5125 it were surrounded with a NE_EXPR. */
5127 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5128 return 0;
5130 lcode = TREE_CODE (lhs);
5131 rcode = TREE_CODE (rhs);
5133 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5135 lhs = build2 (NE_EXPR, truth_type, lhs,
5136 build_int_cst (TREE_TYPE (lhs), 0));
5137 lcode = NE_EXPR;
5140 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5142 rhs = build2 (NE_EXPR, truth_type, rhs,
5143 build_int_cst (TREE_TYPE (rhs), 0));
5144 rcode = NE_EXPR;
5147 if (TREE_CODE_CLASS (lcode) != tcc_comparison
5148 || TREE_CODE_CLASS (rcode) != tcc_comparison)
5149 return 0;
5151 ll_arg = TREE_OPERAND (lhs, 0);
5152 lr_arg = TREE_OPERAND (lhs, 1);
5153 rl_arg = TREE_OPERAND (rhs, 0);
5154 rr_arg = TREE_OPERAND (rhs, 1);
5156 /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations. */
5157 if (simple_operand_p (ll_arg)
5158 && simple_operand_p (lr_arg))
5160 if (operand_equal_p (ll_arg, rl_arg, 0)
5161 && operand_equal_p (lr_arg, rr_arg, 0))
5163 result = combine_comparisons (loc, code, lcode, rcode,
5164 truth_type, ll_arg, lr_arg);
5165 if (result)
5166 return result;
5168 else if (operand_equal_p (ll_arg, rr_arg, 0)
5169 && operand_equal_p (lr_arg, rl_arg, 0))
5171 result = combine_comparisons (loc, code, lcode,
5172 swap_tree_comparison (rcode),
5173 truth_type, ll_arg, lr_arg);
5174 if (result)
5175 return result;
5179 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5180 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5182 /* If the RHS can be evaluated unconditionally and its operands are
5183 simple, it wins to evaluate the RHS unconditionally on machines
5184 with expensive branches. In this case, this isn't a comparison
5185 that can be merged. */
5187 if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5188 false) >= 2
5189 && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5190 && simple_operand_p (rl_arg)
5191 && simple_operand_p (rr_arg))
5193 /* Convert (a != 0) || (b != 0) into (a | b) != 0. */
5194 if (code == TRUTH_OR_EXPR
5195 && lcode == NE_EXPR && integer_zerop (lr_arg)
5196 && rcode == NE_EXPR && integer_zerop (rr_arg)
5197 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5198 && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5199 return build2_loc (loc, NE_EXPR, truth_type,
5200 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5201 ll_arg, rl_arg),
5202 build_int_cst (TREE_TYPE (ll_arg), 0));
5204 /* Convert (a == 0) && (b == 0) into (a | b) == 0. */
5205 if (code == TRUTH_AND_EXPR
5206 && lcode == EQ_EXPR && integer_zerop (lr_arg)
5207 && rcode == EQ_EXPR && integer_zerop (rr_arg)
5208 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5209 && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5210 return build2_loc (loc, EQ_EXPR, truth_type,
5211 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5212 ll_arg, rl_arg),
5213 build_int_cst (TREE_TYPE (ll_arg), 0));
5216 /* See if the comparisons can be merged. Then get all the parameters for
5217 each side. */
5219 if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5220 || (rcode != EQ_EXPR && rcode != NE_EXPR))
5221 return 0;
5223 volatilep = 0;
5224 ll_inner = decode_field_reference (loc, ll_arg,
5225 &ll_bitsize, &ll_bitpos, &ll_mode,
5226 &ll_unsignedp, &volatilep, &ll_mask,
5227 &ll_and_mask);
5228 lr_inner = decode_field_reference (loc, lr_arg,
5229 &lr_bitsize, &lr_bitpos, &lr_mode,
5230 &lr_unsignedp, &volatilep, &lr_mask,
5231 &lr_and_mask);
5232 rl_inner = decode_field_reference (loc, rl_arg,
5233 &rl_bitsize, &rl_bitpos, &rl_mode,
5234 &rl_unsignedp, &volatilep, &rl_mask,
5235 &rl_and_mask);
5236 rr_inner = decode_field_reference (loc, rr_arg,
5237 &rr_bitsize, &rr_bitpos, &rr_mode,
5238 &rr_unsignedp, &volatilep, &rr_mask,
5239 &rr_and_mask);
5241 /* It must be true that the inner operation on the lhs of each
5242 comparison must be the same if we are to be able to do anything.
5243 Then see if we have constants. If not, the same must be true for
5244 the rhs's. */
5245 if (volatilep || ll_inner == 0 || rl_inner == 0
5246 || ! operand_equal_p (ll_inner, rl_inner, 0))
5247 return 0;
5249 if (TREE_CODE (lr_arg) == INTEGER_CST
5250 && TREE_CODE (rr_arg) == INTEGER_CST)
5251 l_const = lr_arg, r_const = rr_arg;
5252 else if (lr_inner == 0 || rr_inner == 0
5253 || ! operand_equal_p (lr_inner, rr_inner, 0))
5254 return 0;
5255 else
5256 l_const = r_const = 0;
5258 /* If either comparison code is not correct for our logical operation,
5259 fail. However, we can convert a one-bit comparison against zero into
5260 the opposite comparison against that bit being set in the field. */
5262 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5263 if (lcode != wanted_code)
5265 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5267 /* Make the left operand unsigned, since we are only interested
5268 in the value of one bit. Otherwise we are doing the wrong
5269 thing below. */
5270 ll_unsignedp = 1;
5271 l_const = ll_mask;
5273 else
5274 return 0;
5277 /* This is analogous to the code for l_const above. */
5278 if (rcode != wanted_code)
5280 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5282 rl_unsignedp = 1;
5283 r_const = rl_mask;
5285 else
5286 return 0;
5289 /* See if we can find a mode that contains both fields being compared on
5290 the left. If we can't, fail. Otherwise, update all constants and masks
5291 to be relative to a field of that size. */
5292 first_bit = MIN (ll_bitpos, rl_bitpos);
5293 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5294 lnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5295 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5296 volatilep);
5297 if (lnmode == VOIDmode)
5298 return 0;
5300 lnbitsize = GET_MODE_BITSIZE (lnmode);
5301 lnbitpos = first_bit & ~ (lnbitsize - 1);
5302 lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5303 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5305 if (BYTES_BIG_ENDIAN)
5307 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5308 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5311 ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask),
5312 size_int (xll_bitpos));
5313 rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask),
5314 size_int (xrl_bitpos));
5316 if (l_const)
5318 l_const = fold_convert_loc (loc, lntype, l_const);
5319 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5320 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos));
5321 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5322 fold_build1_loc (loc, BIT_NOT_EXPR,
5323 lntype, ll_mask))))
5325 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5327 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5330 if (r_const)
5332 r_const = fold_convert_loc (loc, lntype, r_const);
5333 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5334 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos));
5335 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5336 fold_build1_loc (loc, BIT_NOT_EXPR,
5337 lntype, rl_mask))))
5339 warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5341 return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5345 /* If the right sides are not constant, do the same for it. Also,
5346 disallow this optimization if a size or signedness mismatch occurs
5347 between the left and right sides. */
5348 if (l_const == 0)
5350 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5351 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5352 /* Make sure the two fields on the right
5353 correspond to the left without being swapped. */
5354 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5355 return 0;
5357 first_bit = MIN (lr_bitpos, rr_bitpos);
5358 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5359 rnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5360 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5361 volatilep);
5362 if (rnmode == VOIDmode)
5363 return 0;
5365 rnbitsize = GET_MODE_BITSIZE (rnmode);
5366 rnbitpos = first_bit & ~ (rnbitsize - 1);
5367 rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5368 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5370 if (BYTES_BIG_ENDIAN)
5372 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5373 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5376 lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5377 rntype, lr_mask),
5378 size_int (xlr_bitpos));
5379 rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5380 rntype, rr_mask),
5381 size_int (xrr_bitpos));
5383 /* Make a mask that corresponds to both fields being compared.
5384 Do this for both items being compared. If the operands are the
5385 same size and the bits being compared are in the same position
5386 then we can do this by masking both and comparing the masked
5387 results. */
5388 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5389 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
5390 if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5392 lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5393 ll_unsignedp || rl_unsignedp);
5394 if (! all_ones_mask_p (ll_mask, lnbitsize))
5395 lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5397 rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
5398 lr_unsignedp || rr_unsignedp);
5399 if (! all_ones_mask_p (lr_mask, rnbitsize))
5400 rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5402 return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5405 /* There is still another way we can do something: If both pairs of
5406 fields being compared are adjacent, we may be able to make a wider
5407 field containing them both.
5409 Note that we still must mask the lhs/rhs expressions. Furthermore,
5410 the mask must be shifted to account for the shift done by
5411 make_bit_field_ref. */
5412 if ((ll_bitsize + ll_bitpos == rl_bitpos
5413 && lr_bitsize + lr_bitpos == rr_bitpos)
5414 || (ll_bitpos == rl_bitpos + rl_bitsize
5415 && lr_bitpos == rr_bitpos + rr_bitsize))
5417 tree type;
5419 lhs = make_bit_field_ref (loc, ll_inner, lntype,
5420 ll_bitsize + rl_bitsize,
5421 MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5422 rhs = make_bit_field_ref (loc, lr_inner, rntype,
5423 lr_bitsize + rr_bitsize,
5424 MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5426 ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5427 size_int (MIN (xll_bitpos, xrl_bitpos)));
5428 lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5429 size_int (MIN (xlr_bitpos, xrr_bitpos)));
5431 /* Convert to the smaller type before masking out unwanted bits. */
5432 type = lntype;
5433 if (lntype != rntype)
5435 if (lnbitsize > rnbitsize)
5437 lhs = fold_convert_loc (loc, rntype, lhs);
5438 ll_mask = fold_convert_loc (loc, rntype, ll_mask);
5439 type = rntype;
5441 else if (lnbitsize < rnbitsize)
5443 rhs = fold_convert_loc (loc, lntype, rhs);
5444 lr_mask = fold_convert_loc (loc, lntype, lr_mask);
5445 type = lntype;
5449 if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5450 lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5452 if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5453 rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5455 return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5458 return 0;
5461 /* Handle the case of comparisons with constants. If there is something in
5462 common between the masks, those bits of the constants must be the same.
5463 If not, the condition is always false. Test for this to avoid generating
5464 incorrect code below. */
5465 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask);
5466 if (! integer_zerop (result)
5467 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const),
5468 const_binop (BIT_AND_EXPR, result, r_const)) != 1)
5470 if (wanted_code == NE_EXPR)
5472 warning (0, "%<or%> of unmatched not-equal tests is always 1");
5473 return constant_boolean_node (true, truth_type);
5475 else
5477 warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5478 return constant_boolean_node (false, truth_type);
5482 /* Construct the expression we will return. First get the component
5483 reference we will make. Unless the mask is all ones the width of
5484 that field, perform the mask operation. Then compare with the
5485 merged constant. */
5486 result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5487 ll_unsignedp || rl_unsignedp);
5489 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5490 if (! all_ones_mask_p (ll_mask, lnbitsize))
5491 result = build2_loc (loc, BIT_AND_EXPR, lntype, result, ll_mask);
5493 return build2_loc (loc, wanted_code, truth_type, result,
5494 const_binop (BIT_IOR_EXPR, l_const, r_const));
5497 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5498 constant. */
5500 static tree
5501 optimize_minmax_comparison (location_t loc, enum tree_code code, tree type,
5502 tree op0, tree op1)
5504 tree arg0 = op0;
5505 enum tree_code op_code;
5506 tree comp_const;
5507 tree minmax_const;
5508 int consts_equal, consts_lt;
5509 tree inner;
5511 STRIP_SIGN_NOPS (arg0);
5513 op_code = TREE_CODE (arg0);
5514 minmax_const = TREE_OPERAND (arg0, 1);
5515 comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1);
5516 consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5517 consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5518 inner = TREE_OPERAND (arg0, 0);
5520 /* If something does not permit us to optimize, return the original tree. */
5521 if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5522 || TREE_CODE (comp_const) != INTEGER_CST
5523 || TREE_OVERFLOW (comp_const)
5524 || TREE_CODE (minmax_const) != INTEGER_CST
5525 || TREE_OVERFLOW (minmax_const))
5526 return NULL_TREE;
5528 /* Now handle all the various comparison codes. We only handle EQ_EXPR
5529 and GT_EXPR, doing the rest with recursive calls using logical
5530 simplifications. */
5531 switch (code)
5533 case NE_EXPR: case LT_EXPR: case LE_EXPR:
5535 tree tem
5536 = optimize_minmax_comparison (loc,
5537 invert_tree_comparison (code, false),
5538 type, op0, op1);
5539 if (tem)
5540 return invert_truthvalue_loc (loc, tem);
5541 return NULL_TREE;
5544 case GE_EXPR:
5545 return
5546 fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
5547 optimize_minmax_comparison
5548 (loc, EQ_EXPR, type, arg0, comp_const),
5549 optimize_minmax_comparison
5550 (loc, GT_EXPR, type, arg0, comp_const));
5552 case EQ_EXPR:
5553 if (op_code == MAX_EXPR && consts_equal)
5554 /* MAX (X, 0) == 0 -> X <= 0 */
5555 return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const);
5557 else if (op_code == MAX_EXPR && consts_lt)
5558 /* MAX (X, 0) == 5 -> X == 5 */
5559 return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5561 else if (op_code == MAX_EXPR)
5562 /* MAX (X, 0) == -1 -> false */
5563 return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5565 else if (consts_equal)
5566 /* MIN (X, 0) == 0 -> X >= 0 */
5567 return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const);
5569 else if (consts_lt)
5570 /* MIN (X, 0) == 5 -> false */
5571 return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5573 else
5574 /* MIN (X, 0) == -1 -> X == -1 */
5575 return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5577 case GT_EXPR:
5578 if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5579 /* MAX (X, 0) > 0 -> X > 0
5580 MAX (X, 0) > 5 -> X > 5 */
5581 return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5583 else if (op_code == MAX_EXPR)
5584 /* MAX (X, 0) > -1 -> true */
5585 return omit_one_operand_loc (loc, type, integer_one_node, inner);
5587 else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5588 /* MIN (X, 0) > 0 -> false
5589 MIN (X, 0) > 5 -> false */
5590 return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5592 else
5593 /* MIN (X, 0) > -1 -> X > -1 */
5594 return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5596 default:
5597 return NULL_TREE;
5601 /* T is an integer expression that is being multiplied, divided, or taken a
5602 modulus (CODE says which and what kind of divide or modulus) by a
5603 constant C. See if we can eliminate that operation by folding it with
5604 other operations already in T. WIDE_TYPE, if non-null, is a type that
5605 should be used for the computation if wider than our type.
5607 For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5608 (X * 2) + (Y * 4). We must, however, be assured that either the original
5609 expression would not overflow or that overflow is undefined for the type
5610 in the language in question.
5612 If we return a non-null expression, it is an equivalent form of the
5613 original computation, but need not be in the original type.
5615 We set *STRICT_OVERFLOW_P to true if the return values depends on
5616 signed overflow being undefined. Otherwise we do not change
5617 *STRICT_OVERFLOW_P. */
5619 static tree
5620 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5621 bool *strict_overflow_p)
5623 /* To avoid exponential search depth, refuse to allow recursion past
5624 three levels. Beyond that (1) it's highly unlikely that we'll find
5625 something interesting and (2) we've probably processed it before
5626 when we built the inner expression. */
5628 static int depth;
5629 tree ret;
5631 if (depth > 3)
5632 return NULL;
5634 depth++;
5635 ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5636 depth--;
5638 return ret;
5641 static tree
5642 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5643 bool *strict_overflow_p)
5645 tree type = TREE_TYPE (t);
5646 enum tree_code tcode = TREE_CODE (t);
5647 tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5648 > GET_MODE_SIZE (TYPE_MODE (type)))
5649 ? wide_type : type);
5650 tree t1, t2;
5651 int same_p = tcode == code;
5652 tree op0 = NULL_TREE, op1 = NULL_TREE;
5653 bool sub_strict_overflow_p;
5655 /* Don't deal with constants of zero here; they confuse the code below. */
5656 if (integer_zerop (c))
5657 return NULL_TREE;
5659 if (TREE_CODE_CLASS (tcode) == tcc_unary)
5660 op0 = TREE_OPERAND (t, 0);
5662 if (TREE_CODE_CLASS (tcode) == tcc_binary)
5663 op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5665 /* Note that we need not handle conditional operations here since fold
5666 already handles those cases. So just do arithmetic here. */
5667 switch (tcode)
5669 case INTEGER_CST:
5670 /* For a constant, we can always simplify if we are a multiply
5671 or (for divide and modulus) if it is a multiple of our constant. */
5672 if (code == MULT_EXPR
5673 || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c)))
5674 return const_binop (code, fold_convert (ctype, t),
5675 fold_convert (ctype, c));
5676 break;
5678 CASE_CONVERT: case NON_LVALUE_EXPR:
5679 /* If op0 is an expression ... */
5680 if ((COMPARISON_CLASS_P (op0)
5681 || UNARY_CLASS_P (op0)
5682 || BINARY_CLASS_P (op0)
5683 || VL_EXP_CLASS_P (op0)
5684 || EXPRESSION_CLASS_P (op0))
5685 /* ... and has wrapping overflow, and its type is smaller
5686 than ctype, then we cannot pass through as widening. */
5687 && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0))
5688 && ! (TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
5689 && TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
5690 && (TYPE_PRECISION (ctype)
5691 > TYPE_PRECISION (TREE_TYPE (op0))))
5692 /* ... or this is a truncation (t is narrower than op0),
5693 then we cannot pass through this narrowing. */
5694 || (TYPE_PRECISION (type)
5695 < TYPE_PRECISION (TREE_TYPE (op0)))
5696 /* ... or signedness changes for division or modulus,
5697 then we cannot pass through this conversion. */
5698 || (code != MULT_EXPR
5699 && (TYPE_UNSIGNED (ctype)
5700 != TYPE_UNSIGNED (TREE_TYPE (op0))))
5701 /* ... or has undefined overflow while the converted to
5702 type has not, we cannot do the operation in the inner type
5703 as that would introduce undefined overflow. */
5704 || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
5705 && !TYPE_OVERFLOW_UNDEFINED (type))))
5706 break;
5708 /* Pass the constant down and see if we can make a simplification. If
5709 we can, replace this expression with the inner simplification for
5710 possible later conversion to our or some other type. */
5711 if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
5712 && TREE_CODE (t2) == INTEGER_CST
5713 && !TREE_OVERFLOW (t2)
5714 && (0 != (t1 = extract_muldiv (op0, t2, code,
5715 code == MULT_EXPR
5716 ? ctype : NULL_TREE,
5717 strict_overflow_p))))
5718 return t1;
5719 break;
5721 case ABS_EXPR:
5722 /* If widening the type changes it from signed to unsigned, then we
5723 must avoid building ABS_EXPR itself as unsigned. */
5724 if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
5726 tree cstype = (*signed_type_for) (ctype);
5727 if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
5728 != 0)
5730 t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
5731 return fold_convert (ctype, t1);
5733 break;
5735 /* If the constant is negative, we cannot simplify this. */
5736 if (tree_int_cst_sgn (c) == -1)
5737 break;
5738 /* FALLTHROUGH */
5739 case NEGATE_EXPR:
5740 /* For division and modulus, type can't be unsigned, as e.g.
5741 (-(x / 2U)) / 2U isn't equal to -((x / 2U) / 2U) for x >= 2.
5742 For signed types, even with wrapping overflow, this is fine. */
5743 if (code != MULT_EXPR && TYPE_UNSIGNED (type))
5744 break;
5745 if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
5746 != 0)
5747 return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
5748 break;
5750 case MIN_EXPR: case MAX_EXPR:
5751 /* If widening the type changes the signedness, then we can't perform
5752 this optimization as that changes the result. */
5753 if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
5754 break;
5756 /* MIN (a, b) / 5 -> MIN (a / 5, b / 5) */
5757 sub_strict_overflow_p = false;
5758 if ((t1 = extract_muldiv (op0, c, code, wide_type,
5759 &sub_strict_overflow_p)) != 0
5760 && (t2 = extract_muldiv (op1, c, code, wide_type,
5761 &sub_strict_overflow_p)) != 0)
5763 if (tree_int_cst_sgn (c) < 0)
5764 tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
5765 if (sub_strict_overflow_p)
5766 *strict_overflow_p = true;
5767 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5768 fold_convert (ctype, t2));
5770 break;
5772 case LSHIFT_EXPR: case RSHIFT_EXPR:
5773 /* If the second operand is constant, this is a multiplication
5774 or floor division, by a power of two, so we can treat it that
5775 way unless the multiplier or divisor overflows. Signed
5776 left-shift overflow is implementation-defined rather than
5777 undefined in C90, so do not convert signed left shift into
5778 multiplication. */
5779 if (TREE_CODE (op1) == INTEGER_CST
5780 && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
5781 /* const_binop may not detect overflow correctly,
5782 so check for it explicitly here. */
5783 && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1)
5784 && TREE_INT_CST_HIGH (op1) == 0
5785 && 0 != (t1 = fold_convert (ctype,
5786 const_binop (LSHIFT_EXPR,
5787 size_one_node,
5788 op1)))
5789 && !TREE_OVERFLOW (t1))
5790 return extract_muldiv (build2 (tcode == LSHIFT_EXPR
5791 ? MULT_EXPR : FLOOR_DIV_EXPR,
5792 ctype,
5793 fold_convert (ctype, op0),
5794 t1),
5795 c, code, wide_type, strict_overflow_p);
5796 break;
5798 case PLUS_EXPR: case MINUS_EXPR:
5799 /* See if we can eliminate the operation on both sides. If we can, we
5800 can return a new PLUS or MINUS. If we can't, the only remaining
5801 cases where we can do anything are if the second operand is a
5802 constant. */
5803 sub_strict_overflow_p = false;
5804 t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
5805 t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
5806 if (t1 != 0 && t2 != 0
5807 && (code == MULT_EXPR
5808 /* If not multiplication, we can only do this if both operands
5809 are divisible by c. */
5810 || (multiple_of_p (ctype, op0, c)
5811 && multiple_of_p (ctype, op1, c))))
5813 if (sub_strict_overflow_p)
5814 *strict_overflow_p = true;
5815 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5816 fold_convert (ctype, t2));
5819 /* If this was a subtraction, negate OP1 and set it to be an addition.
5820 This simplifies the logic below. */
5821 if (tcode == MINUS_EXPR)
5823 tcode = PLUS_EXPR, op1 = negate_expr (op1);
5824 /* If OP1 was not easily negatable, the constant may be OP0. */
5825 if (TREE_CODE (op0) == INTEGER_CST)
5827 tree tem = op0;
5828 op0 = op1;
5829 op1 = tem;
5830 tem = t1;
5831 t1 = t2;
5832 t2 = tem;
5836 if (TREE_CODE (op1) != INTEGER_CST)
5837 break;
5839 /* If either OP1 or C are negative, this optimization is not safe for
5840 some of the division and remainder types while for others we need
5841 to change the code. */
5842 if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
5844 if (code == CEIL_DIV_EXPR)
5845 code = FLOOR_DIV_EXPR;
5846 else if (code == FLOOR_DIV_EXPR)
5847 code = CEIL_DIV_EXPR;
5848 else if (code != MULT_EXPR
5849 && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
5850 break;
5853 /* If it's a multiply or a division/modulus operation of a multiple
5854 of our constant, do the operation and verify it doesn't overflow. */
5855 if (code == MULT_EXPR
5856 || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c)))
5858 op1 = const_binop (code, fold_convert (ctype, op1),
5859 fold_convert (ctype, c));
5860 /* We allow the constant to overflow with wrapping semantics. */
5861 if (op1 == 0
5862 || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
5863 break;
5865 else
5866 break;
5868 /* If we have an unsigned type is not a sizetype, we cannot widen
5869 the operation since it will change the result if the original
5870 computation overflowed. */
5871 if (TYPE_UNSIGNED (ctype)
5872 && ! (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype))
5873 && ctype != type)
5874 break;
5876 /* If we were able to eliminate our operation from the first side,
5877 apply our operation to the second side and reform the PLUS. */
5878 if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
5879 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
5881 /* The last case is if we are a multiply. In that case, we can
5882 apply the distributive law to commute the multiply and addition
5883 if the multiplication of the constants doesn't overflow. */
5884 if (code == MULT_EXPR)
5885 return fold_build2 (tcode, ctype,
5886 fold_build2 (code, ctype,
5887 fold_convert (ctype, op0),
5888 fold_convert (ctype, c)),
5889 op1);
5891 break;
5893 case MULT_EXPR:
5894 /* We have a special case here if we are doing something like
5895 (C * 8) % 4 since we know that's zero. */
5896 if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
5897 || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
5898 /* If the multiplication can overflow we cannot optimize this.
5899 ??? Until we can properly mark individual operations as
5900 not overflowing we need to treat sizetype special here as
5901 stor-layout relies on this opimization to make
5902 DECL_FIELD_BIT_OFFSET always a constant. */
5903 && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
5904 || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
5905 && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
5906 && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
5907 && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c)))
5909 *strict_overflow_p = true;
5910 return omit_one_operand (type, integer_zero_node, op0);
5913 /* ... fall through ... */
5915 case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR:
5916 case ROUND_DIV_EXPR: case EXACT_DIV_EXPR:
5917 /* If we can extract our operation from the LHS, do so and return a
5918 new operation. Likewise for the RHS from a MULT_EXPR. Otherwise,
5919 do something only if the second operand is a constant. */
5920 if (same_p
5921 && (t1 = extract_muldiv (op0, c, code, wide_type,
5922 strict_overflow_p)) != 0)
5923 return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
5924 fold_convert (ctype, op1));
5925 else if (tcode == MULT_EXPR && code == MULT_EXPR
5926 && (t1 = extract_muldiv (op1, c, code, wide_type,
5927 strict_overflow_p)) != 0)
5928 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5929 fold_convert (ctype, t1));
5930 else if (TREE_CODE (op1) != INTEGER_CST)
5931 return 0;
5933 /* If these are the same operation types, we can associate them
5934 assuming no overflow. */
5935 if (tcode == code)
5937 double_int mul;
5938 int overflow_p;
5939 mul = double_int_mul_with_sign
5940 (double_int_ext
5941 (tree_to_double_int (op1),
5942 TYPE_PRECISION (ctype), TYPE_UNSIGNED (ctype)),
5943 double_int_ext
5944 (tree_to_double_int (c),
5945 TYPE_PRECISION (ctype), TYPE_UNSIGNED (ctype)),
5946 false, &overflow_p);
5947 overflow_p = (((!TYPE_UNSIGNED (ctype)
5948 || (TREE_CODE (ctype) == INTEGER_TYPE
5949 && TYPE_IS_SIZETYPE (ctype)))
5950 && overflow_p)
5951 | TREE_OVERFLOW (c) | TREE_OVERFLOW (op1));
5952 if (!double_int_fits_to_tree_p (ctype, mul)
5953 && ((TYPE_UNSIGNED (ctype) && tcode != MULT_EXPR)
5954 || !TYPE_UNSIGNED (ctype)
5955 || (TREE_CODE (ctype) == INTEGER_TYPE
5956 && TYPE_IS_SIZETYPE (ctype))))
5957 overflow_p = 1;
5958 if (!overflow_p)
5959 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5960 double_int_to_tree (ctype, mul));
5963 /* If these operations "cancel" each other, we have the main
5964 optimizations of this pass, which occur when either constant is a
5965 multiple of the other, in which case we replace this with either an
5966 operation or CODE or TCODE.
5968 If we have an unsigned type that is not a sizetype, we cannot do
5969 this since it will change the result if the original computation
5970 overflowed. */
5971 if ((TYPE_OVERFLOW_UNDEFINED (ctype)
5972 || (TREE_CODE (ctype) == INTEGER_TYPE && TYPE_IS_SIZETYPE (ctype)))
5973 && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
5974 || (tcode == MULT_EXPR
5975 && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
5976 && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
5977 && code != MULT_EXPR)))
5979 if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c)))
5981 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5982 *strict_overflow_p = true;
5983 return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
5984 fold_convert (ctype,
5985 const_binop (TRUNC_DIV_EXPR,
5986 op1, c)));
5988 else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1)))
5990 if (TYPE_OVERFLOW_UNDEFINED (ctype))
5991 *strict_overflow_p = true;
5992 return fold_build2 (code, ctype, fold_convert (ctype, op0),
5993 fold_convert (ctype,
5994 const_binop (TRUNC_DIV_EXPR,
5995 c, op1)));
5998 break;
6000 default:
6001 break;
6004 return 0;
6007 /* Return a node which has the indicated constant VALUE (either 0 or
6008 1 for scalars or {-1,-1,..} or {0,0,...} for vectors),
6009 and is of the indicated TYPE. */
6011 tree
6012 constant_boolean_node (bool value, tree type)
6014 if (type == integer_type_node)
6015 return value ? integer_one_node : integer_zero_node;
6016 else if (type == boolean_type_node)
6017 return value ? boolean_true_node : boolean_false_node;
6018 else if (TREE_CODE (type) == VECTOR_TYPE)
6019 return build_vector_from_val (type,
6020 build_int_cst (TREE_TYPE (type),
6021 value ? -1 : 0));
6022 else
6023 return fold_convert (type, value ? integer_one_node : integer_zero_node);
6027 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6028 Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here
6029 CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6030 expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the
6031 COND is the first argument to CODE; otherwise (as in the example
6032 given here), it is the second argument. TYPE is the type of the
6033 original expression. Return NULL_TREE if no simplification is
6034 possible. */
6036 static tree
6037 fold_binary_op_with_conditional_arg (location_t loc,
6038 enum tree_code code,
6039 tree type, tree op0, tree op1,
6040 tree cond, tree arg, int cond_first_p)
6042 tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6043 tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6044 tree test, true_value, false_value;
6045 tree lhs = NULL_TREE;
6046 tree rhs = NULL_TREE;
6048 if (TREE_CODE (cond) == COND_EXPR)
6050 test = TREE_OPERAND (cond, 0);
6051 true_value = TREE_OPERAND (cond, 1);
6052 false_value = TREE_OPERAND (cond, 2);
6053 /* If this operand throws an expression, then it does not make
6054 sense to try to perform a logical or arithmetic operation
6055 involving it. */
6056 if (VOID_TYPE_P (TREE_TYPE (true_value)))
6057 lhs = true_value;
6058 if (VOID_TYPE_P (TREE_TYPE (false_value)))
6059 rhs = false_value;
6061 else
6063 tree testtype = TREE_TYPE (cond);
6064 test = cond;
6065 true_value = constant_boolean_node (true, testtype);
6066 false_value = constant_boolean_node (false, testtype);
6069 /* This transformation is only worthwhile if we don't have to wrap ARG
6070 in a SAVE_EXPR and the operation can be simplified without recursing
6071 on at least one of the branches once its pushed inside the COND_EXPR. */
6072 if (!TREE_CONSTANT (arg)
6073 && (TREE_SIDE_EFFECTS (arg)
6074 || TREE_CODE (arg) == COND_EXPR || TREE_CODE (arg) == VEC_COND_EXPR
6075 || TREE_CONSTANT (true_value) || TREE_CONSTANT (false_value)))
6076 return NULL_TREE;
6078 arg = fold_convert_loc (loc, arg_type, arg);
6079 if (lhs == 0)
6081 true_value = fold_convert_loc (loc, cond_type, true_value);
6082 if (cond_first_p)
6083 lhs = fold_build2_loc (loc, code, type, true_value, arg);
6084 else
6085 lhs = fold_build2_loc (loc, code, type, arg, true_value);
6087 if (rhs == 0)
6089 false_value = fold_convert_loc (loc, cond_type, false_value);
6090 if (cond_first_p)
6091 rhs = fold_build2_loc (loc, code, type, false_value, arg);
6092 else
6093 rhs = fold_build2_loc (loc, code, type, arg, false_value);
6096 /* Check that we have simplified at least one of the branches. */
6097 if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs))
6098 return NULL_TREE;
6100 return fold_build3_loc (loc, COND_EXPR, type, test, lhs, rhs);
6104 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6106 If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6107 TYPE, X + ADDEND is the same as X. If NEGATE, return true if X -
6108 ADDEND is the same as X.
6110 X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6111 and finite. The problematic cases are when X is zero, and its mode
6112 has signed zeros. In the case of rounding towards -infinity,
6113 X - 0 is not the same as X because 0 - 0 is -0. In other rounding
6114 modes, X + 0 is not the same as X because -0 + 0 is 0. */
6116 bool
6117 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6119 if (!real_zerop (addend))
6120 return false;
6122 /* Don't allow the fold with -fsignaling-nans. */
6123 if (HONOR_SNANS (TYPE_MODE (type)))
6124 return false;
6126 /* Allow the fold if zeros aren't signed, or their sign isn't important. */
6127 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
6128 return true;
6130 /* Treat x + -0 as x - 0 and x - -0 as x + 0. */
6131 if (TREE_CODE (addend) == REAL_CST
6132 && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6133 negate = !negate;
6135 /* The mode has signed zeros, and we have to honor their sign.
6136 In this situation, there is only one case we can return true for.
6137 X - 0 is the same as X unless rounding towards -infinity is
6138 supported. */
6139 return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type));
6142 /* Subroutine of fold() that checks comparisons of built-in math
6143 functions against real constants.
6145 FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6146 operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR. TYPE
6147 is the type of the result and ARG0 and ARG1 are the operands of the
6148 comparison. ARG1 must be a TREE_REAL_CST.
6150 The function returns the constant folded tree if a simplification
6151 can be made, and NULL_TREE otherwise. */
6153 static tree
6154 fold_mathfn_compare (location_t loc,
6155 enum built_in_function fcode, enum tree_code code,
6156 tree type, tree arg0, tree arg1)
6158 REAL_VALUE_TYPE c;
6160 if (BUILTIN_SQRT_P (fcode))
6162 tree arg = CALL_EXPR_ARG (arg0, 0);
6163 enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6165 c = TREE_REAL_CST (arg1);
6166 if (REAL_VALUE_NEGATIVE (c))
6168 /* sqrt(x) < y is always false, if y is negative. */
6169 if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6170 return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6172 /* sqrt(x) > y is always true, if y is negative and we
6173 don't care about NaNs, i.e. negative values of x. */
6174 if (code == NE_EXPR || !HONOR_NANS (mode))
6175 return omit_one_operand_loc (loc, type, integer_one_node, arg);
6177 /* sqrt(x) > y is the same as x >= 0, if y is negative. */
6178 return fold_build2_loc (loc, GE_EXPR, type, arg,
6179 build_real (TREE_TYPE (arg), dconst0));
6181 else if (code == GT_EXPR || code == GE_EXPR)
6183 REAL_VALUE_TYPE c2;
6185 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6186 real_convert (&c2, mode, &c2);
6188 if (REAL_VALUE_ISINF (c2))
6190 /* sqrt(x) > y is x == +Inf, when y is very large. */
6191 if (HONOR_INFINITIES (mode))
6192 return fold_build2_loc (loc, EQ_EXPR, type, arg,
6193 build_real (TREE_TYPE (arg), c2));
6195 /* sqrt(x) > y is always false, when y is very large
6196 and we don't care about infinities. */
6197 return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6200 /* sqrt(x) > c is the same as x > c*c. */
6201 return fold_build2_loc (loc, code, type, arg,
6202 build_real (TREE_TYPE (arg), c2));
6204 else if (code == LT_EXPR || code == LE_EXPR)
6206 REAL_VALUE_TYPE c2;
6208 REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6209 real_convert (&c2, mode, &c2);
6211 if (REAL_VALUE_ISINF (c2))
6213 /* sqrt(x) < y is always true, when y is a very large
6214 value and we don't care about NaNs or Infinities. */
6215 if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6216 return omit_one_operand_loc (loc, type, integer_one_node, arg);
6218 /* sqrt(x) < y is x != +Inf when y is very large and we
6219 don't care about NaNs. */
6220 if (! HONOR_NANS (mode))
6221 return fold_build2_loc (loc, NE_EXPR, type, arg,
6222 build_real (TREE_TYPE (arg), c2));
6224 /* sqrt(x) < y is x >= 0 when y is very large and we
6225 don't care about Infinities. */
6226 if (! HONOR_INFINITIES (mode))
6227 return fold_build2_loc (loc, GE_EXPR, type, arg,
6228 build_real (TREE_TYPE (arg), dconst0));
6230 /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */
6231 arg = save_expr (arg);
6232 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6233 fold_build2_loc (loc, GE_EXPR, type, arg,
6234 build_real (TREE_TYPE (arg),
6235 dconst0)),
6236 fold_build2_loc (loc, NE_EXPR, type, arg,
6237 build_real (TREE_TYPE (arg),
6238 c2)));
6241 /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */
6242 if (! HONOR_NANS (mode))
6243 return fold_build2_loc (loc, code, type, arg,
6244 build_real (TREE_TYPE (arg), c2));
6246 /* sqrt(x) < c is the same as x >= 0 && x < c*c. */
6247 arg = save_expr (arg);
6248 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6249 fold_build2_loc (loc, GE_EXPR, type, arg,
6250 build_real (TREE_TYPE (arg),
6251 dconst0)),
6252 fold_build2_loc (loc, code, type, arg,
6253 build_real (TREE_TYPE (arg),
6254 c2)));
6258 return NULL_TREE;
6261 /* Subroutine of fold() that optimizes comparisons against Infinities,
6262 either +Inf or -Inf.
6264 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6265 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6266 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6268 The function returns the constant folded tree if a simplification
6269 can be made, and NULL_TREE otherwise. */
6271 static tree
6272 fold_inf_compare (location_t loc, enum tree_code code, tree type,
6273 tree arg0, tree arg1)
6275 enum machine_mode mode;
6276 REAL_VALUE_TYPE max;
6277 tree temp;
6278 bool neg;
6280 mode = TYPE_MODE (TREE_TYPE (arg0));
6282 /* For negative infinity swap the sense of the comparison. */
6283 neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6284 if (neg)
6285 code = swap_tree_comparison (code);
6287 switch (code)
6289 case GT_EXPR:
6290 /* x > +Inf is always false, if with ignore sNANs. */
6291 if (HONOR_SNANS (mode))
6292 return NULL_TREE;
6293 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6295 case LE_EXPR:
6296 /* x <= +Inf is always true, if we don't case about NaNs. */
6297 if (! HONOR_NANS (mode))
6298 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6300 /* x <= +Inf is the same as x == x, i.e. isfinite(x). */
6301 arg0 = save_expr (arg0);
6302 return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0);
6304 case EQ_EXPR:
6305 case GE_EXPR:
6306 /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX. */
6307 real_maxval (&max, neg, mode);
6308 return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6309 arg0, build_real (TREE_TYPE (arg0), max));
6311 case LT_EXPR:
6312 /* x < +Inf is always equal to x <= DBL_MAX. */
6313 real_maxval (&max, neg, mode);
6314 return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6315 arg0, build_real (TREE_TYPE (arg0), max));
6317 case NE_EXPR:
6318 /* x != +Inf is always equal to !(x > DBL_MAX). */
6319 real_maxval (&max, neg, mode);
6320 if (! HONOR_NANS (mode))
6321 return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6322 arg0, build_real (TREE_TYPE (arg0), max));
6324 temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6325 arg0, build_real (TREE_TYPE (arg0), max));
6326 return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp);
6328 default:
6329 break;
6332 return NULL_TREE;
6335 /* Subroutine of fold() that optimizes comparisons of a division by
6336 a nonzero integer constant against an integer constant, i.e.
6337 X/C1 op C2.
6339 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6340 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1
6341 are the operands of the comparison. ARG1 must be a TREE_REAL_CST.
6343 The function returns the constant folded tree if a simplification
6344 can be made, and NULL_TREE otherwise. */
6346 static tree
6347 fold_div_compare (location_t loc,
6348 enum tree_code code, tree type, tree arg0, tree arg1)
6350 tree prod, tmp, hi, lo;
6351 tree arg00 = TREE_OPERAND (arg0, 0);
6352 tree arg01 = TREE_OPERAND (arg0, 1);
6353 double_int val;
6354 bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0));
6355 bool neg_overflow;
6356 int overflow;
6358 /* We have to do this the hard way to detect unsigned overflow.
6359 prod = int_const_binop (MULT_EXPR, arg01, arg1); */
6360 overflow = mul_double_with_sign (TREE_INT_CST_LOW (arg01),
6361 TREE_INT_CST_HIGH (arg01),
6362 TREE_INT_CST_LOW (arg1),
6363 TREE_INT_CST_HIGH (arg1),
6364 &val.low, &val.high, unsigned_p);
6365 prod = force_fit_type_double (TREE_TYPE (arg00), val, -1, overflow);
6366 neg_overflow = false;
6368 if (unsigned_p)
6370 tmp = int_const_binop (MINUS_EXPR, arg01,
6371 build_int_cst (TREE_TYPE (arg01), 1));
6372 lo = prod;
6374 /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp). */
6375 overflow = add_double_with_sign (TREE_INT_CST_LOW (prod),
6376 TREE_INT_CST_HIGH (prod),
6377 TREE_INT_CST_LOW (tmp),
6378 TREE_INT_CST_HIGH (tmp),
6379 &val.low, &val.high, unsigned_p);
6380 hi = force_fit_type_double (TREE_TYPE (arg00), val,
6381 -1, overflow | TREE_OVERFLOW (prod));
6383 else if (tree_int_cst_sgn (arg01) >= 0)
6385 tmp = int_const_binop (MINUS_EXPR, arg01,
6386 build_int_cst (TREE_TYPE (arg01), 1));
6387 switch (tree_int_cst_sgn (arg1))
6389 case -1:
6390 neg_overflow = true;
6391 lo = int_const_binop (MINUS_EXPR, prod, tmp);
6392 hi = prod;
6393 break;
6395 case 0:
6396 lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6397 hi = tmp;
6398 break;
6400 case 1:
6401 hi = int_const_binop (PLUS_EXPR, prod, tmp);
6402 lo = prod;
6403 break;
6405 default:
6406 gcc_unreachable ();
6409 else
6411 /* A negative divisor reverses the relational operators. */
6412 code = swap_tree_comparison (code);
6414 tmp = int_const_binop (PLUS_EXPR, arg01,
6415 build_int_cst (TREE_TYPE (arg01), 1));
6416 switch (tree_int_cst_sgn (arg1))
6418 case -1:
6419 hi = int_const_binop (MINUS_EXPR, prod, tmp);
6420 lo = prod;
6421 break;
6423 case 0:
6424 hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6425 lo = tmp;
6426 break;
6428 case 1:
6429 neg_overflow = true;
6430 lo = int_const_binop (PLUS_EXPR, prod, tmp);
6431 hi = prod;
6432 break;
6434 default:
6435 gcc_unreachable ();
6439 switch (code)
6441 case EQ_EXPR:
6442 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6443 return omit_one_operand_loc (loc, type, integer_zero_node, arg00);
6444 if (TREE_OVERFLOW (hi))
6445 return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6446 if (TREE_OVERFLOW (lo))
6447 return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6448 return build_range_check (loc, type, arg00, 1, lo, hi);
6450 case NE_EXPR:
6451 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6452 return omit_one_operand_loc (loc, type, integer_one_node, arg00);
6453 if (TREE_OVERFLOW (hi))
6454 return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6455 if (TREE_OVERFLOW (lo))
6456 return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6457 return build_range_check (loc, type, arg00, 0, lo, hi);
6459 case LT_EXPR:
6460 if (TREE_OVERFLOW (lo))
6462 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6463 return omit_one_operand_loc (loc, type, tmp, arg00);
6465 return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6467 case LE_EXPR:
6468 if (TREE_OVERFLOW (hi))
6470 tmp = neg_overflow ? integer_zero_node : integer_one_node;
6471 return omit_one_operand_loc (loc, type, tmp, arg00);
6473 return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6475 case GT_EXPR:
6476 if (TREE_OVERFLOW (hi))
6478 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6479 return omit_one_operand_loc (loc, type, tmp, arg00);
6481 return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6483 case GE_EXPR:
6484 if (TREE_OVERFLOW (lo))
6486 tmp = neg_overflow ? integer_one_node : integer_zero_node;
6487 return omit_one_operand_loc (loc, type, tmp, arg00);
6489 return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6491 default:
6492 break;
6495 return NULL_TREE;
6499 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6500 equality/inequality test, then return a simplified form of the test
6501 using a sign testing. Otherwise return NULL. TYPE is the desired
6502 result type. */
6504 static tree
6505 fold_single_bit_test_into_sign_test (location_t loc,
6506 enum tree_code code, tree arg0, tree arg1,
6507 tree result_type)
6509 /* If this is testing a single bit, we can optimize the test. */
6510 if ((code == NE_EXPR || code == EQ_EXPR)
6511 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6512 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6514 /* If we have (A & C) != 0 where C is the sign bit of A, convert
6515 this into A < 0. Similarly for (A & C) == 0 into A >= 0. */
6516 tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6518 if (arg00 != NULL_TREE
6519 /* This is only a win if casting to a signed type is cheap,
6520 i.e. when arg00's type is not a partial mode. */
6521 && TYPE_PRECISION (TREE_TYPE (arg00))
6522 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00))))
6524 tree stype = signed_type_for (TREE_TYPE (arg00));
6525 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6526 result_type,
6527 fold_convert_loc (loc, stype, arg00),
6528 build_int_cst (stype, 0));
6532 return NULL_TREE;
6535 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6536 equality/inequality test, then return a simplified form of
6537 the test using shifts and logical operations. Otherwise return
6538 NULL. TYPE is the desired result type. */
6540 tree
6541 fold_single_bit_test (location_t loc, enum tree_code code,
6542 tree arg0, tree arg1, tree result_type)
6544 /* If this is testing a single bit, we can optimize the test. */
6545 if ((code == NE_EXPR || code == EQ_EXPR)
6546 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6547 && integer_pow2p (TREE_OPERAND (arg0, 1)))
6549 tree inner = TREE_OPERAND (arg0, 0);
6550 tree type = TREE_TYPE (arg0);
6551 int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6552 enum machine_mode operand_mode = TYPE_MODE (type);
6553 int ops_unsigned;
6554 tree signed_type, unsigned_type, intermediate_type;
6555 tree tem, one;
6557 /* First, see if we can fold the single bit test into a sign-bit
6558 test. */
6559 tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1,
6560 result_type);
6561 if (tem)
6562 return tem;
6564 /* Otherwise we have (A & C) != 0 where C is a single bit,
6565 convert that into ((A >> C2) & 1). Where C2 = log2(C).
6566 Similarly for (A & C) == 0. */
6568 /* If INNER is a right shift of a constant and it plus BITNUM does
6569 not overflow, adjust BITNUM and INNER. */
6570 if (TREE_CODE (inner) == RSHIFT_EXPR
6571 && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6572 && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
6573 && bitnum < TYPE_PRECISION (type)
6574 && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
6575 bitnum - TYPE_PRECISION (type)))
6577 bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
6578 inner = TREE_OPERAND (inner, 0);
6581 /* If we are going to be able to omit the AND below, we must do our
6582 operations as unsigned. If we must use the AND, we have a choice.
6583 Normally unsigned is faster, but for some machines signed is. */
6584 #ifdef LOAD_EXTEND_OP
6585 ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
6586 && !flag_syntax_only) ? 0 : 1;
6587 #else
6588 ops_unsigned = 1;
6589 #endif
6591 signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6592 unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6593 intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6594 inner = fold_convert_loc (loc, intermediate_type, inner);
6596 if (bitnum != 0)
6597 inner = build2 (RSHIFT_EXPR, intermediate_type,
6598 inner, size_int (bitnum));
6600 one = build_int_cst (intermediate_type, 1);
6602 if (code == EQ_EXPR)
6603 inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one);
6605 /* Put the AND last so it can combine with more things. */
6606 inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6608 /* Make sure to return the proper type. */
6609 inner = fold_convert_loc (loc, result_type, inner);
6611 return inner;
6613 return NULL_TREE;
6616 /* Check whether we are allowed to reorder operands arg0 and arg1,
6617 such that the evaluation of arg1 occurs before arg0. */
6619 static bool
6620 reorder_operands_p (const_tree arg0, const_tree arg1)
6622 if (! flag_evaluation_order)
6623 return true;
6624 if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6625 return true;
6626 return ! TREE_SIDE_EFFECTS (arg0)
6627 && ! TREE_SIDE_EFFECTS (arg1);
6630 /* Test whether it is preferable two swap two operands, ARG0 and
6631 ARG1, for example because ARG0 is an integer constant and ARG1
6632 isn't. If REORDER is true, only recommend swapping if we can
6633 evaluate the operands in reverse order. */
6635 bool
6636 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6638 STRIP_SIGN_NOPS (arg0);
6639 STRIP_SIGN_NOPS (arg1);
6641 if (TREE_CODE (arg1) == INTEGER_CST)
6642 return 0;
6643 if (TREE_CODE (arg0) == INTEGER_CST)
6644 return 1;
6646 if (TREE_CODE (arg1) == REAL_CST)
6647 return 0;
6648 if (TREE_CODE (arg0) == REAL_CST)
6649 return 1;
6651 if (TREE_CODE (arg1) == FIXED_CST)
6652 return 0;
6653 if (TREE_CODE (arg0) == FIXED_CST)
6654 return 1;
6656 if (TREE_CODE (arg1) == COMPLEX_CST)
6657 return 0;
6658 if (TREE_CODE (arg0) == COMPLEX_CST)
6659 return 1;
6661 if (TREE_CONSTANT (arg1))
6662 return 0;
6663 if (TREE_CONSTANT (arg0))
6664 return 1;
6666 if (optimize_function_for_size_p (cfun))
6667 return 0;
6669 if (reorder && flag_evaluation_order
6670 && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6671 return 0;
6673 /* It is preferable to swap two SSA_NAME to ensure a canonical form
6674 for commutative and comparison operators. Ensuring a canonical
6675 form allows the optimizers to find additional redundancies without
6676 having to explicitly check for both orderings. */
6677 if (TREE_CODE (arg0) == SSA_NAME
6678 && TREE_CODE (arg1) == SSA_NAME
6679 && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6680 return 1;
6682 /* Put SSA_NAMEs last. */
6683 if (TREE_CODE (arg1) == SSA_NAME)
6684 return 0;
6685 if (TREE_CODE (arg0) == SSA_NAME)
6686 return 1;
6688 /* Put variables last. */
6689 if (DECL_P (arg1))
6690 return 0;
6691 if (DECL_P (arg0))
6692 return 1;
6694 return 0;
6697 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6698 ARG0 is extended to a wider type. */
6700 static tree
6701 fold_widened_comparison (location_t loc, enum tree_code code,
6702 tree type, tree arg0, tree arg1)
6704 tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6705 tree arg1_unw;
6706 tree shorter_type, outer_type;
6707 tree min, max;
6708 bool above, below;
6710 if (arg0_unw == arg0)
6711 return NULL_TREE;
6712 shorter_type = TREE_TYPE (arg0_unw);
6714 #ifdef HAVE_canonicalize_funcptr_for_compare
6715 /* Disable this optimization if we're casting a function pointer
6716 type on targets that require function pointer canonicalization. */
6717 if (HAVE_canonicalize_funcptr_for_compare
6718 && TREE_CODE (shorter_type) == POINTER_TYPE
6719 && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6720 return NULL_TREE;
6721 #endif
6723 if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6724 return NULL_TREE;
6726 arg1_unw = get_unwidened (arg1, NULL_TREE);
6728 /* If possible, express the comparison in the shorter mode. */
6729 if ((code == EQ_EXPR || code == NE_EXPR
6730 || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
6731 && (TREE_TYPE (arg1_unw) == shorter_type
6732 || ((TYPE_PRECISION (shorter_type)
6733 >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
6734 && (TYPE_UNSIGNED (shorter_type)
6735 == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
6736 || (TREE_CODE (arg1_unw) == INTEGER_CST
6737 && (TREE_CODE (shorter_type) == INTEGER_TYPE
6738 || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
6739 && int_fits_type_p (arg1_unw, shorter_type))))
6740 return fold_build2_loc (loc, code, type, arg0_unw,
6741 fold_convert_loc (loc, shorter_type, arg1_unw));
6743 if (TREE_CODE (arg1_unw) != INTEGER_CST
6744 || TREE_CODE (shorter_type) != INTEGER_TYPE
6745 || !int_fits_type_p (arg1_unw, shorter_type))
6746 return NULL_TREE;
6748 /* If we are comparing with the integer that does not fit into the range
6749 of the shorter type, the result is known. */
6750 outer_type = TREE_TYPE (arg1_unw);
6751 min = lower_bound_in_type (outer_type, shorter_type);
6752 max = upper_bound_in_type (outer_type, shorter_type);
6754 above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6755 max, arg1_unw));
6756 below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
6757 arg1_unw, min));
6759 switch (code)
6761 case EQ_EXPR:
6762 if (above || below)
6763 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6764 break;
6766 case NE_EXPR:
6767 if (above || below)
6768 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6769 break;
6771 case LT_EXPR:
6772 case LE_EXPR:
6773 if (above)
6774 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6775 else if (below)
6776 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6778 case GT_EXPR:
6779 case GE_EXPR:
6780 if (above)
6781 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6782 else if (below)
6783 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6785 default:
6786 break;
6789 return NULL_TREE;
6792 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
6793 ARG0 just the signedness is changed. */
6795 static tree
6796 fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type,
6797 tree arg0, tree arg1)
6799 tree arg0_inner;
6800 tree inner_type, outer_type;
6802 if (!CONVERT_EXPR_P (arg0))
6803 return NULL_TREE;
6805 outer_type = TREE_TYPE (arg0);
6806 arg0_inner = TREE_OPERAND (arg0, 0);
6807 inner_type = TREE_TYPE (arg0_inner);
6809 #ifdef HAVE_canonicalize_funcptr_for_compare
6810 /* Disable this optimization if we're casting a function pointer
6811 type on targets that require function pointer canonicalization. */
6812 if (HAVE_canonicalize_funcptr_for_compare
6813 && TREE_CODE (inner_type) == POINTER_TYPE
6814 && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
6815 return NULL_TREE;
6816 #endif
6818 if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
6819 return NULL_TREE;
6821 if (TREE_CODE (arg1) != INTEGER_CST
6822 && !(CONVERT_EXPR_P (arg1)
6823 && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
6824 return NULL_TREE;
6826 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
6827 && code != NE_EXPR
6828 && code != EQ_EXPR)
6829 return NULL_TREE;
6831 if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
6832 return NULL_TREE;
6834 if (TREE_CODE (arg1) == INTEGER_CST)
6835 arg1 = force_fit_type_double (inner_type, tree_to_double_int (arg1),
6836 0, TREE_OVERFLOW (arg1));
6837 else
6838 arg1 = fold_convert_loc (loc, inner_type, arg1);
6840 return fold_build2_loc (loc, code, type, arg0_inner, arg1);
6843 /* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is
6844 step of the array. Reconstructs s and delta in the case of s *
6845 delta being an integer constant (and thus already folded). ADDR is
6846 the address. MULT is the multiplicative expression. If the
6847 function succeeds, the new address expression is returned.
6848 Otherwise NULL_TREE is returned. LOC is the location of the
6849 resulting expression. */
6851 static tree
6852 try_move_mult_to_index (location_t loc, tree addr, tree op1)
6854 tree s, delta, step;
6855 tree ref = TREE_OPERAND (addr, 0), pref;
6856 tree ret, pos;
6857 tree itype;
6858 bool mdim = false;
6860 /* Strip the nops that might be added when converting op1 to sizetype. */
6861 STRIP_NOPS (op1);
6863 /* Canonicalize op1 into a possibly non-constant delta
6864 and an INTEGER_CST s. */
6865 if (TREE_CODE (op1) == MULT_EXPR)
6867 tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1);
6869 STRIP_NOPS (arg0);
6870 STRIP_NOPS (arg1);
6872 if (TREE_CODE (arg0) == INTEGER_CST)
6874 s = arg0;
6875 delta = arg1;
6877 else if (TREE_CODE (arg1) == INTEGER_CST)
6879 s = arg1;
6880 delta = arg0;
6882 else
6883 return NULL_TREE;
6885 else if (TREE_CODE (op1) == INTEGER_CST)
6887 delta = op1;
6888 s = NULL_TREE;
6890 else
6892 /* Simulate we are delta * 1. */
6893 delta = op1;
6894 s = integer_one_node;
6897 /* Handle &x.array the same as we would handle &x.array[0]. */
6898 if (TREE_CODE (ref) == COMPONENT_REF
6899 && TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE)
6901 tree domain;
6903 /* Remember if this was a multi-dimensional array. */
6904 if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6905 mdim = true;
6907 domain = TYPE_DOMAIN (TREE_TYPE (ref));
6908 if (! domain)
6909 goto cont;
6910 itype = TREE_TYPE (domain);
6912 step = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ref)));
6913 if (TREE_CODE (step) != INTEGER_CST)
6914 goto cont;
6916 if (s)
6918 if (! tree_int_cst_equal (step, s))
6919 goto cont;
6921 else
6923 /* Try if delta is a multiple of step. */
6924 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
6925 if (! tmp)
6926 goto cont;
6927 delta = tmp;
6930 /* Only fold here if we can verify we do not overflow one
6931 dimension of a multi-dimensional array. */
6932 if (mdim)
6934 tree tmp;
6936 if (!TYPE_MIN_VALUE (domain)
6937 || !TYPE_MAX_VALUE (domain)
6938 || TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST)
6939 goto cont;
6941 tmp = fold_binary_loc (loc, PLUS_EXPR, itype,
6942 fold_convert_loc (loc, itype,
6943 TYPE_MIN_VALUE (domain)),
6944 fold_convert_loc (loc, itype, delta));
6945 if (TREE_CODE (tmp) != INTEGER_CST
6946 || tree_int_cst_lt (TYPE_MAX_VALUE (domain), tmp))
6947 goto cont;
6950 /* We found a suitable component reference. */
6952 pref = TREE_OPERAND (addr, 0);
6953 ret = copy_node (pref);
6954 SET_EXPR_LOCATION (ret, loc);
6956 ret = build4_loc (loc, ARRAY_REF, TREE_TYPE (TREE_TYPE (ref)), ret,
6957 fold_build2_loc
6958 (loc, PLUS_EXPR, itype,
6959 fold_convert_loc (loc, itype,
6960 TYPE_MIN_VALUE
6961 (TYPE_DOMAIN (TREE_TYPE (ref)))),
6962 fold_convert_loc (loc, itype, delta)),
6963 NULL_TREE, NULL_TREE);
6964 return build_fold_addr_expr_loc (loc, ret);
6967 cont:
6969 for (;; ref = TREE_OPERAND (ref, 0))
6971 if (TREE_CODE (ref) == ARRAY_REF)
6973 tree domain;
6975 /* Remember if this was a multi-dimensional array. */
6976 if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF)
6977 mdim = true;
6979 domain = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0)));
6980 if (! domain)
6981 continue;
6982 itype = TREE_TYPE (domain);
6984 step = array_ref_element_size (ref);
6985 if (TREE_CODE (step) != INTEGER_CST)
6986 continue;
6988 if (s)
6990 if (! tree_int_cst_equal (step, s))
6991 continue;
6993 else
6995 /* Try if delta is a multiple of step. */
6996 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step);
6997 if (! tmp)
6998 continue;
6999 delta = tmp;
7002 /* Only fold here if we can verify we do not overflow one
7003 dimension of a multi-dimensional array. */
7004 if (mdim)
7006 tree tmp;
7008 if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST
7009 || !TYPE_MAX_VALUE (domain)
7010 || TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST)
7011 continue;
7013 tmp = fold_binary_loc (loc, PLUS_EXPR, itype,
7014 fold_convert_loc (loc, itype,
7015 TREE_OPERAND (ref, 1)),
7016 fold_convert_loc (loc, itype, delta));
7017 if (!tmp
7018 || TREE_CODE (tmp) != INTEGER_CST
7019 || tree_int_cst_lt (TYPE_MAX_VALUE (domain), tmp))
7020 continue;
7023 break;
7025 else
7026 mdim = false;
7028 if (!handled_component_p (ref))
7029 return NULL_TREE;
7032 /* We found the suitable array reference. So copy everything up to it,
7033 and replace the index. */
7035 pref = TREE_OPERAND (addr, 0);
7036 ret = copy_node (pref);
7037 SET_EXPR_LOCATION (ret, loc);
7038 pos = ret;
7040 while (pref != ref)
7042 pref = TREE_OPERAND (pref, 0);
7043 TREE_OPERAND (pos, 0) = copy_node (pref);
7044 pos = TREE_OPERAND (pos, 0);
7047 TREE_OPERAND (pos, 1)
7048 = fold_build2_loc (loc, PLUS_EXPR, itype,
7049 fold_convert_loc (loc, itype, TREE_OPERAND (pos, 1)),
7050 fold_convert_loc (loc, itype, delta));
7051 return fold_build1_loc (loc, ADDR_EXPR, TREE_TYPE (addr), ret);
7055 /* Fold A < X && A + 1 > Y to A < X && A >= Y. Normally A + 1 > Y
7056 means A >= Y && A != MAX, but in this case we know that
7057 A < X <= MAX. INEQ is A + 1 > Y, BOUND is A < X. */
7059 static tree
7060 fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound)
7062 tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7064 if (TREE_CODE (bound) == LT_EXPR)
7065 a = TREE_OPERAND (bound, 0);
7066 else if (TREE_CODE (bound) == GT_EXPR)
7067 a = TREE_OPERAND (bound, 1);
7068 else
7069 return NULL_TREE;
7071 typea = TREE_TYPE (a);
7072 if (!INTEGRAL_TYPE_P (typea)
7073 && !POINTER_TYPE_P (typea))
7074 return NULL_TREE;
7076 if (TREE_CODE (ineq) == LT_EXPR)
7078 a1 = TREE_OPERAND (ineq, 1);
7079 y = TREE_OPERAND (ineq, 0);
7081 else if (TREE_CODE (ineq) == GT_EXPR)
7083 a1 = TREE_OPERAND (ineq, 0);
7084 y = TREE_OPERAND (ineq, 1);
7086 else
7087 return NULL_TREE;
7089 if (TREE_TYPE (a1) != typea)
7090 return NULL_TREE;
7092 if (POINTER_TYPE_P (typea))
7094 /* Convert the pointer types into integer before taking the difference. */
7095 tree ta = fold_convert_loc (loc, ssizetype, a);
7096 tree ta1 = fold_convert_loc (loc, ssizetype, a1);
7097 diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta);
7099 else
7100 diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a);
7102 if (!diff || !integer_onep (diff))
7103 return NULL_TREE;
7105 return fold_build2_loc (loc, GE_EXPR, type, a, y);
7108 /* Fold a sum or difference of at least one multiplication.
7109 Returns the folded tree or NULL if no simplification could be made. */
7111 static tree
7112 fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
7113 tree arg0, tree arg1)
7115 tree arg00, arg01, arg10, arg11;
7116 tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7118 /* (A * C) +- (B * C) -> (A+-B) * C.
7119 (A * C) +- A -> A * (C+-1).
7120 We are most concerned about the case where C is a constant,
7121 but other combinations show up during loop reduction. Since
7122 it is not difficult, try all four possibilities. */
7124 if (TREE_CODE (arg0) == MULT_EXPR)
7126 arg00 = TREE_OPERAND (arg0, 0);
7127 arg01 = TREE_OPERAND (arg0, 1);
7129 else if (TREE_CODE (arg0) == INTEGER_CST)
7131 arg00 = build_one_cst (type);
7132 arg01 = arg0;
7134 else
7136 /* We cannot generate constant 1 for fract. */
7137 if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7138 return NULL_TREE;
7139 arg00 = arg0;
7140 arg01 = build_one_cst (type);
7142 if (TREE_CODE (arg1) == MULT_EXPR)
7144 arg10 = TREE_OPERAND (arg1, 0);
7145 arg11 = TREE_OPERAND (arg1, 1);
7147 else if (TREE_CODE (arg1) == INTEGER_CST)
7149 arg10 = build_one_cst (type);
7150 /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7151 the purpose of this canonicalization. */
7152 if (TREE_INT_CST_HIGH (arg1) == -1
7153 && negate_expr_p (arg1)
7154 && code == PLUS_EXPR)
7156 arg11 = negate_expr (arg1);
7157 code = MINUS_EXPR;
7159 else
7160 arg11 = arg1;
7162 else
7164 /* We cannot generate constant 1 for fract. */
7165 if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7166 return NULL_TREE;
7167 arg10 = arg1;
7168 arg11 = build_one_cst (type);
7170 same = NULL_TREE;
7172 if (operand_equal_p (arg01, arg11, 0))
7173 same = arg01, alt0 = arg00, alt1 = arg10;
7174 else if (operand_equal_p (arg00, arg10, 0))
7175 same = arg00, alt0 = arg01, alt1 = arg11;
7176 else if (operand_equal_p (arg00, arg11, 0))
7177 same = arg00, alt0 = arg01, alt1 = arg10;
7178 else if (operand_equal_p (arg01, arg10, 0))
7179 same = arg01, alt0 = arg00, alt1 = arg11;
7181 /* No identical multiplicands; see if we can find a common
7182 power-of-two factor in non-power-of-two multiplies. This
7183 can help in multi-dimensional array access. */
7184 else if (host_integerp (arg01, 0)
7185 && host_integerp (arg11, 0))
7187 HOST_WIDE_INT int01, int11, tmp;
7188 bool swap = false;
7189 tree maybe_same;
7190 int01 = TREE_INT_CST_LOW (arg01);
7191 int11 = TREE_INT_CST_LOW (arg11);
7193 /* Move min of absolute values to int11. */
7194 if (absu_hwi (int01) < absu_hwi (int11))
7196 tmp = int01, int01 = int11, int11 = tmp;
7197 alt0 = arg00, arg00 = arg10, arg10 = alt0;
7198 maybe_same = arg01;
7199 swap = true;
7201 else
7202 maybe_same = arg11;
7204 if (exact_log2 (absu_hwi (int11)) > 0 && int01 % int11 == 0
7205 /* The remainder should not be a constant, otherwise we
7206 end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7207 increased the number of multiplications necessary. */
7208 && TREE_CODE (arg10) != INTEGER_CST)
7210 alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00,
7211 build_int_cst (TREE_TYPE (arg00),
7212 int01 / int11));
7213 alt1 = arg10;
7214 same = maybe_same;
7215 if (swap)
7216 maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7220 if (same)
7221 return fold_build2_loc (loc, MULT_EXPR, type,
7222 fold_build2_loc (loc, code, type,
7223 fold_convert_loc (loc, type, alt0),
7224 fold_convert_loc (loc, type, alt1)),
7225 fold_convert_loc (loc, type, same));
7227 return NULL_TREE;
7230 /* Subroutine of native_encode_expr. Encode the INTEGER_CST
7231 specified by EXPR into the buffer PTR of length LEN bytes.
7232 Return the number of bytes placed in the buffer, or zero
7233 upon failure. */
7235 static int
7236 native_encode_int (const_tree expr, unsigned char *ptr, int len)
7238 tree type = TREE_TYPE (expr);
7239 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7240 int byte, offset, word, words;
7241 unsigned char value;
7243 if (total_bytes > len)
7244 return 0;
7245 words = total_bytes / UNITS_PER_WORD;
7247 for (byte = 0; byte < total_bytes; byte++)
7249 int bitpos = byte * BITS_PER_UNIT;
7250 if (bitpos < HOST_BITS_PER_WIDE_INT)
7251 value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos);
7252 else
7253 value = (unsigned char) (TREE_INT_CST_HIGH (expr)
7254 >> (bitpos - HOST_BITS_PER_WIDE_INT));
7256 if (total_bytes > UNITS_PER_WORD)
7258 word = byte / UNITS_PER_WORD;
7259 if (WORDS_BIG_ENDIAN)
7260 word = (words - 1) - word;
7261 offset = word * UNITS_PER_WORD;
7262 if (BYTES_BIG_ENDIAN)
7263 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7264 else
7265 offset += byte % UNITS_PER_WORD;
7267 else
7268 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7269 ptr[offset] = value;
7271 return total_bytes;
7275 /* Subroutine of native_encode_expr. Encode the REAL_CST
7276 specified by EXPR into the buffer PTR of length LEN bytes.
7277 Return the number of bytes placed in the buffer, or zero
7278 upon failure. */
7280 static int
7281 native_encode_real (const_tree expr, unsigned char *ptr, int len)
7283 tree type = TREE_TYPE (expr);
7284 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7285 int byte, offset, word, words, bitpos;
7286 unsigned char value;
7288 /* There are always 32 bits in each long, no matter the size of
7289 the hosts long. We handle floating point representations with
7290 up to 192 bits. */
7291 long tmp[6];
7293 if (total_bytes > len)
7294 return 0;
7295 words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7297 real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7299 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7300 bitpos += BITS_PER_UNIT)
7302 byte = (bitpos / BITS_PER_UNIT) & 3;
7303 value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7305 if (UNITS_PER_WORD < 4)
7307 word = byte / UNITS_PER_WORD;
7308 if (WORDS_BIG_ENDIAN)
7309 word = (words - 1) - word;
7310 offset = word * UNITS_PER_WORD;
7311 if (BYTES_BIG_ENDIAN)
7312 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7313 else
7314 offset += byte % UNITS_PER_WORD;
7316 else
7317 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7318 ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
7320 return total_bytes;
7323 /* Subroutine of native_encode_expr. Encode the COMPLEX_CST
7324 specified by EXPR into the buffer PTR of length LEN bytes.
7325 Return the number of bytes placed in the buffer, or zero
7326 upon failure. */
7328 static int
7329 native_encode_complex (const_tree expr, unsigned char *ptr, int len)
7331 int rsize, isize;
7332 tree part;
7334 part = TREE_REALPART (expr);
7335 rsize = native_encode_expr (part, ptr, len);
7336 if (rsize == 0)
7337 return 0;
7338 part = TREE_IMAGPART (expr);
7339 isize = native_encode_expr (part, ptr+rsize, len-rsize);
7340 if (isize != rsize)
7341 return 0;
7342 return rsize + isize;
7346 /* Subroutine of native_encode_expr. Encode the VECTOR_CST
7347 specified by EXPR into the buffer PTR of length LEN bytes.
7348 Return the number of bytes placed in the buffer, or zero
7349 upon failure. */
7351 static int
7352 native_encode_vector (const_tree expr, unsigned char *ptr, int len)
7354 int i, size, offset, count;
7355 tree itype, elem, elements;
7357 offset = 0;
7358 elements = TREE_VECTOR_CST_ELTS (expr);
7359 count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr));
7360 itype = TREE_TYPE (TREE_TYPE (expr));
7361 size = GET_MODE_SIZE (TYPE_MODE (itype));
7362 for (i = 0; i < count; i++)
7364 if (elements)
7366 elem = TREE_VALUE (elements);
7367 elements = TREE_CHAIN (elements);
7369 else
7370 elem = NULL_TREE;
7372 if (elem)
7374 if (native_encode_expr (elem, ptr+offset, len-offset) != size)
7375 return 0;
7377 else
7379 if (offset + size > len)
7380 return 0;
7381 memset (ptr+offset, 0, size);
7383 offset += size;
7385 return offset;
7389 /* Subroutine of native_encode_expr. Encode the STRING_CST
7390 specified by EXPR into the buffer PTR of length LEN bytes.
7391 Return the number of bytes placed in the buffer, or zero
7392 upon failure. */
7394 static int
7395 native_encode_string (const_tree expr, unsigned char *ptr, int len)
7397 tree type = TREE_TYPE (expr);
7398 HOST_WIDE_INT total_bytes;
7400 if (TREE_CODE (type) != ARRAY_TYPE
7401 || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
7402 || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
7403 || !host_integerp (TYPE_SIZE_UNIT (type), 0))
7404 return 0;
7405 total_bytes = tree_low_cst (TYPE_SIZE_UNIT (type), 0);
7406 if (total_bytes > len)
7407 return 0;
7408 if (TREE_STRING_LENGTH (expr) < total_bytes)
7410 memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr));
7411 memset (ptr + TREE_STRING_LENGTH (expr), 0,
7412 total_bytes - TREE_STRING_LENGTH (expr));
7414 else
7415 memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes);
7416 return total_bytes;
7420 /* Subroutine of fold_view_convert_expr. Encode the INTEGER_CST,
7421 REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7422 buffer PTR of length LEN bytes. Return the number of bytes
7423 placed in the buffer, or zero upon failure. */
7426 native_encode_expr (const_tree expr, unsigned char *ptr, int len)
7428 switch (TREE_CODE (expr))
7430 case INTEGER_CST:
7431 return native_encode_int (expr, ptr, len);
7433 case REAL_CST:
7434 return native_encode_real (expr, ptr, len);
7436 case COMPLEX_CST:
7437 return native_encode_complex (expr, ptr, len);
7439 case VECTOR_CST:
7440 return native_encode_vector (expr, ptr, len);
7442 case STRING_CST:
7443 return native_encode_string (expr, ptr, len);
7445 default:
7446 return 0;
7451 /* Subroutine of native_interpret_expr. Interpret the contents of
7452 the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7453 If the buffer cannot be interpreted, return NULL_TREE. */
7455 static tree
7456 native_interpret_int (tree type, const unsigned char *ptr, int len)
7458 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7459 int byte, offset, word, words;
7460 unsigned char value;
7461 double_int result;
7463 if (total_bytes > len)
7464 return NULL_TREE;
7465 if (total_bytes * BITS_PER_UNIT > 2 * HOST_BITS_PER_WIDE_INT)
7466 return NULL_TREE;
7468 result = double_int_zero;
7469 words = total_bytes / UNITS_PER_WORD;
7471 for (byte = 0; byte < total_bytes; byte++)
7473 int bitpos = byte * BITS_PER_UNIT;
7474 if (total_bytes > UNITS_PER_WORD)
7476 word = byte / UNITS_PER_WORD;
7477 if (WORDS_BIG_ENDIAN)
7478 word = (words - 1) - word;
7479 offset = word * UNITS_PER_WORD;
7480 if (BYTES_BIG_ENDIAN)
7481 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7482 else
7483 offset += byte % UNITS_PER_WORD;
7485 else
7486 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7487 value = ptr[offset];
7489 if (bitpos < HOST_BITS_PER_WIDE_INT)
7490 result.low |= (unsigned HOST_WIDE_INT) value << bitpos;
7491 else
7492 result.high |= (unsigned HOST_WIDE_INT) value
7493 << (bitpos - HOST_BITS_PER_WIDE_INT);
7496 return double_int_to_tree (type, result);
7500 /* Subroutine of native_interpret_expr. Interpret the contents of
7501 the buffer PTR of length LEN as a REAL_CST of type TYPE.
7502 If the buffer cannot be interpreted, return NULL_TREE. */
7504 static tree
7505 native_interpret_real (tree type, const unsigned char *ptr, int len)
7507 enum machine_mode mode = TYPE_MODE (type);
7508 int total_bytes = GET_MODE_SIZE (mode);
7509 int byte, offset, word, words, bitpos;
7510 unsigned char value;
7511 /* There are always 32 bits in each long, no matter the size of
7512 the hosts long. We handle floating point representations with
7513 up to 192 bits. */
7514 REAL_VALUE_TYPE r;
7515 long tmp[6];
7517 total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7518 if (total_bytes > len || total_bytes > 24)
7519 return NULL_TREE;
7520 words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7522 memset (tmp, 0, sizeof (tmp));
7523 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7524 bitpos += BITS_PER_UNIT)
7526 byte = (bitpos / BITS_PER_UNIT) & 3;
7527 if (UNITS_PER_WORD < 4)
7529 word = byte / UNITS_PER_WORD;
7530 if (WORDS_BIG_ENDIAN)
7531 word = (words - 1) - word;
7532 offset = word * UNITS_PER_WORD;
7533 if (BYTES_BIG_ENDIAN)
7534 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7535 else
7536 offset += byte % UNITS_PER_WORD;
7538 else
7539 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7540 value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7542 tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7545 real_from_target (&r, tmp, mode);
7546 return build_real (type, r);
7550 /* Subroutine of native_interpret_expr. Interpret the contents of
7551 the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7552 If the buffer cannot be interpreted, return NULL_TREE. */
7554 static tree
7555 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7557 tree etype, rpart, ipart;
7558 int size;
7560 etype = TREE_TYPE (type);
7561 size = GET_MODE_SIZE (TYPE_MODE (etype));
7562 if (size * 2 > len)
7563 return NULL_TREE;
7564 rpart = native_interpret_expr (etype, ptr, size);
7565 if (!rpart)
7566 return NULL_TREE;
7567 ipart = native_interpret_expr (etype, ptr+size, size);
7568 if (!ipart)
7569 return NULL_TREE;
7570 return build_complex (type, rpart, ipart);
7574 /* Subroutine of native_interpret_expr. Interpret the contents of
7575 the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7576 If the buffer cannot be interpreted, return NULL_TREE. */
7578 static tree
7579 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7581 tree etype, elem, elements;
7582 int i, size, count;
7584 etype = TREE_TYPE (type);
7585 size = GET_MODE_SIZE (TYPE_MODE (etype));
7586 count = TYPE_VECTOR_SUBPARTS (type);
7587 if (size * count > len)
7588 return NULL_TREE;
7590 elements = NULL_TREE;
7591 for (i = count - 1; i >= 0; i--)
7593 elem = native_interpret_expr (etype, ptr+(i*size), size);
7594 if (!elem)
7595 return NULL_TREE;
7596 elements = tree_cons (NULL_TREE, elem, elements);
7598 return build_vector (type, elements);
7602 /* Subroutine of fold_view_convert_expr. Interpret the contents of
7603 the buffer PTR of length LEN as a constant of type TYPE. For
7604 INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7605 we return a REAL_CST, etc... If the buffer cannot be interpreted,
7606 return NULL_TREE. */
7608 tree
7609 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7611 switch (TREE_CODE (type))
7613 case INTEGER_TYPE:
7614 case ENUMERAL_TYPE:
7615 case BOOLEAN_TYPE:
7616 return native_interpret_int (type, ptr, len);
7618 case REAL_TYPE:
7619 return native_interpret_real (type, ptr, len);
7621 case COMPLEX_TYPE:
7622 return native_interpret_complex (type, ptr, len);
7624 case VECTOR_TYPE:
7625 return native_interpret_vector (type, ptr, len);
7627 default:
7628 return NULL_TREE;
7633 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7634 TYPE at compile-time. If we're unable to perform the conversion
7635 return NULL_TREE. */
7637 static tree
7638 fold_view_convert_expr (tree type, tree expr)
7640 /* We support up to 512-bit values (for V8DFmode). */
7641 unsigned char buffer[64];
7642 int len;
7644 /* Check that the host and target are sane. */
7645 if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7646 return NULL_TREE;
7648 len = native_encode_expr (expr, buffer, sizeof (buffer));
7649 if (len == 0)
7650 return NULL_TREE;
7652 return native_interpret_expr (type, buffer, len);
7655 /* Build an expression for the address of T. Folds away INDIRECT_REF
7656 to avoid confusing the gimplify process. */
7658 tree
7659 build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype)
7661 /* The size of the object is not relevant when talking about its address. */
7662 if (TREE_CODE (t) == WITH_SIZE_EXPR)
7663 t = TREE_OPERAND (t, 0);
7665 if (TREE_CODE (t) == INDIRECT_REF)
7667 t = TREE_OPERAND (t, 0);
7669 if (TREE_TYPE (t) != ptrtype)
7670 t = build1_loc (loc, NOP_EXPR, ptrtype, t);
7672 else if (TREE_CODE (t) == MEM_REF
7673 && integer_zerop (TREE_OPERAND (t, 1)))
7674 return TREE_OPERAND (t, 0);
7675 else if (TREE_CODE (t) == VIEW_CONVERT_EXPR)
7677 t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0));
7679 if (TREE_TYPE (t) != ptrtype)
7680 t = fold_convert_loc (loc, ptrtype, t);
7682 else
7683 t = build1_loc (loc, ADDR_EXPR, ptrtype, t);
7685 return t;
7688 /* Build an expression for the address of T. */
7690 tree
7691 build_fold_addr_expr_loc (location_t loc, tree t)
7693 tree ptrtype = build_pointer_type (TREE_TYPE (t));
7695 return build_fold_addr_expr_with_type_loc (loc, t, ptrtype);
7698 static bool vec_cst_ctor_to_array (tree, tree *);
7700 /* Fold a unary expression of code CODE and type TYPE with operand
7701 OP0. Return the folded expression if folding is successful.
7702 Otherwise, return NULL_TREE. */
7704 tree
7705 fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
7707 tree tem;
7708 tree arg0;
7709 enum tree_code_class kind = TREE_CODE_CLASS (code);
7711 gcc_assert (IS_EXPR_CODE_CLASS (kind)
7712 && TREE_CODE_LENGTH (code) == 1);
7714 arg0 = op0;
7715 if (arg0)
7717 if (CONVERT_EXPR_CODE_P (code)
7718 || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR)
7720 /* Don't use STRIP_NOPS, because signedness of argument type
7721 matters. */
7722 STRIP_SIGN_NOPS (arg0);
7724 else
7726 /* Strip any conversions that don't change the mode. This
7727 is safe for every expression, except for a comparison
7728 expression because its signedness is derived from its
7729 operands.
7731 Note that this is done as an internal manipulation within
7732 the constant folder, in order to find the simplest
7733 representation of the arguments so that their form can be
7734 studied. In any cases, the appropriate type conversions
7735 should be put back in the tree that will get out of the
7736 constant folder. */
7737 STRIP_NOPS (arg0);
7741 if (TREE_CODE_CLASS (code) == tcc_unary)
7743 if (TREE_CODE (arg0) == COMPOUND_EXPR)
7744 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7745 fold_build1_loc (loc, code, type,
7746 fold_convert_loc (loc, TREE_TYPE (op0),
7747 TREE_OPERAND (arg0, 1))));
7748 else if (TREE_CODE (arg0) == COND_EXPR)
7750 tree arg01 = TREE_OPERAND (arg0, 1);
7751 tree arg02 = TREE_OPERAND (arg0, 2);
7752 if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7753 arg01 = fold_build1_loc (loc, code, type,
7754 fold_convert_loc (loc,
7755 TREE_TYPE (op0), arg01));
7756 if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7757 arg02 = fold_build1_loc (loc, code, type,
7758 fold_convert_loc (loc,
7759 TREE_TYPE (op0), arg02));
7760 tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0),
7761 arg01, arg02);
7763 /* If this was a conversion, and all we did was to move into
7764 inside the COND_EXPR, bring it back out. But leave it if
7765 it is a conversion from integer to integer and the
7766 result precision is no wider than a word since such a
7767 conversion is cheap and may be optimized away by combine,
7768 while it couldn't if it were outside the COND_EXPR. Then return
7769 so we don't get into an infinite recursion loop taking the
7770 conversion out and then back in. */
7772 if ((CONVERT_EXPR_CODE_P (code)
7773 || code == NON_LVALUE_EXPR)
7774 && TREE_CODE (tem) == COND_EXPR
7775 && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7776 && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7777 && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7778 && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7779 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7780 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7781 && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7782 && (INTEGRAL_TYPE_P
7783 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7784 && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7785 || flag_syntax_only))
7786 tem = build1_loc (loc, code, type,
7787 build3 (COND_EXPR,
7788 TREE_TYPE (TREE_OPERAND
7789 (TREE_OPERAND (tem, 1), 0)),
7790 TREE_OPERAND (tem, 0),
7791 TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7792 TREE_OPERAND (TREE_OPERAND (tem, 2),
7793 0)));
7794 return tem;
7798 switch (code)
7800 case PAREN_EXPR:
7801 /* Re-association barriers around constants and other re-association
7802 barriers can be removed. */
7803 if (CONSTANT_CLASS_P (op0)
7804 || TREE_CODE (op0) == PAREN_EXPR)
7805 return fold_convert_loc (loc, type, op0);
7806 return NULL_TREE;
7808 CASE_CONVERT:
7809 case FLOAT_EXPR:
7810 case FIX_TRUNC_EXPR:
7811 if (TREE_TYPE (op0) == type)
7812 return op0;
7814 if (COMPARISON_CLASS_P (op0))
7816 /* If we have (type) (a CMP b) and type is an integral type, return
7817 new expression involving the new type. Canonicalize
7818 (type) (a CMP b) to (a CMP b) ? (type) true : (type) false for
7819 non-integral type.
7820 Do not fold the result as that would not simplify further, also
7821 folding again results in recursions. */
7822 if (TREE_CODE (type) == BOOLEAN_TYPE)
7823 return build2_loc (loc, TREE_CODE (op0), type,
7824 TREE_OPERAND (op0, 0),
7825 TREE_OPERAND (op0, 1));
7826 else if (!INTEGRAL_TYPE_P (type))
7827 return build3_loc (loc, COND_EXPR, type, op0,
7828 constant_boolean_node (true, type),
7829 constant_boolean_node (false, type));
7832 /* Handle cases of two conversions in a row. */
7833 if (CONVERT_EXPR_P (op0))
7835 tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0));
7836 tree inter_type = TREE_TYPE (op0);
7837 int inside_int = INTEGRAL_TYPE_P (inside_type);
7838 int inside_ptr = POINTER_TYPE_P (inside_type);
7839 int inside_float = FLOAT_TYPE_P (inside_type);
7840 int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE;
7841 unsigned int inside_prec = TYPE_PRECISION (inside_type);
7842 int inside_unsignedp = TYPE_UNSIGNED (inside_type);
7843 int inter_int = INTEGRAL_TYPE_P (inter_type);
7844 int inter_ptr = POINTER_TYPE_P (inter_type);
7845 int inter_float = FLOAT_TYPE_P (inter_type);
7846 int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE;
7847 unsigned int inter_prec = TYPE_PRECISION (inter_type);
7848 int inter_unsignedp = TYPE_UNSIGNED (inter_type);
7849 int final_int = INTEGRAL_TYPE_P (type);
7850 int final_ptr = POINTER_TYPE_P (type);
7851 int final_float = FLOAT_TYPE_P (type);
7852 int final_vec = TREE_CODE (type) == VECTOR_TYPE;
7853 unsigned int final_prec = TYPE_PRECISION (type);
7854 int final_unsignedp = TYPE_UNSIGNED (type);
7856 /* In addition to the cases of two conversions in a row
7857 handled below, if we are converting something to its own
7858 type via an object of identical or wider precision, neither
7859 conversion is needed. */
7860 if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type)
7861 && (((inter_int || inter_ptr) && final_int)
7862 || (inter_float && final_float))
7863 && inter_prec >= final_prec)
7864 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
7866 /* Likewise, if the intermediate and initial types are either both
7867 float or both integer, we don't need the middle conversion if the
7868 former is wider than the latter and doesn't change the signedness
7869 (for integers). Avoid this if the final type is a pointer since
7870 then we sometimes need the middle conversion. Likewise if the
7871 final type has a precision not equal to the size of its mode. */
7872 if (((inter_int && inside_int)
7873 || (inter_float && inside_float)
7874 || (inter_vec && inside_vec))
7875 && inter_prec >= inside_prec
7876 && (inter_float || inter_vec
7877 || inter_unsignedp == inside_unsignedp)
7878 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7879 && TYPE_MODE (type) == TYPE_MODE (inter_type))
7880 && ! final_ptr
7881 && (! final_vec || inter_prec == inside_prec))
7882 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
7884 /* If we have a sign-extension of a zero-extended value, we can
7885 replace that by a single zero-extension. */
7886 if (inside_int && inter_int && final_int
7887 && inside_prec < inter_prec && inter_prec < final_prec
7888 && inside_unsignedp && !inter_unsignedp)
7889 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
7891 /* Two conversions in a row are not needed unless:
7892 - some conversion is floating-point (overstrict for now), or
7893 - some conversion is a vector (overstrict for now), or
7894 - the intermediate type is narrower than both initial and
7895 final, or
7896 - the intermediate type and innermost type differ in signedness,
7897 and the outermost type is wider than the intermediate, or
7898 - the initial type is a pointer type and the precisions of the
7899 intermediate and final types differ, or
7900 - the final type is a pointer type and the precisions of the
7901 initial and intermediate types differ. */
7902 if (! inside_float && ! inter_float && ! final_float
7903 && ! inside_vec && ! inter_vec && ! final_vec
7904 && (inter_prec >= inside_prec || inter_prec >= final_prec)
7905 && ! (inside_int && inter_int
7906 && inter_unsignedp != inside_unsignedp
7907 && inter_prec < final_prec)
7908 && ((inter_unsignedp && inter_prec > inside_prec)
7909 == (final_unsignedp && final_prec > inter_prec))
7910 && ! (inside_ptr && inter_prec != final_prec)
7911 && ! (final_ptr && inside_prec != inter_prec)
7912 && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
7913 && TYPE_MODE (type) == TYPE_MODE (inter_type)))
7914 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
7917 /* Handle (T *)&A.B.C for A being of type T and B and C
7918 living at offset zero. This occurs frequently in
7919 C++ upcasting and then accessing the base. */
7920 if (TREE_CODE (op0) == ADDR_EXPR
7921 && POINTER_TYPE_P (type)
7922 && handled_component_p (TREE_OPERAND (op0, 0)))
7924 HOST_WIDE_INT bitsize, bitpos;
7925 tree offset;
7926 enum machine_mode mode;
7927 int unsignedp, volatilep;
7928 tree base = TREE_OPERAND (op0, 0);
7929 base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7930 &mode, &unsignedp, &volatilep, false);
7931 /* If the reference was to a (constant) zero offset, we can use
7932 the address of the base if it has the same base type
7933 as the result type and the pointer type is unqualified. */
7934 if (! offset && bitpos == 0
7935 && (TYPE_MAIN_VARIANT (TREE_TYPE (type))
7936 == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7937 && TYPE_QUALS (type) == TYPE_UNQUALIFIED)
7938 return fold_convert_loc (loc, type,
7939 build_fold_addr_expr_loc (loc, base));
7942 if (TREE_CODE (op0) == MODIFY_EXPR
7943 && TREE_CONSTANT (TREE_OPERAND (op0, 1))
7944 /* Detect assigning a bitfield. */
7945 && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
7946 && DECL_BIT_FIELD
7947 (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
7949 /* Don't leave an assignment inside a conversion
7950 unless assigning a bitfield. */
7951 tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1));
7952 /* First do the assignment, then return converted constant. */
7953 tem = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
7954 TREE_NO_WARNING (tem) = 1;
7955 TREE_USED (tem) = 1;
7956 return tem;
7959 /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
7960 constants (if x has signed type, the sign bit cannot be set
7961 in c). This folds extension into the BIT_AND_EXPR.
7962 ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
7963 very likely don't have maximal range for their precision and this
7964 transformation effectively doesn't preserve non-maximal ranges. */
7965 if (TREE_CODE (type) == INTEGER_TYPE
7966 && TREE_CODE (op0) == BIT_AND_EXPR
7967 && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
7969 tree and_expr = op0;
7970 tree and0 = TREE_OPERAND (and_expr, 0);
7971 tree and1 = TREE_OPERAND (and_expr, 1);
7972 int change = 0;
7974 if (TYPE_UNSIGNED (TREE_TYPE (and_expr))
7975 || (TYPE_PRECISION (type)
7976 <= TYPE_PRECISION (TREE_TYPE (and_expr))))
7977 change = 1;
7978 else if (TYPE_PRECISION (TREE_TYPE (and1))
7979 <= HOST_BITS_PER_WIDE_INT
7980 && host_integerp (and1, 1))
7982 unsigned HOST_WIDE_INT cst;
7984 cst = tree_low_cst (and1, 1);
7985 cst &= (HOST_WIDE_INT) -1
7986 << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
7987 change = (cst == 0);
7988 #ifdef LOAD_EXTEND_OP
7989 if (change
7990 && !flag_syntax_only
7991 && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
7992 == ZERO_EXTEND))
7994 tree uns = unsigned_type_for (TREE_TYPE (and0));
7995 and0 = fold_convert_loc (loc, uns, and0);
7996 and1 = fold_convert_loc (loc, uns, and1);
7998 #endif
8000 if (change)
8002 tem = force_fit_type_double (type, tree_to_double_int (and1),
8003 0, TREE_OVERFLOW (and1));
8004 return fold_build2_loc (loc, BIT_AND_EXPR, type,
8005 fold_convert_loc (loc, type, and0), tem);
8009 /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8010 when one of the new casts will fold away. Conservatively we assume
8011 that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8012 if (POINTER_TYPE_P (type)
8013 && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8014 && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0)))
8015 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8016 || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8017 || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8019 tree arg00 = TREE_OPERAND (arg0, 0);
8020 tree arg01 = TREE_OPERAND (arg0, 1);
8022 return fold_build_pointer_plus_loc
8023 (loc, fold_convert_loc (loc, type, arg00), arg01);
8026 /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8027 of the same precision, and X is an integer type not narrower than
8028 types T1 or T2, i.e. the cast (T2)X isn't an extension. */
8029 if (INTEGRAL_TYPE_P (type)
8030 && TREE_CODE (op0) == BIT_NOT_EXPR
8031 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8032 && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8033 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8035 tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8036 if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8037 && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8038 return fold_build1_loc (loc, BIT_NOT_EXPR, type,
8039 fold_convert_loc (loc, type, tem));
8042 /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8043 type of X and Y (integer types only). */
8044 if (INTEGRAL_TYPE_P (type)
8045 && TREE_CODE (op0) == MULT_EXPR
8046 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8047 && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8049 /* Be careful not to introduce new overflows. */
8050 tree mult_type;
8051 if (TYPE_OVERFLOW_WRAPS (type))
8052 mult_type = type;
8053 else
8054 mult_type = unsigned_type_for (type);
8056 if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8058 tem = fold_build2_loc (loc, MULT_EXPR, mult_type,
8059 fold_convert_loc (loc, mult_type,
8060 TREE_OPERAND (op0, 0)),
8061 fold_convert_loc (loc, mult_type,
8062 TREE_OPERAND (op0, 1)));
8063 return fold_convert_loc (loc, type, tem);
8067 tem = fold_convert_const (code, type, op0);
8068 return tem ? tem : NULL_TREE;
8070 case ADDR_SPACE_CONVERT_EXPR:
8071 if (integer_zerop (arg0))
8072 return fold_convert_const (code, type, arg0);
8073 return NULL_TREE;
8075 case FIXED_CONVERT_EXPR:
8076 tem = fold_convert_const (code, type, arg0);
8077 return tem ? tem : NULL_TREE;
8079 case VIEW_CONVERT_EXPR:
8080 if (TREE_TYPE (op0) == type)
8081 return op0;
8082 if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
8083 return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8084 type, TREE_OPERAND (op0, 0));
8085 if (TREE_CODE (op0) == MEM_REF)
8086 return fold_build2_loc (loc, MEM_REF, type,
8087 TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1));
8089 /* For integral conversions with the same precision or pointer
8090 conversions use a NOP_EXPR instead. */
8091 if ((INTEGRAL_TYPE_P (type)
8092 || POINTER_TYPE_P (type))
8093 && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8094 || POINTER_TYPE_P (TREE_TYPE (op0)))
8095 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8096 return fold_convert_loc (loc, type, op0);
8098 /* Strip inner integral conversions that do not change the precision. */
8099 if (CONVERT_EXPR_P (op0)
8100 && (INTEGRAL_TYPE_P (TREE_TYPE (op0))
8101 || POINTER_TYPE_P (TREE_TYPE (op0)))
8102 && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
8103 || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
8104 && (TYPE_PRECISION (TREE_TYPE (op0))
8105 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))))
8106 return fold_build1_loc (loc, VIEW_CONVERT_EXPR,
8107 type, TREE_OPERAND (op0, 0));
8109 return fold_view_convert_expr (type, op0);
8111 case NEGATE_EXPR:
8112 tem = fold_negate_expr (loc, arg0);
8113 if (tem)
8114 return fold_convert_loc (loc, type, tem);
8115 return NULL_TREE;
8117 case ABS_EXPR:
8118 if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
8119 return fold_abs_const (arg0, type);
8120 else if (TREE_CODE (arg0) == NEGATE_EXPR)
8121 return fold_build1_loc (loc, ABS_EXPR, type, TREE_OPERAND (arg0, 0));
8122 /* Convert fabs((double)float) into (double)fabsf(float). */
8123 else if (TREE_CODE (arg0) == NOP_EXPR
8124 && TREE_CODE (type) == REAL_TYPE)
8126 tree targ0 = strip_float_extensions (arg0);
8127 if (targ0 != arg0)
8128 return fold_convert_loc (loc, type,
8129 fold_build1_loc (loc, ABS_EXPR,
8130 TREE_TYPE (targ0),
8131 targ0));
8133 /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on. */
8134 else if (TREE_CODE (arg0) == ABS_EXPR)
8135 return arg0;
8136 else if (tree_expr_nonnegative_p (arg0))
8137 return arg0;
8139 /* Strip sign ops from argument. */
8140 if (TREE_CODE (type) == REAL_TYPE)
8142 tem = fold_strip_sign_ops (arg0);
8143 if (tem)
8144 return fold_build1_loc (loc, ABS_EXPR, type,
8145 fold_convert_loc (loc, type, tem));
8147 return NULL_TREE;
8149 case CONJ_EXPR:
8150 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8151 return fold_convert_loc (loc, type, arg0);
8152 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8154 tree itype = TREE_TYPE (type);
8155 tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0));
8156 tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1));
8157 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart,
8158 negate_expr (ipart));
8160 if (TREE_CODE (arg0) == COMPLEX_CST)
8162 tree itype = TREE_TYPE (type);
8163 tree rpart = fold_convert_loc (loc, itype, TREE_REALPART (arg0));
8164 tree ipart = fold_convert_loc (loc, itype, TREE_IMAGPART (arg0));
8165 return build_complex (type, rpart, negate_expr (ipart));
8167 if (TREE_CODE (arg0) == CONJ_EXPR)
8168 return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8169 return NULL_TREE;
8171 case BIT_NOT_EXPR:
8172 if (TREE_CODE (arg0) == INTEGER_CST)
8173 return fold_not_const (arg0, type);
8174 else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
8175 return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8176 /* Convert ~ (-A) to A - 1. */
8177 else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8178 return fold_build2_loc (loc, MINUS_EXPR, type,
8179 fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)),
8180 build_int_cst (type, 1));
8181 /* Convert ~ (A - 1) or ~ (A + -1) to -A. */
8182 else if (INTEGRAL_TYPE_P (type)
8183 && ((TREE_CODE (arg0) == MINUS_EXPR
8184 && integer_onep (TREE_OPERAND (arg0, 1)))
8185 || (TREE_CODE (arg0) == PLUS_EXPR
8186 && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8187 return fold_build1_loc (loc, NEGATE_EXPR, type,
8188 fold_convert_loc (loc, type,
8189 TREE_OPERAND (arg0, 0)));
8190 /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. */
8191 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8192 && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8193 fold_convert_loc (loc, type,
8194 TREE_OPERAND (arg0, 0)))))
8195 return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem,
8196 fold_convert_loc (loc, type,
8197 TREE_OPERAND (arg0, 1)));
8198 else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8199 && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8200 fold_convert_loc (loc, type,
8201 TREE_OPERAND (arg0, 1)))))
8202 return fold_build2_loc (loc, BIT_XOR_EXPR, type,
8203 fold_convert_loc (loc, type,
8204 TREE_OPERAND (arg0, 0)), tem);
8205 /* Perform BIT_NOT_EXPR on each element individually. */
8206 else if (TREE_CODE (arg0) == VECTOR_CST)
8208 tree elements = TREE_VECTOR_CST_ELTS (arg0), elem, list = NULL_TREE;
8209 int count = TYPE_VECTOR_SUBPARTS (type), i;
8211 for (i = 0; i < count; i++)
8213 if (elements)
8215 elem = TREE_VALUE (elements);
8216 elem = fold_unary_loc (loc, BIT_NOT_EXPR, TREE_TYPE (type), elem);
8217 if (elem == NULL_TREE)
8218 break;
8219 elements = TREE_CHAIN (elements);
8221 else
8222 elem = build_int_cst (TREE_TYPE (type), -1);
8223 list = tree_cons (NULL_TREE, elem, list);
8225 if (i == count)
8226 return build_vector (type, nreverse (list));
8229 return NULL_TREE;
8231 case TRUTH_NOT_EXPR:
8232 /* The argument to invert_truthvalue must have Boolean type. */
8233 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
8234 arg0 = fold_convert_loc (loc, boolean_type_node, arg0);
8236 /* Note that the operand of this must be an int
8237 and its values must be 0 or 1.
8238 ("true" is a fixed value perhaps depending on the language,
8239 but we don't handle values other than 1 correctly yet.) */
8240 tem = fold_truth_not_expr (loc, arg0);
8241 if (!tem)
8242 return NULL_TREE;
8243 return fold_convert_loc (loc, type, tem);
8245 case REALPART_EXPR:
8246 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8247 return fold_convert_loc (loc, type, arg0);
8248 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8249 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0),
8250 TREE_OPERAND (arg0, 1));
8251 if (TREE_CODE (arg0) == COMPLEX_CST)
8252 return fold_convert_loc (loc, type, TREE_REALPART (arg0));
8253 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8255 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8256 tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8257 fold_build1_loc (loc, REALPART_EXPR, itype,
8258 TREE_OPERAND (arg0, 0)),
8259 fold_build1_loc (loc, REALPART_EXPR, itype,
8260 TREE_OPERAND (arg0, 1)));
8261 return fold_convert_loc (loc, type, tem);
8263 if (TREE_CODE (arg0) == CONJ_EXPR)
8265 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8266 tem = fold_build1_loc (loc, REALPART_EXPR, itype,
8267 TREE_OPERAND (arg0, 0));
8268 return fold_convert_loc (loc, type, tem);
8270 if (TREE_CODE (arg0) == CALL_EXPR)
8272 tree fn = get_callee_fndecl (arg0);
8273 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8274 switch (DECL_FUNCTION_CODE (fn))
8276 CASE_FLT_FN (BUILT_IN_CEXPI):
8277 fn = mathfn_built_in (type, BUILT_IN_COS);
8278 if (fn)
8279 return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8280 break;
8282 default:
8283 break;
8286 return NULL_TREE;
8288 case IMAGPART_EXPR:
8289 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8290 return build_zero_cst (type);
8291 if (TREE_CODE (arg0) == COMPLEX_EXPR)
8292 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 1),
8293 TREE_OPERAND (arg0, 0));
8294 if (TREE_CODE (arg0) == COMPLEX_CST)
8295 return fold_convert_loc (loc, type, TREE_IMAGPART (arg0));
8296 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8298 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8299 tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8300 fold_build1_loc (loc, IMAGPART_EXPR, itype,
8301 TREE_OPERAND (arg0, 0)),
8302 fold_build1_loc (loc, IMAGPART_EXPR, itype,
8303 TREE_OPERAND (arg0, 1)));
8304 return fold_convert_loc (loc, type, tem);
8306 if (TREE_CODE (arg0) == CONJ_EXPR)
8308 tree itype = TREE_TYPE (TREE_TYPE (arg0));
8309 tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8310 return fold_convert_loc (loc, type, negate_expr (tem));
8312 if (TREE_CODE (arg0) == CALL_EXPR)
8314 tree fn = get_callee_fndecl (arg0);
8315 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8316 switch (DECL_FUNCTION_CODE (fn))
8318 CASE_FLT_FN (BUILT_IN_CEXPI):
8319 fn = mathfn_built_in (type, BUILT_IN_SIN);
8320 if (fn)
8321 return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8322 break;
8324 default:
8325 break;
8328 return NULL_TREE;
8330 case INDIRECT_REF:
8331 /* Fold *&X to X if X is an lvalue. */
8332 if (TREE_CODE (op0) == ADDR_EXPR)
8334 tree op00 = TREE_OPERAND (op0, 0);
8335 if ((TREE_CODE (op00) == VAR_DECL
8336 || TREE_CODE (op00) == PARM_DECL
8337 || TREE_CODE (op00) == RESULT_DECL)
8338 && !TREE_READONLY (op00))
8339 return op00;
8341 return NULL_TREE;
8343 case VEC_UNPACK_LO_EXPR:
8344 case VEC_UNPACK_HI_EXPR:
8345 case VEC_UNPACK_FLOAT_LO_EXPR:
8346 case VEC_UNPACK_FLOAT_HI_EXPR:
8348 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
8349 tree *elts, vals = NULL_TREE;
8350 enum tree_code subcode;
8352 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2);
8353 if (TREE_CODE (arg0) != VECTOR_CST)
8354 return NULL_TREE;
8356 elts = XALLOCAVEC (tree, nelts * 2);
8357 if (!vec_cst_ctor_to_array (arg0, elts))
8358 return NULL_TREE;
8360 if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_UNPACK_LO_EXPR
8361 || code == VEC_UNPACK_FLOAT_LO_EXPR))
8362 elts += nelts;
8364 if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR)
8365 subcode = NOP_EXPR;
8366 else
8367 subcode = FLOAT_EXPR;
8369 for (i = 0; i < nelts; i++)
8371 elts[i] = fold_convert_const (subcode, TREE_TYPE (type), elts[i]);
8372 if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
8373 return NULL_TREE;
8376 for (i = 0; i < nelts; i++)
8377 vals = tree_cons (NULL_TREE, elts[nelts - i - 1], vals);
8378 return build_vector (type, vals);
8381 default:
8382 return NULL_TREE;
8383 } /* switch (code) */
8387 /* If the operation was a conversion do _not_ mark a resulting constant
8388 with TREE_OVERFLOW if the original constant was not. These conversions
8389 have implementation defined behavior and retaining the TREE_OVERFLOW
8390 flag here would confuse later passes such as VRP. */
8391 tree
8392 fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code,
8393 tree type, tree op0)
8395 tree res = fold_unary_loc (loc, code, type, op0);
8396 if (res
8397 && TREE_CODE (res) == INTEGER_CST
8398 && TREE_CODE (op0) == INTEGER_CST
8399 && CONVERT_EXPR_CODE_P (code))
8400 TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8402 return res;
8405 /* Fold a binary bitwise/truth expression of code CODE and type TYPE with
8406 operands OP0 and OP1. LOC is the location of the resulting expression.
8407 ARG0 and ARG1 are the NOP_STRIPed results of OP0 and OP1.
8408 Return the folded expression if folding is successful. Otherwise,
8409 return NULL_TREE. */
8410 static tree
8411 fold_truth_andor (location_t loc, enum tree_code code, tree type,
8412 tree arg0, tree arg1, tree op0, tree op1)
8414 tree tem;
8416 /* We only do these simplifications if we are optimizing. */
8417 if (!optimize)
8418 return NULL_TREE;
8420 /* Check for things like (A || B) && (A || C). We can convert this
8421 to A || (B && C). Note that either operator can be any of the four
8422 truth and/or operations and the transformation will still be
8423 valid. Also note that we only care about order for the
8424 ANDIF and ORIF operators. If B contains side effects, this
8425 might change the truth-value of A. */
8426 if (TREE_CODE (arg0) == TREE_CODE (arg1)
8427 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8428 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8429 || TREE_CODE (arg0) == TRUTH_AND_EXPR
8430 || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8431 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
8433 tree a00 = TREE_OPERAND (arg0, 0);
8434 tree a01 = TREE_OPERAND (arg0, 1);
8435 tree a10 = TREE_OPERAND (arg1, 0);
8436 tree a11 = TREE_OPERAND (arg1, 1);
8437 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8438 || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8439 && (code == TRUTH_AND_EXPR
8440 || code == TRUTH_OR_EXPR));
8442 if (operand_equal_p (a00, a10, 0))
8443 return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8444 fold_build2_loc (loc, code, type, a01, a11));
8445 else if (commutative && operand_equal_p (a00, a11, 0))
8446 return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8447 fold_build2_loc (loc, code, type, a01, a10));
8448 else if (commutative && operand_equal_p (a01, a10, 0))
8449 return fold_build2_loc (loc, TREE_CODE (arg0), type, a01,
8450 fold_build2_loc (loc, code, type, a00, a11));
8452 /* This case if tricky because we must either have commutative
8453 operators or else A10 must not have side-effects. */
8455 else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8456 && operand_equal_p (a01, a11, 0))
8457 return fold_build2_loc (loc, TREE_CODE (arg0), type,
8458 fold_build2_loc (loc, code, type, a00, a10),
8459 a01);
8462 /* See if we can build a range comparison. */
8463 if (0 != (tem = fold_range_test (loc, code, type, op0, op1)))
8464 return tem;
8466 if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg0) == TRUTH_ORIF_EXPR)
8467 || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg0) == TRUTH_ANDIF_EXPR))
8469 tem = merge_truthop_with_opposite_arm (loc, arg0, arg1, true);
8470 if (tem)
8471 return fold_build2_loc (loc, code, type, tem, arg1);
8474 if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg1) == TRUTH_ORIF_EXPR)
8475 || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg1) == TRUTH_ANDIF_EXPR))
8477 tem = merge_truthop_with_opposite_arm (loc, arg1, arg0, false);
8478 if (tem)
8479 return fold_build2_loc (loc, code, type, arg0, tem);
8482 /* Check for the possibility of merging component references. If our
8483 lhs is another similar operation, try to merge its rhs with our
8484 rhs. Then try to merge our lhs and rhs. */
8485 if (TREE_CODE (arg0) == code
8486 && 0 != (tem = fold_truth_andor_1 (loc, code, type,
8487 TREE_OPERAND (arg0, 1), arg1)))
8488 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
8490 if ((tem = fold_truth_andor_1 (loc, code, type, arg0, arg1)) != 0)
8491 return tem;
8493 if ((BRANCH_COST (optimize_function_for_speed_p (cfun),
8494 false) >= 2)
8495 && LOGICAL_OP_NON_SHORT_CIRCUIT
8496 && (code == TRUTH_AND_EXPR
8497 || code == TRUTH_ANDIF_EXPR
8498 || code == TRUTH_OR_EXPR
8499 || code == TRUTH_ORIF_EXPR))
8501 enum tree_code ncode, icode;
8503 ncode = (code == TRUTH_ANDIF_EXPR || code == TRUTH_AND_EXPR)
8504 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR;
8505 icode = ncode == TRUTH_AND_EXPR ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR;
8507 /* Transform ((A AND-IF B) AND[-IF] C) into (A AND-IF (B AND C)),
8508 or ((A OR-IF B) OR[-IF] C) into (A OR-IF (B OR C))
8509 We don't want to pack more than two leafs to a non-IF AND/OR
8510 expression.
8511 If tree-code of left-hand operand isn't an AND/OR-IF code and not
8512 equal to IF-CODE, then we don't want to add right-hand operand.
8513 If the inner right-hand side of left-hand operand has
8514 side-effects, or isn't simple, then we can't add to it,
8515 as otherwise we might destroy if-sequence. */
8516 if (TREE_CODE (arg0) == icode
8517 && simple_operand_p_2 (arg1)
8518 /* Needed for sequence points to handle trappings, and
8519 side-effects. */
8520 && simple_operand_p_2 (TREE_OPERAND (arg0, 1)))
8522 tem = fold_build2_loc (loc, ncode, type, TREE_OPERAND (arg0, 1),
8523 arg1);
8524 return fold_build2_loc (loc, icode, type, TREE_OPERAND (arg0, 0),
8525 tem);
8527 /* Same as abouve but for (A AND[-IF] (B AND-IF C)) -> ((A AND B) AND-IF C),
8528 or (A OR[-IF] (B OR-IF C) -> ((A OR B) OR-IF C). */
8529 else if (TREE_CODE (arg1) == icode
8530 && simple_operand_p_2 (arg0)
8531 /* Needed for sequence points to handle trappings, and
8532 side-effects. */
8533 && simple_operand_p_2 (TREE_OPERAND (arg1, 0)))
8535 tem = fold_build2_loc (loc, ncode, type,
8536 arg0, TREE_OPERAND (arg1, 0));
8537 return fold_build2_loc (loc, icode, type, tem,
8538 TREE_OPERAND (arg1, 1));
8540 /* Transform (A AND-IF B) into (A AND B), or (A OR-IF B)
8541 into (A OR B).
8542 For sequence point consistancy, we need to check for trapping,
8543 and side-effects. */
8544 else if (code == icode && simple_operand_p_2 (arg0)
8545 && simple_operand_p_2 (arg1))
8546 return fold_build2_loc (loc, ncode, type, arg0, arg1);
8549 return NULL_TREE;
8552 /* Fold a binary expression of code CODE and type TYPE with operands
8553 OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8554 Return the folded expression if folding is successful. Otherwise,
8555 return NULL_TREE. */
8557 static tree
8558 fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
8560 enum tree_code compl_code;
8562 if (code == MIN_EXPR)
8563 compl_code = MAX_EXPR;
8564 else if (code == MAX_EXPR)
8565 compl_code = MIN_EXPR;
8566 else
8567 gcc_unreachable ();
8569 /* MIN (MAX (a, b), b) == b. */
8570 if (TREE_CODE (op0) == compl_code
8571 && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8572 return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
8574 /* MIN (MAX (b, a), b) == b. */
8575 if (TREE_CODE (op0) == compl_code
8576 && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8577 && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8578 return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
8580 /* MIN (a, MAX (a, b)) == a. */
8581 if (TREE_CODE (op1) == compl_code
8582 && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8583 && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8584 return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
8586 /* MIN (a, MAX (b, a)) == a. */
8587 if (TREE_CODE (op1) == compl_code
8588 && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8589 && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8590 return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
8592 return NULL_TREE;
8595 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8596 by changing CODE to reduce the magnitude of constants involved in
8597 ARG0 of the comparison.
8598 Returns a canonicalized comparison tree if a simplification was
8599 possible, otherwise returns NULL_TREE.
8600 Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8601 valid if signed overflow is undefined. */
8603 static tree
8604 maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
8605 tree arg0, tree arg1,
8606 bool *strict_overflow_p)
8608 enum tree_code code0 = TREE_CODE (arg0);
8609 tree t, cst0 = NULL_TREE;
8610 int sgn0;
8611 bool swap = false;
8613 /* Match A +- CST code arg1 and CST code arg1. We can change the
8614 first form only if overflow is undefined. */
8615 if (!((TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
8616 /* In principle pointers also have undefined overflow behavior,
8617 but that causes problems elsewhere. */
8618 && !POINTER_TYPE_P (TREE_TYPE (arg0))
8619 && (code0 == MINUS_EXPR
8620 || code0 == PLUS_EXPR)
8621 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8622 || code0 == INTEGER_CST))
8623 return NULL_TREE;
8625 /* Identify the constant in arg0 and its sign. */
8626 if (code0 == INTEGER_CST)
8627 cst0 = arg0;
8628 else
8629 cst0 = TREE_OPERAND (arg0, 1);
8630 sgn0 = tree_int_cst_sgn (cst0);
8632 /* Overflowed constants and zero will cause problems. */
8633 if (integer_zerop (cst0)
8634 || TREE_OVERFLOW (cst0))
8635 return NULL_TREE;
8637 /* See if we can reduce the magnitude of the constant in
8638 arg0 by changing the comparison code. */
8639 if (code0 == INTEGER_CST)
8641 /* CST <= arg1 -> CST-1 < arg1. */
8642 if (code == LE_EXPR && sgn0 == 1)
8643 code = LT_EXPR;
8644 /* -CST < arg1 -> -CST-1 <= arg1. */
8645 else if (code == LT_EXPR && sgn0 == -1)
8646 code = LE_EXPR;
8647 /* CST > arg1 -> CST-1 >= arg1. */
8648 else if (code == GT_EXPR && sgn0 == 1)
8649 code = GE_EXPR;
8650 /* -CST >= arg1 -> -CST-1 > arg1. */
8651 else if (code == GE_EXPR && sgn0 == -1)
8652 code = GT_EXPR;
8653 else
8654 return NULL_TREE;
8655 /* arg1 code' CST' might be more canonical. */
8656 swap = true;
8658 else
8660 /* A - CST < arg1 -> A - CST-1 <= arg1. */
8661 if (code == LT_EXPR
8662 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8663 code = LE_EXPR;
8664 /* A + CST > arg1 -> A + CST-1 >= arg1. */
8665 else if (code == GT_EXPR
8666 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8667 code = GE_EXPR;
8668 /* A + CST <= arg1 -> A + CST-1 < arg1. */
8669 else if (code == LE_EXPR
8670 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8671 code = LT_EXPR;
8672 /* A - CST >= arg1 -> A - CST-1 > arg1. */
8673 else if (code == GE_EXPR
8674 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8675 code = GT_EXPR;
8676 else
8677 return NULL_TREE;
8678 *strict_overflow_p = true;
8681 /* Now build the constant reduced in magnitude. But not if that
8682 would produce one outside of its types range. */
8683 if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
8684 && ((sgn0 == 1
8685 && TYPE_MIN_VALUE (TREE_TYPE (cst0))
8686 && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
8687 || (sgn0 == -1
8688 && TYPE_MAX_VALUE (TREE_TYPE (cst0))
8689 && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
8690 /* We cannot swap the comparison here as that would cause us to
8691 endlessly recurse. */
8692 return NULL_TREE;
8694 t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8695 cst0, build_int_cst (TREE_TYPE (cst0), 1));
8696 if (code0 != INTEGER_CST)
8697 t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8698 t = fold_convert (TREE_TYPE (arg1), t);
8700 /* If swapping might yield to a more canonical form, do so. */
8701 if (swap)
8702 return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t);
8703 else
8704 return fold_build2_loc (loc, code, type, t, arg1);
8707 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8708 overflow further. Try to decrease the magnitude of constants involved
8709 by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8710 and put sole constants at the second argument position.
8711 Returns the canonicalized tree if changed, otherwise NULL_TREE. */
8713 static tree
8714 maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type,
8715 tree arg0, tree arg1)
8717 tree t;
8718 bool strict_overflow_p;
8719 const char * const warnmsg = G_("assuming signed overflow does not occur "
8720 "when reducing constant in comparison");
8722 /* Try canonicalization by simplifying arg0. */
8723 strict_overflow_p = false;
8724 t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
8725 &strict_overflow_p);
8726 if (t)
8728 if (strict_overflow_p)
8729 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8730 return t;
8733 /* Try canonicalization by simplifying arg1 using the swapped
8734 comparison. */
8735 code = swap_tree_comparison (code);
8736 strict_overflow_p = false;
8737 t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
8738 &strict_overflow_p);
8739 if (t && strict_overflow_p)
8740 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8741 return t;
8744 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
8745 space. This is used to avoid issuing overflow warnings for
8746 expressions like &p->x which can not wrap. */
8748 static bool
8749 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8751 unsigned HOST_WIDE_INT offset_low, total_low;
8752 HOST_WIDE_INT size, offset_high, total_high;
8754 if (!POINTER_TYPE_P (TREE_TYPE (base)))
8755 return true;
8757 if (bitpos < 0)
8758 return true;
8760 if (offset == NULL_TREE)
8762 offset_low = 0;
8763 offset_high = 0;
8765 else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8766 return true;
8767 else
8769 offset_low = TREE_INT_CST_LOW (offset);
8770 offset_high = TREE_INT_CST_HIGH (offset);
8773 if (add_double_with_sign (offset_low, offset_high,
8774 bitpos / BITS_PER_UNIT, 0,
8775 &total_low, &total_high,
8776 true))
8777 return true;
8779 if (total_high != 0)
8780 return true;
8782 size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8783 if (size <= 0)
8784 return true;
8786 /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8787 array. */
8788 if (TREE_CODE (base) == ADDR_EXPR)
8790 HOST_WIDE_INT base_size;
8792 base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8793 if (base_size > 0 && size < base_size)
8794 size = base_size;
8797 return total_low > (unsigned HOST_WIDE_INT) size;
8800 /* Subroutine of fold_binary. This routine performs all of the
8801 transformations that are common to the equality/inequality
8802 operators (EQ_EXPR and NE_EXPR) and the ordering operators
8803 (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR). Callers other than
8804 fold_binary should call fold_binary. Fold a comparison with
8805 tree code CODE and type TYPE with operands OP0 and OP1. Return
8806 the folded comparison or NULL_TREE. */
8808 static tree
8809 fold_comparison (location_t loc, enum tree_code code, tree type,
8810 tree op0, tree op1)
8812 tree arg0, arg1, tem;
8814 arg0 = op0;
8815 arg1 = op1;
8817 STRIP_SIGN_NOPS (arg0);
8818 STRIP_SIGN_NOPS (arg1);
8820 tem = fold_relational_const (code, type, arg0, arg1);
8821 if (tem != NULL_TREE)
8822 return tem;
8824 /* If one arg is a real or integer constant, put it last. */
8825 if (tree_swap_operands_p (arg0, arg1, true))
8826 return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
8828 /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1. */
8829 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8830 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8831 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8832 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
8833 && (TREE_CODE (arg1) == INTEGER_CST
8834 && !TREE_OVERFLOW (arg1)))
8836 tree const1 = TREE_OPERAND (arg0, 1);
8837 tree const2 = arg1;
8838 tree variable = TREE_OPERAND (arg0, 0);
8839 tree lhs;
8840 int lhs_add;
8841 lhs_add = TREE_CODE (arg0) != PLUS_EXPR;
8843 lhs = fold_build2_loc (loc, lhs_add ? PLUS_EXPR : MINUS_EXPR,
8844 TREE_TYPE (arg1), const2, const1);
8846 /* If the constant operation overflowed this can be
8847 simplified as a comparison against INT_MAX/INT_MIN. */
8848 if (TREE_CODE (lhs) == INTEGER_CST
8849 && TREE_OVERFLOW (lhs))
8851 int const1_sgn = tree_int_cst_sgn (const1);
8852 enum tree_code code2 = code;
8854 /* Get the sign of the constant on the lhs if the
8855 operation were VARIABLE + CONST1. */
8856 if (TREE_CODE (arg0) == MINUS_EXPR)
8857 const1_sgn = -const1_sgn;
8859 /* The sign of the constant determines if we overflowed
8860 INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8861 Canonicalize to the INT_MIN overflow by swapping the comparison
8862 if necessary. */
8863 if (const1_sgn == -1)
8864 code2 = swap_tree_comparison (code);
8866 /* We now can look at the canonicalized case
8867 VARIABLE + 1 CODE2 INT_MIN
8868 and decide on the result. */
8869 if (code2 == LT_EXPR
8870 || code2 == LE_EXPR
8871 || code2 == EQ_EXPR)
8872 return omit_one_operand_loc (loc, type, boolean_false_node, variable);
8873 else if (code2 == NE_EXPR
8874 || code2 == GE_EXPR
8875 || code2 == GT_EXPR)
8876 return omit_one_operand_loc (loc, type, boolean_true_node, variable);
8879 if (TREE_CODE (lhs) == TREE_CODE (arg1)
8880 && (TREE_CODE (lhs) != INTEGER_CST
8881 || !TREE_OVERFLOW (lhs)))
8883 if (code != EQ_EXPR && code != NE_EXPR)
8884 fold_overflow_warning ("assuming signed overflow does not occur "
8885 "when changing X +- C1 cmp C2 to "
8886 "X cmp C1 +- C2",
8887 WARN_STRICT_OVERFLOW_COMPARISON);
8888 return fold_build2_loc (loc, code, type, variable, lhs);
8892 /* For comparisons of pointers we can decompose it to a compile time
8893 comparison of the base objects and the offsets into the object.
8894 This requires at least one operand being an ADDR_EXPR or a
8895 POINTER_PLUS_EXPR to do more than the operand_equal_p test below. */
8896 if (POINTER_TYPE_P (TREE_TYPE (arg0))
8897 && (TREE_CODE (arg0) == ADDR_EXPR
8898 || TREE_CODE (arg1) == ADDR_EXPR
8899 || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8900 || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8902 tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8903 HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8904 enum machine_mode mode;
8905 int volatilep, unsignedp;
8906 bool indirect_base0 = false, indirect_base1 = false;
8908 /* Get base and offset for the access. Strip ADDR_EXPR for
8909 get_inner_reference, but put it back by stripping INDIRECT_REF
8910 off the base object if possible. indirect_baseN will be true
8911 if baseN is not an address but refers to the object itself. */
8912 base0 = arg0;
8913 if (TREE_CODE (arg0) == ADDR_EXPR)
8915 base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8916 &bitsize, &bitpos0, &offset0, &mode,
8917 &unsignedp, &volatilep, false);
8918 if (TREE_CODE (base0) == INDIRECT_REF)
8919 base0 = TREE_OPERAND (base0, 0);
8920 else
8921 indirect_base0 = true;
8923 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8925 base0 = TREE_OPERAND (arg0, 0);
8926 STRIP_SIGN_NOPS (base0);
8927 if (TREE_CODE (base0) == ADDR_EXPR)
8929 base0 = TREE_OPERAND (base0, 0);
8930 indirect_base0 = true;
8932 offset0 = TREE_OPERAND (arg0, 1);
8933 if (host_integerp (offset0, 0))
8935 HOST_WIDE_INT off = size_low_cst (offset0);
8936 if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off)
8937 * BITS_PER_UNIT)
8938 / BITS_PER_UNIT == (HOST_WIDE_INT) off)
8940 bitpos0 = off * BITS_PER_UNIT;
8941 offset0 = NULL_TREE;
8946 base1 = arg1;
8947 if (TREE_CODE (arg1) == ADDR_EXPR)
8949 base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8950 &bitsize, &bitpos1, &offset1, &mode,
8951 &unsignedp, &volatilep, false);
8952 if (TREE_CODE (base1) == INDIRECT_REF)
8953 base1 = TREE_OPERAND (base1, 0);
8954 else
8955 indirect_base1 = true;
8957 else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8959 base1 = TREE_OPERAND (arg1, 0);
8960 STRIP_SIGN_NOPS (base1);
8961 if (TREE_CODE (base1) == ADDR_EXPR)
8963 base1 = TREE_OPERAND (base1, 0);
8964 indirect_base1 = true;
8966 offset1 = TREE_OPERAND (arg1, 1);
8967 if (host_integerp (offset1, 0))
8969 HOST_WIDE_INT off = size_low_cst (offset1);
8970 if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off)
8971 * BITS_PER_UNIT)
8972 / BITS_PER_UNIT == (HOST_WIDE_INT) off)
8974 bitpos1 = off * BITS_PER_UNIT;
8975 offset1 = NULL_TREE;
8980 /* A local variable can never be pointed to by
8981 the default SSA name of an incoming parameter. */
8982 if ((TREE_CODE (arg0) == ADDR_EXPR
8983 && indirect_base0
8984 && TREE_CODE (base0) == VAR_DECL
8985 && auto_var_in_fn_p (base0, current_function_decl)
8986 && !indirect_base1
8987 && TREE_CODE (base1) == SSA_NAME
8988 && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL
8989 && SSA_NAME_IS_DEFAULT_DEF (base1))
8990 || (TREE_CODE (arg1) == ADDR_EXPR
8991 && indirect_base1
8992 && TREE_CODE (base1) == VAR_DECL
8993 && auto_var_in_fn_p (base1, current_function_decl)
8994 && !indirect_base0
8995 && TREE_CODE (base0) == SSA_NAME
8996 && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL
8997 && SSA_NAME_IS_DEFAULT_DEF (base0)))
8999 if (code == NE_EXPR)
9000 return constant_boolean_node (1, type);
9001 else if (code == EQ_EXPR)
9002 return constant_boolean_node (0, type);
9004 /* If we have equivalent bases we might be able to simplify. */
9005 else if (indirect_base0 == indirect_base1
9006 && operand_equal_p (base0, base1, 0))
9008 /* We can fold this expression to a constant if the non-constant
9009 offset parts are equal. */
9010 if ((offset0 == offset1
9011 || (offset0 && offset1
9012 && operand_equal_p (offset0, offset1, 0)))
9013 && (code == EQ_EXPR
9014 || code == NE_EXPR
9015 || (indirect_base0 && DECL_P (base0))
9016 || POINTER_TYPE_OVERFLOW_UNDEFINED))
9019 if (code != EQ_EXPR
9020 && code != NE_EXPR
9021 && bitpos0 != bitpos1
9022 && (pointer_may_wrap_p (base0, offset0, bitpos0)
9023 || pointer_may_wrap_p (base1, offset1, bitpos1)))
9024 fold_overflow_warning (("assuming pointer wraparound does not "
9025 "occur when comparing P +- C1 with "
9026 "P +- C2"),
9027 WARN_STRICT_OVERFLOW_CONDITIONAL);
9029 switch (code)
9031 case EQ_EXPR:
9032 return constant_boolean_node (bitpos0 == bitpos1, type);
9033 case NE_EXPR:
9034 return constant_boolean_node (bitpos0 != bitpos1, type);
9035 case LT_EXPR:
9036 return constant_boolean_node (bitpos0 < bitpos1, type);
9037 case LE_EXPR:
9038 return constant_boolean_node (bitpos0 <= bitpos1, type);
9039 case GE_EXPR:
9040 return constant_boolean_node (bitpos0 >= bitpos1, type);
9041 case GT_EXPR:
9042 return constant_boolean_node (bitpos0 > bitpos1, type);
9043 default:;
9046 /* We can simplify the comparison to a comparison of the variable
9047 offset parts if the constant offset parts are equal.
9048 Be careful to use signed size type here because otherwise we
9049 mess with array offsets in the wrong way. This is possible
9050 because pointer arithmetic is restricted to retain within an
9051 object and overflow on pointer differences is undefined as of
9052 6.5.6/8 and /9 with respect to the signed ptrdiff_t. */
9053 else if (bitpos0 == bitpos1
9054 && ((code == EQ_EXPR || code == NE_EXPR)
9055 || (indirect_base0 && DECL_P (base0))
9056 || POINTER_TYPE_OVERFLOW_UNDEFINED))
9058 /* By converting to signed size type we cover middle-end pointer
9059 arithmetic which operates on unsigned pointer types of size
9060 type size and ARRAY_REF offsets which are properly sign or
9061 zero extended from their type in case it is narrower than
9062 size type. */
9063 if (offset0 == NULL_TREE)
9064 offset0 = build_int_cst (ssizetype, 0);
9065 else
9066 offset0 = fold_convert_loc (loc, ssizetype, offset0);
9067 if (offset1 == NULL_TREE)
9068 offset1 = build_int_cst (ssizetype, 0);
9069 else
9070 offset1 = fold_convert_loc (loc, ssizetype, offset1);
9072 if (code != EQ_EXPR
9073 && code != NE_EXPR
9074 && (pointer_may_wrap_p (base0, offset0, bitpos0)
9075 || pointer_may_wrap_p (base1, offset1, bitpos1)))
9076 fold_overflow_warning (("assuming pointer wraparound does not "
9077 "occur when comparing P +- C1 with "
9078 "P +- C2"),
9079 WARN_STRICT_OVERFLOW_COMPARISON);
9081 return fold_build2_loc (loc, code, type, offset0, offset1);
9084 /* For non-equal bases we can simplify if they are addresses
9085 of local binding decls or constants. */
9086 else if (indirect_base0 && indirect_base1
9087 /* We know that !operand_equal_p (base0, base1, 0)
9088 because the if condition was false. But make
9089 sure two decls are not the same. */
9090 && base0 != base1
9091 && TREE_CODE (arg0) == ADDR_EXPR
9092 && TREE_CODE (arg1) == ADDR_EXPR
9093 && (((TREE_CODE (base0) == VAR_DECL
9094 || TREE_CODE (base0) == PARM_DECL)
9095 && (targetm.binds_local_p (base0)
9096 || CONSTANT_CLASS_P (base1)))
9097 || CONSTANT_CLASS_P (base0))
9098 && (((TREE_CODE (base1) == VAR_DECL
9099 || TREE_CODE (base1) == PARM_DECL)
9100 && (targetm.binds_local_p (base1)
9101 || CONSTANT_CLASS_P (base0)))
9102 || CONSTANT_CLASS_P (base1)))
9104 if (code == EQ_EXPR)
9105 return omit_two_operands_loc (loc, type, boolean_false_node,
9106 arg0, arg1);
9107 else if (code == NE_EXPR)
9108 return omit_two_operands_loc (loc, type, boolean_true_node,
9109 arg0, arg1);
9111 /* For equal offsets we can simplify to a comparison of the
9112 base addresses. */
9113 else if (bitpos0 == bitpos1
9114 && (indirect_base0
9115 ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9116 && (indirect_base1
9117 ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9118 && ((offset0 == offset1)
9119 || (offset0 && offset1
9120 && operand_equal_p (offset0, offset1, 0))))
9122 if (indirect_base0)
9123 base0 = build_fold_addr_expr_loc (loc, base0);
9124 if (indirect_base1)
9125 base1 = build_fold_addr_expr_loc (loc, base1);
9126 return fold_build2_loc (loc, code, type, base0, base1);
9130 /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9131 X CMP Y +- C2 +- C1 for signed X, Y. This is valid if
9132 the resulting offset is smaller in absolute value than the
9133 original one. */
9134 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9135 && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9136 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9137 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9138 && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9139 && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9140 && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9142 tree const1 = TREE_OPERAND (arg0, 1);
9143 tree const2 = TREE_OPERAND (arg1, 1);
9144 tree variable1 = TREE_OPERAND (arg0, 0);
9145 tree variable2 = TREE_OPERAND (arg1, 0);
9146 tree cst;
9147 const char * const warnmsg = G_("assuming signed overflow does not "
9148 "occur when combining constants around "
9149 "a comparison");
9151 /* Put the constant on the side where it doesn't overflow and is
9152 of lower absolute value than before. */
9153 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9154 ? MINUS_EXPR : PLUS_EXPR,
9155 const2, const1);
9156 if (!TREE_OVERFLOW (cst)
9157 && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
9159 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9160 return fold_build2_loc (loc, code, type,
9161 variable1,
9162 fold_build2_loc (loc,
9163 TREE_CODE (arg1), TREE_TYPE (arg1),
9164 variable2, cst));
9167 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9168 ? MINUS_EXPR : PLUS_EXPR,
9169 const1, const2);
9170 if (!TREE_OVERFLOW (cst)
9171 && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
9173 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9174 return fold_build2_loc (loc, code, type,
9175 fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0),
9176 variable1, cst),
9177 variable2);
9181 /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9182 signed arithmetic case. That form is created by the compiler
9183 often enough for folding it to be of value. One example is in
9184 computing loop trip counts after Operator Strength Reduction. */
9185 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9186 && TREE_CODE (arg0) == MULT_EXPR
9187 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9188 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9189 && integer_zerop (arg1))
9191 tree const1 = TREE_OPERAND (arg0, 1);
9192 tree const2 = arg1; /* zero */
9193 tree variable1 = TREE_OPERAND (arg0, 0);
9194 enum tree_code cmp_code = code;
9196 /* Handle unfolded multiplication by zero. */
9197 if (integer_zerop (const1))
9198 return fold_build2_loc (loc, cmp_code, type, const1, const2);
9200 fold_overflow_warning (("assuming signed overflow does not occur when "
9201 "eliminating multiplication in comparison "
9202 "with zero"),
9203 WARN_STRICT_OVERFLOW_COMPARISON);
9205 /* If const1 is negative we swap the sense of the comparison. */
9206 if (tree_int_cst_sgn (const1) < 0)
9207 cmp_code = swap_tree_comparison (cmp_code);
9209 return fold_build2_loc (loc, cmp_code, type, variable1, const2);
9212 tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1);
9213 if (tem)
9214 return tem;
9216 if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9218 tree targ0 = strip_float_extensions (arg0);
9219 tree targ1 = strip_float_extensions (arg1);
9220 tree newtype = TREE_TYPE (targ0);
9222 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9223 newtype = TREE_TYPE (targ1);
9225 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
9226 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9227 return fold_build2_loc (loc, code, type,
9228 fold_convert_loc (loc, newtype, targ0),
9229 fold_convert_loc (loc, newtype, targ1));
9231 /* (-a) CMP (-b) -> b CMP a */
9232 if (TREE_CODE (arg0) == NEGATE_EXPR
9233 && TREE_CODE (arg1) == NEGATE_EXPR)
9234 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0),
9235 TREE_OPERAND (arg0, 0));
9237 if (TREE_CODE (arg1) == REAL_CST)
9239 REAL_VALUE_TYPE cst;
9240 cst = TREE_REAL_CST (arg1);
9242 /* (-a) CMP CST -> a swap(CMP) (-CST) */
9243 if (TREE_CODE (arg0) == NEGATE_EXPR)
9244 return fold_build2_loc (loc, swap_tree_comparison (code), type,
9245 TREE_OPERAND (arg0, 0),
9246 build_real (TREE_TYPE (arg1),
9247 real_value_negate (&cst)));
9249 /* IEEE doesn't distinguish +0 and -0 in comparisons. */
9250 /* a CMP (-0) -> a CMP 0 */
9251 if (REAL_VALUE_MINUS_ZERO (cst))
9252 return fold_build2_loc (loc, code, type, arg0,
9253 build_real (TREE_TYPE (arg1), dconst0));
9255 /* x != NaN is always true, other ops are always false. */
9256 if (REAL_VALUE_ISNAN (cst)
9257 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1))))
9259 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9260 return omit_one_operand_loc (loc, type, tem, arg0);
9263 /* Fold comparisons against infinity. */
9264 if (REAL_VALUE_ISINF (cst)
9265 && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9267 tem = fold_inf_compare (loc, code, type, arg0, arg1);
9268 if (tem != NULL_TREE)
9269 return tem;
9273 /* If this is a comparison of a real constant with a PLUS_EXPR
9274 or a MINUS_EXPR of a real constant, we can convert it into a
9275 comparison with a revised real constant as long as no overflow
9276 occurs when unsafe_math_optimizations are enabled. */
9277 if (flag_unsafe_math_optimizations
9278 && TREE_CODE (arg1) == REAL_CST
9279 && (TREE_CODE (arg0) == PLUS_EXPR
9280 || TREE_CODE (arg0) == MINUS_EXPR)
9281 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9282 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9283 ? MINUS_EXPR : PLUS_EXPR,
9284 arg1, TREE_OPERAND (arg0, 1)))
9285 && !TREE_OVERFLOW (tem))
9286 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
9288 /* Likewise, we can simplify a comparison of a real constant with
9289 a MINUS_EXPR whose first operand is also a real constant, i.e.
9290 (c1 - x) < c2 becomes x > c1-c2. Reordering is allowed on
9291 floating-point types only if -fassociative-math is set. */
9292 if (flag_associative_math
9293 && TREE_CODE (arg1) == REAL_CST
9294 && TREE_CODE (arg0) == MINUS_EXPR
9295 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9296 && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9297 arg1))
9298 && !TREE_OVERFLOW (tem))
9299 return fold_build2_loc (loc, swap_tree_comparison (code), type,
9300 TREE_OPERAND (arg0, 1), tem);
9302 /* Fold comparisons against built-in math functions. */
9303 if (TREE_CODE (arg1) == REAL_CST
9304 && flag_unsafe_math_optimizations
9305 && ! flag_errno_math)
9307 enum built_in_function fcode = builtin_mathfn_code (arg0);
9309 if (fcode != END_BUILTINS)
9311 tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1);
9312 if (tem != NULL_TREE)
9313 return tem;
9318 if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9319 && CONVERT_EXPR_P (arg0))
9321 /* If we are widening one operand of an integer comparison,
9322 see if the other operand is similarly being widened. Perhaps we
9323 can do the comparison in the narrower type. */
9324 tem = fold_widened_comparison (loc, code, type, arg0, arg1);
9325 if (tem)
9326 return tem;
9328 /* Or if we are changing signedness. */
9329 tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1);
9330 if (tem)
9331 return tem;
9334 /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9335 constant, we can simplify it. */
9336 if (TREE_CODE (arg1) == INTEGER_CST
9337 && (TREE_CODE (arg0) == MIN_EXPR
9338 || TREE_CODE (arg0) == MAX_EXPR)
9339 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9341 tem = optimize_minmax_comparison (loc, code, type, op0, op1);
9342 if (tem)
9343 return tem;
9346 /* Simplify comparison of something with itself. (For IEEE
9347 floating-point, we can only do some of these simplifications.) */
9348 if (operand_equal_p (arg0, arg1, 0))
9350 switch (code)
9352 case EQ_EXPR:
9353 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9354 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9355 return constant_boolean_node (1, type);
9356 break;
9358 case GE_EXPR:
9359 case LE_EXPR:
9360 if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9361 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9362 return constant_boolean_node (1, type);
9363 return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1);
9365 case NE_EXPR:
9366 /* For NE, we can only do this simplification if integer
9367 or we don't honor IEEE floating point NaNs. */
9368 if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9369 && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9370 break;
9371 /* ... fall through ... */
9372 case GT_EXPR:
9373 case LT_EXPR:
9374 return constant_boolean_node (0, type);
9375 default:
9376 gcc_unreachable ();
9380 /* If we are comparing an expression that just has comparisons
9381 of two integer values, arithmetic expressions of those comparisons,
9382 and constants, we can simplify it. There are only three cases
9383 to check: the two values can either be equal, the first can be
9384 greater, or the second can be greater. Fold the expression for
9385 those three values. Since each value must be 0 or 1, we have
9386 eight possibilities, each of which corresponds to the constant 0
9387 or 1 or one of the six possible comparisons.
9389 This handles common cases like (a > b) == 0 but also handles
9390 expressions like ((x > y) - (y > x)) > 0, which supposedly
9391 occur in macroized code. */
9393 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9395 tree cval1 = 0, cval2 = 0;
9396 int save_p = 0;
9398 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9399 /* Don't handle degenerate cases here; they should already
9400 have been handled anyway. */
9401 && cval1 != 0 && cval2 != 0
9402 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9403 && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9404 && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9405 && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9406 && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9407 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9408 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9410 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9411 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9413 /* We can't just pass T to eval_subst in case cval1 or cval2
9414 was the same as ARG1. */
9416 tree high_result
9417 = fold_build2_loc (loc, code, type,
9418 eval_subst (loc, arg0, cval1, maxval,
9419 cval2, minval),
9420 arg1);
9421 tree equal_result
9422 = fold_build2_loc (loc, code, type,
9423 eval_subst (loc, arg0, cval1, maxval,
9424 cval2, maxval),
9425 arg1);
9426 tree low_result
9427 = fold_build2_loc (loc, code, type,
9428 eval_subst (loc, arg0, cval1, minval,
9429 cval2, maxval),
9430 arg1);
9432 /* All three of these results should be 0 or 1. Confirm they are.
9433 Then use those values to select the proper code to use. */
9435 if (TREE_CODE (high_result) == INTEGER_CST
9436 && TREE_CODE (equal_result) == INTEGER_CST
9437 && TREE_CODE (low_result) == INTEGER_CST)
9439 /* Make a 3-bit mask with the high-order bit being the
9440 value for `>', the next for '=', and the low for '<'. */
9441 switch ((integer_onep (high_result) * 4)
9442 + (integer_onep (equal_result) * 2)
9443 + integer_onep (low_result))
9445 case 0:
9446 /* Always false. */
9447 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
9448 case 1:
9449 code = LT_EXPR;
9450 break;
9451 case 2:
9452 code = EQ_EXPR;
9453 break;
9454 case 3:
9455 code = LE_EXPR;
9456 break;
9457 case 4:
9458 code = GT_EXPR;
9459 break;
9460 case 5:
9461 code = NE_EXPR;
9462 break;
9463 case 6:
9464 code = GE_EXPR;
9465 break;
9466 case 7:
9467 /* Always true. */
9468 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
9471 if (save_p)
9473 tem = save_expr (build2 (code, type, cval1, cval2));
9474 SET_EXPR_LOCATION (tem, loc);
9475 return tem;
9477 return fold_build2_loc (loc, code, type, cval1, cval2);
9482 /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9483 into a single range test. */
9484 if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9485 || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9486 && TREE_CODE (arg1) == INTEGER_CST
9487 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9488 && !integer_zerop (TREE_OPERAND (arg0, 1))
9489 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9490 && !TREE_OVERFLOW (arg1))
9492 tem = fold_div_compare (loc, code, type, arg0, arg1);
9493 if (tem != NULL_TREE)
9494 return tem;
9497 /* Fold ~X op ~Y as Y op X. */
9498 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9499 && TREE_CODE (arg1) == BIT_NOT_EXPR)
9501 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9502 return fold_build2_loc (loc, code, type,
9503 fold_convert_loc (loc, cmp_type,
9504 TREE_OPERAND (arg1, 0)),
9505 TREE_OPERAND (arg0, 0));
9508 /* Fold ~X op C as X op' ~C, where op' is the swapped comparison. */
9509 if (TREE_CODE (arg0) == BIT_NOT_EXPR
9510 && TREE_CODE (arg1) == INTEGER_CST)
9512 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9513 return fold_build2_loc (loc, swap_tree_comparison (code), type,
9514 TREE_OPERAND (arg0, 0),
9515 fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type,
9516 fold_convert_loc (loc, cmp_type, arg1)));
9519 return NULL_TREE;
9523 /* Subroutine of fold_binary. Optimize complex multiplications of the
9524 form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2). The
9525 argument EXPR represents the expression "z" of type TYPE. */
9527 static tree
9528 fold_mult_zconjz (location_t loc, tree type, tree expr)
9530 tree itype = TREE_TYPE (type);
9531 tree rpart, ipart, tem;
9533 if (TREE_CODE (expr) == COMPLEX_EXPR)
9535 rpart = TREE_OPERAND (expr, 0);
9536 ipart = TREE_OPERAND (expr, 1);
9538 else if (TREE_CODE (expr) == COMPLEX_CST)
9540 rpart = TREE_REALPART (expr);
9541 ipart = TREE_IMAGPART (expr);
9543 else
9545 expr = save_expr (expr);
9546 rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr);
9547 ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr);
9550 rpart = save_expr (rpart);
9551 ipart = save_expr (ipart);
9552 tem = fold_build2_loc (loc, PLUS_EXPR, itype,
9553 fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart),
9554 fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart));
9555 return fold_build2_loc (loc, COMPLEX_EXPR, type, tem,
9556 build_zero_cst (itype));
9560 /* Subroutine of fold_binary. If P is the value of EXPR, computes
9561 power-of-two M and (arbitrary) N such that M divides (P-N). This condition
9562 guarantees that P and N have the same least significant log2(M) bits.
9563 N is not otherwise constrained. In particular, N is not normalized to
9564 0 <= N < M as is common. In general, the precise value of P is unknown.
9565 M is chosen as large as possible such that constant N can be determined.
9567 Returns M and sets *RESIDUE to N.
9569 If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9570 account. This is not always possible due to PR 35705.
9573 static unsigned HOST_WIDE_INT
9574 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9575 bool allow_func_align)
9577 enum tree_code code;
9579 *residue = 0;
9581 code = TREE_CODE (expr);
9582 if (code == ADDR_EXPR)
9584 unsigned int bitalign;
9585 bitalign = get_object_alignment_1 (TREE_OPERAND (expr, 0), residue);
9586 *residue /= BITS_PER_UNIT;
9587 return bitalign / BITS_PER_UNIT;
9589 else if (code == POINTER_PLUS_EXPR)
9591 tree op0, op1;
9592 unsigned HOST_WIDE_INT modulus;
9593 enum tree_code inner_code;
9595 op0 = TREE_OPERAND (expr, 0);
9596 STRIP_NOPS (op0);
9597 modulus = get_pointer_modulus_and_residue (op0, residue,
9598 allow_func_align);
9600 op1 = TREE_OPERAND (expr, 1);
9601 STRIP_NOPS (op1);
9602 inner_code = TREE_CODE (op1);
9603 if (inner_code == INTEGER_CST)
9605 *residue += TREE_INT_CST_LOW (op1);
9606 return modulus;
9608 else if (inner_code == MULT_EXPR)
9610 op1 = TREE_OPERAND (op1, 1);
9611 if (TREE_CODE (op1) == INTEGER_CST)
9613 unsigned HOST_WIDE_INT align;
9615 /* Compute the greatest power-of-2 divisor of op1. */
9616 align = TREE_INT_CST_LOW (op1);
9617 align &= -align;
9619 /* If align is non-zero and less than *modulus, replace
9620 *modulus with align., If align is 0, then either op1 is 0
9621 or the greatest power-of-2 divisor of op1 doesn't fit in an
9622 unsigned HOST_WIDE_INT. In either case, no additional
9623 constraint is imposed. */
9624 if (align)
9625 modulus = MIN (modulus, align);
9627 return modulus;
9632 /* If we get here, we were unable to determine anything useful about the
9633 expression. */
9634 return 1;
9637 /* Helper function for fold_vec_perm. Store elements of VECTOR_CST or
9638 CONSTRUCTOR ARG into array ELTS and return true if successful. */
9640 static bool
9641 vec_cst_ctor_to_array (tree arg, tree *elts)
9643 unsigned int nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)), i;
9645 if (TREE_CODE (arg) == VECTOR_CST)
9647 tree t;
9649 for (i = 0, t = TREE_VECTOR_CST_ELTS (arg);
9650 i < nelts && t; i++, t = TREE_CHAIN (t))
9651 elts[i] = TREE_VALUE (t);
9652 if (t)
9653 return false;
9655 else if (TREE_CODE (arg) == CONSTRUCTOR)
9657 constructor_elt *elt;
9659 FOR_EACH_VEC_ELT (constructor_elt, CONSTRUCTOR_ELTS (arg), i, elt)
9660 if (i >= nelts)
9661 return false;
9662 else
9663 elts[i] = elt->value;
9665 else
9666 return false;
9667 for (; i < nelts; i++)
9668 elts[i]
9669 = fold_convert (TREE_TYPE (TREE_TYPE (arg)), integer_zero_node);
9670 return true;
9673 /* Attempt to fold vector permutation of ARG0 and ARG1 vectors using SEL
9674 selector. Return the folded VECTOR_CST or CONSTRUCTOR if successful,
9675 NULL_TREE otherwise. */
9677 static tree
9678 fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
9680 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
9681 tree *elts;
9682 bool need_ctor = false;
9684 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts
9685 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts);
9686 if (TREE_TYPE (TREE_TYPE (arg0)) != TREE_TYPE (type)
9687 || TREE_TYPE (TREE_TYPE (arg1)) != TREE_TYPE (type))
9688 return NULL_TREE;
9690 elts = XALLOCAVEC (tree, nelts * 3);
9691 if (!vec_cst_ctor_to_array (arg0, elts)
9692 || !vec_cst_ctor_to_array (arg1, elts + nelts))
9693 return NULL_TREE;
9695 for (i = 0; i < nelts; i++)
9697 if (!CONSTANT_CLASS_P (elts[sel[i]]))
9698 need_ctor = true;
9699 elts[i + 2 * nelts] = unshare_expr (elts[sel[i]]);
9702 if (need_ctor)
9704 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, nelts);
9705 for (i = 0; i < nelts; i++)
9706 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[2 * nelts + i]);
9707 return build_constructor (type, v);
9709 else
9711 tree vals = NULL_TREE;
9712 for (i = 0; i < nelts; i++)
9713 vals = tree_cons (NULL_TREE, elts[3 * nelts - i - 1], vals);
9714 return build_vector (type, vals);
9718 /* Try to fold a pointer difference of type TYPE two address expressions of
9719 array references AREF0 and AREF1 using location LOC. Return a
9720 simplified expression for the difference or NULL_TREE. */
9722 static tree
9723 fold_addr_of_array_ref_difference (location_t loc, tree type,
9724 tree aref0, tree aref1)
9726 tree base0 = TREE_OPERAND (aref0, 0);
9727 tree base1 = TREE_OPERAND (aref1, 0);
9728 tree base_offset = build_int_cst (type, 0);
9730 /* If the bases are array references as well, recurse. If the bases
9731 are pointer indirections compute the difference of the pointers.
9732 If the bases are equal, we are set. */
9733 if ((TREE_CODE (base0) == ARRAY_REF
9734 && TREE_CODE (base1) == ARRAY_REF
9735 && (base_offset
9736 = fold_addr_of_array_ref_difference (loc, type, base0, base1)))
9737 || (INDIRECT_REF_P (base0)
9738 && INDIRECT_REF_P (base1)
9739 && (base_offset = fold_binary_loc (loc, MINUS_EXPR, type,
9740 TREE_OPERAND (base0, 0),
9741 TREE_OPERAND (base1, 0))))
9742 || operand_equal_p (base0, base1, 0))
9744 tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
9745 tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
9746 tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0));
9747 tree diff = build2 (MINUS_EXPR, type, op0, op1);
9748 return fold_build2_loc (loc, PLUS_EXPR, type,
9749 base_offset,
9750 fold_build2_loc (loc, MULT_EXPR, type,
9751 diff, esz));
9753 return NULL_TREE;
9756 /* Fold a binary expression of code CODE and type TYPE with operands
9757 OP0 and OP1. LOC is the location of the resulting expression.
9758 Return the folded expression if folding is successful. Otherwise,
9759 return NULL_TREE. */
9761 tree
9762 fold_binary_loc (location_t loc,
9763 enum tree_code code, tree type, tree op0, tree op1)
9765 enum tree_code_class kind = TREE_CODE_CLASS (code);
9766 tree arg0, arg1, tem;
9767 tree t1 = NULL_TREE;
9768 bool strict_overflow_p;
9770 gcc_assert (IS_EXPR_CODE_CLASS (kind)
9771 && TREE_CODE_LENGTH (code) == 2
9772 && op0 != NULL_TREE
9773 && op1 != NULL_TREE);
9775 arg0 = op0;
9776 arg1 = op1;
9778 /* Strip any conversions that don't change the mode. This is
9779 safe for every expression, except for a comparison expression
9780 because its signedness is derived from its operands. So, in
9781 the latter case, only strip conversions that don't change the
9782 signedness. MIN_EXPR/MAX_EXPR also need signedness of arguments
9783 preserved.
9785 Note that this is done as an internal manipulation within the
9786 constant folder, in order to find the simplest representation
9787 of the arguments so that their form can be studied. In any
9788 cases, the appropriate type conversions should be put back in
9789 the tree that will get out of the constant folder. */
9791 if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
9793 STRIP_SIGN_NOPS (arg0);
9794 STRIP_SIGN_NOPS (arg1);
9796 else
9798 STRIP_NOPS (arg0);
9799 STRIP_NOPS (arg1);
9802 /* Note that TREE_CONSTANT isn't enough: static var addresses are
9803 constant but we can't do arithmetic on them. */
9804 if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9805 || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
9806 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST)
9807 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST)
9808 || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST)
9809 || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST))
9811 if (kind == tcc_binary)
9813 /* Make sure type and arg0 have the same saturating flag. */
9814 gcc_assert (TYPE_SATURATING (type)
9815 == TYPE_SATURATING (TREE_TYPE (arg0)));
9816 tem = const_binop (code, arg0, arg1);
9818 else if (kind == tcc_comparison)
9819 tem = fold_relational_const (code, type, arg0, arg1);
9820 else
9821 tem = NULL_TREE;
9823 if (tem != NULL_TREE)
9825 if (TREE_TYPE (tem) != type)
9826 tem = fold_convert_loc (loc, type, tem);
9827 return tem;
9831 /* If this is a commutative operation, and ARG0 is a constant, move it
9832 to ARG1 to reduce the number of tests below. */
9833 if (commutative_tree_code (code)
9834 && tree_swap_operands_p (arg0, arg1, true))
9835 return fold_build2_loc (loc, code, type, op1, op0);
9837 /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9839 First check for cases where an arithmetic operation is applied to a
9840 compound, conditional, or comparison operation. Push the arithmetic
9841 operation inside the compound or conditional to see if any folding
9842 can then be done. Convert comparison to conditional for this purpose.
9843 The also optimizes non-constant cases that used to be done in
9844 expand_expr.
9846 Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9847 one of the operands is a comparison and the other is a comparison, a
9848 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the
9849 code below would make the expression more complex. Change it to a
9850 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to
9851 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */
9853 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9854 || code == EQ_EXPR || code == NE_EXPR)
9855 && ((truth_value_p (TREE_CODE (arg0))
9856 && (truth_value_p (TREE_CODE (arg1))
9857 || (TREE_CODE (arg1) == BIT_AND_EXPR
9858 && integer_onep (TREE_OPERAND (arg1, 1)))))
9859 || (truth_value_p (TREE_CODE (arg1))
9860 && (truth_value_p (TREE_CODE (arg0))
9861 || (TREE_CODE (arg0) == BIT_AND_EXPR
9862 && integer_onep (TREE_OPERAND (arg0, 1)))))))
9864 tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9865 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9866 : TRUTH_XOR_EXPR,
9867 boolean_type_node,
9868 fold_convert_loc (loc, boolean_type_node, arg0),
9869 fold_convert_loc (loc, boolean_type_node, arg1));
9871 if (code == EQ_EXPR)
9872 tem = invert_truthvalue_loc (loc, tem);
9874 return fold_convert_loc (loc, type, tem);
9877 if (TREE_CODE_CLASS (code) == tcc_binary
9878 || TREE_CODE_CLASS (code) == tcc_comparison)
9880 if (TREE_CODE (arg0) == COMPOUND_EXPR)
9882 tem = fold_build2_loc (loc, code, type,
9883 fold_convert_loc (loc, TREE_TYPE (op0),
9884 TREE_OPERAND (arg0, 1)), op1);
9885 return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9886 tem);
9888 if (TREE_CODE (arg1) == COMPOUND_EXPR
9889 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9891 tem = fold_build2_loc (loc, code, type, op0,
9892 fold_convert_loc (loc, TREE_TYPE (op1),
9893 TREE_OPERAND (arg1, 1)));
9894 return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9895 tem);
9898 if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
9900 tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
9901 arg0, arg1,
9902 /*cond_first_p=*/1);
9903 if (tem != NULL_TREE)
9904 return tem;
9907 if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
9909 tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
9910 arg1, arg0,
9911 /*cond_first_p=*/0);
9912 if (tem != NULL_TREE)
9913 return tem;
9917 switch (code)
9919 case MEM_REF:
9920 /* MEM[&MEM[p, CST1], CST2] -> MEM[p, CST1 + CST2]. */
9921 if (TREE_CODE (arg0) == ADDR_EXPR
9922 && TREE_CODE (TREE_OPERAND (arg0, 0)) == MEM_REF)
9924 tree iref = TREE_OPERAND (arg0, 0);
9925 return fold_build2 (MEM_REF, type,
9926 TREE_OPERAND (iref, 0),
9927 int_const_binop (PLUS_EXPR, arg1,
9928 TREE_OPERAND (iref, 1)));
9931 /* MEM[&a.b, CST2] -> MEM[&a, offsetof (a, b) + CST2]. */
9932 if (TREE_CODE (arg0) == ADDR_EXPR
9933 && handled_component_p (TREE_OPERAND (arg0, 0)))
9935 tree base;
9936 HOST_WIDE_INT coffset;
9937 base = get_addr_base_and_unit_offset (TREE_OPERAND (arg0, 0),
9938 &coffset);
9939 if (!base)
9940 return NULL_TREE;
9941 return fold_build2 (MEM_REF, type,
9942 build_fold_addr_expr (base),
9943 int_const_binop (PLUS_EXPR, arg1,
9944 size_int (coffset)));
9947 return NULL_TREE;
9949 case POINTER_PLUS_EXPR:
9950 /* 0 +p index -> (type)index */
9951 if (integer_zerop (arg0))
9952 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
9954 /* PTR +p 0 -> PTR */
9955 if (integer_zerop (arg1))
9956 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
9958 /* INT +p INT -> (PTR)(INT + INT). Stripping types allows for this. */
9959 if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
9960 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
9961 return fold_convert_loc (loc, type,
9962 fold_build2_loc (loc, PLUS_EXPR, sizetype,
9963 fold_convert_loc (loc, sizetype,
9964 arg1),
9965 fold_convert_loc (loc, sizetype,
9966 arg0)));
9968 /* (PTR +p B) +p A -> PTR +p (B + A) */
9969 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
9971 tree inner;
9972 tree arg01 = fold_convert_loc (loc, sizetype, TREE_OPERAND (arg0, 1));
9973 tree arg00 = TREE_OPERAND (arg0, 0);
9974 inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
9975 arg01, fold_convert_loc (loc, sizetype, arg1));
9976 return fold_convert_loc (loc, type,
9977 fold_build_pointer_plus_loc (loc,
9978 arg00, inner));
9981 /* PTR_CST +p CST -> CST1 */
9982 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
9983 return fold_build2_loc (loc, PLUS_EXPR, type, arg0,
9984 fold_convert_loc (loc, type, arg1));
9986 /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step
9987 of the array. Loop optimizer sometimes produce this type of
9988 expressions. */
9989 if (TREE_CODE (arg0) == ADDR_EXPR)
9991 tem = try_move_mult_to_index (loc, arg0,
9992 fold_convert_loc (loc, sizetype, arg1));
9993 if (tem)
9994 return fold_convert_loc (loc, type, tem);
9997 return NULL_TREE;
9999 case PLUS_EXPR:
10000 /* A + (-B) -> A - B */
10001 if (TREE_CODE (arg1) == NEGATE_EXPR)
10002 return fold_build2_loc (loc, MINUS_EXPR, type,
10003 fold_convert_loc (loc, type, arg0),
10004 fold_convert_loc (loc, type,
10005 TREE_OPERAND (arg1, 0)));
10006 /* (-A) + B -> B - A */
10007 if (TREE_CODE (arg0) == NEGATE_EXPR
10008 && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
10009 return fold_build2_loc (loc, MINUS_EXPR, type,
10010 fold_convert_loc (loc, type, arg1),
10011 fold_convert_loc (loc, type,
10012 TREE_OPERAND (arg0, 0)));
10014 if (INTEGRAL_TYPE_P (type))
10016 /* Convert ~A + 1 to -A. */
10017 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10018 && integer_onep (arg1))
10019 return fold_build1_loc (loc, NEGATE_EXPR, type,
10020 fold_convert_loc (loc, type,
10021 TREE_OPERAND (arg0, 0)));
10023 /* ~X + X is -1. */
10024 if (TREE_CODE (arg0) == BIT_NOT_EXPR
10025 && !TYPE_OVERFLOW_TRAPS (type))
10027 tree tem = TREE_OPERAND (arg0, 0);
10029 STRIP_NOPS (tem);
10030 if (operand_equal_p (tem, arg1, 0))
10032 t1 = build_int_cst_type (type, -1);
10033 return omit_one_operand_loc (loc, type, t1, arg1);
10037 /* X + ~X is -1. */
10038 if (TREE_CODE (arg1) == BIT_NOT_EXPR
10039 && !TYPE_OVERFLOW_TRAPS (type))
10041 tree tem = TREE_OPERAND (arg1, 0);
10043 STRIP_NOPS (tem);
10044 if (operand_equal_p (arg0, tem, 0))
10046 t1 = build_int_cst_type (type, -1);
10047 return omit_one_operand_loc (loc, type, t1, arg0);
10051 /* X + (X / CST) * -CST is X % CST. */
10052 if (TREE_CODE (arg1) == MULT_EXPR
10053 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10054 && operand_equal_p (arg0,
10055 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
10057 tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
10058 tree cst1 = TREE_OPERAND (arg1, 1);
10059 tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1),
10060 cst1, cst0);
10061 if (sum && integer_zerop (sum))
10062 return fold_convert_loc (loc, type,
10063 fold_build2_loc (loc, TRUNC_MOD_EXPR,
10064 TREE_TYPE (arg0), arg0,
10065 cst0));
10069 /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
10070 one. Make sure the type is not saturating and has the signedness of
10071 the stripped operands, as fold_plusminus_mult_expr will re-associate.
10072 ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
10073 if ((TREE_CODE (arg0) == MULT_EXPR
10074 || TREE_CODE (arg1) == MULT_EXPR)
10075 && !TYPE_SATURATING (type)
10076 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10077 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10078 && (!FLOAT_TYPE_P (type) || flag_associative_math))
10080 tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10081 if (tem)
10082 return tem;
10085 if (! FLOAT_TYPE_P (type))
10087 if (integer_zerop (arg1))
10088 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10090 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
10091 with a constant, and the two constants have no bits in common,
10092 we should treat this as a BIT_IOR_EXPR since this may produce more
10093 simplifications. */
10094 if (TREE_CODE (arg0) == BIT_AND_EXPR
10095 && TREE_CODE (arg1) == BIT_AND_EXPR
10096 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10097 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10098 && integer_zerop (const_binop (BIT_AND_EXPR,
10099 TREE_OPERAND (arg0, 1),
10100 TREE_OPERAND (arg1, 1))))
10102 code = BIT_IOR_EXPR;
10103 goto bit_ior;
10106 /* Reassociate (plus (plus (mult) (foo)) (mult)) as
10107 (plus (plus (mult) (mult)) (foo)) so that we can
10108 take advantage of the factoring cases below. */
10109 if (TYPE_OVERFLOW_WRAPS (type)
10110 && (((TREE_CODE (arg0) == PLUS_EXPR
10111 || TREE_CODE (arg0) == MINUS_EXPR)
10112 && TREE_CODE (arg1) == MULT_EXPR)
10113 || ((TREE_CODE (arg1) == PLUS_EXPR
10114 || TREE_CODE (arg1) == MINUS_EXPR)
10115 && TREE_CODE (arg0) == MULT_EXPR)))
10117 tree parg0, parg1, parg, marg;
10118 enum tree_code pcode;
10120 if (TREE_CODE (arg1) == MULT_EXPR)
10121 parg = arg0, marg = arg1;
10122 else
10123 parg = arg1, marg = arg0;
10124 pcode = TREE_CODE (parg);
10125 parg0 = TREE_OPERAND (parg, 0);
10126 parg1 = TREE_OPERAND (parg, 1);
10127 STRIP_NOPS (parg0);
10128 STRIP_NOPS (parg1);
10130 if (TREE_CODE (parg0) == MULT_EXPR
10131 && TREE_CODE (parg1) != MULT_EXPR)
10132 return fold_build2_loc (loc, pcode, type,
10133 fold_build2_loc (loc, PLUS_EXPR, type,
10134 fold_convert_loc (loc, type,
10135 parg0),
10136 fold_convert_loc (loc, type,
10137 marg)),
10138 fold_convert_loc (loc, type, parg1));
10139 if (TREE_CODE (parg0) != MULT_EXPR
10140 && TREE_CODE (parg1) == MULT_EXPR)
10141 return
10142 fold_build2_loc (loc, PLUS_EXPR, type,
10143 fold_convert_loc (loc, type, parg0),
10144 fold_build2_loc (loc, pcode, type,
10145 fold_convert_loc (loc, type, marg),
10146 fold_convert_loc (loc, type,
10147 parg1)));
10150 else
10152 /* See if ARG1 is zero and X + ARG1 reduces to X. */
10153 if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0))
10154 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10156 /* Likewise if the operands are reversed. */
10157 if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10158 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
10160 /* Convert X + -C into X - C. */
10161 if (TREE_CODE (arg1) == REAL_CST
10162 && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
10164 tem = fold_negate_const (arg1, type);
10165 if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
10166 return fold_build2_loc (loc, MINUS_EXPR, type,
10167 fold_convert_loc (loc, type, arg0),
10168 fold_convert_loc (loc, type, tem));
10171 /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10172 to __complex__ ( x, y ). This is not the same for SNaNs or
10173 if signed zeros are involved. */
10174 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10175 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10176 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10178 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10179 tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10180 tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10181 bool arg0rz = false, arg0iz = false;
10182 if ((arg0r && (arg0rz = real_zerop (arg0r)))
10183 || (arg0i && (arg0iz = real_zerop (arg0i))))
10185 tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10186 tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10187 if (arg0rz && arg1i && real_zerop (arg1i))
10189 tree rp = arg1r ? arg1r
10190 : build1 (REALPART_EXPR, rtype, arg1);
10191 tree ip = arg0i ? arg0i
10192 : build1 (IMAGPART_EXPR, rtype, arg0);
10193 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10195 else if (arg0iz && arg1r && real_zerop (arg1r))
10197 tree rp = arg0r ? arg0r
10198 : build1 (REALPART_EXPR, rtype, arg0);
10199 tree ip = arg1i ? arg1i
10200 : build1 (IMAGPART_EXPR, rtype, arg1);
10201 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10206 if (flag_unsafe_math_optimizations
10207 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10208 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10209 && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10210 return tem;
10212 /* Convert x+x into x*2.0. */
10213 if (operand_equal_p (arg0, arg1, 0)
10214 && SCALAR_FLOAT_TYPE_P (type))
10215 return fold_build2_loc (loc, MULT_EXPR, type, arg0,
10216 build_real (type, dconst2));
10218 /* Convert a + (b*c + d*e) into (a + b*c) + d*e.
10219 We associate floats only if the user has specified
10220 -fassociative-math. */
10221 if (flag_associative_math
10222 && TREE_CODE (arg1) == PLUS_EXPR
10223 && TREE_CODE (arg0) != MULT_EXPR)
10225 tree tree10 = TREE_OPERAND (arg1, 0);
10226 tree tree11 = TREE_OPERAND (arg1, 1);
10227 if (TREE_CODE (tree11) == MULT_EXPR
10228 && TREE_CODE (tree10) == MULT_EXPR)
10230 tree tree0;
10231 tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10);
10232 return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11);
10235 /* Convert (b*c + d*e) + a into b*c + (d*e +a).
10236 We associate floats only if the user has specified
10237 -fassociative-math. */
10238 if (flag_associative_math
10239 && TREE_CODE (arg0) == PLUS_EXPR
10240 && TREE_CODE (arg1) != MULT_EXPR)
10242 tree tree00 = TREE_OPERAND (arg0, 0);
10243 tree tree01 = TREE_OPERAND (arg0, 1);
10244 if (TREE_CODE (tree01) == MULT_EXPR
10245 && TREE_CODE (tree00) == MULT_EXPR)
10247 tree tree0;
10248 tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1);
10249 return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0);
10254 bit_rotate:
10255 /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10256 is a rotate of A by C1 bits. */
10257 /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10258 is a rotate of A by B bits. */
10260 enum tree_code code0, code1;
10261 tree rtype;
10262 code0 = TREE_CODE (arg0);
10263 code1 = TREE_CODE (arg1);
10264 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10265 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10266 && operand_equal_p (TREE_OPERAND (arg0, 0),
10267 TREE_OPERAND (arg1, 0), 0)
10268 && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10269 TYPE_UNSIGNED (rtype))
10270 /* Only create rotates in complete modes. Other cases are not
10271 expanded properly. */
10272 && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype)))
10274 tree tree01, tree11;
10275 enum tree_code code01, code11;
10277 tree01 = TREE_OPERAND (arg0, 1);
10278 tree11 = TREE_OPERAND (arg1, 1);
10279 STRIP_NOPS (tree01);
10280 STRIP_NOPS (tree11);
10281 code01 = TREE_CODE (tree01);
10282 code11 = TREE_CODE (tree11);
10283 if (code01 == INTEGER_CST
10284 && code11 == INTEGER_CST
10285 && TREE_INT_CST_HIGH (tree01) == 0
10286 && TREE_INT_CST_HIGH (tree11) == 0
10287 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11))
10288 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10290 tem = build2_loc (loc, LROTATE_EXPR,
10291 TREE_TYPE (TREE_OPERAND (arg0, 0)),
10292 TREE_OPERAND (arg0, 0),
10293 code0 == LSHIFT_EXPR ? tree01 : tree11);
10294 return fold_convert_loc (loc, type, tem);
10296 else if (code11 == MINUS_EXPR)
10298 tree tree110, tree111;
10299 tree110 = TREE_OPERAND (tree11, 0);
10300 tree111 = TREE_OPERAND (tree11, 1);
10301 STRIP_NOPS (tree110);
10302 STRIP_NOPS (tree111);
10303 if (TREE_CODE (tree110) == INTEGER_CST
10304 && 0 == compare_tree_int (tree110,
10305 TYPE_PRECISION
10306 (TREE_TYPE (TREE_OPERAND
10307 (arg0, 0))))
10308 && operand_equal_p (tree01, tree111, 0))
10309 return
10310 fold_convert_loc (loc, type,
10311 build2 ((code0 == LSHIFT_EXPR
10312 ? LROTATE_EXPR
10313 : RROTATE_EXPR),
10314 TREE_TYPE (TREE_OPERAND (arg0, 0)),
10315 TREE_OPERAND (arg0, 0), tree01));
10317 else if (code01 == MINUS_EXPR)
10319 tree tree010, tree011;
10320 tree010 = TREE_OPERAND (tree01, 0);
10321 tree011 = TREE_OPERAND (tree01, 1);
10322 STRIP_NOPS (tree010);
10323 STRIP_NOPS (tree011);
10324 if (TREE_CODE (tree010) == INTEGER_CST
10325 && 0 == compare_tree_int (tree010,
10326 TYPE_PRECISION
10327 (TREE_TYPE (TREE_OPERAND
10328 (arg0, 0))))
10329 && operand_equal_p (tree11, tree011, 0))
10330 return fold_convert_loc
10331 (loc, type,
10332 build2 ((code0 != LSHIFT_EXPR
10333 ? LROTATE_EXPR
10334 : RROTATE_EXPR),
10335 TREE_TYPE (TREE_OPERAND (arg0, 0)),
10336 TREE_OPERAND (arg0, 0), tree11));
10341 associate:
10342 /* In most languages, can't associate operations on floats through
10343 parentheses. Rather than remember where the parentheses were, we
10344 don't associate floats at all, unless the user has specified
10345 -fassociative-math.
10346 And, we need to make sure type is not saturating. */
10348 if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10349 && !TYPE_SATURATING (type))
10351 tree var0, con0, lit0, minus_lit0;
10352 tree var1, con1, lit1, minus_lit1;
10353 bool ok = true;
10355 /* Split both trees into variables, constants, and literals. Then
10356 associate each group together, the constants with literals,
10357 then the result with variables. This increases the chances of
10358 literals being recombined later and of generating relocatable
10359 expressions for the sum of a constant and literal. */
10360 var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
10361 var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
10362 code == MINUS_EXPR);
10364 /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
10365 if (code == MINUS_EXPR)
10366 code = PLUS_EXPR;
10368 /* With undefined overflow we can only associate constants with one
10369 variable, and constants whose association doesn't overflow. */
10370 if ((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10371 || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10373 if (var0 && var1)
10375 tree tmp0 = var0;
10376 tree tmp1 = var1;
10378 if (TREE_CODE (tmp0) == NEGATE_EXPR)
10379 tmp0 = TREE_OPERAND (tmp0, 0);
10380 if (TREE_CODE (tmp1) == NEGATE_EXPR)
10381 tmp1 = TREE_OPERAND (tmp1, 0);
10382 /* The only case we can still associate with two variables
10383 is if they are the same, modulo negation. */
10384 if (!operand_equal_p (tmp0, tmp1, 0))
10385 ok = false;
10388 if (ok && lit0 && lit1)
10390 tree tmp0 = fold_convert (type, lit0);
10391 tree tmp1 = fold_convert (type, lit1);
10393 if (!TREE_OVERFLOW (tmp0) && !TREE_OVERFLOW (tmp1)
10394 && TREE_OVERFLOW (fold_build2 (code, type, tmp0, tmp1)))
10395 ok = false;
10399 /* Only do something if we found more than two objects. Otherwise,
10400 nothing has changed and we risk infinite recursion. */
10401 if (ok
10402 && (2 < ((var0 != 0) + (var1 != 0)
10403 + (con0 != 0) + (con1 != 0)
10404 + (lit0 != 0) + (lit1 != 0)
10405 + (minus_lit0 != 0) + (minus_lit1 != 0))))
10407 var0 = associate_trees (loc, var0, var1, code, type);
10408 con0 = associate_trees (loc, con0, con1, code, type);
10409 lit0 = associate_trees (loc, lit0, lit1, code, type);
10410 minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1, code, type);
10412 /* Preserve the MINUS_EXPR if the negative part of the literal is
10413 greater than the positive part. Otherwise, the multiplicative
10414 folding code (i.e extract_muldiv) may be fooled in case
10415 unsigned constants are subtracted, like in the following
10416 example: ((X*2 + 4) - 8U)/2. */
10417 if (minus_lit0 && lit0)
10419 if (TREE_CODE (lit0) == INTEGER_CST
10420 && TREE_CODE (minus_lit0) == INTEGER_CST
10421 && tree_int_cst_lt (lit0, minus_lit0))
10423 minus_lit0 = associate_trees (loc, minus_lit0, lit0,
10424 MINUS_EXPR, type);
10425 lit0 = 0;
10427 else
10429 lit0 = associate_trees (loc, lit0, minus_lit0,
10430 MINUS_EXPR, type);
10431 minus_lit0 = 0;
10434 if (minus_lit0)
10436 if (con0 == 0)
10437 return
10438 fold_convert_loc (loc, type,
10439 associate_trees (loc, var0, minus_lit0,
10440 MINUS_EXPR, type));
10441 else
10443 con0 = associate_trees (loc, con0, minus_lit0,
10444 MINUS_EXPR, type);
10445 return
10446 fold_convert_loc (loc, type,
10447 associate_trees (loc, var0, con0,
10448 PLUS_EXPR, type));
10452 con0 = associate_trees (loc, con0, lit0, code, type);
10453 return
10454 fold_convert_loc (loc, type, associate_trees (loc, var0, con0,
10455 code, type));
10459 return NULL_TREE;
10461 case MINUS_EXPR:
10462 /* Pointer simplifications for subtraction, simple reassociations. */
10463 if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10465 /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10466 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10467 && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10469 tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10470 tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10471 tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
10472 tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
10473 return fold_build2_loc (loc, PLUS_EXPR, type,
10474 fold_build2_loc (loc, MINUS_EXPR, type,
10475 arg00, arg10),
10476 fold_build2_loc (loc, MINUS_EXPR, type,
10477 arg01, arg11));
10479 /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10480 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10482 tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10483 tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10484 tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00,
10485 fold_convert_loc (loc, type, arg1));
10486 if (tmp)
10487 return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01);
10490 /* A - (-B) -> A + B */
10491 if (TREE_CODE (arg1) == NEGATE_EXPR)
10492 return fold_build2_loc (loc, PLUS_EXPR, type, op0,
10493 fold_convert_loc (loc, type,
10494 TREE_OPERAND (arg1, 0)));
10495 /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */
10496 if (TREE_CODE (arg0) == NEGATE_EXPR
10497 && (FLOAT_TYPE_P (type)
10498 || INTEGRAL_TYPE_P (type))
10499 && negate_expr_p (arg1)
10500 && reorder_operands_p (arg0, arg1))
10501 return fold_build2_loc (loc, MINUS_EXPR, type,
10502 fold_convert_loc (loc, type,
10503 negate_expr (arg1)),
10504 fold_convert_loc (loc, type,
10505 TREE_OPERAND (arg0, 0)));
10506 /* Convert -A - 1 to ~A. */
10507 if (INTEGRAL_TYPE_P (type)
10508 && TREE_CODE (arg0) == NEGATE_EXPR
10509 && integer_onep (arg1)
10510 && !TYPE_OVERFLOW_TRAPS (type))
10511 return fold_build1_loc (loc, BIT_NOT_EXPR, type,
10512 fold_convert_loc (loc, type,
10513 TREE_OPERAND (arg0, 0)));
10515 /* Convert -1 - A to ~A. */
10516 if (INTEGRAL_TYPE_P (type)
10517 && integer_all_onesp (arg0))
10518 return fold_build1_loc (loc, BIT_NOT_EXPR, type, op1);
10521 /* X - (X / CST) * CST is X % CST. */
10522 if (INTEGRAL_TYPE_P (type)
10523 && TREE_CODE (arg1) == MULT_EXPR
10524 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10525 && operand_equal_p (arg0,
10526 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10527 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10528 TREE_OPERAND (arg1, 1), 0))
10529 return
10530 fold_convert_loc (loc, type,
10531 fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10532 arg0, TREE_OPERAND (arg1, 1)));
10534 if (! FLOAT_TYPE_P (type))
10536 if (integer_zerop (arg0))
10537 return negate_expr (fold_convert_loc (loc, type, arg1));
10538 if (integer_zerop (arg1))
10539 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10541 /* Fold A - (A & B) into ~B & A. */
10542 if (!TREE_SIDE_EFFECTS (arg0)
10543 && TREE_CODE (arg1) == BIT_AND_EXPR)
10545 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10547 tree arg10 = fold_convert_loc (loc, type,
10548 TREE_OPERAND (arg1, 0));
10549 return fold_build2_loc (loc, BIT_AND_EXPR, type,
10550 fold_build1_loc (loc, BIT_NOT_EXPR,
10551 type, arg10),
10552 fold_convert_loc (loc, type, arg0));
10554 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10556 tree arg11 = fold_convert_loc (loc,
10557 type, TREE_OPERAND (arg1, 1));
10558 return fold_build2_loc (loc, BIT_AND_EXPR, type,
10559 fold_build1_loc (loc, BIT_NOT_EXPR,
10560 type, arg11),
10561 fold_convert_loc (loc, type, arg0));
10565 /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10566 any power of 2 minus 1. */
10567 if (TREE_CODE (arg0) == BIT_AND_EXPR
10568 && TREE_CODE (arg1) == BIT_AND_EXPR
10569 && operand_equal_p (TREE_OPERAND (arg0, 0),
10570 TREE_OPERAND (arg1, 0), 0))
10572 tree mask0 = TREE_OPERAND (arg0, 1);
10573 tree mask1 = TREE_OPERAND (arg1, 1);
10574 tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0);
10576 if (operand_equal_p (tem, mask1, 0))
10578 tem = fold_build2_loc (loc, BIT_XOR_EXPR, type,
10579 TREE_OPERAND (arg0, 0), mask1);
10580 return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1);
10585 /* See if ARG1 is zero and X - ARG1 reduces to X. */
10586 else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1))
10587 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10589 /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether
10590 ARG0 is zero and X + ARG0 reduces to X, since that would mean
10591 (-ARG1 + ARG0) reduces to -ARG1. */
10592 else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
10593 return negate_expr (fold_convert_loc (loc, type, arg1));
10595 /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10596 __complex__ ( x, -y ). This is not the same for SNaNs or if
10597 signed zeros are involved. */
10598 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10599 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10600 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10602 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10603 tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10604 tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10605 bool arg0rz = false, arg0iz = false;
10606 if ((arg0r && (arg0rz = real_zerop (arg0r)))
10607 || (arg0i && (arg0iz = real_zerop (arg0i))))
10609 tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10610 tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10611 if (arg0rz && arg1i && real_zerop (arg1i))
10613 tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10614 arg1r ? arg1r
10615 : build1 (REALPART_EXPR, rtype, arg1));
10616 tree ip = arg0i ? arg0i
10617 : build1 (IMAGPART_EXPR, rtype, arg0);
10618 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10620 else if (arg0iz && arg1r && real_zerop (arg1r))
10622 tree rp = arg0r ? arg0r
10623 : build1 (REALPART_EXPR, rtype, arg0);
10624 tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10625 arg1i ? arg1i
10626 : build1 (IMAGPART_EXPR, rtype, arg1));
10627 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10632 /* Fold &x - &x. This can happen from &x.foo - &x.
10633 This is unsafe for certain floats even in non-IEEE formats.
10634 In IEEE, it is unsafe because it does wrong for NaNs.
10635 Also note that operand_equal_p is always false if an operand
10636 is volatile. */
10638 if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
10639 && operand_equal_p (arg0, arg1, 0))
10640 return build_zero_cst (type);
10642 /* A - B -> A + (-B) if B is easily negatable. */
10643 if (negate_expr_p (arg1)
10644 && ((FLOAT_TYPE_P (type)
10645 /* Avoid this transformation if B is a positive REAL_CST. */
10646 && (TREE_CODE (arg1) != REAL_CST
10647 || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10648 || INTEGRAL_TYPE_P (type)))
10649 return fold_build2_loc (loc, PLUS_EXPR, type,
10650 fold_convert_loc (loc, type, arg0),
10651 fold_convert_loc (loc, type,
10652 negate_expr (arg1)));
10654 /* Try folding difference of addresses. */
10656 HOST_WIDE_INT diff;
10658 if ((TREE_CODE (arg0) == ADDR_EXPR
10659 || TREE_CODE (arg1) == ADDR_EXPR)
10660 && ptr_difference_const (arg0, arg1, &diff))
10661 return build_int_cst_type (type, diff);
10664 /* Fold &a[i] - &a[j] to i-j. */
10665 if (TREE_CODE (arg0) == ADDR_EXPR
10666 && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10667 && TREE_CODE (arg1) == ADDR_EXPR
10668 && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10670 tree tem = fold_addr_of_array_ref_difference (loc, type,
10671 TREE_OPERAND (arg0, 0),
10672 TREE_OPERAND (arg1, 0));
10673 if (tem)
10674 return tem;
10677 if (FLOAT_TYPE_P (type)
10678 && flag_unsafe_math_optimizations
10679 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10680 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10681 && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10682 return tem;
10684 /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
10685 one. Make sure the type is not saturating and has the signedness of
10686 the stripped operands, as fold_plusminus_mult_expr will re-associate.
10687 ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
10688 if ((TREE_CODE (arg0) == MULT_EXPR
10689 || TREE_CODE (arg1) == MULT_EXPR)
10690 && !TYPE_SATURATING (type)
10691 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10692 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10693 && (!FLOAT_TYPE_P (type) || flag_associative_math))
10695 tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10696 if (tem)
10697 return tem;
10700 goto associate;
10702 case MULT_EXPR:
10703 /* (-A) * (-B) -> A * B */
10704 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10705 return fold_build2_loc (loc, MULT_EXPR, type,
10706 fold_convert_loc (loc, type,
10707 TREE_OPERAND (arg0, 0)),
10708 fold_convert_loc (loc, type,
10709 negate_expr (arg1)));
10710 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10711 return fold_build2_loc (loc, MULT_EXPR, type,
10712 fold_convert_loc (loc, type,
10713 negate_expr (arg0)),
10714 fold_convert_loc (loc, type,
10715 TREE_OPERAND (arg1, 0)));
10717 if (! FLOAT_TYPE_P (type))
10719 if (integer_zerop (arg1))
10720 return omit_one_operand_loc (loc, type, arg1, arg0);
10721 if (integer_onep (arg1))
10722 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10723 /* Transform x * -1 into -x. Make sure to do the negation
10724 on the original operand with conversions not stripped
10725 because we can only strip non-sign-changing conversions. */
10726 if (integer_all_onesp (arg1))
10727 return fold_convert_loc (loc, type, negate_expr (op0));
10728 /* Transform x * -C into -x * C if x is easily negatable. */
10729 if (TREE_CODE (arg1) == INTEGER_CST
10730 && tree_int_cst_sgn (arg1) == -1
10731 && negate_expr_p (arg0)
10732 && (tem = negate_expr (arg1)) != arg1
10733 && !TREE_OVERFLOW (tem))
10734 return fold_build2_loc (loc, MULT_EXPR, type,
10735 fold_convert_loc (loc, type,
10736 negate_expr (arg0)),
10737 tem);
10739 /* (a * (1 << b)) is (a << b) */
10740 if (TREE_CODE (arg1) == LSHIFT_EXPR
10741 && integer_onep (TREE_OPERAND (arg1, 0)))
10742 return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
10743 TREE_OPERAND (arg1, 1));
10744 if (TREE_CODE (arg0) == LSHIFT_EXPR
10745 && integer_onep (TREE_OPERAND (arg0, 0)))
10746 return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
10747 TREE_OPERAND (arg0, 1));
10749 /* (A + A) * C -> A * 2 * C */
10750 if (TREE_CODE (arg0) == PLUS_EXPR
10751 && TREE_CODE (arg1) == INTEGER_CST
10752 && operand_equal_p (TREE_OPERAND (arg0, 0),
10753 TREE_OPERAND (arg0, 1), 0))
10754 return fold_build2_loc (loc, MULT_EXPR, type,
10755 omit_one_operand_loc (loc, type,
10756 TREE_OPERAND (arg0, 0),
10757 TREE_OPERAND (arg0, 1)),
10758 fold_build2_loc (loc, MULT_EXPR, type,
10759 build_int_cst (type, 2) , arg1));
10761 strict_overflow_p = false;
10762 if (TREE_CODE (arg1) == INTEGER_CST
10763 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10764 &strict_overflow_p)))
10766 if (strict_overflow_p)
10767 fold_overflow_warning (("assuming signed overflow does not "
10768 "occur when simplifying "
10769 "multiplication"),
10770 WARN_STRICT_OVERFLOW_MISC);
10771 return fold_convert_loc (loc, type, tem);
10774 /* Optimize z * conj(z) for integer complex numbers. */
10775 if (TREE_CODE (arg0) == CONJ_EXPR
10776 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10777 return fold_mult_zconjz (loc, type, arg1);
10778 if (TREE_CODE (arg1) == CONJ_EXPR
10779 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10780 return fold_mult_zconjz (loc, type, arg0);
10782 else
10784 /* Maybe fold x * 0 to 0. The expressions aren't the same
10785 when x is NaN, since x * 0 is also NaN. Nor are they the
10786 same in modes with signed zeros, since multiplying a
10787 negative value by 0 gives -0, not +0. */
10788 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10789 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10790 && real_zerop (arg1))
10791 return omit_one_operand_loc (loc, type, arg1, arg0);
10792 /* In IEEE floating point, x*1 is not equivalent to x for snans.
10793 Likewise for complex arithmetic with signed zeros. */
10794 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10795 && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10796 || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10797 && real_onep (arg1))
10798 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
10800 /* Transform x * -1.0 into -x. */
10801 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
10802 && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10803 || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10804 && real_minus_onep (arg1))
10805 return fold_convert_loc (loc, type, negate_expr (arg0));
10807 /* Convert (C1/X)*C2 into (C1*C2)/X. This transformation may change
10808 the result for floating point types due to rounding so it is applied
10809 only if -fassociative-math was specify. */
10810 if (flag_associative_math
10811 && TREE_CODE (arg0) == RDIV_EXPR
10812 && TREE_CODE (arg1) == REAL_CST
10813 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10815 tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10816 arg1);
10817 if (tem)
10818 return fold_build2_loc (loc, RDIV_EXPR, type, tem,
10819 TREE_OPERAND (arg0, 1));
10822 /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y. */
10823 if (operand_equal_p (arg0, arg1, 0))
10825 tree tem = fold_strip_sign_ops (arg0);
10826 if (tem != NULL_TREE)
10828 tem = fold_convert_loc (loc, type, tem);
10829 return fold_build2_loc (loc, MULT_EXPR, type, tem, tem);
10833 /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10834 This is not the same for NaNs or if signed zeros are
10835 involved. */
10836 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
10837 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))
10838 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10839 && TREE_CODE (arg1) == COMPLEX_CST
10840 && real_zerop (TREE_REALPART (arg1)))
10842 tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10843 if (real_onep (TREE_IMAGPART (arg1)))
10844 return
10845 fold_build2_loc (loc, COMPLEX_EXPR, type,
10846 negate_expr (fold_build1_loc (loc, IMAGPART_EXPR,
10847 rtype, arg0)),
10848 fold_build1_loc (loc, REALPART_EXPR, rtype, arg0));
10849 else if (real_minus_onep (TREE_IMAGPART (arg1)))
10850 return
10851 fold_build2_loc (loc, COMPLEX_EXPR, type,
10852 fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0),
10853 negate_expr (fold_build1_loc (loc, REALPART_EXPR,
10854 rtype, arg0)));
10857 /* Optimize z * conj(z) for floating point complex numbers.
10858 Guarded by flag_unsafe_math_optimizations as non-finite
10859 imaginary components don't produce scalar results. */
10860 if (flag_unsafe_math_optimizations
10861 && TREE_CODE (arg0) == CONJ_EXPR
10862 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10863 return fold_mult_zconjz (loc, type, arg1);
10864 if (flag_unsafe_math_optimizations
10865 && TREE_CODE (arg1) == CONJ_EXPR
10866 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10867 return fold_mult_zconjz (loc, type, arg0);
10869 if (flag_unsafe_math_optimizations)
10871 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10872 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10874 /* Optimizations of root(...)*root(...). */
10875 if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10877 tree rootfn, arg;
10878 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10879 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10881 /* Optimize sqrt(x)*sqrt(x) as x. */
10882 if (BUILTIN_SQRT_P (fcode0)
10883 && operand_equal_p (arg00, arg10, 0)
10884 && ! HONOR_SNANS (TYPE_MODE (type)))
10885 return arg00;
10887 /* Optimize root(x)*root(y) as root(x*y). */
10888 rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10889 arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10);
10890 return build_call_expr_loc (loc, rootfn, 1, arg);
10893 /* Optimize expN(x)*expN(y) as expN(x+y). */
10894 if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10896 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10897 tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10898 CALL_EXPR_ARG (arg0, 0),
10899 CALL_EXPR_ARG (arg1, 0));
10900 return build_call_expr_loc (loc, expfn, 1, arg);
10903 /* Optimizations of pow(...)*pow(...). */
10904 if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10905 || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10906 || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10908 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10909 tree arg01 = CALL_EXPR_ARG (arg0, 1);
10910 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10911 tree arg11 = CALL_EXPR_ARG (arg1, 1);
10913 /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y). */
10914 if (operand_equal_p (arg01, arg11, 0))
10916 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10917 tree arg = fold_build2_loc (loc, MULT_EXPR, type,
10918 arg00, arg10);
10919 return build_call_expr_loc (loc, powfn, 2, arg, arg01);
10922 /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z). */
10923 if (operand_equal_p (arg00, arg10, 0))
10925 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10926 tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10927 arg01, arg11);
10928 return build_call_expr_loc (loc, powfn, 2, arg00, arg);
10932 /* Optimize tan(x)*cos(x) as sin(x). */
10933 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10934 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10935 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10936 || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10937 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10938 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10939 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10940 CALL_EXPR_ARG (arg1, 0), 0))
10942 tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10944 if (sinfn != NULL_TREE)
10945 return build_call_expr_loc (loc, sinfn, 1,
10946 CALL_EXPR_ARG (arg0, 0));
10949 /* Optimize x*pow(x,c) as pow(x,c+1). */
10950 if (fcode1 == BUILT_IN_POW
10951 || fcode1 == BUILT_IN_POWF
10952 || fcode1 == BUILT_IN_POWL)
10954 tree arg10 = CALL_EXPR_ARG (arg1, 0);
10955 tree arg11 = CALL_EXPR_ARG (arg1, 1);
10956 if (TREE_CODE (arg11) == REAL_CST
10957 && !TREE_OVERFLOW (arg11)
10958 && operand_equal_p (arg0, arg10, 0))
10960 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10961 REAL_VALUE_TYPE c;
10962 tree arg;
10964 c = TREE_REAL_CST (arg11);
10965 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10966 arg = build_real (type, c);
10967 return build_call_expr_loc (loc, powfn, 2, arg0, arg);
10971 /* Optimize pow(x,c)*x as pow(x,c+1). */
10972 if (fcode0 == BUILT_IN_POW
10973 || fcode0 == BUILT_IN_POWF
10974 || fcode0 == BUILT_IN_POWL)
10976 tree arg00 = CALL_EXPR_ARG (arg0, 0);
10977 tree arg01 = CALL_EXPR_ARG (arg0, 1);
10978 if (TREE_CODE (arg01) == REAL_CST
10979 && !TREE_OVERFLOW (arg01)
10980 && operand_equal_p (arg1, arg00, 0))
10982 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10983 REAL_VALUE_TYPE c;
10984 tree arg;
10986 c = TREE_REAL_CST (arg01);
10987 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10988 arg = build_real (type, c);
10989 return build_call_expr_loc (loc, powfn, 2, arg1, arg);
10993 /* Canonicalize x*x as pow(x,2.0), which is expanded as x*x. */
10994 if (!in_gimple_form
10995 && optimize
10996 && operand_equal_p (arg0, arg1, 0))
10998 tree powfn = mathfn_built_in (type, BUILT_IN_POW);
11000 if (powfn)
11002 tree arg = build_real (type, dconst2);
11003 return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11008 goto associate;
11010 case BIT_IOR_EXPR:
11011 bit_ior:
11012 if (integer_all_onesp (arg1))
11013 return omit_one_operand_loc (loc, type, arg1, arg0);
11014 if (integer_zerop (arg1))
11015 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11016 if (operand_equal_p (arg0, arg1, 0))
11017 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11019 /* ~X | X is -1. */
11020 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11021 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11023 t1 = build_zero_cst (type);
11024 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11025 return omit_one_operand_loc (loc, type, t1, arg1);
11028 /* X | ~X is -1. */
11029 if (TREE_CODE (arg1) == BIT_NOT_EXPR
11030 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11032 t1 = build_zero_cst (type);
11033 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11034 return omit_one_operand_loc (loc, type, t1, arg0);
11037 /* Canonicalize (X & C1) | C2. */
11038 if (TREE_CODE (arg0) == BIT_AND_EXPR
11039 && TREE_CODE (arg1) == INTEGER_CST
11040 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11042 double_int c1, c2, c3, msk;
11043 int width = TYPE_PRECISION (type), w;
11044 c1 = tree_to_double_int (TREE_OPERAND (arg0, 1));
11045 c2 = tree_to_double_int (arg1);
11047 /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2). */
11048 if (double_int_equal_p (double_int_and (c1, c2), c1))
11049 return omit_one_operand_loc (loc, type, arg1,
11050 TREE_OPERAND (arg0, 0));
11052 msk = double_int_mask (width);
11054 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
11055 if (double_int_zero_p (double_int_and_not (msk,
11056 double_int_ior (c1, c2))))
11057 return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11058 TREE_OPERAND (arg0, 0), arg1);
11060 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
11061 unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
11062 mode which allows further optimizations. */
11063 c1 = double_int_and (c1, msk);
11064 c2 = double_int_and (c2, msk);
11065 c3 = double_int_and_not (c1, c2);
11066 for (w = BITS_PER_UNIT;
11067 w <= width && w <= HOST_BITS_PER_WIDE_INT;
11068 w <<= 1)
11070 unsigned HOST_WIDE_INT mask
11071 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w);
11072 if (((c1.low | c2.low) & mask) == mask
11073 && (c1.low & ~mask) == 0 && c1.high == 0)
11075 c3 = uhwi_to_double_int (mask);
11076 break;
11079 if (!double_int_equal_p (c3, c1))
11080 return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11081 fold_build2_loc (loc, BIT_AND_EXPR, type,
11082 TREE_OPERAND (arg0, 0),
11083 double_int_to_tree (type,
11084 c3)),
11085 arg1);
11088 /* (X & Y) | Y is (X, Y). */
11089 if (TREE_CODE (arg0) == BIT_AND_EXPR
11090 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11091 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11092 /* (X & Y) | X is (Y, X). */
11093 if (TREE_CODE (arg0) == BIT_AND_EXPR
11094 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11095 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11096 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11097 /* X | (X & Y) is (Y, X). */
11098 if (TREE_CODE (arg1) == BIT_AND_EXPR
11099 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11100 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11101 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11102 /* X | (Y & X) is (Y, X). */
11103 if (TREE_CODE (arg1) == BIT_AND_EXPR
11104 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11105 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11106 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11108 /* (X & ~Y) | (~X & Y) is X ^ Y */
11109 if (TREE_CODE (arg0) == BIT_AND_EXPR
11110 && TREE_CODE (arg1) == BIT_AND_EXPR)
11112 tree a0, a1, l0, l1, n0, n1;
11114 a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11115 a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11117 l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11118 l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11120 n0 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l0);
11121 n1 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l1);
11123 if ((operand_equal_p (n0, a0, 0)
11124 && operand_equal_p (n1, a1, 0))
11125 || (operand_equal_p (n0, a1, 0)
11126 && operand_equal_p (n1, a0, 0)))
11127 return fold_build2_loc (loc, BIT_XOR_EXPR, type, l0, n1);
11130 t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11131 if (t1 != NULL_TREE)
11132 return t1;
11134 /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
11136 This results in more efficient code for machines without a NAND
11137 instruction. Combine will canonicalize to the first form
11138 which will allow use of NAND instructions provided by the
11139 backend if they exist. */
11140 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11141 && TREE_CODE (arg1) == BIT_NOT_EXPR)
11143 return
11144 fold_build1_loc (loc, BIT_NOT_EXPR, type,
11145 build2 (BIT_AND_EXPR, type,
11146 fold_convert_loc (loc, type,
11147 TREE_OPERAND (arg0, 0)),
11148 fold_convert_loc (loc, type,
11149 TREE_OPERAND (arg1, 0))));
11152 /* See if this can be simplified into a rotate first. If that
11153 is unsuccessful continue in the association code. */
11154 goto bit_rotate;
11156 case BIT_XOR_EXPR:
11157 if (integer_zerop (arg1))
11158 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11159 if (integer_all_onesp (arg1))
11160 return fold_build1_loc (loc, BIT_NOT_EXPR, type, op0);
11161 if (operand_equal_p (arg0, arg1, 0))
11162 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11164 /* ~X ^ X is -1. */
11165 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11166 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11168 t1 = build_zero_cst (type);
11169 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11170 return omit_one_operand_loc (loc, type, t1, arg1);
11173 /* X ^ ~X is -1. */
11174 if (TREE_CODE (arg1) == BIT_NOT_EXPR
11175 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11177 t1 = build_zero_cst (type);
11178 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11179 return omit_one_operand_loc (loc, type, t1, arg0);
11182 /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
11183 with a constant, and the two constants have no bits in common,
11184 we should treat this as a BIT_IOR_EXPR since this may produce more
11185 simplifications. */
11186 if (TREE_CODE (arg0) == BIT_AND_EXPR
11187 && TREE_CODE (arg1) == BIT_AND_EXPR
11188 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11189 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
11190 && integer_zerop (const_binop (BIT_AND_EXPR,
11191 TREE_OPERAND (arg0, 1),
11192 TREE_OPERAND (arg1, 1))))
11194 code = BIT_IOR_EXPR;
11195 goto bit_ior;
11198 /* (X | Y) ^ X -> Y & ~ X*/
11199 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11200 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11202 tree t2 = TREE_OPERAND (arg0, 1);
11203 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11204 arg1);
11205 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11206 fold_convert_loc (loc, type, t2),
11207 fold_convert_loc (loc, type, t1));
11208 return t1;
11211 /* (Y | X) ^ X -> Y & ~ X*/
11212 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11213 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11215 tree t2 = TREE_OPERAND (arg0, 0);
11216 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11217 arg1);
11218 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11219 fold_convert_loc (loc, type, t2),
11220 fold_convert_loc (loc, type, t1));
11221 return t1;
11224 /* X ^ (X | Y) -> Y & ~ X*/
11225 if (TREE_CODE (arg1) == BIT_IOR_EXPR
11226 && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11228 tree t2 = TREE_OPERAND (arg1, 1);
11229 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11230 arg0);
11231 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11232 fold_convert_loc (loc, type, t2),
11233 fold_convert_loc (loc, type, t1));
11234 return t1;
11237 /* X ^ (Y | X) -> Y & ~ X*/
11238 if (TREE_CODE (arg1) == BIT_IOR_EXPR
11239 && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11241 tree t2 = TREE_OPERAND (arg1, 0);
11242 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11243 arg0);
11244 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11245 fold_convert_loc (loc, type, t2),
11246 fold_convert_loc (loc, type, t1));
11247 return t1;
11250 /* Convert ~X ^ ~Y to X ^ Y. */
11251 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11252 && TREE_CODE (arg1) == BIT_NOT_EXPR)
11253 return fold_build2_loc (loc, code, type,
11254 fold_convert_loc (loc, type,
11255 TREE_OPERAND (arg0, 0)),
11256 fold_convert_loc (loc, type,
11257 TREE_OPERAND (arg1, 0)));
11259 /* Convert ~X ^ C to X ^ ~C. */
11260 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11261 && TREE_CODE (arg1) == INTEGER_CST)
11262 return fold_build2_loc (loc, code, type,
11263 fold_convert_loc (loc, type,
11264 TREE_OPERAND (arg0, 0)),
11265 fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1));
11267 /* Fold (X & 1) ^ 1 as (X & 1) == 0. */
11268 if (TREE_CODE (arg0) == BIT_AND_EXPR
11269 && integer_onep (TREE_OPERAND (arg0, 1))
11270 && integer_onep (arg1))
11271 return fold_build2_loc (loc, EQ_EXPR, type, arg0,
11272 build_int_cst (TREE_TYPE (arg0), 0));
11274 /* Fold (X & Y) ^ Y as ~X & Y. */
11275 if (TREE_CODE (arg0) == BIT_AND_EXPR
11276 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11278 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11279 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11280 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11281 fold_convert_loc (loc, type, arg1));
11283 /* Fold (X & Y) ^ X as ~Y & X. */
11284 if (TREE_CODE (arg0) == BIT_AND_EXPR
11285 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11286 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11288 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11289 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11290 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11291 fold_convert_loc (loc, type, arg1));
11293 /* Fold X ^ (X & Y) as X & ~Y. */
11294 if (TREE_CODE (arg1) == BIT_AND_EXPR
11295 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11297 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11298 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11299 fold_convert_loc (loc, type, arg0),
11300 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11302 /* Fold X ^ (Y & X) as ~Y & X. */
11303 if (TREE_CODE (arg1) == BIT_AND_EXPR
11304 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11305 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11307 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11308 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11309 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11310 fold_convert_loc (loc, type, arg0));
11313 /* See if this can be simplified into a rotate first. If that
11314 is unsuccessful continue in the association code. */
11315 goto bit_rotate;
11317 case BIT_AND_EXPR:
11318 if (integer_all_onesp (arg1))
11319 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11320 if (integer_zerop (arg1))
11321 return omit_one_operand_loc (loc, type, arg1, arg0);
11322 if (operand_equal_p (arg0, arg1, 0))
11323 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11325 /* ~X & X, (X == 0) & X, and !X & X are always zero. */
11326 if ((TREE_CODE (arg0) == BIT_NOT_EXPR
11327 || TREE_CODE (arg0) == TRUTH_NOT_EXPR
11328 || (TREE_CODE (arg0) == EQ_EXPR
11329 && integer_zerop (TREE_OPERAND (arg0, 1))))
11330 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11331 return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
11333 /* X & ~X , X & (X == 0), and X & !X are always zero. */
11334 if ((TREE_CODE (arg1) == BIT_NOT_EXPR
11335 || TREE_CODE (arg1) == TRUTH_NOT_EXPR
11336 || (TREE_CODE (arg1) == EQ_EXPR
11337 && integer_zerop (TREE_OPERAND (arg1, 1))))
11338 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11339 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11341 /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2). */
11342 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11343 && TREE_CODE (arg1) == INTEGER_CST
11344 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11346 tree tmp1 = fold_convert_loc (loc, type, arg1);
11347 tree tmp2 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11348 tree tmp3 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11349 tmp2 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp2, tmp1);
11350 tmp3 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp3, tmp1);
11351 return
11352 fold_convert_loc (loc, type,
11353 fold_build2_loc (loc, BIT_IOR_EXPR,
11354 type, tmp2, tmp3));
11357 /* (X | Y) & Y is (X, Y). */
11358 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11359 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11360 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0));
11361 /* (X | Y) & X is (Y, X). */
11362 if (TREE_CODE (arg0) == BIT_IOR_EXPR
11363 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11364 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11365 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1));
11366 /* X & (X | Y) is (Y, X). */
11367 if (TREE_CODE (arg1) == BIT_IOR_EXPR
11368 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
11369 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1)))
11370 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1));
11371 /* X & (Y | X) is (Y, X). */
11372 if (TREE_CODE (arg1) == BIT_IOR_EXPR
11373 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11374 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11375 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0));
11377 /* Fold (X ^ 1) & 1 as (X & 1) == 0. */
11378 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11379 && integer_onep (TREE_OPERAND (arg0, 1))
11380 && integer_onep (arg1))
11382 tem = TREE_OPERAND (arg0, 0);
11383 return fold_build2_loc (loc, EQ_EXPR, type,
11384 fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11385 build_int_cst (TREE_TYPE (tem), 1)),
11386 build_int_cst (TREE_TYPE (tem), 0));
11388 /* Fold ~X & 1 as (X & 1) == 0. */
11389 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11390 && integer_onep (arg1))
11392 tem = TREE_OPERAND (arg0, 0);
11393 return fold_build2_loc (loc, EQ_EXPR, type,
11394 fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem,
11395 build_int_cst (TREE_TYPE (tem), 1)),
11396 build_int_cst (TREE_TYPE (tem), 0));
11398 /* Fold !X & 1 as X == 0. */
11399 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11400 && integer_onep (arg1))
11402 tem = TREE_OPERAND (arg0, 0);
11403 return fold_build2_loc (loc, EQ_EXPR, type, tem,
11404 build_int_cst (TREE_TYPE (tem), 0));
11407 /* Fold (X ^ Y) & Y as ~X & Y. */
11408 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11409 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11411 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11412 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11413 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11414 fold_convert_loc (loc, type, arg1));
11416 /* Fold (X ^ Y) & X as ~Y & X. */
11417 if (TREE_CODE (arg0) == BIT_XOR_EXPR
11418 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11419 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11421 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11422 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11423 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11424 fold_convert_loc (loc, type, arg1));
11426 /* Fold X & (X ^ Y) as X & ~Y. */
11427 if (TREE_CODE (arg1) == BIT_XOR_EXPR
11428 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11430 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11431 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11432 fold_convert_loc (loc, type, arg0),
11433 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11435 /* Fold X & (Y ^ X) as ~Y & X. */
11436 if (TREE_CODE (arg1) == BIT_XOR_EXPR
11437 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11438 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11440 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11441 return fold_build2_loc (loc, BIT_AND_EXPR, type,
11442 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11443 fold_convert_loc (loc, type, arg0));
11446 /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
11447 ((A & N) + B) & M -> (A + B) & M
11448 Similarly if (N & M) == 0,
11449 ((A | N) + B) & M -> (A + B) & M
11450 and for - instead of + (or unary - instead of +)
11451 and/or ^ instead of |.
11452 If B is constant and (B & M) == 0, fold into A & M. */
11453 if (host_integerp (arg1, 1))
11455 unsigned HOST_WIDE_INT cst1 = tree_low_cst (arg1, 1);
11456 if (~cst1 && (cst1 & (cst1 + 1)) == 0
11457 && INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11458 && (TREE_CODE (arg0) == PLUS_EXPR
11459 || TREE_CODE (arg0) == MINUS_EXPR
11460 || TREE_CODE (arg0) == NEGATE_EXPR)
11461 && (TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
11462 || TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE))
11464 tree pmop[2];
11465 int which = 0;
11466 unsigned HOST_WIDE_INT cst0;
11468 /* Now we know that arg0 is (C + D) or (C - D) or
11469 -C and arg1 (M) is == (1LL << cst) - 1.
11470 Store C into PMOP[0] and D into PMOP[1]. */
11471 pmop[0] = TREE_OPERAND (arg0, 0);
11472 pmop[1] = NULL;
11473 if (TREE_CODE (arg0) != NEGATE_EXPR)
11475 pmop[1] = TREE_OPERAND (arg0, 1);
11476 which = 1;
11479 if (!host_integerp (TYPE_MAX_VALUE (TREE_TYPE (arg0)), 1)
11480 || (tree_low_cst (TYPE_MAX_VALUE (TREE_TYPE (arg0)), 1)
11481 & cst1) != cst1)
11482 which = -1;
11484 for (; which >= 0; which--)
11485 switch (TREE_CODE (pmop[which]))
11487 case BIT_AND_EXPR:
11488 case BIT_IOR_EXPR:
11489 case BIT_XOR_EXPR:
11490 if (TREE_CODE (TREE_OPERAND (pmop[which], 1))
11491 != INTEGER_CST)
11492 break;
11493 /* tree_low_cst not used, because we don't care about
11494 the upper bits. */
11495 cst0 = TREE_INT_CST_LOW (TREE_OPERAND (pmop[which], 1));
11496 cst0 &= cst1;
11497 if (TREE_CODE (pmop[which]) == BIT_AND_EXPR)
11499 if (cst0 != cst1)
11500 break;
11502 else if (cst0 != 0)
11503 break;
11504 /* If C or D is of the form (A & N) where
11505 (N & M) == M, or of the form (A | N) or
11506 (A ^ N) where (N & M) == 0, replace it with A. */
11507 pmop[which] = TREE_OPERAND (pmop[which], 0);
11508 break;
11509 case INTEGER_CST:
11510 /* If C or D is a N where (N & M) == 0, it can be
11511 omitted (assumed 0). */
11512 if ((TREE_CODE (arg0) == PLUS_EXPR
11513 || (TREE_CODE (arg0) == MINUS_EXPR && which == 0))
11514 && (TREE_INT_CST_LOW (pmop[which]) & cst1) == 0)
11515 pmop[which] = NULL;
11516 break;
11517 default:
11518 break;
11521 /* Only build anything new if we optimized one or both arguments
11522 above. */
11523 if (pmop[0] != TREE_OPERAND (arg0, 0)
11524 || (TREE_CODE (arg0) != NEGATE_EXPR
11525 && pmop[1] != TREE_OPERAND (arg0, 1)))
11527 tree utype = TREE_TYPE (arg0);
11528 if (! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
11530 /* Perform the operations in a type that has defined
11531 overflow behavior. */
11532 utype = unsigned_type_for (TREE_TYPE (arg0));
11533 if (pmop[0] != NULL)
11534 pmop[0] = fold_convert_loc (loc, utype, pmop[0]);
11535 if (pmop[1] != NULL)
11536 pmop[1] = fold_convert_loc (loc, utype, pmop[1]);
11539 if (TREE_CODE (arg0) == NEGATE_EXPR)
11540 tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[0]);
11541 else if (TREE_CODE (arg0) == PLUS_EXPR)
11543 if (pmop[0] != NULL && pmop[1] != NULL)
11544 tem = fold_build2_loc (loc, PLUS_EXPR, utype,
11545 pmop[0], pmop[1]);
11546 else if (pmop[0] != NULL)
11547 tem = pmop[0];
11548 else if (pmop[1] != NULL)
11549 tem = pmop[1];
11550 else
11551 return build_int_cst (type, 0);
11553 else if (pmop[0] == NULL)
11554 tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[1]);
11555 else
11556 tem = fold_build2_loc (loc, MINUS_EXPR, utype,
11557 pmop[0], pmop[1]);
11558 /* TEM is now the new binary +, - or unary - replacement. */
11559 tem = fold_build2_loc (loc, BIT_AND_EXPR, utype, tem,
11560 fold_convert_loc (loc, utype, arg1));
11561 return fold_convert_loc (loc, type, tem);
11566 t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11567 if (t1 != NULL_TREE)
11568 return t1;
11569 /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */
11570 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11571 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11573 unsigned int prec
11574 = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11576 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT
11577 && (~TREE_INT_CST_LOW (arg1)
11578 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0)
11579 return
11580 fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11583 /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11585 This results in more efficient code for machines without a NOR
11586 instruction. Combine will canonicalize to the first form
11587 which will allow use of NOR instructions provided by the
11588 backend if they exist. */
11589 if (TREE_CODE (arg0) == BIT_NOT_EXPR
11590 && TREE_CODE (arg1) == BIT_NOT_EXPR)
11592 return fold_build1_loc (loc, BIT_NOT_EXPR, type,
11593 build2 (BIT_IOR_EXPR, type,
11594 fold_convert_loc (loc, type,
11595 TREE_OPERAND (arg0, 0)),
11596 fold_convert_loc (loc, type,
11597 TREE_OPERAND (arg1, 0))));
11600 /* If arg0 is derived from the address of an object or function, we may
11601 be able to fold this expression using the object or function's
11602 alignment. */
11603 if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1))
11605 unsigned HOST_WIDE_INT modulus, residue;
11606 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1);
11608 modulus = get_pointer_modulus_and_residue (arg0, &residue,
11609 integer_onep (arg1));
11611 /* This works because modulus is a power of 2. If this weren't the
11612 case, we'd have to replace it by its greatest power-of-2
11613 divisor: modulus & -modulus. */
11614 if (low < modulus)
11615 return build_int_cst (type, residue & low);
11618 /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11619 (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11620 if the new mask might be further optimized. */
11621 if ((TREE_CODE (arg0) == LSHIFT_EXPR
11622 || TREE_CODE (arg0) == RSHIFT_EXPR)
11623 && host_integerp (TREE_OPERAND (arg0, 1), 1)
11624 && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)))
11625 && tree_low_cst (TREE_OPERAND (arg0, 1), 1)
11626 < TYPE_PRECISION (TREE_TYPE (arg0))
11627 && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11628 && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0)
11630 unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1);
11631 unsigned HOST_WIDE_INT mask
11632 = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1)));
11633 unsigned HOST_WIDE_INT newmask, zerobits = 0;
11634 tree shift_type = TREE_TYPE (arg0);
11636 if (TREE_CODE (arg0) == LSHIFT_EXPR)
11637 zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11638 else if (TREE_CODE (arg0) == RSHIFT_EXPR
11639 && TYPE_PRECISION (TREE_TYPE (arg0))
11640 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0))))
11642 unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0));
11643 tree arg00 = TREE_OPERAND (arg0, 0);
11644 /* See if more bits can be proven as zero because of
11645 zero extension. */
11646 if (TREE_CODE (arg00) == NOP_EXPR
11647 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11649 tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11650 if (TYPE_PRECISION (inner_type)
11651 == GET_MODE_BITSIZE (TYPE_MODE (inner_type))
11652 && TYPE_PRECISION (inner_type) < prec)
11654 prec = TYPE_PRECISION (inner_type);
11655 /* See if we can shorten the right shift. */
11656 if (shiftc < prec)
11657 shift_type = inner_type;
11660 zerobits = ~(unsigned HOST_WIDE_INT) 0;
11661 zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11662 zerobits <<= prec - shiftc;
11663 /* For arithmetic shift if sign bit could be set, zerobits
11664 can contain actually sign bits, so no transformation is
11665 possible, unless MASK masks them all away. In that
11666 case the shift needs to be converted into logical shift. */
11667 if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11668 && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11670 if ((mask & zerobits) == 0)
11671 shift_type = unsigned_type_for (TREE_TYPE (arg0));
11672 else
11673 zerobits = 0;
11677 /* ((X << 16) & 0xff00) is (X, 0). */
11678 if ((mask & zerobits) == mask)
11679 return omit_one_operand_loc (loc, type,
11680 build_int_cst (type, 0), arg0);
11682 newmask = mask | zerobits;
11683 if (newmask != mask && (newmask & (newmask + 1)) == 0)
11685 unsigned int prec;
11687 /* Only do the transformation if NEWMASK is some integer
11688 mode's mask. */
11689 for (prec = BITS_PER_UNIT;
11690 prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11691 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11692 break;
11693 if (prec < HOST_BITS_PER_WIDE_INT
11694 || newmask == ~(unsigned HOST_WIDE_INT) 0)
11696 tree newmaskt;
11698 if (shift_type != TREE_TYPE (arg0))
11700 tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type,
11701 fold_convert_loc (loc, shift_type,
11702 TREE_OPERAND (arg0, 0)),
11703 TREE_OPERAND (arg0, 1));
11704 tem = fold_convert_loc (loc, type, tem);
11706 else
11707 tem = op0;
11708 newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask);
11709 if (!tree_int_cst_equal (newmaskt, arg1))
11710 return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt);
11715 goto associate;
11717 case RDIV_EXPR:
11718 /* Don't touch a floating-point divide by zero unless the mode
11719 of the constant can represent infinity. */
11720 if (TREE_CODE (arg1) == REAL_CST
11721 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11722 && real_zerop (arg1))
11723 return NULL_TREE;
11725 /* Optimize A / A to 1.0 if we don't care about
11726 NaNs or Infinities. Skip the transformation
11727 for non-real operands. */
11728 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0))
11729 && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
11730 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0)))
11731 && operand_equal_p (arg0, arg1, 0))
11733 tree r = build_real (TREE_TYPE (arg0), dconst1);
11735 return omit_two_operands_loc (loc, type, r, arg0, arg1);
11738 /* The complex version of the above A / A optimization. */
11739 if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
11740 && operand_equal_p (arg0, arg1, 0))
11742 tree elem_type = TREE_TYPE (TREE_TYPE (arg0));
11743 if (! HONOR_NANS (TYPE_MODE (elem_type))
11744 && ! HONOR_INFINITIES (TYPE_MODE (elem_type)))
11746 tree r = build_real (elem_type, dconst1);
11747 /* omit_two_operands will call fold_convert for us. */
11748 return omit_two_operands_loc (loc, type, r, arg0, arg1);
11752 /* (-A) / (-B) -> A / B */
11753 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11754 return fold_build2_loc (loc, RDIV_EXPR, type,
11755 TREE_OPERAND (arg0, 0),
11756 negate_expr (arg1));
11757 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11758 return fold_build2_loc (loc, RDIV_EXPR, type,
11759 negate_expr (arg0),
11760 TREE_OPERAND (arg1, 0));
11762 /* In IEEE floating point, x/1 is not equivalent to x for snans. */
11763 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11764 && real_onep (arg1))
11765 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
11767 /* In IEEE floating point, x/-1 is not equivalent to -x for snans. */
11768 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
11769 && real_minus_onep (arg1))
11770 return non_lvalue_loc (loc, fold_convert_loc (loc, type,
11771 negate_expr (arg0)));
11773 /* If ARG1 is a constant, we can convert this to a multiply by the
11774 reciprocal. This does not have the same rounding properties,
11775 so only do this if -freciprocal-math. We can actually
11776 always safely do it if ARG1 is a power of two, but it's hard to
11777 tell if it is or not in a portable manner. */
11778 if (TREE_CODE (arg1) == REAL_CST)
11780 if (flag_reciprocal_math
11781 && 0 != (tem = const_binop (code, build_real (type, dconst1),
11782 arg1)))
11783 return fold_build2_loc (loc, MULT_EXPR, type, arg0, tem);
11784 /* Find the reciprocal if optimizing and the result is exact. */
11785 if (optimize)
11787 REAL_VALUE_TYPE r;
11788 r = TREE_REAL_CST (arg1);
11789 if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
11791 tem = build_real (type, r);
11792 return fold_build2_loc (loc, MULT_EXPR, type,
11793 fold_convert_loc (loc, type, arg0), tem);
11797 /* Convert A/B/C to A/(B*C). */
11798 if (flag_reciprocal_math
11799 && TREE_CODE (arg0) == RDIV_EXPR)
11800 return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11801 fold_build2_loc (loc, MULT_EXPR, type,
11802 TREE_OPERAND (arg0, 1), arg1));
11804 /* Convert A/(B/C) to (A/B)*C. */
11805 if (flag_reciprocal_math
11806 && TREE_CODE (arg1) == RDIV_EXPR)
11807 return fold_build2_loc (loc, MULT_EXPR, type,
11808 fold_build2_loc (loc, RDIV_EXPR, type, arg0,
11809 TREE_OPERAND (arg1, 0)),
11810 TREE_OPERAND (arg1, 1));
11812 /* Convert C1/(X*C2) into (C1/C2)/X. */
11813 if (flag_reciprocal_math
11814 && TREE_CODE (arg1) == MULT_EXPR
11815 && TREE_CODE (arg0) == REAL_CST
11816 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11818 tree tem = const_binop (RDIV_EXPR, arg0,
11819 TREE_OPERAND (arg1, 1));
11820 if (tem)
11821 return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11822 TREE_OPERAND (arg1, 0));
11825 if (flag_unsafe_math_optimizations)
11827 enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11828 enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11830 /* Optimize sin(x)/cos(x) as tan(x). */
11831 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11832 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11833 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11834 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11835 CALL_EXPR_ARG (arg1, 0), 0))
11837 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11839 if (tanfn != NULL_TREE)
11840 return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11843 /* Optimize cos(x)/sin(x) as 1.0/tan(x). */
11844 if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11845 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11846 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11847 && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11848 CALL_EXPR_ARG (arg1, 0), 0))
11850 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11852 if (tanfn != NULL_TREE)
11854 tree tmp = build_call_expr_loc (loc, tanfn, 1,
11855 CALL_EXPR_ARG (arg0, 0));
11856 return fold_build2_loc (loc, RDIV_EXPR, type,
11857 build_real (type, dconst1), tmp);
11861 /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11862 NaNs or Infinities. */
11863 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11864 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11865 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11867 tree arg00 = CALL_EXPR_ARG (arg0, 0);
11868 tree arg01 = CALL_EXPR_ARG (arg1, 0);
11870 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11871 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11872 && operand_equal_p (arg00, arg01, 0))
11874 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11876 if (cosfn != NULL_TREE)
11877 return build_call_expr_loc (loc, cosfn, 1, arg00);
11881 /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11882 NaNs or Infinities. */
11883 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11884 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11885 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11887 tree arg00 = CALL_EXPR_ARG (arg0, 0);
11888 tree arg01 = CALL_EXPR_ARG (arg1, 0);
11890 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00)))
11891 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00)))
11892 && operand_equal_p (arg00, arg01, 0))
11894 tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11896 if (cosfn != NULL_TREE)
11898 tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00);
11899 return fold_build2_loc (loc, RDIV_EXPR, type,
11900 build_real (type, dconst1),
11901 tmp);
11906 /* Optimize pow(x,c)/x as pow(x,c-1). */
11907 if (fcode0 == BUILT_IN_POW
11908 || fcode0 == BUILT_IN_POWF
11909 || fcode0 == BUILT_IN_POWL)
11911 tree arg00 = CALL_EXPR_ARG (arg0, 0);
11912 tree arg01 = CALL_EXPR_ARG (arg0, 1);
11913 if (TREE_CODE (arg01) == REAL_CST
11914 && !TREE_OVERFLOW (arg01)
11915 && operand_equal_p (arg1, arg00, 0))
11917 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11918 REAL_VALUE_TYPE c;
11919 tree arg;
11921 c = TREE_REAL_CST (arg01);
11922 real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11923 arg = build_real (type, c);
11924 return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11928 /* Optimize a/root(b/c) into a*root(c/b). */
11929 if (BUILTIN_ROOT_P (fcode1))
11931 tree rootarg = CALL_EXPR_ARG (arg1, 0);
11933 if (TREE_CODE (rootarg) == RDIV_EXPR)
11935 tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11936 tree b = TREE_OPERAND (rootarg, 0);
11937 tree c = TREE_OPERAND (rootarg, 1);
11939 tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b);
11941 tmp = build_call_expr_loc (loc, rootfn, 1, tmp);
11942 return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp);
11946 /* Optimize x/expN(y) into x*expN(-y). */
11947 if (BUILTIN_EXPONENT_P (fcode1))
11949 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11950 tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11951 arg1 = build_call_expr_loc (loc,
11952 expfn, 1,
11953 fold_convert_loc (loc, type, arg));
11954 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11957 /* Optimize x/pow(y,z) into x*pow(y,-z). */
11958 if (fcode1 == BUILT_IN_POW
11959 || fcode1 == BUILT_IN_POWF
11960 || fcode1 == BUILT_IN_POWL)
11962 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11963 tree arg10 = CALL_EXPR_ARG (arg1, 0);
11964 tree arg11 = CALL_EXPR_ARG (arg1, 1);
11965 tree neg11 = fold_convert_loc (loc, type,
11966 negate_expr (arg11));
11967 arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11);
11968 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11971 return NULL_TREE;
11973 case TRUNC_DIV_EXPR:
11974 /* Optimize (X & (-A)) / A where A is a power of 2,
11975 to X >> log2(A) */
11976 if (TREE_CODE (arg0) == BIT_AND_EXPR
11977 && !TYPE_UNSIGNED (type) && TREE_CODE (arg1) == INTEGER_CST
11978 && integer_pow2p (arg1) && tree_int_cst_sgn (arg1) > 0)
11980 tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (arg1),
11981 arg1, TREE_OPERAND (arg0, 1));
11982 if (sum && integer_zerop (sum)) {
11983 unsigned long pow2;
11985 if (TREE_INT_CST_LOW (arg1))
11986 pow2 = exact_log2 (TREE_INT_CST_LOW (arg1));
11987 else
11988 pow2 = exact_log2 (TREE_INT_CST_HIGH (arg1))
11989 + HOST_BITS_PER_WIDE_INT;
11991 return fold_build2_loc (loc, RSHIFT_EXPR, type,
11992 TREE_OPERAND (arg0, 0),
11993 build_int_cst (integer_type_node, pow2));
11997 /* Fall thru */
11999 case FLOOR_DIV_EXPR:
12000 /* Simplify A / (B << N) where A and B are positive and B is
12001 a power of 2, to A >> (N + log2(B)). */
12002 strict_overflow_p = false;
12003 if (TREE_CODE (arg1) == LSHIFT_EXPR
12004 && (TYPE_UNSIGNED (type)
12005 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12007 tree sval = TREE_OPERAND (arg1, 0);
12008 if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
12010 tree sh_cnt = TREE_OPERAND (arg1, 1);
12011 unsigned long pow2;
12013 if (TREE_INT_CST_LOW (sval))
12014 pow2 = exact_log2 (TREE_INT_CST_LOW (sval));
12015 else
12016 pow2 = exact_log2 (TREE_INT_CST_HIGH (sval))
12017 + HOST_BITS_PER_WIDE_INT;
12019 if (strict_overflow_p)
12020 fold_overflow_warning (("assuming signed overflow does not "
12021 "occur when simplifying A / (B << N)"),
12022 WARN_STRICT_OVERFLOW_MISC);
12024 sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
12025 sh_cnt,
12026 build_int_cst (TREE_TYPE (sh_cnt),
12027 pow2));
12028 return fold_build2_loc (loc, RSHIFT_EXPR, type,
12029 fold_convert_loc (loc, type, arg0), sh_cnt);
12033 /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
12034 TRUNC_DIV_EXPR. Rewrite into the latter in this case. */
12035 if (INTEGRAL_TYPE_P (type)
12036 && TYPE_UNSIGNED (type)
12037 && code == FLOOR_DIV_EXPR)
12038 return fold_build2_loc (loc, TRUNC_DIV_EXPR, type, op0, op1);
12040 /* Fall thru */
12042 case ROUND_DIV_EXPR:
12043 case CEIL_DIV_EXPR:
12044 case EXACT_DIV_EXPR:
12045 if (integer_onep (arg1))
12046 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12047 if (integer_zerop (arg1))
12048 return NULL_TREE;
12049 /* X / -1 is -X. */
12050 if (!TYPE_UNSIGNED (type)
12051 && TREE_CODE (arg1) == INTEGER_CST
12052 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12053 && TREE_INT_CST_HIGH (arg1) == -1)
12054 return fold_convert_loc (loc, type, negate_expr (arg0));
12056 /* Convert -A / -B to A / B when the type is signed and overflow is
12057 undefined. */
12058 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12059 && TREE_CODE (arg0) == NEGATE_EXPR
12060 && negate_expr_p (arg1))
12062 if (INTEGRAL_TYPE_P (type))
12063 fold_overflow_warning (("assuming signed overflow does not occur "
12064 "when distributing negation across "
12065 "division"),
12066 WARN_STRICT_OVERFLOW_MISC);
12067 return fold_build2_loc (loc, code, type,
12068 fold_convert_loc (loc, type,
12069 TREE_OPERAND (arg0, 0)),
12070 fold_convert_loc (loc, type,
12071 negate_expr (arg1)));
12073 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
12074 && TREE_CODE (arg1) == NEGATE_EXPR
12075 && negate_expr_p (arg0))
12077 if (INTEGRAL_TYPE_P (type))
12078 fold_overflow_warning (("assuming signed overflow does not occur "
12079 "when distributing negation across "
12080 "division"),
12081 WARN_STRICT_OVERFLOW_MISC);
12082 return fold_build2_loc (loc, code, type,
12083 fold_convert_loc (loc, type,
12084 negate_expr (arg0)),
12085 fold_convert_loc (loc, type,
12086 TREE_OPERAND (arg1, 0)));
12089 /* If arg0 is a multiple of arg1, then rewrite to the fastest div
12090 operation, EXACT_DIV_EXPR.
12092 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
12093 At one time others generated faster code, it's not clear if they do
12094 after the last round to changes to the DIV code in expmed.c. */
12095 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
12096 && multiple_of_p (type, arg0, arg1))
12097 return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
12099 strict_overflow_p = false;
12100 if (TREE_CODE (arg1) == INTEGER_CST
12101 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12102 &strict_overflow_p)))
12104 if (strict_overflow_p)
12105 fold_overflow_warning (("assuming signed overflow does not occur "
12106 "when simplifying division"),
12107 WARN_STRICT_OVERFLOW_MISC);
12108 return fold_convert_loc (loc, type, tem);
12111 return NULL_TREE;
12113 case CEIL_MOD_EXPR:
12114 case FLOOR_MOD_EXPR:
12115 case ROUND_MOD_EXPR:
12116 case TRUNC_MOD_EXPR:
12117 /* X % 1 is always zero, but be sure to preserve any side
12118 effects in X. */
12119 if (integer_onep (arg1))
12120 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12122 /* X % 0, return X % 0 unchanged so that we can get the
12123 proper warnings and errors. */
12124 if (integer_zerop (arg1))
12125 return NULL_TREE;
12127 /* 0 % X is always zero, but be sure to preserve any side
12128 effects in X. Place this after checking for X == 0. */
12129 if (integer_zerop (arg0))
12130 return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12132 /* X % -1 is zero. */
12133 if (!TYPE_UNSIGNED (type)
12134 && TREE_CODE (arg1) == INTEGER_CST
12135 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1
12136 && TREE_INT_CST_HIGH (arg1) == -1)
12137 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12139 /* X % -C is the same as X % C. */
12140 if (code == TRUNC_MOD_EXPR
12141 && !TYPE_UNSIGNED (type)
12142 && TREE_CODE (arg1) == INTEGER_CST
12143 && !TREE_OVERFLOW (arg1)
12144 && TREE_INT_CST_HIGH (arg1) < 0
12145 && !TYPE_OVERFLOW_TRAPS (type)
12146 /* Avoid this transformation if C is INT_MIN, i.e. C == -C. */
12147 && !sign_bit_p (arg1, arg1))
12148 return fold_build2_loc (loc, code, type,
12149 fold_convert_loc (loc, type, arg0),
12150 fold_convert_loc (loc, type,
12151 negate_expr (arg1)));
12153 /* X % -Y is the same as X % Y. */
12154 if (code == TRUNC_MOD_EXPR
12155 && !TYPE_UNSIGNED (type)
12156 && TREE_CODE (arg1) == NEGATE_EXPR
12157 && !TYPE_OVERFLOW_TRAPS (type))
12158 return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0),
12159 fold_convert_loc (loc, type,
12160 TREE_OPERAND (arg1, 0)));
12162 strict_overflow_p = false;
12163 if (TREE_CODE (arg1) == INTEGER_CST
12164 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12165 &strict_overflow_p)))
12167 if (strict_overflow_p)
12168 fold_overflow_warning (("assuming signed overflow does not occur "
12169 "when simplifying modulus"),
12170 WARN_STRICT_OVERFLOW_MISC);
12171 return fold_convert_loc (loc, type, tem);
12174 /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
12175 i.e. "X % C" into "X & (C - 1)", if X and C are positive. */
12176 if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
12177 && (TYPE_UNSIGNED (type)
12178 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12180 tree c = arg1;
12181 /* Also optimize A % (C << N) where C is a power of 2,
12182 to A & ((C << N) - 1). */
12183 if (TREE_CODE (arg1) == LSHIFT_EXPR)
12184 c = TREE_OPERAND (arg1, 0);
12186 if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
12188 tree mask
12189 = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1,
12190 build_int_cst (TREE_TYPE (arg1), 1));
12191 if (strict_overflow_p)
12192 fold_overflow_warning (("assuming signed overflow does not "
12193 "occur when simplifying "
12194 "X % (power of two)"),
12195 WARN_STRICT_OVERFLOW_MISC);
12196 return fold_build2_loc (loc, BIT_AND_EXPR, type,
12197 fold_convert_loc (loc, type, arg0),
12198 fold_convert_loc (loc, type, mask));
12202 return NULL_TREE;
12204 case LROTATE_EXPR:
12205 case RROTATE_EXPR:
12206 if (integer_all_onesp (arg0))
12207 return omit_one_operand_loc (loc, type, arg0, arg1);
12208 goto shift;
12210 case RSHIFT_EXPR:
12211 /* Optimize -1 >> x for arithmetic right shifts. */
12212 if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type)
12213 && tree_expr_nonnegative_p (arg1))
12214 return omit_one_operand_loc (loc, type, arg0, arg1);
12215 /* ... fall through ... */
12217 case LSHIFT_EXPR:
12218 shift:
12219 if (integer_zerop (arg1))
12220 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12221 if (integer_zerop (arg0))
12222 return omit_one_operand_loc (loc, type, arg0, arg1);
12224 /* Since negative shift count is not well-defined,
12225 don't try to compute it in the compiler. */
12226 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
12227 return NULL_TREE;
12229 /* Turn (a OP c1) OP c2 into a OP (c1+c2). */
12230 if (TREE_CODE (op0) == code && host_integerp (arg1, false)
12231 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12232 && host_integerp (TREE_OPERAND (arg0, 1), false)
12233 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12235 HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
12236 + TREE_INT_CST_LOW (arg1));
12238 /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
12239 being well defined. */
12240 if (low >= TYPE_PRECISION (type))
12242 if (code == LROTATE_EXPR || code == RROTATE_EXPR)
12243 low = low % TYPE_PRECISION (type);
12244 else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
12245 return omit_one_operand_loc (loc, type, build_int_cst (type, 0),
12246 TREE_OPERAND (arg0, 0));
12247 else
12248 low = TYPE_PRECISION (type) - 1;
12251 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12252 build_int_cst (type, low));
12255 /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
12256 into x & ((unsigned)-1 >> c) for unsigned types. */
12257 if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
12258 || (TYPE_UNSIGNED (type)
12259 && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
12260 && host_integerp (arg1, false)
12261 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
12262 && host_integerp (TREE_OPERAND (arg0, 1), false)
12263 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
12265 HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
12266 HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
12267 tree lshift;
12268 tree arg00;
12270 if (low0 == low1)
12272 arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12274 lshift = build_int_cst (type, -1);
12275 lshift = int_const_binop (code, lshift, arg1);
12277 return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift);
12281 /* Rewrite an LROTATE_EXPR by a constant into an
12282 RROTATE_EXPR by a new constant. */
12283 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
12285 tree tem = build_int_cst (TREE_TYPE (arg1),
12286 TYPE_PRECISION (type));
12287 tem = const_binop (MINUS_EXPR, tem, arg1);
12288 return fold_build2_loc (loc, RROTATE_EXPR, type, op0, tem);
12291 /* If we have a rotate of a bit operation with the rotate count and
12292 the second operand of the bit operation both constant,
12293 permute the two operations. */
12294 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12295 && (TREE_CODE (arg0) == BIT_AND_EXPR
12296 || TREE_CODE (arg0) == BIT_IOR_EXPR
12297 || TREE_CODE (arg0) == BIT_XOR_EXPR)
12298 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12299 return fold_build2_loc (loc, TREE_CODE (arg0), type,
12300 fold_build2_loc (loc, code, type,
12301 TREE_OPERAND (arg0, 0), arg1),
12302 fold_build2_loc (loc, code, type,
12303 TREE_OPERAND (arg0, 1), arg1));
12305 /* Two consecutive rotates adding up to the precision of the
12306 type can be ignored. */
12307 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12308 && TREE_CODE (arg0) == RROTATE_EXPR
12309 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12310 && TREE_INT_CST_HIGH (arg1) == 0
12311 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0
12312 && ((TREE_INT_CST_LOW (arg1)
12313 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)))
12314 == (unsigned int) TYPE_PRECISION (type)))
12315 return TREE_OPERAND (arg0, 0);
12317 /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
12318 (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
12319 if the latter can be further optimized. */
12320 if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
12321 && TREE_CODE (arg0) == BIT_AND_EXPR
12322 && TREE_CODE (arg1) == INTEGER_CST
12323 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12325 tree mask = fold_build2_loc (loc, code, type,
12326 fold_convert_loc (loc, type,
12327 TREE_OPERAND (arg0, 1)),
12328 arg1);
12329 tree shift = fold_build2_loc (loc, code, type,
12330 fold_convert_loc (loc, type,
12331 TREE_OPERAND (arg0, 0)),
12332 arg1);
12333 tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
12334 if (tem)
12335 return tem;
12338 return NULL_TREE;
12340 case MIN_EXPR:
12341 if (operand_equal_p (arg0, arg1, 0))
12342 return omit_one_operand_loc (loc, type, arg0, arg1);
12343 if (INTEGRAL_TYPE_P (type)
12344 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
12345 return omit_one_operand_loc (loc, type, arg1, arg0);
12346 tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
12347 if (tem)
12348 return tem;
12349 goto associate;
12351 case MAX_EXPR:
12352 if (operand_equal_p (arg0, arg1, 0))
12353 return omit_one_operand_loc (loc, type, arg0, arg1);
12354 if (INTEGRAL_TYPE_P (type)
12355 && TYPE_MAX_VALUE (type)
12356 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
12357 return omit_one_operand_loc (loc, type, arg1, arg0);
12358 tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
12359 if (tem)
12360 return tem;
12361 goto associate;
12363 case TRUTH_ANDIF_EXPR:
12364 /* Note that the operands of this must be ints
12365 and their values must be 0 or 1.
12366 ("true" is a fixed value perhaps depending on the language.) */
12367 /* If first arg is constant zero, return it. */
12368 if (integer_zerop (arg0))
12369 return fold_convert_loc (loc, type, arg0);
12370 case TRUTH_AND_EXPR:
12371 /* If either arg is constant true, drop it. */
12372 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12373 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12374 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
12375 /* Preserve sequence points. */
12376 && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12377 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12378 /* If second arg is constant zero, result is zero, but first arg
12379 must be evaluated. */
12380 if (integer_zerop (arg1))
12381 return omit_one_operand_loc (loc, type, arg1, arg0);
12382 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
12383 case will be handled here. */
12384 if (integer_zerop (arg0))
12385 return omit_one_operand_loc (loc, type, arg0, arg1);
12387 /* !X && X is always false. */
12388 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12389 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12390 return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12391 /* X && !X is always false. */
12392 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12393 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12394 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12396 /* A < X && A + 1 > Y ==> A < X && A >= Y. Normally A + 1 > Y
12397 means A >= Y && A != MAX, but in this case we know that
12398 A < X <= MAX. */
12400 if (!TREE_SIDE_EFFECTS (arg0)
12401 && !TREE_SIDE_EFFECTS (arg1))
12403 tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1);
12404 if (tem && !operand_equal_p (tem, arg0, 0))
12405 return fold_build2_loc (loc, code, type, tem, arg1);
12407 tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0);
12408 if (tem && !operand_equal_p (tem, arg1, 0))
12409 return fold_build2_loc (loc, code, type, arg0, tem);
12412 if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1))
12413 != NULL_TREE)
12414 return tem;
12416 return NULL_TREE;
12418 case TRUTH_ORIF_EXPR:
12419 /* Note that the operands of this must be ints
12420 and their values must be 0 or true.
12421 ("true" is a fixed value perhaps depending on the language.) */
12422 /* If first arg is constant true, return it. */
12423 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12424 return fold_convert_loc (loc, type, arg0);
12425 case TRUTH_OR_EXPR:
12426 /* If either arg is constant zero, drop it. */
12427 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12428 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12429 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12430 /* Preserve sequence points. */
12431 && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12432 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12433 /* If second arg is constant true, result is true, but we must
12434 evaluate first arg. */
12435 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12436 return omit_one_operand_loc (loc, type, arg1, arg0);
12437 /* Likewise for first arg, but note this only occurs here for
12438 TRUTH_OR_EXPR. */
12439 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12440 return omit_one_operand_loc (loc, type, arg0, arg1);
12442 /* !X || X is always true. */
12443 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12444 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12445 return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12446 /* X || !X is always true. */
12447 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12448 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12449 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12451 /* (X && !Y) || (!X && Y) is X ^ Y */
12452 if (TREE_CODE (arg0) == TRUTH_AND_EXPR
12453 && TREE_CODE (arg1) == TRUTH_AND_EXPR)
12455 tree a0, a1, l0, l1, n0, n1;
12457 a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
12458 a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
12460 l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12461 l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
12463 n0 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l0);
12464 n1 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l1);
12466 if ((operand_equal_p (n0, a0, 0)
12467 && operand_equal_p (n1, a1, 0))
12468 || (operand_equal_p (n0, a1, 0)
12469 && operand_equal_p (n1, a0, 0)))
12470 return fold_build2_loc (loc, TRUTH_XOR_EXPR, type, l0, n1);
12473 if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1))
12474 != NULL_TREE)
12475 return tem;
12477 return NULL_TREE;
12479 case TRUTH_XOR_EXPR:
12480 /* If the second arg is constant zero, drop it. */
12481 if (integer_zerop (arg1))
12482 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12483 /* If the second arg is constant true, this is a logical inversion. */
12484 if (integer_onep (arg1))
12486 /* Only call invert_truthvalue if operand is a truth value. */
12487 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE)
12488 tem = fold_build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0);
12489 else
12490 tem = invert_truthvalue_loc (loc, arg0);
12491 return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
12493 /* Identical arguments cancel to zero. */
12494 if (operand_equal_p (arg0, arg1, 0))
12495 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12497 /* !X ^ X is always true. */
12498 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12499 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12500 return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12502 /* X ^ !X is always true. */
12503 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12504 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12505 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12507 return NULL_TREE;
12509 case EQ_EXPR:
12510 case NE_EXPR:
12511 STRIP_NOPS (arg0);
12512 STRIP_NOPS (arg1);
12514 tem = fold_comparison (loc, code, type, op0, op1);
12515 if (tem != NULL_TREE)
12516 return tem;
12518 /* bool_var != 0 becomes bool_var. */
12519 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12520 && code == NE_EXPR)
12521 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12523 /* bool_var == 1 becomes bool_var. */
12524 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12525 && code == EQ_EXPR)
12526 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12528 /* bool_var != 1 becomes !bool_var. */
12529 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12530 && code == NE_EXPR)
12531 return fold_convert_loc (loc, type,
12532 fold_build1_loc (loc, TRUTH_NOT_EXPR,
12533 TREE_TYPE (arg0), arg0));
12535 /* bool_var == 0 becomes !bool_var. */
12536 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12537 && code == EQ_EXPR)
12538 return fold_convert_loc (loc, type,
12539 fold_build1_loc (loc, TRUTH_NOT_EXPR,
12540 TREE_TYPE (arg0), arg0));
12542 /* !exp != 0 becomes !exp */
12543 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1)
12544 && code == NE_EXPR)
12545 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12547 /* If this is an equality comparison of the address of two non-weak,
12548 unaliased symbols neither of which are extern (since we do not
12549 have access to attributes for externs), then we know the result. */
12550 if (TREE_CODE (arg0) == ADDR_EXPR
12551 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0))
12552 && ! DECL_WEAK (TREE_OPERAND (arg0, 0))
12553 && ! lookup_attribute ("alias",
12554 DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0)))
12555 && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0))
12556 && TREE_CODE (arg1) == ADDR_EXPR
12557 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0))
12558 && ! DECL_WEAK (TREE_OPERAND (arg1, 0))
12559 && ! lookup_attribute ("alias",
12560 DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
12561 && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
12563 /* We know that we're looking at the address of two
12564 non-weak, unaliased, static _DECL nodes.
12566 It is both wasteful and incorrect to call operand_equal_p
12567 to compare the two ADDR_EXPR nodes. It is wasteful in that
12568 all we need to do is test pointer equality for the arguments
12569 to the two ADDR_EXPR nodes. It is incorrect to use
12570 operand_equal_p as that function is NOT equivalent to a
12571 C equality test. It can in fact return false for two
12572 objects which would test as equal using the C equality
12573 operator. */
12574 bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12575 return constant_boolean_node (equal
12576 ? code == EQ_EXPR : code != EQ_EXPR,
12577 type);
12580 /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or
12581 a MINUS_EXPR of a constant, we can convert it into a comparison with
12582 a revised constant as long as no overflow occurs. */
12583 if (TREE_CODE (arg1) == INTEGER_CST
12584 && (TREE_CODE (arg0) == PLUS_EXPR
12585 || TREE_CODE (arg0) == MINUS_EXPR)
12586 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12587 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
12588 ? MINUS_EXPR : PLUS_EXPR,
12589 fold_convert_loc (loc, TREE_TYPE (arg0),
12590 arg1),
12591 TREE_OPERAND (arg0, 1)))
12592 && !TREE_OVERFLOW (tem))
12593 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12595 /* Similarly for a NEGATE_EXPR. */
12596 if (TREE_CODE (arg0) == NEGATE_EXPR
12597 && TREE_CODE (arg1) == INTEGER_CST
12598 && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0),
12599 arg1)))
12600 && TREE_CODE (tem) == INTEGER_CST
12601 && !TREE_OVERFLOW (tem))
12602 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12604 /* Similarly for a BIT_XOR_EXPR; X ^ C1 == C2 is X == (C1 ^ C2). */
12605 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12606 && TREE_CODE (arg1) == INTEGER_CST
12607 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12608 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12609 fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0),
12610 fold_convert_loc (loc,
12611 TREE_TYPE (arg0),
12612 arg1),
12613 TREE_OPERAND (arg0, 1)));
12615 /* Transform comparisons of the form X +- Y CMP X to Y CMP 0. */
12616 if ((TREE_CODE (arg0) == PLUS_EXPR
12617 || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12618 || TREE_CODE (arg0) == MINUS_EXPR)
12619 && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12620 0)),
12621 arg1, 0)
12622 && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12623 || POINTER_TYPE_P (TREE_TYPE (arg0))))
12625 tree val = TREE_OPERAND (arg0, 1);
12626 return omit_two_operands_loc (loc, type,
12627 fold_build2_loc (loc, code, type,
12628 val,
12629 build_int_cst (TREE_TYPE (val),
12630 0)),
12631 TREE_OPERAND (arg0, 0), arg1);
12634 /* Transform comparisons of the form C - X CMP X if C % 2 == 1. */
12635 if (TREE_CODE (arg0) == MINUS_EXPR
12636 && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12637 && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12638 1)),
12639 arg1, 0)
12640 && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1)
12642 return omit_two_operands_loc (loc, type,
12643 code == NE_EXPR
12644 ? boolean_true_node : boolean_false_node,
12645 TREE_OPERAND (arg0, 1), arg1);
12648 /* If we have X - Y == 0, we can convert that to X == Y and similarly
12649 for !=. Don't do this for ordered comparisons due to overflow. */
12650 if (TREE_CODE (arg0) == MINUS_EXPR
12651 && integer_zerop (arg1))
12652 return fold_build2_loc (loc, code, type,
12653 TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
12655 /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */
12656 if (TREE_CODE (arg0) == ABS_EXPR
12657 && (integer_zerop (arg1) || real_zerop (arg1)))
12658 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1);
12660 /* If this is an EQ or NE comparison with zero and ARG0 is
12661 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
12662 two operations, but the latter can be done in one less insn
12663 on machines that have only two-operand insns or on which a
12664 constant cannot be the first operand. */
12665 if (TREE_CODE (arg0) == BIT_AND_EXPR
12666 && integer_zerop (arg1))
12668 tree arg00 = TREE_OPERAND (arg0, 0);
12669 tree arg01 = TREE_OPERAND (arg0, 1);
12670 if (TREE_CODE (arg00) == LSHIFT_EXPR
12671 && integer_onep (TREE_OPERAND (arg00, 0)))
12673 tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00),
12674 arg01, TREE_OPERAND (arg00, 1));
12675 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12676 build_int_cst (TREE_TYPE (arg0), 1));
12677 return fold_build2_loc (loc, code, type,
12678 fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12679 arg1);
12681 else if (TREE_CODE (arg01) == LSHIFT_EXPR
12682 && integer_onep (TREE_OPERAND (arg01, 0)))
12684 tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01),
12685 arg00, TREE_OPERAND (arg01, 1));
12686 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12687 build_int_cst (TREE_TYPE (arg0), 1));
12688 return fold_build2_loc (loc, code, type,
12689 fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12690 arg1);
12694 /* If this is an NE or EQ comparison of zero against the result of a
12695 signed MOD operation whose second operand is a power of 2, make
12696 the MOD operation unsigned since it is simpler and equivalent. */
12697 if (integer_zerop (arg1)
12698 && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12699 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12700 || TREE_CODE (arg0) == CEIL_MOD_EXPR
12701 || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12702 || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12703 && integer_pow2p (TREE_OPERAND (arg0, 1)))
12705 tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12706 tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype,
12707 fold_convert_loc (loc, newtype,
12708 TREE_OPERAND (arg0, 0)),
12709 fold_convert_loc (loc, newtype,
12710 TREE_OPERAND (arg0, 1)));
12712 return fold_build2_loc (loc, code, type, newmod,
12713 fold_convert_loc (loc, newtype, arg1));
12716 /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12717 C1 is a valid shift constant, and C2 is a power of two, i.e.
12718 a single bit. */
12719 if (TREE_CODE (arg0) == BIT_AND_EXPR
12720 && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12721 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12722 == INTEGER_CST
12723 && integer_pow2p (TREE_OPERAND (arg0, 1))
12724 && integer_zerop (arg1))
12726 tree itype = TREE_TYPE (arg0);
12727 unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype);
12728 tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12730 /* Check for a valid shift count. */
12731 if (TREE_INT_CST_HIGH (arg001) == 0
12732 && TREE_INT_CST_LOW (arg001) < prec)
12734 tree arg01 = TREE_OPERAND (arg0, 1);
12735 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12736 unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12737 /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12738 can be rewritten as (X & (C2 << C1)) != 0. */
12739 if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12741 tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001);
12742 tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem);
12743 return fold_build2_loc (loc, code, type, tem,
12744 fold_convert_loc (loc, itype, arg1));
12746 /* Otherwise, for signed (arithmetic) shifts,
12747 ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12748 ((X >> C1) & C2) == 0 is rewritten as X >= 0. */
12749 else if (!TYPE_UNSIGNED (itype))
12750 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12751 arg000, build_int_cst (itype, 0));
12752 /* Otherwise, of unsigned (logical) shifts,
12753 ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12754 ((X >> C1) & C2) == 0 is rewritten as (X,true). */
12755 else
12756 return omit_one_operand_loc (loc, type,
12757 code == EQ_EXPR ? integer_one_node
12758 : integer_zero_node,
12759 arg000);
12763 /* If we have (A & C) == C where C is a power of 2, convert this into
12764 (A & C) != 0. Similarly for NE_EXPR. */
12765 if (TREE_CODE (arg0) == BIT_AND_EXPR
12766 && integer_pow2p (TREE_OPERAND (arg0, 1))
12767 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12768 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12769 arg0, fold_convert_loc (loc, TREE_TYPE (arg0),
12770 integer_zero_node));
12772 /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12773 bit, then fold the expression into A < 0 or A >= 0. */
12774 tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type);
12775 if (tem)
12776 return tem;
12778 /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12779 Similarly for NE_EXPR. */
12780 if (TREE_CODE (arg0) == BIT_AND_EXPR
12781 && TREE_CODE (arg1) == INTEGER_CST
12782 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12784 tree notc = fold_build1_loc (loc, BIT_NOT_EXPR,
12785 TREE_TYPE (TREE_OPERAND (arg0, 1)),
12786 TREE_OPERAND (arg0, 1));
12787 tree dandnotc
12788 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12789 fold_convert_loc (loc, TREE_TYPE (arg0), arg1),
12790 notc);
12791 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12792 if (integer_nonzerop (dandnotc))
12793 return omit_one_operand_loc (loc, type, rslt, arg0);
12796 /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12797 Similarly for NE_EXPR. */
12798 if (TREE_CODE (arg0) == BIT_IOR_EXPR
12799 && TREE_CODE (arg1) == INTEGER_CST
12800 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12802 tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12803 tree candnotd
12804 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12805 TREE_OPERAND (arg0, 1),
12806 fold_convert_loc (loc, TREE_TYPE (arg0), notd));
12807 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12808 if (integer_nonzerop (candnotd))
12809 return omit_one_operand_loc (loc, type, rslt, arg0);
12812 /* If this is a comparison of a field, we may be able to simplify it. */
12813 if ((TREE_CODE (arg0) == COMPONENT_REF
12814 || TREE_CODE (arg0) == BIT_FIELD_REF)
12815 /* Handle the constant case even without -O
12816 to make sure the warnings are given. */
12817 && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12819 t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1);
12820 if (t1)
12821 return t1;
12824 /* Optimize comparisons of strlen vs zero to a compare of the
12825 first character of the string vs zero. To wit,
12826 strlen(ptr) == 0 => *ptr == 0
12827 strlen(ptr) != 0 => *ptr != 0
12828 Other cases should reduce to one of these two (or a constant)
12829 due to the return value of strlen being unsigned. */
12830 if (TREE_CODE (arg0) == CALL_EXPR
12831 && integer_zerop (arg1))
12833 tree fndecl = get_callee_fndecl (arg0);
12835 if (fndecl
12836 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12837 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12838 && call_expr_nargs (arg0) == 1
12839 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12841 tree iref = build_fold_indirect_ref_loc (loc,
12842 CALL_EXPR_ARG (arg0, 0));
12843 return fold_build2_loc (loc, code, type, iref,
12844 build_int_cst (TREE_TYPE (iref), 0));
12848 /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12849 of X. Similarly fold (X >> C) == 0 into X >= 0. */
12850 if (TREE_CODE (arg0) == RSHIFT_EXPR
12851 && integer_zerop (arg1)
12852 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12854 tree arg00 = TREE_OPERAND (arg0, 0);
12855 tree arg01 = TREE_OPERAND (arg0, 1);
12856 tree itype = TREE_TYPE (arg00);
12857 if (TREE_INT_CST_HIGH (arg01) == 0
12858 && TREE_INT_CST_LOW (arg01)
12859 == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1))
12861 if (TYPE_UNSIGNED (itype))
12863 itype = signed_type_for (itype);
12864 arg00 = fold_convert_loc (loc, itype, arg00);
12866 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12867 type, arg00, build_int_cst (itype, 0));
12871 /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y. */
12872 if (integer_zerop (arg1)
12873 && TREE_CODE (arg0) == BIT_XOR_EXPR)
12874 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12875 TREE_OPERAND (arg0, 1));
12877 /* (X ^ Y) == Y becomes X == 0. We know that Y has no side-effects. */
12878 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12879 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12880 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12881 build_zero_cst (TREE_TYPE (arg0)));
12882 /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */
12883 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12884 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12885 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12886 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
12887 build_zero_cst (TREE_TYPE (arg0)));
12889 /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */
12890 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12891 && TREE_CODE (arg1) == INTEGER_CST
12892 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12893 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12894 fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1),
12895 TREE_OPERAND (arg0, 1), arg1));
12897 /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12898 (X & C) == 0 when C is a single bit. */
12899 if (TREE_CODE (arg0) == BIT_AND_EXPR
12900 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12901 && integer_zerop (arg1)
12902 && integer_pow2p (TREE_OPERAND (arg0, 1)))
12904 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12905 TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12906 TREE_OPERAND (arg0, 1));
12907 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12908 type, tem,
12909 fold_convert_loc (loc, TREE_TYPE (arg0),
12910 arg1));
12913 /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12914 constant C is a power of two, i.e. a single bit. */
12915 if (TREE_CODE (arg0) == BIT_XOR_EXPR
12916 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12917 && integer_zerop (arg1)
12918 && integer_pow2p (TREE_OPERAND (arg0, 1))
12919 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12920 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12922 tree arg00 = TREE_OPERAND (arg0, 0);
12923 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12924 arg00, build_int_cst (TREE_TYPE (arg00), 0));
12927 /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12928 when is C is a power of two, i.e. a single bit. */
12929 if (TREE_CODE (arg0) == BIT_AND_EXPR
12930 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12931 && integer_zerop (arg1)
12932 && integer_pow2p (TREE_OPERAND (arg0, 1))
12933 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12934 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12936 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12937 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000),
12938 arg000, TREE_OPERAND (arg0, 1));
12939 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12940 tem, build_int_cst (TREE_TYPE (tem), 0));
12943 if (integer_zerop (arg1)
12944 && tree_expr_nonzero_p (arg0))
12946 tree res = constant_boolean_node (code==NE_EXPR, type);
12947 return omit_one_operand_loc (loc, type, res, arg0);
12950 /* Fold -X op -Y as X op Y, where op is eq/ne. */
12951 if (TREE_CODE (arg0) == NEGATE_EXPR
12952 && TREE_CODE (arg1) == NEGATE_EXPR)
12953 return fold_build2_loc (loc, code, type,
12954 TREE_OPERAND (arg0, 0),
12955 fold_convert_loc (loc, TREE_TYPE (arg0),
12956 TREE_OPERAND (arg1, 0)));
12958 /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries. */
12959 if (TREE_CODE (arg0) == BIT_AND_EXPR
12960 && TREE_CODE (arg1) == BIT_AND_EXPR)
12962 tree arg00 = TREE_OPERAND (arg0, 0);
12963 tree arg01 = TREE_OPERAND (arg0, 1);
12964 tree arg10 = TREE_OPERAND (arg1, 0);
12965 tree arg11 = TREE_OPERAND (arg1, 1);
12966 tree itype = TREE_TYPE (arg0);
12968 if (operand_equal_p (arg01, arg11, 0))
12969 return fold_build2_loc (loc, code, type,
12970 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12971 fold_build2_loc (loc,
12972 BIT_XOR_EXPR, itype,
12973 arg00, arg10),
12974 arg01),
12975 build_zero_cst (itype));
12977 if (operand_equal_p (arg01, arg10, 0))
12978 return fold_build2_loc (loc, code, type,
12979 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12980 fold_build2_loc (loc,
12981 BIT_XOR_EXPR, itype,
12982 arg00, arg11),
12983 arg01),
12984 build_zero_cst (itype));
12986 if (operand_equal_p (arg00, arg11, 0))
12987 return fold_build2_loc (loc, code, type,
12988 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12989 fold_build2_loc (loc,
12990 BIT_XOR_EXPR, itype,
12991 arg01, arg10),
12992 arg00),
12993 build_zero_cst (itype));
12995 if (operand_equal_p (arg00, arg10, 0))
12996 return fold_build2_loc (loc, code, type,
12997 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12998 fold_build2_loc (loc,
12999 BIT_XOR_EXPR, itype,
13000 arg01, arg11),
13001 arg00),
13002 build_zero_cst (itype));
13005 if (TREE_CODE (arg0) == BIT_XOR_EXPR
13006 && TREE_CODE (arg1) == BIT_XOR_EXPR)
13008 tree arg00 = TREE_OPERAND (arg0, 0);
13009 tree arg01 = TREE_OPERAND (arg0, 1);
13010 tree arg10 = TREE_OPERAND (arg1, 0);
13011 tree arg11 = TREE_OPERAND (arg1, 1);
13012 tree itype = TREE_TYPE (arg0);
13014 /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
13015 operand_equal_p guarantees no side-effects so we don't need
13016 to use omit_one_operand on Z. */
13017 if (operand_equal_p (arg01, arg11, 0))
13018 return fold_build2_loc (loc, code, type, arg00,
13019 fold_convert_loc (loc, TREE_TYPE (arg00),
13020 arg10));
13021 if (operand_equal_p (arg01, arg10, 0))
13022 return fold_build2_loc (loc, code, type, arg00,
13023 fold_convert_loc (loc, TREE_TYPE (arg00),
13024 arg11));
13025 if (operand_equal_p (arg00, arg11, 0))
13026 return fold_build2_loc (loc, code, type, arg01,
13027 fold_convert_loc (loc, TREE_TYPE (arg01),
13028 arg10));
13029 if (operand_equal_p (arg00, arg10, 0))
13030 return fold_build2_loc (loc, code, type, arg01,
13031 fold_convert_loc (loc, TREE_TYPE (arg01),
13032 arg11));
13034 /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y. */
13035 if (TREE_CODE (arg01) == INTEGER_CST
13036 && TREE_CODE (arg11) == INTEGER_CST)
13038 tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg01,
13039 fold_convert_loc (loc, itype, arg11));
13040 tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00, tem);
13041 return fold_build2_loc (loc, code, type, tem,
13042 fold_convert_loc (loc, itype, arg10));
13046 /* Attempt to simplify equality/inequality comparisons of complex
13047 values. Only lower the comparison if the result is known or
13048 can be simplified to a single scalar comparison. */
13049 if ((TREE_CODE (arg0) == COMPLEX_EXPR
13050 || TREE_CODE (arg0) == COMPLEX_CST)
13051 && (TREE_CODE (arg1) == COMPLEX_EXPR
13052 || TREE_CODE (arg1) == COMPLEX_CST))
13054 tree real0, imag0, real1, imag1;
13055 tree rcond, icond;
13057 if (TREE_CODE (arg0) == COMPLEX_EXPR)
13059 real0 = TREE_OPERAND (arg0, 0);
13060 imag0 = TREE_OPERAND (arg0, 1);
13062 else
13064 real0 = TREE_REALPART (arg0);
13065 imag0 = TREE_IMAGPART (arg0);
13068 if (TREE_CODE (arg1) == COMPLEX_EXPR)
13070 real1 = TREE_OPERAND (arg1, 0);
13071 imag1 = TREE_OPERAND (arg1, 1);
13073 else
13075 real1 = TREE_REALPART (arg1);
13076 imag1 = TREE_IMAGPART (arg1);
13079 rcond = fold_binary_loc (loc, code, type, real0, real1);
13080 if (rcond && TREE_CODE (rcond) == INTEGER_CST)
13082 if (integer_zerop (rcond))
13084 if (code == EQ_EXPR)
13085 return omit_two_operands_loc (loc, type, boolean_false_node,
13086 imag0, imag1);
13087 return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1);
13089 else
13091 if (code == NE_EXPR)
13092 return omit_two_operands_loc (loc, type, boolean_true_node,
13093 imag0, imag1);
13094 return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1);
13098 icond = fold_binary_loc (loc, code, type, imag0, imag1);
13099 if (icond && TREE_CODE (icond) == INTEGER_CST)
13101 if (integer_zerop (icond))
13103 if (code == EQ_EXPR)
13104 return omit_two_operands_loc (loc, type, boolean_false_node,
13105 real0, real1);
13106 return fold_build2_loc (loc, NE_EXPR, type, real0, real1);
13108 else
13110 if (code == NE_EXPR)
13111 return omit_two_operands_loc (loc, type, boolean_true_node,
13112 real0, real1);
13113 return fold_build2_loc (loc, EQ_EXPR, type, real0, real1);
13118 return NULL_TREE;
13120 case LT_EXPR:
13121 case GT_EXPR:
13122 case LE_EXPR:
13123 case GE_EXPR:
13124 tem = fold_comparison (loc, code, type, op0, op1);
13125 if (tem != NULL_TREE)
13126 return tem;
13128 /* Transform comparisons of the form X +- C CMP X. */
13129 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
13130 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
13131 && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
13132 && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
13133 || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
13134 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
13136 tree arg01 = TREE_OPERAND (arg0, 1);
13137 enum tree_code code0 = TREE_CODE (arg0);
13138 int is_positive;
13140 if (TREE_CODE (arg01) == REAL_CST)
13141 is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
13142 else
13143 is_positive = tree_int_cst_sgn (arg01);
13145 /* (X - c) > X becomes false. */
13146 if (code == GT_EXPR
13147 && ((code0 == MINUS_EXPR && is_positive >= 0)
13148 || (code0 == PLUS_EXPR && is_positive <= 0)))
13150 if (TREE_CODE (arg01) == INTEGER_CST
13151 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13152 fold_overflow_warning (("assuming signed overflow does not "
13153 "occur when assuming that (X - c) > X "
13154 "is always false"),
13155 WARN_STRICT_OVERFLOW_ALL);
13156 return constant_boolean_node (0, type);
13159 /* Likewise (X + c) < X becomes false. */
13160 if (code == LT_EXPR
13161 && ((code0 == PLUS_EXPR && is_positive >= 0)
13162 || (code0 == MINUS_EXPR && is_positive <= 0)))
13164 if (TREE_CODE (arg01) == INTEGER_CST
13165 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13166 fold_overflow_warning (("assuming signed overflow does not "
13167 "occur when assuming that "
13168 "(X + c) < X is always false"),
13169 WARN_STRICT_OVERFLOW_ALL);
13170 return constant_boolean_node (0, type);
13173 /* Convert (X - c) <= X to true. */
13174 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13175 && code == LE_EXPR
13176 && ((code0 == MINUS_EXPR && is_positive >= 0)
13177 || (code0 == PLUS_EXPR && is_positive <= 0)))
13179 if (TREE_CODE (arg01) == INTEGER_CST
13180 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13181 fold_overflow_warning (("assuming signed overflow does not "
13182 "occur when assuming that "
13183 "(X - c) <= X is always true"),
13184 WARN_STRICT_OVERFLOW_ALL);
13185 return constant_boolean_node (1, type);
13188 /* Convert (X + c) >= X to true. */
13189 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))
13190 && code == GE_EXPR
13191 && ((code0 == PLUS_EXPR && is_positive >= 0)
13192 || (code0 == MINUS_EXPR && is_positive <= 0)))
13194 if (TREE_CODE (arg01) == INTEGER_CST
13195 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13196 fold_overflow_warning (("assuming signed overflow does not "
13197 "occur when assuming that "
13198 "(X + c) >= X is always true"),
13199 WARN_STRICT_OVERFLOW_ALL);
13200 return constant_boolean_node (1, type);
13203 if (TREE_CODE (arg01) == INTEGER_CST)
13205 /* Convert X + c > X and X - c < X to true for integers. */
13206 if (code == GT_EXPR
13207 && ((code0 == PLUS_EXPR && is_positive > 0)
13208 || (code0 == MINUS_EXPR && is_positive < 0)))
13210 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13211 fold_overflow_warning (("assuming signed overflow does "
13212 "not occur when assuming that "
13213 "(X + c) > X is always true"),
13214 WARN_STRICT_OVERFLOW_ALL);
13215 return constant_boolean_node (1, type);
13218 if (code == LT_EXPR
13219 && ((code0 == MINUS_EXPR && is_positive > 0)
13220 || (code0 == PLUS_EXPR && is_positive < 0)))
13222 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13223 fold_overflow_warning (("assuming signed overflow does "
13224 "not occur when assuming that "
13225 "(X - c) < X is always true"),
13226 WARN_STRICT_OVERFLOW_ALL);
13227 return constant_boolean_node (1, type);
13230 /* Convert X + c <= X and X - c >= X to false for integers. */
13231 if (code == LE_EXPR
13232 && ((code0 == PLUS_EXPR && is_positive > 0)
13233 || (code0 == MINUS_EXPR && is_positive < 0)))
13235 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13236 fold_overflow_warning (("assuming signed overflow does "
13237 "not occur when assuming that "
13238 "(X + c) <= X is always false"),
13239 WARN_STRICT_OVERFLOW_ALL);
13240 return constant_boolean_node (0, type);
13243 if (code == GE_EXPR
13244 && ((code0 == MINUS_EXPR && is_positive > 0)
13245 || (code0 == PLUS_EXPR && is_positive < 0)))
13247 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13248 fold_overflow_warning (("assuming signed overflow does "
13249 "not occur when assuming that "
13250 "(X - c) >= X is always false"),
13251 WARN_STRICT_OVERFLOW_ALL);
13252 return constant_boolean_node (0, type);
13257 /* Comparisons with the highest or lowest possible integer of
13258 the specified precision will have known values. */
13260 tree arg1_type = TREE_TYPE (arg1);
13261 unsigned int width = TYPE_PRECISION (arg1_type);
13263 if (TREE_CODE (arg1) == INTEGER_CST
13264 && width <= 2 * HOST_BITS_PER_WIDE_INT
13265 && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
13267 HOST_WIDE_INT signed_max_hi;
13268 unsigned HOST_WIDE_INT signed_max_lo;
13269 unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo;
13271 if (width <= HOST_BITS_PER_WIDE_INT)
13273 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13274 - 1;
13275 signed_max_hi = 0;
13276 max_hi = 0;
13278 if (TYPE_UNSIGNED (arg1_type))
13280 max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13281 min_lo = 0;
13282 min_hi = 0;
13284 else
13286 max_lo = signed_max_lo;
13287 min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13288 min_hi = -1;
13291 else
13293 width -= HOST_BITS_PER_WIDE_INT;
13294 signed_max_lo = -1;
13295 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1))
13296 - 1;
13297 max_lo = -1;
13298 min_lo = 0;
13300 if (TYPE_UNSIGNED (arg1_type))
13302 max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1;
13303 min_hi = 0;
13305 else
13307 max_hi = signed_max_hi;
13308 min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1));
13312 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi
13313 && TREE_INT_CST_LOW (arg1) == max_lo)
13314 switch (code)
13316 case GT_EXPR:
13317 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13319 case GE_EXPR:
13320 return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13322 case LE_EXPR:
13323 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13325 case LT_EXPR:
13326 return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13328 /* The GE_EXPR and LT_EXPR cases above are not normally
13329 reached because of previous transformations. */
13331 default:
13332 break;
13334 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13335 == max_hi
13336 && TREE_INT_CST_LOW (arg1) == max_lo - 1)
13337 switch (code)
13339 case GT_EXPR:
13340 arg1 = const_binop (PLUS_EXPR, arg1,
13341 build_int_cst (TREE_TYPE (arg1), 1));
13342 return fold_build2_loc (loc, EQ_EXPR, type,
13343 fold_convert_loc (loc,
13344 TREE_TYPE (arg1), arg0),
13345 arg1);
13346 case LE_EXPR:
13347 arg1 = const_binop (PLUS_EXPR, arg1,
13348 build_int_cst (TREE_TYPE (arg1), 1));
13349 return fold_build2_loc (loc, NE_EXPR, type,
13350 fold_convert_loc (loc, TREE_TYPE (arg1),
13351 arg0),
13352 arg1);
13353 default:
13354 break;
13356 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13357 == min_hi
13358 && TREE_INT_CST_LOW (arg1) == min_lo)
13359 switch (code)
13361 case LT_EXPR:
13362 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13364 case LE_EXPR:
13365 return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13367 case GE_EXPR:
13368 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13370 case GT_EXPR:
13371 return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13373 default:
13374 break;
13376 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1)
13377 == min_hi
13378 && TREE_INT_CST_LOW (arg1) == min_lo + 1)
13379 switch (code)
13381 case GE_EXPR:
13382 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node);
13383 return fold_build2_loc (loc, NE_EXPR, type,
13384 fold_convert_loc (loc,
13385 TREE_TYPE (arg1), arg0),
13386 arg1);
13387 case LT_EXPR:
13388 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node);
13389 return fold_build2_loc (loc, EQ_EXPR, type,
13390 fold_convert_loc (loc, TREE_TYPE (arg1),
13391 arg0),
13392 arg1);
13393 default:
13394 break;
13397 else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
13398 && TREE_INT_CST_LOW (arg1) == signed_max_lo
13399 && TYPE_UNSIGNED (arg1_type)
13400 /* We will flip the signedness of the comparison operator
13401 associated with the mode of arg1, so the sign bit is
13402 specified by this mode. Check that arg1 is the signed
13403 max associated with this sign bit. */
13404 && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
13405 /* signed_type does not work on pointer types. */
13406 && INTEGRAL_TYPE_P (arg1_type))
13408 /* The following case also applies to X < signed_max+1
13409 and X >= signed_max+1 because previous transformations. */
13410 if (code == LE_EXPR || code == GT_EXPR)
13412 tree st;
13413 st = signed_type_for (TREE_TYPE (arg1));
13414 return fold_build2_loc (loc,
13415 code == LE_EXPR ? GE_EXPR : LT_EXPR,
13416 type, fold_convert_loc (loc, st, arg0),
13417 build_int_cst (st, 0));
13423 /* If we are comparing an ABS_EXPR with a constant, we can
13424 convert all the cases into explicit comparisons, but they may
13425 well not be faster than doing the ABS and one comparison.
13426 But ABS (X) <= C is a range comparison, which becomes a subtraction
13427 and a comparison, and is probably faster. */
13428 if (code == LE_EXPR
13429 && TREE_CODE (arg1) == INTEGER_CST
13430 && TREE_CODE (arg0) == ABS_EXPR
13431 && ! TREE_SIDE_EFFECTS (arg0)
13432 && (0 != (tem = negate_expr (arg1)))
13433 && TREE_CODE (tem) == INTEGER_CST
13434 && !TREE_OVERFLOW (tem))
13435 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13436 build2 (GE_EXPR, type,
13437 TREE_OPERAND (arg0, 0), tem),
13438 build2 (LE_EXPR, type,
13439 TREE_OPERAND (arg0, 0), arg1));
13441 /* Convert ABS_EXPR<x> >= 0 to true. */
13442 strict_overflow_p = false;
13443 if (code == GE_EXPR
13444 && (integer_zerop (arg1)
13445 || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
13446 && real_zerop (arg1)))
13447 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13449 if (strict_overflow_p)
13450 fold_overflow_warning (("assuming signed overflow does not occur "
13451 "when simplifying comparison of "
13452 "absolute value and zero"),
13453 WARN_STRICT_OVERFLOW_CONDITIONAL);
13454 return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13457 /* Convert ABS_EXPR<x> < 0 to false. */
13458 strict_overflow_p = false;
13459 if (code == LT_EXPR
13460 && (integer_zerop (arg1) || real_zerop (arg1))
13461 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13463 if (strict_overflow_p)
13464 fold_overflow_warning (("assuming signed overflow does not occur "
13465 "when simplifying comparison of "
13466 "absolute value and zero"),
13467 WARN_STRICT_OVERFLOW_CONDITIONAL);
13468 return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13471 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13472 and similarly for >= into !=. */
13473 if ((code == LT_EXPR || code == GE_EXPR)
13474 && TYPE_UNSIGNED (TREE_TYPE (arg0))
13475 && TREE_CODE (arg1) == LSHIFT_EXPR
13476 && integer_onep (TREE_OPERAND (arg1, 0)))
13477 return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13478 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13479 TREE_OPERAND (arg1, 1)),
13480 build_int_cst (TREE_TYPE (arg0), 0));
13482 /* Similarly for X < (cast) (1 << Y). But cast can't be narrowing,
13483 otherwise Y might be >= # of bits in X's type and thus e.g.
13484 (unsigned char) (1 << Y) for Y 15 might be 0.
13485 If the cast is widening, then 1 << Y should have unsigned type,
13486 otherwise if Y is number of bits in the signed shift type minus 1,
13487 we can't optimize this. E.g. (unsigned long long) (1 << Y) for Y
13488 31 might be 0xffffffff80000000. */
13489 if ((code == LT_EXPR || code == GE_EXPR)
13490 && TYPE_UNSIGNED (TREE_TYPE (arg0))
13491 && CONVERT_EXPR_P (arg1)
13492 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13493 && (TYPE_PRECISION (TREE_TYPE (arg1))
13494 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0))))
13495 && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0)))
13496 || (TYPE_PRECISION (TREE_TYPE (arg1))
13497 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)))))
13498 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13500 tem = build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13501 TREE_OPERAND (TREE_OPERAND (arg1, 0), 1));
13502 return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13503 fold_convert_loc (loc, TREE_TYPE (arg0), tem),
13504 build_int_cst (TREE_TYPE (arg0), 0));
13507 return NULL_TREE;
13509 case UNORDERED_EXPR:
13510 case ORDERED_EXPR:
13511 case UNLT_EXPR:
13512 case UNLE_EXPR:
13513 case UNGT_EXPR:
13514 case UNGE_EXPR:
13515 case UNEQ_EXPR:
13516 case LTGT_EXPR:
13517 if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13519 t1 = fold_relational_const (code, type, arg0, arg1);
13520 if (t1 != NULL_TREE)
13521 return t1;
13524 /* If the first operand is NaN, the result is constant. */
13525 if (TREE_CODE (arg0) == REAL_CST
13526 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13527 && (code != LTGT_EXPR || ! flag_trapping_math))
13529 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13530 ? integer_zero_node
13531 : integer_one_node;
13532 return omit_one_operand_loc (loc, type, t1, arg1);
13535 /* If the second operand is NaN, the result is constant. */
13536 if (TREE_CODE (arg1) == REAL_CST
13537 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13538 && (code != LTGT_EXPR || ! flag_trapping_math))
13540 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13541 ? integer_zero_node
13542 : integer_one_node;
13543 return omit_one_operand_loc (loc, type, t1, arg0);
13546 /* Simplify unordered comparison of something with itself. */
13547 if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13548 && operand_equal_p (arg0, arg1, 0))
13549 return constant_boolean_node (1, type);
13551 if (code == LTGT_EXPR
13552 && !flag_trapping_math
13553 && operand_equal_p (arg0, arg1, 0))
13554 return constant_boolean_node (0, type);
13556 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
13558 tree targ0 = strip_float_extensions (arg0);
13559 tree targ1 = strip_float_extensions (arg1);
13560 tree newtype = TREE_TYPE (targ0);
13562 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13563 newtype = TREE_TYPE (targ1);
13565 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13566 return fold_build2_loc (loc, code, type,
13567 fold_convert_loc (loc, newtype, targ0),
13568 fold_convert_loc (loc, newtype, targ1));
13571 return NULL_TREE;
13573 case COMPOUND_EXPR:
13574 /* When pedantic, a compound expression can be neither an lvalue
13575 nor an integer constant expression. */
13576 if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13577 return NULL_TREE;
13578 /* Don't let (0, 0) be null pointer constant. */
13579 tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13580 : fold_convert_loc (loc, type, arg1);
13581 return pedantic_non_lvalue_loc (loc, tem);
13583 case COMPLEX_EXPR:
13584 if ((TREE_CODE (arg0) == REAL_CST
13585 && TREE_CODE (arg1) == REAL_CST)
13586 || (TREE_CODE (arg0) == INTEGER_CST
13587 && TREE_CODE (arg1) == INTEGER_CST))
13588 return build_complex (type, arg0, arg1);
13589 if (TREE_CODE (arg0) == REALPART_EXPR
13590 && TREE_CODE (arg1) == IMAGPART_EXPR
13591 && TREE_TYPE (TREE_OPERAND (arg0, 0)) == type
13592 && operand_equal_p (TREE_OPERAND (arg0, 0),
13593 TREE_OPERAND (arg1, 0), 0))
13594 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0),
13595 TREE_OPERAND (arg1, 0));
13596 return NULL_TREE;
13598 case ASSERT_EXPR:
13599 /* An ASSERT_EXPR should never be passed to fold_binary. */
13600 gcc_unreachable ();
13602 case VEC_PACK_TRUNC_EXPR:
13603 case VEC_PACK_FIX_TRUNC_EXPR:
13605 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
13606 tree *elts, vals = NULL_TREE;
13608 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts / 2
13609 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts / 2);
13610 if (TREE_CODE (arg0) != VECTOR_CST || TREE_CODE (arg1) != VECTOR_CST)
13611 return NULL_TREE;
13613 elts = XALLOCAVEC (tree, nelts);
13614 if (!vec_cst_ctor_to_array (arg0, elts)
13615 || !vec_cst_ctor_to_array (arg1, elts + nelts / 2))
13616 return NULL_TREE;
13618 for (i = 0; i < nelts; i++)
13620 elts[i] = fold_convert_const (code == VEC_PACK_TRUNC_EXPR
13621 ? NOP_EXPR : FIX_TRUNC_EXPR,
13622 TREE_TYPE (type), elts[i]);
13623 if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
13624 return NULL_TREE;
13627 for (i = 0; i < nelts; i++)
13628 vals = tree_cons (NULL_TREE, elts[nelts - i - 1], vals);
13629 return build_vector (type, vals);
13632 case VEC_WIDEN_MULT_LO_EXPR:
13633 case VEC_WIDEN_MULT_HI_EXPR:
13635 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
13636 tree *elts, vals = NULL_TREE;
13638 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2
13639 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts * 2);
13640 if (TREE_CODE (arg0) != VECTOR_CST || TREE_CODE (arg1) != VECTOR_CST)
13641 return NULL_TREE;
13643 elts = XALLOCAVEC (tree, nelts * 4);
13644 if (!vec_cst_ctor_to_array (arg0, elts)
13645 || !vec_cst_ctor_to_array (arg1, elts + nelts * 2))
13646 return NULL_TREE;
13648 if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_WIDEN_MULT_LO_EXPR))
13649 elts += nelts;
13651 for (i = 0; i < nelts; i++)
13653 elts[i] = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[i]);
13654 elts[i + nelts * 2]
13655 = fold_convert_const (NOP_EXPR, TREE_TYPE (type),
13656 elts[i + nelts * 2]);
13657 if (elts[i] == NULL_TREE || elts[i + nelts * 2] == NULL_TREE)
13658 return NULL_TREE;
13659 elts[i] = const_binop (MULT_EXPR, elts[i], elts[i + nelts * 2]);
13660 if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
13661 return NULL_TREE;
13664 for (i = 0; i < nelts; i++)
13665 vals = tree_cons (NULL_TREE, elts[nelts - i - 1], vals);
13666 return build_vector (type, vals);
13669 default:
13670 return NULL_TREE;
13671 } /* switch (code) */
13674 /* Callback for walk_tree, looking for LABEL_EXPR. Return *TP if it is
13675 a LABEL_EXPR; otherwise return NULL_TREE. Do not check the subtrees
13676 of GOTO_EXPR. */
13678 static tree
13679 contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13681 switch (TREE_CODE (*tp))
13683 case LABEL_EXPR:
13684 return *tp;
13686 case GOTO_EXPR:
13687 *walk_subtrees = 0;
13689 /* ... fall through ... */
13691 default:
13692 return NULL_TREE;
13696 /* Return whether the sub-tree ST contains a label which is accessible from
13697 outside the sub-tree. */
13699 static bool
13700 contains_label_p (tree st)
13702 return
13703 (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE);
13706 /* Fold a ternary expression of code CODE and type TYPE with operands
13707 OP0, OP1, and OP2. Return the folded expression if folding is
13708 successful. Otherwise, return NULL_TREE. */
13710 tree
13711 fold_ternary_loc (location_t loc, enum tree_code code, tree type,
13712 tree op0, tree op1, tree op2)
13714 tree tem;
13715 tree arg0 = NULL_TREE, arg1 = NULL_TREE, arg2 = NULL_TREE;
13716 enum tree_code_class kind = TREE_CODE_CLASS (code);
13718 gcc_assert (IS_EXPR_CODE_CLASS (kind)
13719 && TREE_CODE_LENGTH (code) == 3);
13721 /* Strip any conversions that don't change the mode. This is safe
13722 for every expression, except for a comparison expression because
13723 its signedness is derived from its operands. So, in the latter
13724 case, only strip conversions that don't change the signedness.
13726 Note that this is done as an internal manipulation within the
13727 constant folder, in order to find the simplest representation of
13728 the arguments so that their form can be studied. In any cases,
13729 the appropriate type conversions should be put back in the tree
13730 that will get out of the constant folder. */
13731 if (op0)
13733 arg0 = op0;
13734 STRIP_NOPS (arg0);
13737 if (op1)
13739 arg1 = op1;
13740 STRIP_NOPS (arg1);
13743 if (op2)
13745 arg2 = op2;
13746 STRIP_NOPS (arg2);
13749 switch (code)
13751 case COMPONENT_REF:
13752 if (TREE_CODE (arg0) == CONSTRUCTOR
13753 && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13755 unsigned HOST_WIDE_INT idx;
13756 tree field, value;
13757 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13758 if (field == arg1)
13759 return value;
13761 return NULL_TREE;
13763 case COND_EXPR:
13764 /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13765 so all simple results must be passed through pedantic_non_lvalue. */
13766 if (TREE_CODE (arg0) == INTEGER_CST)
13768 tree unused_op = integer_zerop (arg0) ? op1 : op2;
13769 tem = integer_zerop (arg0) ? op2 : op1;
13770 /* Only optimize constant conditions when the selected branch
13771 has the same type as the COND_EXPR. This avoids optimizing
13772 away "c ? x : throw", where the throw has a void type.
13773 Avoid throwing away that operand which contains label. */
13774 if ((!TREE_SIDE_EFFECTS (unused_op)
13775 || !contains_label_p (unused_op))
13776 && (! VOID_TYPE_P (TREE_TYPE (tem))
13777 || VOID_TYPE_P (type)))
13778 return pedantic_non_lvalue_loc (loc, tem);
13779 return NULL_TREE;
13781 if (operand_equal_p (arg1, op2, 0))
13782 return pedantic_omit_one_operand_loc (loc, type, arg1, arg0);
13784 /* If we have A op B ? A : C, we may be able to convert this to a
13785 simpler expression, depending on the operation and the values
13786 of B and C. Signed zeros prevent all of these transformations,
13787 for reasons given above each one.
13789 Also try swapping the arguments and inverting the conditional. */
13790 if (COMPARISON_CLASS_P (arg0)
13791 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13792 arg1, TREE_OPERAND (arg0, 1))
13793 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
13795 tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2);
13796 if (tem)
13797 return tem;
13800 if (COMPARISON_CLASS_P (arg0)
13801 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13802 op2,
13803 TREE_OPERAND (arg0, 1))
13804 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
13806 location_t loc0 = expr_location_or (arg0, loc);
13807 tem = fold_truth_not_expr (loc0, arg0);
13808 if (tem && COMPARISON_CLASS_P (tem))
13810 tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
13811 if (tem)
13812 return tem;
13816 /* If the second operand is simpler than the third, swap them
13817 since that produces better jump optimization results. */
13818 if (truth_value_p (TREE_CODE (arg0))
13819 && tree_swap_operands_p (op1, op2, false))
13821 location_t loc0 = expr_location_or (arg0, loc);
13822 /* See if this can be inverted. If it can't, possibly because
13823 it was a floating-point inequality comparison, don't do
13824 anything. */
13825 tem = fold_truth_not_expr (loc0, arg0);
13826 if (tem)
13827 return fold_build3_loc (loc, code, type, tem, op2, op1);
13830 /* Convert A ? 1 : 0 to simply A. */
13831 if (integer_onep (op1)
13832 && integer_zerop (op2)
13833 /* If we try to convert OP0 to our type, the
13834 call to fold will try to move the conversion inside
13835 a COND, which will recurse. In that case, the COND_EXPR
13836 is probably the best choice, so leave it alone. */
13837 && type == TREE_TYPE (arg0))
13838 return pedantic_non_lvalue_loc (loc, arg0);
13840 /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR
13841 over COND_EXPR in cases such as floating point comparisons. */
13842 if (integer_zerop (op1)
13843 && integer_onep (op2)
13844 && truth_value_p (TREE_CODE (arg0)))
13845 return pedantic_non_lvalue_loc (loc,
13846 fold_convert_loc (loc, type,
13847 invert_truthvalue_loc (loc,
13848 arg0)));
13850 /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>). */
13851 if (TREE_CODE (arg0) == LT_EXPR
13852 && integer_zerop (TREE_OPERAND (arg0, 1))
13853 && integer_zerop (op2)
13854 && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13856 /* sign_bit_p looks through both zero and sign extensions,
13857 but for this optimization only sign extensions are
13858 usable. */
13859 tree tem2 = TREE_OPERAND (arg0, 0);
13860 while (tem != tem2)
13862 if (TREE_CODE (tem2) != NOP_EXPR
13863 || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0))))
13865 tem = NULL_TREE;
13866 break;
13868 tem2 = TREE_OPERAND (tem2, 0);
13870 /* sign_bit_p only checks ARG1 bits within A's precision.
13871 If <sign bit of A> has wider type than A, bits outside
13872 of A's precision in <sign bit of A> need to be checked.
13873 If they are all 0, this optimization needs to be done
13874 in unsigned A's type, if they are all 1 in signed A's type,
13875 otherwise this can't be done. */
13876 if (tem
13877 && TYPE_PRECISION (TREE_TYPE (tem))
13878 < TYPE_PRECISION (TREE_TYPE (arg1))
13879 && TYPE_PRECISION (TREE_TYPE (tem))
13880 < TYPE_PRECISION (type))
13882 unsigned HOST_WIDE_INT mask_lo;
13883 HOST_WIDE_INT mask_hi;
13884 int inner_width, outer_width;
13885 tree tem_type;
13887 inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13888 outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13889 if (outer_width > TYPE_PRECISION (type))
13890 outer_width = TYPE_PRECISION (type);
13892 if (outer_width > HOST_BITS_PER_WIDE_INT)
13894 mask_hi = ((unsigned HOST_WIDE_INT) -1
13895 >> (2 * HOST_BITS_PER_WIDE_INT - outer_width));
13896 mask_lo = -1;
13898 else
13900 mask_hi = 0;
13901 mask_lo = ((unsigned HOST_WIDE_INT) -1
13902 >> (HOST_BITS_PER_WIDE_INT - outer_width));
13904 if (inner_width > HOST_BITS_PER_WIDE_INT)
13906 mask_hi &= ~((unsigned HOST_WIDE_INT) -1
13907 >> (HOST_BITS_PER_WIDE_INT - inner_width));
13908 mask_lo = 0;
13910 else
13911 mask_lo &= ~((unsigned HOST_WIDE_INT) -1
13912 >> (HOST_BITS_PER_WIDE_INT - inner_width));
13914 if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi
13915 && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo)
13917 tem_type = signed_type_for (TREE_TYPE (tem));
13918 tem = fold_convert_loc (loc, tem_type, tem);
13920 else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0
13921 && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0)
13923 tem_type = unsigned_type_for (TREE_TYPE (tem));
13924 tem = fold_convert_loc (loc, tem_type, tem);
13926 else
13927 tem = NULL;
13930 if (tem)
13931 return
13932 fold_convert_loc (loc, type,
13933 fold_build2_loc (loc, BIT_AND_EXPR,
13934 TREE_TYPE (tem), tem,
13935 fold_convert_loc (loc,
13936 TREE_TYPE (tem),
13937 arg1)));
13940 /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was
13941 already handled above. */
13942 if (TREE_CODE (arg0) == BIT_AND_EXPR
13943 && integer_onep (TREE_OPERAND (arg0, 1))
13944 && integer_zerop (op2)
13945 && integer_pow2p (arg1))
13947 tree tem = TREE_OPERAND (arg0, 0);
13948 STRIP_NOPS (tem);
13949 if (TREE_CODE (tem) == RSHIFT_EXPR
13950 && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST
13951 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13952 TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)))
13953 return fold_build2_loc (loc, BIT_AND_EXPR, type,
13954 TREE_OPERAND (tem, 0), arg1);
13957 /* A & N ? N : 0 is simply A & N if N is a power of two. This
13958 is probably obsolete because the first operand should be a
13959 truth value (that's why we have the two cases above), but let's
13960 leave it in until we can confirm this for all front-ends. */
13961 if (integer_zerop (op2)
13962 && TREE_CODE (arg0) == NE_EXPR
13963 && integer_zerop (TREE_OPERAND (arg0, 1))
13964 && integer_pow2p (arg1)
13965 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13966 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13967 arg1, OEP_ONLY_CONST))
13968 return pedantic_non_lvalue_loc (loc,
13969 fold_convert_loc (loc, type,
13970 TREE_OPERAND (arg0, 0)));
13972 /* Convert A ? B : 0 into A && B if A and B are truth values. */
13973 if (integer_zerop (op2)
13974 && truth_value_p (TREE_CODE (arg0))
13975 && truth_value_p (TREE_CODE (arg1)))
13976 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13977 fold_convert_loc (loc, type, arg0),
13978 arg1);
13980 /* Convert A ? B : 1 into !A || B if A and B are truth values. */
13981 if (integer_onep (op2)
13982 && truth_value_p (TREE_CODE (arg0))
13983 && truth_value_p (TREE_CODE (arg1)))
13985 location_t loc0 = expr_location_or (arg0, loc);
13986 /* Only perform transformation if ARG0 is easily inverted. */
13987 tem = fold_truth_not_expr (loc0, arg0);
13988 if (tem)
13989 return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
13990 fold_convert_loc (loc, type, tem),
13991 arg1);
13994 /* Convert A ? 0 : B into !A && B if A and B are truth values. */
13995 if (integer_zerop (arg1)
13996 && truth_value_p (TREE_CODE (arg0))
13997 && truth_value_p (TREE_CODE (op2)))
13999 location_t loc0 = expr_location_or (arg0, loc);
14000 /* Only perform transformation if ARG0 is easily inverted. */
14001 tem = fold_truth_not_expr (loc0, arg0);
14002 if (tem)
14003 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
14004 fold_convert_loc (loc, type, tem),
14005 op2);
14008 /* Convert A ? 1 : B into A || B if A and B are truth values. */
14009 if (integer_onep (arg1)
14010 && truth_value_p (TREE_CODE (arg0))
14011 && truth_value_p (TREE_CODE (op2)))
14012 return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
14013 fold_convert_loc (loc, type, arg0),
14014 op2);
14016 return NULL_TREE;
14018 case CALL_EXPR:
14019 /* CALL_EXPRs used to be ternary exprs. Catch any mistaken uses
14020 of fold_ternary on them. */
14021 gcc_unreachable ();
14023 case BIT_FIELD_REF:
14024 if ((TREE_CODE (arg0) == VECTOR_CST
14025 || TREE_CODE (arg0) == CONSTRUCTOR)
14026 && type == TREE_TYPE (TREE_TYPE (arg0)))
14028 unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
14029 unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
14031 if (width != 0
14032 && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
14033 && (idx % width) == 0
14034 && (idx = idx / width)
14035 < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
14037 if (TREE_CODE (arg0) == VECTOR_CST)
14039 tree elements = TREE_VECTOR_CST_ELTS (arg0);
14040 while (idx-- > 0 && elements)
14041 elements = TREE_CHAIN (elements);
14042 if (elements)
14043 return TREE_VALUE (elements);
14045 else if (idx < CONSTRUCTOR_NELTS (arg0))
14046 return CONSTRUCTOR_ELT (arg0, idx)->value;
14047 return build_zero_cst (type);
14051 /* A bit-field-ref that referenced the full argument can be stripped. */
14052 if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
14053 && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_low_cst (arg1, 1)
14054 && integer_zerop (op2))
14055 return fold_convert_loc (loc, type, arg0);
14057 return NULL_TREE;
14059 case FMA_EXPR:
14060 /* For integers we can decompose the FMA if possible. */
14061 if (TREE_CODE (arg0) == INTEGER_CST
14062 && TREE_CODE (arg1) == INTEGER_CST)
14063 return fold_build2_loc (loc, PLUS_EXPR, type,
14064 const_binop (MULT_EXPR, arg0, arg1), arg2);
14065 if (integer_zerop (arg2))
14066 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
14068 return fold_fma (loc, type, arg0, arg1, arg2);
14070 case VEC_PERM_EXPR:
14071 if (TREE_CODE (arg2) == VECTOR_CST)
14073 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
14074 unsigned char *sel = XALLOCAVEC (unsigned char, nelts);
14075 tree t;
14076 bool need_mask_canon = false;
14078 gcc_assert (nelts == TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)));
14079 for (i = 0, t = TREE_VECTOR_CST_ELTS (arg2);
14080 i < nelts && t; i++, t = TREE_CHAIN (t))
14082 if (TREE_CODE (TREE_VALUE (t)) != INTEGER_CST)
14083 return NULL_TREE;
14085 sel[i] = TREE_INT_CST_LOW (TREE_VALUE (t)) & (2 * nelts - 1);
14086 if (TREE_INT_CST_HIGH (TREE_VALUE (t))
14087 || ((unsigned HOST_WIDE_INT)
14088 TREE_INT_CST_LOW (TREE_VALUE (t)) != sel[i]))
14089 need_mask_canon = true;
14091 if (t)
14092 return NULL_TREE;
14093 for (; i < nelts; i++)
14094 sel[i] = 0;
14096 if ((TREE_CODE (arg0) == VECTOR_CST
14097 || TREE_CODE (arg0) == CONSTRUCTOR)
14098 && (TREE_CODE (arg1) == VECTOR_CST
14099 || TREE_CODE (arg1) == CONSTRUCTOR))
14101 t = fold_vec_perm (type, arg0, arg1, sel);
14102 if (t != NULL_TREE)
14103 return t;
14106 if (need_mask_canon && arg2 == op2)
14108 tree list = NULL_TREE, eltype = TREE_TYPE (TREE_TYPE (arg2));
14109 for (i = 0; i < nelts; i++)
14110 list = tree_cons (NULL_TREE,
14111 build_int_cst (eltype, sel[nelts - i - 1]),
14112 list);
14113 t = build_vector (TREE_TYPE (arg2), list);
14114 return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t);
14117 return NULL_TREE;
14119 default:
14120 return NULL_TREE;
14121 } /* switch (code) */
14124 /* Perform constant folding and related simplification of EXPR.
14125 The related simplifications include x*1 => x, x*0 => 0, etc.,
14126 and application of the associative law.
14127 NOP_EXPR conversions may be removed freely (as long as we
14128 are careful not to change the type of the overall expression).
14129 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
14130 but we can constant-fold them if they have constant operands. */
14132 #ifdef ENABLE_FOLD_CHECKING
14133 # define fold(x) fold_1 (x)
14134 static tree fold_1 (tree);
14135 static
14136 #endif
14137 tree
14138 fold (tree expr)
14140 const tree t = expr;
14141 enum tree_code code = TREE_CODE (t);
14142 enum tree_code_class kind = TREE_CODE_CLASS (code);
14143 tree tem;
14144 location_t loc = EXPR_LOCATION (expr);
14146 /* Return right away if a constant. */
14147 if (kind == tcc_constant)
14148 return t;
14150 /* CALL_EXPR-like objects with variable numbers of operands are
14151 treated specially. */
14152 if (kind == tcc_vl_exp)
14154 if (code == CALL_EXPR)
14156 tem = fold_call_expr (loc, expr, false);
14157 return tem ? tem : expr;
14159 return expr;
14162 if (IS_EXPR_CODE_CLASS (kind))
14164 tree type = TREE_TYPE (t);
14165 tree op0, op1, op2;
14167 switch (TREE_CODE_LENGTH (code))
14169 case 1:
14170 op0 = TREE_OPERAND (t, 0);
14171 tem = fold_unary_loc (loc, code, type, op0);
14172 return tem ? tem : expr;
14173 case 2:
14174 op0 = TREE_OPERAND (t, 0);
14175 op1 = TREE_OPERAND (t, 1);
14176 tem = fold_binary_loc (loc, code, type, op0, op1);
14177 return tem ? tem : expr;
14178 case 3:
14179 op0 = TREE_OPERAND (t, 0);
14180 op1 = TREE_OPERAND (t, 1);
14181 op2 = TREE_OPERAND (t, 2);
14182 tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14183 return tem ? tem : expr;
14184 default:
14185 break;
14189 switch (code)
14191 case ARRAY_REF:
14193 tree op0 = TREE_OPERAND (t, 0);
14194 tree op1 = TREE_OPERAND (t, 1);
14196 if (TREE_CODE (op1) == INTEGER_CST
14197 && TREE_CODE (op0) == CONSTRUCTOR
14198 && ! type_contains_placeholder_p (TREE_TYPE (op0)))
14200 VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (op0);
14201 unsigned HOST_WIDE_INT end = VEC_length (constructor_elt, elts);
14202 unsigned HOST_WIDE_INT begin = 0;
14204 /* Find a matching index by means of a binary search. */
14205 while (begin != end)
14207 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
14208 tree index = VEC_index (constructor_elt, elts, middle)->index;
14210 if (TREE_CODE (index) == INTEGER_CST
14211 && tree_int_cst_lt (index, op1))
14212 begin = middle + 1;
14213 else if (TREE_CODE (index) == INTEGER_CST
14214 && tree_int_cst_lt (op1, index))
14215 end = middle;
14216 else if (TREE_CODE (index) == RANGE_EXPR
14217 && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
14218 begin = middle + 1;
14219 else if (TREE_CODE (index) == RANGE_EXPR
14220 && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
14221 end = middle;
14222 else
14223 return VEC_index (constructor_elt, elts, middle)->value;
14227 return t;
14230 case CONST_DECL:
14231 return fold (DECL_INITIAL (t));
14233 default:
14234 return t;
14235 } /* switch (code) */
14238 #ifdef ENABLE_FOLD_CHECKING
14239 #undef fold
14241 static void fold_checksum_tree (const_tree, struct md5_ctx *, htab_t);
14242 static void fold_check_failed (const_tree, const_tree);
14243 void print_fold_checksum (const_tree);
14245 /* When --enable-checking=fold, compute a digest of expr before
14246 and after actual fold call to see if fold did not accidentally
14247 change original expr. */
14249 tree
14250 fold (tree expr)
14252 tree ret;
14253 struct md5_ctx ctx;
14254 unsigned char checksum_before[16], checksum_after[16];
14255 htab_t ht;
14257 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14258 md5_init_ctx (&ctx);
14259 fold_checksum_tree (expr, &ctx, ht);
14260 md5_finish_ctx (&ctx, checksum_before);
14261 htab_empty (ht);
14263 ret = fold_1 (expr);
14265 md5_init_ctx (&ctx);
14266 fold_checksum_tree (expr, &ctx, ht);
14267 md5_finish_ctx (&ctx, checksum_after);
14268 htab_delete (ht);
14270 if (memcmp (checksum_before, checksum_after, 16))
14271 fold_check_failed (expr, ret);
14273 return ret;
14276 void
14277 print_fold_checksum (const_tree expr)
14279 struct md5_ctx ctx;
14280 unsigned char checksum[16], cnt;
14281 htab_t ht;
14283 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14284 md5_init_ctx (&ctx);
14285 fold_checksum_tree (expr, &ctx, ht);
14286 md5_finish_ctx (&ctx, checksum);
14287 htab_delete (ht);
14288 for (cnt = 0; cnt < 16; ++cnt)
14289 fprintf (stderr, "%02x", checksum[cnt]);
14290 putc ('\n', stderr);
14293 static void
14294 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
14296 internal_error ("fold check: original tree changed by fold");
14299 static void
14300 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, htab_t ht)
14302 void **slot;
14303 enum tree_code code;
14304 union tree_node buf;
14305 int i, len;
14307 recursive_label:
14308 if (expr == NULL)
14309 return;
14310 slot = (void **) htab_find_slot (ht, expr, INSERT);
14311 if (*slot != NULL)
14312 return;
14313 *slot = CONST_CAST_TREE (expr);
14314 code = TREE_CODE (expr);
14315 if (TREE_CODE_CLASS (code) == tcc_declaration
14316 && DECL_ASSEMBLER_NAME_SET_P (expr))
14318 /* Allow DECL_ASSEMBLER_NAME to be modified. */
14319 memcpy ((char *) &buf, expr, tree_size (expr));
14320 SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
14321 expr = (tree) &buf;
14323 else if (TREE_CODE_CLASS (code) == tcc_type
14324 && (TYPE_POINTER_TO (expr)
14325 || TYPE_REFERENCE_TO (expr)
14326 || TYPE_CACHED_VALUES_P (expr)
14327 || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
14328 || TYPE_NEXT_VARIANT (expr)))
14330 /* Allow these fields to be modified. */
14331 tree tmp;
14332 memcpy ((char *) &buf, expr, tree_size (expr));
14333 expr = tmp = (tree) &buf;
14334 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
14335 TYPE_POINTER_TO (tmp) = NULL;
14336 TYPE_REFERENCE_TO (tmp) = NULL;
14337 TYPE_NEXT_VARIANT (tmp) = NULL;
14338 if (TYPE_CACHED_VALUES_P (tmp))
14340 TYPE_CACHED_VALUES_P (tmp) = 0;
14341 TYPE_CACHED_VALUES (tmp) = NULL;
14344 md5_process_bytes (expr, tree_size (expr), ctx);
14345 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
14346 fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
14347 if (TREE_CODE_CLASS (code) != tcc_type
14348 && TREE_CODE_CLASS (code) != tcc_declaration
14349 && code != TREE_LIST
14350 && code != SSA_NAME
14351 && CODE_CONTAINS_STRUCT (code, TS_COMMON))
14352 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
14353 switch (TREE_CODE_CLASS (code))
14355 case tcc_constant:
14356 switch (code)
14358 case STRING_CST:
14359 md5_process_bytes (TREE_STRING_POINTER (expr),
14360 TREE_STRING_LENGTH (expr), ctx);
14361 break;
14362 case COMPLEX_CST:
14363 fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
14364 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
14365 break;
14366 case VECTOR_CST:
14367 fold_checksum_tree (TREE_VECTOR_CST_ELTS (expr), ctx, ht);
14368 break;
14369 default:
14370 break;
14372 break;
14373 case tcc_exceptional:
14374 switch (code)
14376 case TREE_LIST:
14377 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
14378 fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
14379 expr = TREE_CHAIN (expr);
14380 goto recursive_label;
14381 break;
14382 case TREE_VEC:
14383 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
14384 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
14385 break;
14386 default:
14387 break;
14389 break;
14390 case tcc_expression:
14391 case tcc_reference:
14392 case tcc_comparison:
14393 case tcc_unary:
14394 case tcc_binary:
14395 case tcc_statement:
14396 case tcc_vl_exp:
14397 len = TREE_OPERAND_LENGTH (expr);
14398 for (i = 0; i < len; ++i)
14399 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
14400 break;
14401 case tcc_declaration:
14402 fold_checksum_tree (DECL_NAME (expr), ctx, ht);
14403 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
14404 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
14406 fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
14407 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
14408 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
14409 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
14410 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
14412 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS))
14413 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht);
14415 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
14417 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
14418 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
14419 fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht);
14421 break;
14422 case tcc_type:
14423 if (TREE_CODE (expr) == ENUMERAL_TYPE)
14424 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
14425 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
14426 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
14427 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
14428 fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
14429 if (INTEGRAL_TYPE_P (expr)
14430 || SCALAR_FLOAT_TYPE_P (expr))
14432 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
14433 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
14435 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
14436 if (TREE_CODE (expr) == RECORD_TYPE
14437 || TREE_CODE (expr) == UNION_TYPE
14438 || TREE_CODE (expr) == QUAL_UNION_TYPE)
14439 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
14440 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
14441 break;
14442 default:
14443 break;
14447 /* Helper function for outputting the checksum of a tree T. When
14448 debugging with gdb, you can "define mynext" to be "next" followed
14449 by "call debug_fold_checksum (op0)", then just trace down till the
14450 outputs differ. */
14452 DEBUG_FUNCTION void
14453 debug_fold_checksum (const_tree t)
14455 int i;
14456 unsigned char checksum[16];
14457 struct md5_ctx ctx;
14458 htab_t ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14460 md5_init_ctx (&ctx);
14461 fold_checksum_tree (t, &ctx, ht);
14462 md5_finish_ctx (&ctx, checksum);
14463 htab_empty (ht);
14465 for (i = 0; i < 16; i++)
14466 fprintf (stderr, "%d ", checksum[i]);
14468 fprintf (stderr, "\n");
14471 #endif
14473 /* Fold a unary tree expression with code CODE of type TYPE with an
14474 operand OP0. LOC is the location of the resulting expression.
14475 Return a folded expression if successful. Otherwise, return a tree
14476 expression with code CODE of type TYPE with an operand OP0. */
14478 tree
14479 fold_build1_stat_loc (location_t loc,
14480 enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
14482 tree tem;
14483 #ifdef ENABLE_FOLD_CHECKING
14484 unsigned char checksum_before[16], checksum_after[16];
14485 struct md5_ctx ctx;
14486 htab_t ht;
14488 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14489 md5_init_ctx (&ctx);
14490 fold_checksum_tree (op0, &ctx, ht);
14491 md5_finish_ctx (&ctx, checksum_before);
14492 htab_empty (ht);
14493 #endif
14495 tem = fold_unary_loc (loc, code, type, op0);
14496 if (!tem)
14497 tem = build1_stat_loc (loc, code, type, op0 PASS_MEM_STAT);
14499 #ifdef ENABLE_FOLD_CHECKING
14500 md5_init_ctx (&ctx);
14501 fold_checksum_tree (op0, &ctx, ht);
14502 md5_finish_ctx (&ctx, checksum_after);
14503 htab_delete (ht);
14505 if (memcmp (checksum_before, checksum_after, 16))
14506 fold_check_failed (op0, tem);
14507 #endif
14508 return tem;
14511 /* Fold a binary tree expression with code CODE of type TYPE with
14512 operands OP0 and OP1. LOC is the location of the resulting
14513 expression. Return a folded expression if successful. Otherwise,
14514 return a tree expression with code CODE of type TYPE with operands
14515 OP0 and OP1. */
14517 tree
14518 fold_build2_stat_loc (location_t loc,
14519 enum tree_code code, tree type, tree op0, tree op1
14520 MEM_STAT_DECL)
14522 tree tem;
14523 #ifdef ENABLE_FOLD_CHECKING
14524 unsigned char checksum_before_op0[16],
14525 checksum_before_op1[16],
14526 checksum_after_op0[16],
14527 checksum_after_op1[16];
14528 struct md5_ctx ctx;
14529 htab_t ht;
14531 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14532 md5_init_ctx (&ctx);
14533 fold_checksum_tree (op0, &ctx, ht);
14534 md5_finish_ctx (&ctx, checksum_before_op0);
14535 htab_empty (ht);
14537 md5_init_ctx (&ctx);
14538 fold_checksum_tree (op1, &ctx, ht);
14539 md5_finish_ctx (&ctx, checksum_before_op1);
14540 htab_empty (ht);
14541 #endif
14543 tem = fold_binary_loc (loc, code, type, op0, op1);
14544 if (!tem)
14545 tem = build2_stat_loc (loc, code, type, op0, op1 PASS_MEM_STAT);
14547 #ifdef ENABLE_FOLD_CHECKING
14548 md5_init_ctx (&ctx);
14549 fold_checksum_tree (op0, &ctx, ht);
14550 md5_finish_ctx (&ctx, checksum_after_op0);
14551 htab_empty (ht);
14553 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14554 fold_check_failed (op0, tem);
14556 md5_init_ctx (&ctx);
14557 fold_checksum_tree (op1, &ctx, ht);
14558 md5_finish_ctx (&ctx, checksum_after_op1);
14559 htab_delete (ht);
14561 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14562 fold_check_failed (op1, tem);
14563 #endif
14564 return tem;
14567 /* Fold a ternary tree expression with code CODE of type TYPE with
14568 operands OP0, OP1, and OP2. Return a folded expression if
14569 successful. Otherwise, return a tree expression with code CODE of
14570 type TYPE with operands OP0, OP1, and OP2. */
14572 tree
14573 fold_build3_stat_loc (location_t loc, enum tree_code code, tree type,
14574 tree op0, tree op1, tree op2 MEM_STAT_DECL)
14576 tree tem;
14577 #ifdef ENABLE_FOLD_CHECKING
14578 unsigned char checksum_before_op0[16],
14579 checksum_before_op1[16],
14580 checksum_before_op2[16],
14581 checksum_after_op0[16],
14582 checksum_after_op1[16],
14583 checksum_after_op2[16];
14584 struct md5_ctx ctx;
14585 htab_t ht;
14587 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14588 md5_init_ctx (&ctx);
14589 fold_checksum_tree (op0, &ctx, ht);
14590 md5_finish_ctx (&ctx, checksum_before_op0);
14591 htab_empty (ht);
14593 md5_init_ctx (&ctx);
14594 fold_checksum_tree (op1, &ctx, ht);
14595 md5_finish_ctx (&ctx, checksum_before_op1);
14596 htab_empty (ht);
14598 md5_init_ctx (&ctx);
14599 fold_checksum_tree (op2, &ctx, ht);
14600 md5_finish_ctx (&ctx, checksum_before_op2);
14601 htab_empty (ht);
14602 #endif
14604 gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14605 tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14606 if (!tem)
14607 tem = build3_stat_loc (loc, code, type, op0, op1, op2 PASS_MEM_STAT);
14609 #ifdef ENABLE_FOLD_CHECKING
14610 md5_init_ctx (&ctx);
14611 fold_checksum_tree (op0, &ctx, ht);
14612 md5_finish_ctx (&ctx, checksum_after_op0);
14613 htab_empty (ht);
14615 if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14616 fold_check_failed (op0, tem);
14618 md5_init_ctx (&ctx);
14619 fold_checksum_tree (op1, &ctx, ht);
14620 md5_finish_ctx (&ctx, checksum_after_op1);
14621 htab_empty (ht);
14623 if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14624 fold_check_failed (op1, tem);
14626 md5_init_ctx (&ctx);
14627 fold_checksum_tree (op2, &ctx, ht);
14628 md5_finish_ctx (&ctx, checksum_after_op2);
14629 htab_delete (ht);
14631 if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14632 fold_check_failed (op2, tem);
14633 #endif
14634 return tem;
14637 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14638 arguments in ARGARRAY, and a null static chain.
14639 Return a folded expression if successful. Otherwise, return a CALL_EXPR
14640 of type TYPE from the given operands as constructed by build_call_array. */
14642 tree
14643 fold_build_call_array_loc (location_t loc, tree type, tree fn,
14644 int nargs, tree *argarray)
14646 tree tem;
14647 #ifdef ENABLE_FOLD_CHECKING
14648 unsigned char checksum_before_fn[16],
14649 checksum_before_arglist[16],
14650 checksum_after_fn[16],
14651 checksum_after_arglist[16];
14652 struct md5_ctx ctx;
14653 htab_t ht;
14654 int i;
14656 ht = htab_create (32, htab_hash_pointer, htab_eq_pointer, NULL);
14657 md5_init_ctx (&ctx);
14658 fold_checksum_tree (fn, &ctx, ht);
14659 md5_finish_ctx (&ctx, checksum_before_fn);
14660 htab_empty (ht);
14662 md5_init_ctx (&ctx);
14663 for (i = 0; i < nargs; i++)
14664 fold_checksum_tree (argarray[i], &ctx, ht);
14665 md5_finish_ctx (&ctx, checksum_before_arglist);
14666 htab_empty (ht);
14667 #endif
14669 tem = fold_builtin_call_array (loc, type, fn, nargs, argarray);
14671 #ifdef ENABLE_FOLD_CHECKING
14672 md5_init_ctx (&ctx);
14673 fold_checksum_tree (fn, &ctx, ht);
14674 md5_finish_ctx (&ctx, checksum_after_fn);
14675 htab_empty (ht);
14677 if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14678 fold_check_failed (fn, tem);
14680 md5_init_ctx (&ctx);
14681 for (i = 0; i < nargs; i++)
14682 fold_checksum_tree (argarray[i], &ctx, ht);
14683 md5_finish_ctx (&ctx, checksum_after_arglist);
14684 htab_delete (ht);
14686 if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14687 fold_check_failed (NULL_TREE, tem);
14688 #endif
14689 return tem;
14692 /* Perform constant folding and related simplification of initializer
14693 expression EXPR. These behave identically to "fold_buildN" but ignore
14694 potential run-time traps and exceptions that fold must preserve. */
14696 #define START_FOLD_INIT \
14697 int saved_signaling_nans = flag_signaling_nans;\
14698 int saved_trapping_math = flag_trapping_math;\
14699 int saved_rounding_math = flag_rounding_math;\
14700 int saved_trapv = flag_trapv;\
14701 int saved_folding_initializer = folding_initializer;\
14702 flag_signaling_nans = 0;\
14703 flag_trapping_math = 0;\
14704 flag_rounding_math = 0;\
14705 flag_trapv = 0;\
14706 folding_initializer = 1;
14708 #define END_FOLD_INIT \
14709 flag_signaling_nans = saved_signaling_nans;\
14710 flag_trapping_math = saved_trapping_math;\
14711 flag_rounding_math = saved_rounding_math;\
14712 flag_trapv = saved_trapv;\
14713 folding_initializer = saved_folding_initializer;
14715 tree
14716 fold_build1_initializer_loc (location_t loc, enum tree_code code,
14717 tree type, tree op)
14719 tree result;
14720 START_FOLD_INIT;
14722 result = fold_build1_loc (loc, code, type, op);
14724 END_FOLD_INIT;
14725 return result;
14728 tree
14729 fold_build2_initializer_loc (location_t loc, enum tree_code code,
14730 tree type, tree op0, tree op1)
14732 tree result;
14733 START_FOLD_INIT;
14735 result = fold_build2_loc (loc, code, type, op0, op1);
14737 END_FOLD_INIT;
14738 return result;
14741 tree
14742 fold_build3_initializer_loc (location_t loc, enum tree_code code,
14743 tree type, tree op0, tree op1, tree op2)
14745 tree result;
14746 START_FOLD_INIT;
14748 result = fold_build3_loc (loc, code, type, op0, op1, op2);
14750 END_FOLD_INIT;
14751 return result;
14754 tree
14755 fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn,
14756 int nargs, tree *argarray)
14758 tree result;
14759 START_FOLD_INIT;
14761 result = fold_build_call_array_loc (loc, type, fn, nargs, argarray);
14763 END_FOLD_INIT;
14764 return result;
14767 #undef START_FOLD_INIT
14768 #undef END_FOLD_INIT
14770 /* Determine if first argument is a multiple of second argument. Return 0 if
14771 it is not, or we cannot easily determined it to be.
14773 An example of the sort of thing we care about (at this point; this routine
14774 could surely be made more general, and expanded to do what the *_DIV_EXPR's
14775 fold cases do now) is discovering that
14777 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14779 is a multiple of
14781 SAVE_EXPR (J * 8)
14783 when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14785 This code also handles discovering that
14787 SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14789 is a multiple of 8 so we don't have to worry about dealing with a
14790 possible remainder.
14792 Note that we *look* inside a SAVE_EXPR only to determine how it was
14793 calculated; it is not safe for fold to do much of anything else with the
14794 internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14795 at run time. For example, the latter example above *cannot* be implemented
14796 as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14797 evaluation time of the original SAVE_EXPR is not necessarily the same at
14798 the time the new expression is evaluated. The only optimization of this
14799 sort that would be valid is changing
14801 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14803 divided by 8 to
14805 SAVE_EXPR (I) * SAVE_EXPR (J)
14807 (where the same SAVE_EXPR (J) is used in the original and the
14808 transformed version). */
14811 multiple_of_p (tree type, const_tree top, const_tree bottom)
14813 if (operand_equal_p (top, bottom, 0))
14814 return 1;
14816 if (TREE_CODE (type) != INTEGER_TYPE)
14817 return 0;
14819 switch (TREE_CODE (top))
14821 case BIT_AND_EXPR:
14822 /* Bitwise and provides a power of two multiple. If the mask is
14823 a multiple of BOTTOM then TOP is a multiple of BOTTOM. */
14824 if (!integer_pow2p (bottom))
14825 return 0;
14826 /* FALLTHRU */
14828 case MULT_EXPR:
14829 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14830 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14832 case PLUS_EXPR:
14833 case MINUS_EXPR:
14834 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14835 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14837 case LSHIFT_EXPR:
14838 if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14840 tree op1, t1;
14842 op1 = TREE_OPERAND (top, 1);
14843 /* const_binop may not detect overflow correctly,
14844 so check for it explicitly here. */
14845 if (TYPE_PRECISION (TREE_TYPE (size_one_node))
14846 > TREE_INT_CST_LOW (op1)
14847 && TREE_INT_CST_HIGH (op1) == 0
14848 && 0 != (t1 = fold_convert (type,
14849 const_binop (LSHIFT_EXPR,
14850 size_one_node,
14851 op1)))
14852 && !TREE_OVERFLOW (t1))
14853 return multiple_of_p (type, t1, bottom);
14855 return 0;
14857 case NOP_EXPR:
14858 /* Can't handle conversions from non-integral or wider integral type. */
14859 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14860 || (TYPE_PRECISION (type)
14861 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14862 return 0;
14864 /* .. fall through ... */
14866 case SAVE_EXPR:
14867 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14869 case COND_EXPR:
14870 return (multiple_of_p (type, TREE_OPERAND (top, 1), bottom)
14871 && multiple_of_p (type, TREE_OPERAND (top, 2), bottom));
14873 case INTEGER_CST:
14874 if (TREE_CODE (bottom) != INTEGER_CST
14875 || integer_zerop (bottom)
14876 || (TYPE_UNSIGNED (type)
14877 && (tree_int_cst_sgn (top) < 0
14878 || tree_int_cst_sgn (bottom) < 0)))
14879 return 0;
14880 return integer_zerop (int_const_binop (TRUNC_MOD_EXPR,
14881 top, bottom));
14883 default:
14884 return 0;
14888 /* Return true if CODE or TYPE is known to be non-negative. */
14890 static bool
14891 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14893 if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14894 && truth_value_p (code))
14895 /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14896 have a signed:1 type (where the value is -1 and 0). */
14897 return true;
14898 return false;
14901 /* Return true if (CODE OP0) is known to be non-negative. If the return
14902 value is based on the assumption that signed overflow is undefined,
14903 set *STRICT_OVERFLOW_P to true; otherwise, don't change
14904 *STRICT_OVERFLOW_P. */
14906 bool
14907 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14908 bool *strict_overflow_p)
14910 if (TYPE_UNSIGNED (type))
14911 return true;
14913 switch (code)
14915 case ABS_EXPR:
14916 /* We can't return 1 if flag_wrapv is set because
14917 ABS_EXPR<INT_MIN> = INT_MIN. */
14918 if (!INTEGRAL_TYPE_P (type))
14919 return true;
14920 if (TYPE_OVERFLOW_UNDEFINED (type))
14922 *strict_overflow_p = true;
14923 return true;
14925 break;
14927 case NON_LVALUE_EXPR:
14928 case FLOAT_EXPR:
14929 case FIX_TRUNC_EXPR:
14930 return tree_expr_nonnegative_warnv_p (op0,
14931 strict_overflow_p);
14933 case NOP_EXPR:
14935 tree inner_type = TREE_TYPE (op0);
14936 tree outer_type = type;
14938 if (TREE_CODE (outer_type) == REAL_TYPE)
14940 if (TREE_CODE (inner_type) == REAL_TYPE)
14941 return tree_expr_nonnegative_warnv_p (op0,
14942 strict_overflow_p);
14943 if (TREE_CODE (inner_type) == INTEGER_TYPE)
14945 if (TYPE_UNSIGNED (inner_type))
14946 return true;
14947 return tree_expr_nonnegative_warnv_p (op0,
14948 strict_overflow_p);
14951 else if (TREE_CODE (outer_type) == INTEGER_TYPE)
14953 if (TREE_CODE (inner_type) == REAL_TYPE)
14954 return tree_expr_nonnegative_warnv_p (op0,
14955 strict_overflow_p);
14956 if (TREE_CODE (inner_type) == INTEGER_TYPE)
14957 return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14958 && TYPE_UNSIGNED (inner_type);
14961 break;
14963 default:
14964 return tree_simple_nonnegative_warnv_p (code, type);
14967 /* We don't know sign of `t', so be conservative and return false. */
14968 return false;
14971 /* Return true if (CODE OP0 OP1) is known to be non-negative. If the return
14972 value is based on the assumption that signed overflow is undefined,
14973 set *STRICT_OVERFLOW_P to true; otherwise, don't change
14974 *STRICT_OVERFLOW_P. */
14976 bool
14977 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14978 tree op1, bool *strict_overflow_p)
14980 if (TYPE_UNSIGNED (type))
14981 return true;
14983 switch (code)
14985 case POINTER_PLUS_EXPR:
14986 case PLUS_EXPR:
14987 if (FLOAT_TYPE_P (type))
14988 return (tree_expr_nonnegative_warnv_p (op0,
14989 strict_overflow_p)
14990 && tree_expr_nonnegative_warnv_p (op1,
14991 strict_overflow_p));
14993 /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14994 both unsigned and at least 2 bits shorter than the result. */
14995 if (TREE_CODE (type) == INTEGER_TYPE
14996 && TREE_CODE (op0) == NOP_EXPR
14997 && TREE_CODE (op1) == NOP_EXPR)
14999 tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
15000 tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
15001 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
15002 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
15004 unsigned int prec = MAX (TYPE_PRECISION (inner1),
15005 TYPE_PRECISION (inner2)) + 1;
15006 return prec < TYPE_PRECISION (type);
15009 break;
15011 case MULT_EXPR:
15012 if (FLOAT_TYPE_P (type))
15014 /* x * x for floating point x is always non-negative. */
15015 if (operand_equal_p (op0, op1, 0))
15016 return true;
15017 return (tree_expr_nonnegative_warnv_p (op0,
15018 strict_overflow_p)
15019 && tree_expr_nonnegative_warnv_p (op1,
15020 strict_overflow_p));
15023 /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
15024 both unsigned and their total bits is shorter than the result. */
15025 if (TREE_CODE (type) == INTEGER_TYPE
15026 && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
15027 && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
15029 tree inner0 = (TREE_CODE (op0) == NOP_EXPR)
15030 ? TREE_TYPE (TREE_OPERAND (op0, 0))
15031 : TREE_TYPE (op0);
15032 tree inner1 = (TREE_CODE (op1) == NOP_EXPR)
15033 ? TREE_TYPE (TREE_OPERAND (op1, 0))
15034 : TREE_TYPE (op1);
15036 bool unsigned0 = TYPE_UNSIGNED (inner0);
15037 bool unsigned1 = TYPE_UNSIGNED (inner1);
15039 if (TREE_CODE (op0) == INTEGER_CST)
15040 unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
15042 if (TREE_CODE (op1) == INTEGER_CST)
15043 unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
15045 if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
15046 && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
15048 unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
15049 ? tree_int_cst_min_precision (op0, /*unsignedp=*/true)
15050 : TYPE_PRECISION (inner0);
15052 unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
15053 ? tree_int_cst_min_precision (op1, /*unsignedp=*/true)
15054 : TYPE_PRECISION (inner1);
15056 return precision0 + precision1 < TYPE_PRECISION (type);
15059 return false;
15061 case BIT_AND_EXPR:
15062 case MAX_EXPR:
15063 return (tree_expr_nonnegative_warnv_p (op0,
15064 strict_overflow_p)
15065 || tree_expr_nonnegative_warnv_p (op1,
15066 strict_overflow_p));
15068 case BIT_IOR_EXPR:
15069 case BIT_XOR_EXPR:
15070 case MIN_EXPR:
15071 case RDIV_EXPR:
15072 case TRUNC_DIV_EXPR:
15073 case CEIL_DIV_EXPR:
15074 case FLOOR_DIV_EXPR:
15075 case ROUND_DIV_EXPR:
15076 return (tree_expr_nonnegative_warnv_p (op0,
15077 strict_overflow_p)
15078 && tree_expr_nonnegative_warnv_p (op1,
15079 strict_overflow_p));
15081 case TRUNC_MOD_EXPR:
15082 case CEIL_MOD_EXPR:
15083 case FLOOR_MOD_EXPR:
15084 case ROUND_MOD_EXPR:
15085 return tree_expr_nonnegative_warnv_p (op0,
15086 strict_overflow_p);
15087 default:
15088 return tree_simple_nonnegative_warnv_p (code, type);
15091 /* We don't know sign of `t', so be conservative and return false. */
15092 return false;
15095 /* Return true if T is known to be non-negative. If the return
15096 value is based on the assumption that signed overflow is undefined,
15097 set *STRICT_OVERFLOW_P to true; otherwise, don't change
15098 *STRICT_OVERFLOW_P. */
15100 bool
15101 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15103 if (TYPE_UNSIGNED (TREE_TYPE (t)))
15104 return true;
15106 switch (TREE_CODE (t))
15108 case INTEGER_CST:
15109 return tree_int_cst_sgn (t) >= 0;
15111 case REAL_CST:
15112 return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
15114 case FIXED_CST:
15115 return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
15117 case COND_EXPR:
15118 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15119 strict_overflow_p)
15120 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
15121 strict_overflow_p));
15122 default:
15123 return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15124 TREE_TYPE (t));
15126 /* We don't know sign of `t', so be conservative and return false. */
15127 return false;
15130 /* Return true if T is known to be non-negative. If the return
15131 value is based on the assumption that signed overflow is undefined,
15132 set *STRICT_OVERFLOW_P to true; otherwise, don't change
15133 *STRICT_OVERFLOW_P. */
15135 bool
15136 tree_call_nonnegative_warnv_p (tree type, tree fndecl,
15137 tree arg0, tree arg1, bool *strict_overflow_p)
15139 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
15140 switch (DECL_FUNCTION_CODE (fndecl))
15142 CASE_FLT_FN (BUILT_IN_ACOS):
15143 CASE_FLT_FN (BUILT_IN_ACOSH):
15144 CASE_FLT_FN (BUILT_IN_CABS):
15145 CASE_FLT_FN (BUILT_IN_COSH):
15146 CASE_FLT_FN (BUILT_IN_ERFC):
15147 CASE_FLT_FN (BUILT_IN_EXP):
15148 CASE_FLT_FN (BUILT_IN_EXP10):
15149 CASE_FLT_FN (BUILT_IN_EXP2):
15150 CASE_FLT_FN (BUILT_IN_FABS):
15151 CASE_FLT_FN (BUILT_IN_FDIM):
15152 CASE_FLT_FN (BUILT_IN_HYPOT):
15153 CASE_FLT_FN (BUILT_IN_POW10):
15154 CASE_INT_FN (BUILT_IN_FFS):
15155 CASE_INT_FN (BUILT_IN_PARITY):
15156 CASE_INT_FN (BUILT_IN_POPCOUNT):
15157 case BUILT_IN_BSWAP32:
15158 case BUILT_IN_BSWAP64:
15159 /* Always true. */
15160 return true;
15162 CASE_FLT_FN (BUILT_IN_SQRT):
15163 /* sqrt(-0.0) is -0.0. */
15164 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)))
15165 return true;
15166 return tree_expr_nonnegative_warnv_p (arg0,
15167 strict_overflow_p);
15169 CASE_FLT_FN (BUILT_IN_ASINH):
15170 CASE_FLT_FN (BUILT_IN_ATAN):
15171 CASE_FLT_FN (BUILT_IN_ATANH):
15172 CASE_FLT_FN (BUILT_IN_CBRT):
15173 CASE_FLT_FN (BUILT_IN_CEIL):
15174 CASE_FLT_FN (BUILT_IN_ERF):
15175 CASE_FLT_FN (BUILT_IN_EXPM1):
15176 CASE_FLT_FN (BUILT_IN_FLOOR):
15177 CASE_FLT_FN (BUILT_IN_FMOD):
15178 CASE_FLT_FN (BUILT_IN_FREXP):
15179 CASE_FLT_FN (BUILT_IN_ICEIL):
15180 CASE_FLT_FN (BUILT_IN_IFLOOR):
15181 CASE_FLT_FN (BUILT_IN_IRINT):
15182 CASE_FLT_FN (BUILT_IN_IROUND):
15183 CASE_FLT_FN (BUILT_IN_LCEIL):
15184 CASE_FLT_FN (BUILT_IN_LDEXP):
15185 CASE_FLT_FN (BUILT_IN_LFLOOR):
15186 CASE_FLT_FN (BUILT_IN_LLCEIL):
15187 CASE_FLT_FN (BUILT_IN_LLFLOOR):
15188 CASE_FLT_FN (BUILT_IN_LLRINT):
15189 CASE_FLT_FN (BUILT_IN_LLROUND):
15190 CASE_FLT_FN (BUILT_IN_LRINT):
15191 CASE_FLT_FN (BUILT_IN_LROUND):
15192 CASE_FLT_FN (BUILT_IN_MODF):
15193 CASE_FLT_FN (BUILT_IN_NEARBYINT):
15194 CASE_FLT_FN (BUILT_IN_RINT):
15195 CASE_FLT_FN (BUILT_IN_ROUND):
15196 CASE_FLT_FN (BUILT_IN_SCALB):
15197 CASE_FLT_FN (BUILT_IN_SCALBLN):
15198 CASE_FLT_FN (BUILT_IN_SCALBN):
15199 CASE_FLT_FN (BUILT_IN_SIGNBIT):
15200 CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
15201 CASE_FLT_FN (BUILT_IN_SINH):
15202 CASE_FLT_FN (BUILT_IN_TANH):
15203 CASE_FLT_FN (BUILT_IN_TRUNC):
15204 /* True if the 1st argument is nonnegative. */
15205 return tree_expr_nonnegative_warnv_p (arg0,
15206 strict_overflow_p);
15208 CASE_FLT_FN (BUILT_IN_FMAX):
15209 /* True if the 1st OR 2nd arguments are nonnegative. */
15210 return (tree_expr_nonnegative_warnv_p (arg0,
15211 strict_overflow_p)
15212 || (tree_expr_nonnegative_warnv_p (arg1,
15213 strict_overflow_p)));
15215 CASE_FLT_FN (BUILT_IN_FMIN):
15216 /* True if the 1st AND 2nd arguments are nonnegative. */
15217 return (tree_expr_nonnegative_warnv_p (arg0,
15218 strict_overflow_p)
15219 && (tree_expr_nonnegative_warnv_p (arg1,
15220 strict_overflow_p)));
15222 CASE_FLT_FN (BUILT_IN_COPYSIGN):
15223 /* True if the 2nd argument is nonnegative. */
15224 return tree_expr_nonnegative_warnv_p (arg1,
15225 strict_overflow_p);
15227 CASE_FLT_FN (BUILT_IN_POWI):
15228 /* True if the 1st argument is nonnegative or the second
15229 argument is an even integer. */
15230 if (TREE_CODE (arg1) == INTEGER_CST
15231 && (TREE_INT_CST_LOW (arg1) & 1) == 0)
15232 return true;
15233 return tree_expr_nonnegative_warnv_p (arg0,
15234 strict_overflow_p);
15236 CASE_FLT_FN (BUILT_IN_POW):
15237 /* True if the 1st argument is nonnegative or the second
15238 argument is an even integer valued real. */
15239 if (TREE_CODE (arg1) == REAL_CST)
15241 REAL_VALUE_TYPE c;
15242 HOST_WIDE_INT n;
15244 c = TREE_REAL_CST (arg1);
15245 n = real_to_integer (&c);
15246 if ((n & 1) == 0)
15248 REAL_VALUE_TYPE cint;
15249 real_from_integer (&cint, VOIDmode, n,
15250 n < 0 ? -1 : 0, 0);
15251 if (real_identical (&c, &cint))
15252 return true;
15255 return tree_expr_nonnegative_warnv_p (arg0,
15256 strict_overflow_p);
15258 default:
15259 break;
15261 return tree_simple_nonnegative_warnv_p (CALL_EXPR,
15262 type);
15265 /* Return true if T is known to be non-negative. If the return
15266 value is based on the assumption that signed overflow is undefined,
15267 set *STRICT_OVERFLOW_P to true; otherwise, don't change
15268 *STRICT_OVERFLOW_P. */
15270 bool
15271 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15273 enum tree_code code = TREE_CODE (t);
15274 if (TYPE_UNSIGNED (TREE_TYPE (t)))
15275 return true;
15277 switch (code)
15279 case TARGET_EXPR:
15281 tree temp = TARGET_EXPR_SLOT (t);
15282 t = TARGET_EXPR_INITIAL (t);
15284 /* If the initializer is non-void, then it's a normal expression
15285 that will be assigned to the slot. */
15286 if (!VOID_TYPE_P (t))
15287 return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
15289 /* Otherwise, the initializer sets the slot in some way. One common
15290 way is an assignment statement at the end of the initializer. */
15291 while (1)
15293 if (TREE_CODE (t) == BIND_EXPR)
15294 t = expr_last (BIND_EXPR_BODY (t));
15295 else if (TREE_CODE (t) == TRY_FINALLY_EXPR
15296 || TREE_CODE (t) == TRY_CATCH_EXPR)
15297 t = expr_last (TREE_OPERAND (t, 0));
15298 else if (TREE_CODE (t) == STATEMENT_LIST)
15299 t = expr_last (t);
15300 else
15301 break;
15303 if (TREE_CODE (t) == MODIFY_EXPR
15304 && TREE_OPERAND (t, 0) == temp)
15305 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15306 strict_overflow_p);
15308 return false;
15311 case CALL_EXPR:
15313 tree arg0 = call_expr_nargs (t) > 0 ? CALL_EXPR_ARG (t, 0) : NULL_TREE;
15314 tree arg1 = call_expr_nargs (t) > 1 ? CALL_EXPR_ARG (t, 1) : NULL_TREE;
15316 return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
15317 get_callee_fndecl (t),
15318 arg0,
15319 arg1,
15320 strict_overflow_p);
15322 case COMPOUND_EXPR:
15323 case MODIFY_EXPR:
15324 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15325 strict_overflow_p);
15326 case BIND_EXPR:
15327 return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
15328 strict_overflow_p);
15329 case SAVE_EXPR:
15330 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
15331 strict_overflow_p);
15333 default:
15334 return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15335 TREE_TYPE (t));
15338 /* We don't know sign of `t', so be conservative and return false. */
15339 return false;
15342 /* Return true if T is known to be non-negative. If the return
15343 value is based on the assumption that signed overflow is undefined,
15344 set *STRICT_OVERFLOW_P to true; otherwise, don't change
15345 *STRICT_OVERFLOW_P. */
15347 bool
15348 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15350 enum tree_code code;
15351 if (t == error_mark_node)
15352 return false;
15354 code = TREE_CODE (t);
15355 switch (TREE_CODE_CLASS (code))
15357 case tcc_binary:
15358 case tcc_comparison:
15359 return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15360 TREE_TYPE (t),
15361 TREE_OPERAND (t, 0),
15362 TREE_OPERAND (t, 1),
15363 strict_overflow_p);
15365 case tcc_unary:
15366 return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15367 TREE_TYPE (t),
15368 TREE_OPERAND (t, 0),
15369 strict_overflow_p);
15371 case tcc_constant:
15372 case tcc_declaration:
15373 case tcc_reference:
15374 return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15376 default:
15377 break;
15380 switch (code)
15382 case TRUTH_AND_EXPR:
15383 case TRUTH_OR_EXPR:
15384 case TRUTH_XOR_EXPR:
15385 return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15386 TREE_TYPE (t),
15387 TREE_OPERAND (t, 0),
15388 TREE_OPERAND (t, 1),
15389 strict_overflow_p);
15390 case TRUTH_NOT_EXPR:
15391 return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15392 TREE_TYPE (t),
15393 TREE_OPERAND (t, 0),
15394 strict_overflow_p);
15396 case COND_EXPR:
15397 case CONSTRUCTOR:
15398 case OBJ_TYPE_REF:
15399 case ASSERT_EXPR:
15400 case ADDR_EXPR:
15401 case WITH_SIZE_EXPR:
15402 case SSA_NAME:
15403 return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15405 default:
15406 return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
15410 /* Return true if `t' is known to be non-negative. Handle warnings
15411 about undefined signed overflow. */
15413 bool
15414 tree_expr_nonnegative_p (tree t)
15416 bool ret, strict_overflow_p;
15418 strict_overflow_p = false;
15419 ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
15420 if (strict_overflow_p)
15421 fold_overflow_warning (("assuming signed overflow does not occur when "
15422 "determining that expression is always "
15423 "non-negative"),
15424 WARN_STRICT_OVERFLOW_MISC);
15425 return ret;
15429 /* Return true when (CODE OP0) is an address and is known to be nonzero.
15430 For floating point we further ensure that T is not denormal.
15431 Similar logic is present in nonzero_address in rtlanal.h.
15433 If the return value is based on the assumption that signed overflow
15434 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15435 change *STRICT_OVERFLOW_P. */
15437 bool
15438 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
15439 bool *strict_overflow_p)
15441 switch (code)
15443 case ABS_EXPR:
15444 return tree_expr_nonzero_warnv_p (op0,
15445 strict_overflow_p);
15447 case NOP_EXPR:
15449 tree inner_type = TREE_TYPE (op0);
15450 tree outer_type = type;
15452 return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
15453 && tree_expr_nonzero_warnv_p (op0,
15454 strict_overflow_p));
15456 break;
15458 case NON_LVALUE_EXPR:
15459 return tree_expr_nonzero_warnv_p (op0,
15460 strict_overflow_p);
15462 default:
15463 break;
15466 return false;
15469 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
15470 For floating point we further ensure that T is not denormal.
15471 Similar logic is present in nonzero_address in rtlanal.h.
15473 If the return value is based on the assumption that signed overflow
15474 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15475 change *STRICT_OVERFLOW_P. */
15477 bool
15478 tree_binary_nonzero_warnv_p (enum tree_code code,
15479 tree type,
15480 tree op0,
15481 tree op1, bool *strict_overflow_p)
15483 bool sub_strict_overflow_p;
15484 switch (code)
15486 case POINTER_PLUS_EXPR:
15487 case PLUS_EXPR:
15488 if (TYPE_OVERFLOW_UNDEFINED (type))
15490 /* With the presence of negative values it is hard
15491 to say something. */
15492 sub_strict_overflow_p = false;
15493 if (!tree_expr_nonnegative_warnv_p (op0,
15494 &sub_strict_overflow_p)
15495 || !tree_expr_nonnegative_warnv_p (op1,
15496 &sub_strict_overflow_p))
15497 return false;
15498 /* One of operands must be positive and the other non-negative. */
15499 /* We don't set *STRICT_OVERFLOW_P here: even if this value
15500 overflows, on a twos-complement machine the sum of two
15501 nonnegative numbers can never be zero. */
15502 return (tree_expr_nonzero_warnv_p (op0,
15503 strict_overflow_p)
15504 || tree_expr_nonzero_warnv_p (op1,
15505 strict_overflow_p));
15507 break;
15509 case MULT_EXPR:
15510 if (TYPE_OVERFLOW_UNDEFINED (type))
15512 if (tree_expr_nonzero_warnv_p (op0,
15513 strict_overflow_p)
15514 && tree_expr_nonzero_warnv_p (op1,
15515 strict_overflow_p))
15517 *strict_overflow_p = true;
15518 return true;
15521 break;
15523 case MIN_EXPR:
15524 sub_strict_overflow_p = false;
15525 if (tree_expr_nonzero_warnv_p (op0,
15526 &sub_strict_overflow_p)
15527 && tree_expr_nonzero_warnv_p (op1,
15528 &sub_strict_overflow_p))
15530 if (sub_strict_overflow_p)
15531 *strict_overflow_p = true;
15533 break;
15535 case MAX_EXPR:
15536 sub_strict_overflow_p = false;
15537 if (tree_expr_nonzero_warnv_p (op0,
15538 &sub_strict_overflow_p))
15540 if (sub_strict_overflow_p)
15541 *strict_overflow_p = true;
15543 /* When both operands are nonzero, then MAX must be too. */
15544 if (tree_expr_nonzero_warnv_p (op1,
15545 strict_overflow_p))
15546 return true;
15548 /* MAX where operand 0 is positive is positive. */
15549 return tree_expr_nonnegative_warnv_p (op0,
15550 strict_overflow_p);
15552 /* MAX where operand 1 is positive is positive. */
15553 else if (tree_expr_nonzero_warnv_p (op1,
15554 &sub_strict_overflow_p)
15555 && tree_expr_nonnegative_warnv_p (op1,
15556 &sub_strict_overflow_p))
15558 if (sub_strict_overflow_p)
15559 *strict_overflow_p = true;
15560 return true;
15562 break;
15564 case BIT_IOR_EXPR:
15565 return (tree_expr_nonzero_warnv_p (op1,
15566 strict_overflow_p)
15567 || tree_expr_nonzero_warnv_p (op0,
15568 strict_overflow_p));
15570 default:
15571 break;
15574 return false;
15577 /* Return true when T is an address and is known to be nonzero.
15578 For floating point we further ensure that T is not denormal.
15579 Similar logic is present in nonzero_address in rtlanal.h.
15581 If the return value is based on the assumption that signed overflow
15582 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15583 change *STRICT_OVERFLOW_P. */
15585 bool
15586 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15588 bool sub_strict_overflow_p;
15589 switch (TREE_CODE (t))
15591 case INTEGER_CST:
15592 return !integer_zerop (t);
15594 case ADDR_EXPR:
15596 tree base = TREE_OPERAND (t, 0);
15597 if (!DECL_P (base))
15598 base = get_base_address (base);
15600 if (!base)
15601 return false;
15603 /* Weak declarations may link to NULL. Other things may also be NULL
15604 so protect with -fdelete-null-pointer-checks; but not variables
15605 allocated on the stack. */
15606 if (DECL_P (base)
15607 && (flag_delete_null_pointer_checks
15608 || (DECL_CONTEXT (base)
15609 && TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
15610 && auto_var_in_fn_p (base, DECL_CONTEXT (base)))))
15611 return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base);
15613 /* Constants are never weak. */
15614 if (CONSTANT_CLASS_P (base))
15615 return true;
15617 return false;
15620 case COND_EXPR:
15621 sub_strict_overflow_p = false;
15622 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15623 &sub_strict_overflow_p)
15624 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15625 &sub_strict_overflow_p))
15627 if (sub_strict_overflow_p)
15628 *strict_overflow_p = true;
15629 return true;
15631 break;
15633 default:
15634 break;
15636 return false;
15639 /* Return true when T is an address and is known to be nonzero.
15640 For floating point we further ensure that T is not denormal.
15641 Similar logic is present in nonzero_address in rtlanal.h.
15643 If the return value is based on the assumption that signed overflow
15644 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15645 change *STRICT_OVERFLOW_P. */
15647 bool
15648 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15650 tree type = TREE_TYPE (t);
15651 enum tree_code code;
15653 /* Doing something useful for floating point would need more work. */
15654 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
15655 return false;
15657 code = TREE_CODE (t);
15658 switch (TREE_CODE_CLASS (code))
15660 case tcc_unary:
15661 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15662 strict_overflow_p);
15663 case tcc_binary:
15664 case tcc_comparison:
15665 return tree_binary_nonzero_warnv_p (code, type,
15666 TREE_OPERAND (t, 0),
15667 TREE_OPERAND (t, 1),
15668 strict_overflow_p);
15669 case tcc_constant:
15670 case tcc_declaration:
15671 case tcc_reference:
15672 return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15674 default:
15675 break;
15678 switch (code)
15680 case TRUTH_NOT_EXPR:
15681 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
15682 strict_overflow_p);
15684 case TRUTH_AND_EXPR:
15685 case TRUTH_OR_EXPR:
15686 case TRUTH_XOR_EXPR:
15687 return tree_binary_nonzero_warnv_p (code, type,
15688 TREE_OPERAND (t, 0),
15689 TREE_OPERAND (t, 1),
15690 strict_overflow_p);
15692 case COND_EXPR:
15693 case CONSTRUCTOR:
15694 case OBJ_TYPE_REF:
15695 case ASSERT_EXPR:
15696 case ADDR_EXPR:
15697 case WITH_SIZE_EXPR:
15698 case SSA_NAME:
15699 return tree_single_nonzero_warnv_p (t, strict_overflow_p);
15701 case COMPOUND_EXPR:
15702 case MODIFY_EXPR:
15703 case BIND_EXPR:
15704 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15705 strict_overflow_p);
15707 case SAVE_EXPR:
15708 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
15709 strict_overflow_p);
15711 case CALL_EXPR:
15712 return alloca_call_p (t);
15714 default:
15715 break;
15717 return false;
15720 /* Return true when T is an address and is known to be nonzero.
15721 Handle warnings about undefined signed overflow. */
15723 bool
15724 tree_expr_nonzero_p (tree t)
15726 bool ret, strict_overflow_p;
15728 strict_overflow_p = false;
15729 ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
15730 if (strict_overflow_p)
15731 fold_overflow_warning (("assuming signed overflow does not occur when "
15732 "determining that expression is always "
15733 "non-zero"),
15734 WARN_STRICT_OVERFLOW_MISC);
15735 return ret;
15738 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15739 attempt to fold the expression to a constant without modifying TYPE,
15740 OP0 or OP1.
15742 If the expression could be simplified to a constant, then return
15743 the constant. If the expression would not be simplified to a
15744 constant, then return NULL_TREE. */
15746 tree
15747 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15749 tree tem = fold_binary (code, type, op0, op1);
15750 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15753 /* Given the components of a unary expression CODE, TYPE and OP0,
15754 attempt to fold the expression to a constant without modifying
15755 TYPE or OP0.
15757 If the expression could be simplified to a constant, then return
15758 the constant. If the expression would not be simplified to a
15759 constant, then return NULL_TREE. */
15761 tree
15762 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15764 tree tem = fold_unary (code, type, op0);
15765 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15768 /* If EXP represents referencing an element in a constant string
15769 (either via pointer arithmetic or array indexing), return the
15770 tree representing the value accessed, otherwise return NULL. */
15772 tree
15773 fold_read_from_constant_string (tree exp)
15775 if ((TREE_CODE (exp) == INDIRECT_REF
15776 || TREE_CODE (exp) == ARRAY_REF)
15777 && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15779 tree exp1 = TREE_OPERAND (exp, 0);
15780 tree index;
15781 tree string;
15782 location_t loc = EXPR_LOCATION (exp);
15784 if (TREE_CODE (exp) == INDIRECT_REF)
15785 string = string_constant (exp1, &index);
15786 else
15788 tree low_bound = array_ref_low_bound (exp);
15789 index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1));
15791 /* Optimize the special-case of a zero lower bound.
15793 We convert the low_bound to sizetype to avoid some problems
15794 with constant folding. (E.g. suppose the lower bound is 1,
15795 and its mode is QI. Without the conversion,l (ARRAY
15796 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15797 +INDEX), which becomes (ARRAY+255+INDEX). Oops!) */
15798 if (! integer_zerop (low_bound))
15799 index = size_diffop_loc (loc, index,
15800 fold_convert_loc (loc, sizetype, low_bound));
15802 string = exp1;
15805 if (string
15806 && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15807 && TREE_CODE (string) == STRING_CST
15808 && TREE_CODE (index) == INTEGER_CST
15809 && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15810 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15811 == MODE_INT)
15812 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15813 return build_int_cst_type (TREE_TYPE (exp),
15814 (TREE_STRING_POINTER (string)
15815 [TREE_INT_CST_LOW (index)]));
15817 return NULL;
15820 /* Return the tree for neg (ARG0) when ARG0 is known to be either
15821 an integer constant, real, or fixed-point constant.
15823 TYPE is the type of the result. */
15825 static tree
15826 fold_negate_const (tree arg0, tree type)
15828 tree t = NULL_TREE;
15830 switch (TREE_CODE (arg0))
15832 case INTEGER_CST:
15834 double_int val = tree_to_double_int (arg0);
15835 int overflow = neg_double (val.low, val.high, &val.low, &val.high);
15837 t = force_fit_type_double (type, val, 1,
15838 (overflow | TREE_OVERFLOW (arg0))
15839 && !TYPE_UNSIGNED (type));
15840 break;
15843 case REAL_CST:
15844 t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15845 break;
15847 case FIXED_CST:
15849 FIXED_VALUE_TYPE f;
15850 bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15851 &(TREE_FIXED_CST (arg0)), NULL,
15852 TYPE_SATURATING (type));
15853 t = build_fixed (type, f);
15854 /* Propagate overflow flags. */
15855 if (overflow_p | TREE_OVERFLOW (arg0))
15856 TREE_OVERFLOW (t) = 1;
15857 break;
15860 default:
15861 gcc_unreachable ();
15864 return t;
15867 /* Return the tree for abs (ARG0) when ARG0 is known to be either
15868 an integer constant or real constant.
15870 TYPE is the type of the result. */
15872 tree
15873 fold_abs_const (tree arg0, tree type)
15875 tree t = NULL_TREE;
15877 switch (TREE_CODE (arg0))
15879 case INTEGER_CST:
15881 double_int val = tree_to_double_int (arg0);
15883 /* If the value is unsigned or non-negative, then the absolute value
15884 is the same as the ordinary value. */
15885 if (TYPE_UNSIGNED (type)
15886 || !double_int_negative_p (val))
15887 t = arg0;
15889 /* If the value is negative, then the absolute value is
15890 its negation. */
15891 else
15893 int overflow;
15895 overflow = neg_double (val.low, val.high, &val.low, &val.high);
15896 t = force_fit_type_double (type, val, -1,
15897 overflow | TREE_OVERFLOW (arg0));
15900 break;
15902 case REAL_CST:
15903 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15904 t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15905 else
15906 t = arg0;
15907 break;
15909 default:
15910 gcc_unreachable ();
15913 return t;
15916 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
15917 constant. TYPE is the type of the result. */
15919 static tree
15920 fold_not_const (const_tree arg0, tree type)
15922 double_int val;
15924 gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15926 val = double_int_not (tree_to_double_int (arg0));
15927 return force_fit_type_double (type, val, 0, TREE_OVERFLOW (arg0));
15930 /* Given CODE, a relational operator, the target type, TYPE and two
15931 constant operands OP0 and OP1, return the result of the
15932 relational operation. If the result is not a compile time
15933 constant, then return NULL_TREE. */
15935 static tree
15936 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15938 int result, invert;
15940 /* From here on, the only cases we handle are when the result is
15941 known to be a constant. */
15943 if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15945 const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15946 const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15948 /* Handle the cases where either operand is a NaN. */
15949 if (real_isnan (c0) || real_isnan (c1))
15951 switch (code)
15953 case EQ_EXPR:
15954 case ORDERED_EXPR:
15955 result = 0;
15956 break;
15958 case NE_EXPR:
15959 case UNORDERED_EXPR:
15960 case UNLT_EXPR:
15961 case UNLE_EXPR:
15962 case UNGT_EXPR:
15963 case UNGE_EXPR:
15964 case UNEQ_EXPR:
15965 result = 1;
15966 break;
15968 case LT_EXPR:
15969 case LE_EXPR:
15970 case GT_EXPR:
15971 case GE_EXPR:
15972 case LTGT_EXPR:
15973 if (flag_trapping_math)
15974 return NULL_TREE;
15975 result = 0;
15976 break;
15978 default:
15979 gcc_unreachable ();
15982 return constant_boolean_node (result, type);
15985 return constant_boolean_node (real_compare (code, c0, c1), type);
15988 if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15990 const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15991 const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15992 return constant_boolean_node (fixed_compare (code, c0, c1), type);
15995 /* Handle equality/inequality of complex constants. */
15996 if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15998 tree rcond = fold_relational_const (code, type,
15999 TREE_REALPART (op0),
16000 TREE_REALPART (op1));
16001 tree icond = fold_relational_const (code, type,
16002 TREE_IMAGPART (op0),
16003 TREE_IMAGPART (op1));
16004 if (code == EQ_EXPR)
16005 return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
16006 else if (code == NE_EXPR)
16007 return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
16008 else
16009 return NULL_TREE;
16012 /* From here on we only handle LT, LE, GT, GE, EQ and NE.
16014 To compute GT, swap the arguments and do LT.
16015 To compute GE, do LT and invert the result.
16016 To compute LE, swap the arguments, do LT and invert the result.
16017 To compute NE, do EQ and invert the result.
16019 Therefore, the code below must handle only EQ and LT. */
16021 if (code == LE_EXPR || code == GT_EXPR)
16023 tree tem = op0;
16024 op0 = op1;
16025 op1 = tem;
16026 code = swap_tree_comparison (code);
16029 /* Note that it is safe to invert for real values here because we
16030 have already handled the one case that it matters. */
16032 invert = 0;
16033 if (code == NE_EXPR || code == GE_EXPR)
16035 invert = 1;
16036 code = invert_tree_comparison (code, false);
16039 /* Compute a result for LT or EQ if args permit;
16040 Otherwise return T. */
16041 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
16043 if (code == EQ_EXPR)
16044 result = tree_int_cst_equal (op0, op1);
16045 else if (TYPE_UNSIGNED (TREE_TYPE (op0)))
16046 result = INT_CST_LT_UNSIGNED (op0, op1);
16047 else
16048 result = INT_CST_LT (op0, op1);
16050 else
16051 return NULL_TREE;
16053 if (invert)
16054 result ^= 1;
16055 return constant_boolean_node (result, type);
16058 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
16059 indicated TYPE. If no CLEANUP_POINT_EXPR is necessary, return EXPR
16060 itself. */
16062 tree
16063 fold_build_cleanup_point_expr (tree type, tree expr)
16065 /* If the expression does not have side effects then we don't have to wrap
16066 it with a cleanup point expression. */
16067 if (!TREE_SIDE_EFFECTS (expr))
16068 return expr;
16070 /* If the expression is a return, check to see if the expression inside the
16071 return has no side effects or the right hand side of the modify expression
16072 inside the return. If either don't have side effects set we don't need to
16073 wrap the expression in a cleanup point expression. Note we don't check the
16074 left hand side of the modify because it should always be a return decl. */
16075 if (TREE_CODE (expr) == RETURN_EXPR)
16077 tree op = TREE_OPERAND (expr, 0);
16078 if (!op || !TREE_SIDE_EFFECTS (op))
16079 return expr;
16080 op = TREE_OPERAND (op, 1);
16081 if (!TREE_SIDE_EFFECTS (op))
16082 return expr;
16085 return build1 (CLEANUP_POINT_EXPR, type, expr);
16088 /* Given a pointer value OP0 and a type TYPE, return a simplified version
16089 of an indirection through OP0, or NULL_TREE if no simplification is
16090 possible. */
16092 tree
16093 fold_indirect_ref_1 (location_t loc, tree type, tree op0)
16095 tree sub = op0;
16096 tree subtype;
16098 STRIP_NOPS (sub);
16099 subtype = TREE_TYPE (sub);
16100 if (!POINTER_TYPE_P (subtype))
16101 return NULL_TREE;
16103 if (TREE_CODE (sub) == ADDR_EXPR)
16105 tree op = TREE_OPERAND (sub, 0);
16106 tree optype = TREE_TYPE (op);
16107 /* *&CONST_DECL -> to the value of the const decl. */
16108 if (TREE_CODE (op) == CONST_DECL)
16109 return DECL_INITIAL (op);
16110 /* *&p => p; make sure to handle *&"str"[cst] here. */
16111 if (type == optype)
16113 tree fop = fold_read_from_constant_string (op);
16114 if (fop)
16115 return fop;
16116 else
16117 return op;
16119 /* *(foo *)&fooarray => fooarray[0] */
16120 else if (TREE_CODE (optype) == ARRAY_TYPE
16121 && type == TREE_TYPE (optype)
16122 && (!in_gimple_form
16123 || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
16125 tree type_domain = TYPE_DOMAIN (optype);
16126 tree min_val = size_zero_node;
16127 if (type_domain && TYPE_MIN_VALUE (type_domain))
16128 min_val = TYPE_MIN_VALUE (type_domain);
16129 if (in_gimple_form
16130 && TREE_CODE (min_val) != INTEGER_CST)
16131 return NULL_TREE;
16132 return build4_loc (loc, ARRAY_REF, type, op, min_val,
16133 NULL_TREE, NULL_TREE);
16135 /* *(foo *)&complexfoo => __real__ complexfoo */
16136 else if (TREE_CODE (optype) == COMPLEX_TYPE
16137 && type == TREE_TYPE (optype))
16138 return fold_build1_loc (loc, REALPART_EXPR, type, op);
16139 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
16140 else if (TREE_CODE (optype) == VECTOR_TYPE
16141 && type == TREE_TYPE (optype))
16143 tree part_width = TYPE_SIZE (type);
16144 tree index = bitsize_int (0);
16145 return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
16149 if (TREE_CODE (sub) == POINTER_PLUS_EXPR
16150 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
16152 tree op00 = TREE_OPERAND (sub, 0);
16153 tree op01 = TREE_OPERAND (sub, 1);
16155 STRIP_NOPS (op00);
16156 if (TREE_CODE (op00) == ADDR_EXPR)
16158 tree op00type;
16159 op00 = TREE_OPERAND (op00, 0);
16160 op00type = TREE_TYPE (op00);
16162 /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
16163 if (TREE_CODE (op00type) == VECTOR_TYPE
16164 && type == TREE_TYPE (op00type))
16166 HOST_WIDE_INT offset = tree_low_cst (op01, 0);
16167 tree part_width = TYPE_SIZE (type);
16168 unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT;
16169 unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
16170 tree index = bitsize_int (indexi);
16172 if (offset/part_widthi <= TYPE_VECTOR_SUBPARTS (op00type))
16173 return fold_build3_loc (loc,
16174 BIT_FIELD_REF, type, op00,
16175 part_width, index);
16178 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
16179 else if (TREE_CODE (op00type) == COMPLEX_TYPE
16180 && type == TREE_TYPE (op00type))
16182 tree size = TYPE_SIZE_UNIT (type);
16183 if (tree_int_cst_equal (size, op01))
16184 return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
16186 /* ((foo *)&fooarray)[1] => fooarray[1] */
16187 else if (TREE_CODE (op00type) == ARRAY_TYPE
16188 && type == TREE_TYPE (op00type))
16190 tree type_domain = TYPE_DOMAIN (op00type);
16191 tree min_val = size_zero_node;
16192 if (type_domain && TYPE_MIN_VALUE (type_domain))
16193 min_val = TYPE_MIN_VALUE (type_domain);
16194 op01 = size_binop_loc (loc, EXACT_DIV_EXPR, op01,
16195 TYPE_SIZE_UNIT (type));
16196 op01 = size_binop_loc (loc, PLUS_EXPR, op01, min_val);
16197 return build4_loc (loc, ARRAY_REF, type, op00, op01,
16198 NULL_TREE, NULL_TREE);
16203 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
16204 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
16205 && type == TREE_TYPE (TREE_TYPE (subtype))
16206 && (!in_gimple_form
16207 || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
16209 tree type_domain;
16210 tree min_val = size_zero_node;
16211 sub = build_fold_indirect_ref_loc (loc, sub);
16212 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
16213 if (type_domain && TYPE_MIN_VALUE (type_domain))
16214 min_val = TYPE_MIN_VALUE (type_domain);
16215 if (in_gimple_form
16216 && TREE_CODE (min_val) != INTEGER_CST)
16217 return NULL_TREE;
16218 return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
16219 NULL_TREE);
16222 return NULL_TREE;
16225 /* Builds an expression for an indirection through T, simplifying some
16226 cases. */
16228 tree
16229 build_fold_indirect_ref_loc (location_t loc, tree t)
16231 tree type = TREE_TYPE (TREE_TYPE (t));
16232 tree sub = fold_indirect_ref_1 (loc, type, t);
16234 if (sub)
16235 return sub;
16237 return build1_loc (loc, INDIRECT_REF, type, t);
16240 /* Given an INDIRECT_REF T, return either T or a simplified version. */
16242 tree
16243 fold_indirect_ref_loc (location_t loc, tree t)
16245 tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0));
16247 if (sub)
16248 return sub;
16249 else
16250 return t;
16253 /* Strip non-trapping, non-side-effecting tree nodes from an expression
16254 whose result is ignored. The type of the returned tree need not be
16255 the same as the original expression. */
16257 tree
16258 fold_ignored_result (tree t)
16260 if (!TREE_SIDE_EFFECTS (t))
16261 return integer_zero_node;
16263 for (;;)
16264 switch (TREE_CODE_CLASS (TREE_CODE (t)))
16266 case tcc_unary:
16267 t = TREE_OPERAND (t, 0);
16268 break;
16270 case tcc_binary:
16271 case tcc_comparison:
16272 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16273 t = TREE_OPERAND (t, 0);
16274 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
16275 t = TREE_OPERAND (t, 1);
16276 else
16277 return t;
16278 break;
16280 case tcc_expression:
16281 switch (TREE_CODE (t))
16283 case COMPOUND_EXPR:
16284 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16285 return t;
16286 t = TREE_OPERAND (t, 0);
16287 break;
16289 case COND_EXPR:
16290 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
16291 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
16292 return t;
16293 t = TREE_OPERAND (t, 0);
16294 break;
16296 default:
16297 return t;
16299 break;
16301 default:
16302 return t;
16306 /* Return the value of VALUE, rounded up to a multiple of DIVISOR.
16307 This can only be applied to objects of a sizetype. */
16309 tree
16310 round_up_loc (location_t loc, tree value, int divisor)
16312 tree div = NULL_TREE;
16314 gcc_assert (divisor > 0);
16315 if (divisor == 1)
16316 return value;
16318 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
16319 have to do anything. Only do this when we are not given a const,
16320 because in that case, this check is more expensive than just
16321 doing it. */
16322 if (TREE_CODE (value) != INTEGER_CST)
16324 div = build_int_cst (TREE_TYPE (value), divisor);
16326 if (multiple_of_p (TREE_TYPE (value), value, div))
16327 return value;
16330 /* If divisor is a power of two, simplify this to bit manipulation. */
16331 if (divisor == (divisor & -divisor))
16333 if (TREE_CODE (value) == INTEGER_CST)
16335 double_int val = tree_to_double_int (value);
16336 bool overflow_p;
16338 if ((val.low & (divisor - 1)) == 0)
16339 return value;
16341 overflow_p = TREE_OVERFLOW (value);
16342 val.low &= ~(divisor - 1);
16343 val.low += divisor;
16344 if (val.low == 0)
16346 val.high++;
16347 if (val.high == 0)
16348 overflow_p = true;
16351 return force_fit_type_double (TREE_TYPE (value), val,
16352 -1, overflow_p);
16354 else
16356 tree t;
16358 t = build_int_cst (TREE_TYPE (value), divisor - 1);
16359 value = size_binop_loc (loc, PLUS_EXPR, value, t);
16360 t = build_int_cst (TREE_TYPE (value), -divisor);
16361 value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16364 else
16366 if (!div)
16367 div = build_int_cst (TREE_TYPE (value), divisor);
16368 value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div);
16369 value = size_binop_loc (loc, MULT_EXPR, value, div);
16372 return value;
16375 /* Likewise, but round down. */
16377 tree
16378 round_down_loc (location_t loc, tree value, int divisor)
16380 tree div = NULL_TREE;
16382 gcc_assert (divisor > 0);
16383 if (divisor == 1)
16384 return value;
16386 /* See if VALUE is already a multiple of DIVISOR. If so, we don't
16387 have to do anything. Only do this when we are not given a const,
16388 because in that case, this check is more expensive than just
16389 doing it. */
16390 if (TREE_CODE (value) != INTEGER_CST)
16392 div = build_int_cst (TREE_TYPE (value), divisor);
16394 if (multiple_of_p (TREE_TYPE (value), value, div))
16395 return value;
16398 /* If divisor is a power of two, simplify this to bit manipulation. */
16399 if (divisor == (divisor & -divisor))
16401 tree t;
16403 t = build_int_cst (TREE_TYPE (value), -divisor);
16404 value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16406 else
16408 if (!div)
16409 div = build_int_cst (TREE_TYPE (value), divisor);
16410 value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div);
16411 value = size_binop_loc (loc, MULT_EXPR, value, div);
16414 return value;
16417 /* Returns the pointer to the base of the object addressed by EXP and
16418 extracts the information about the offset of the access, storing it
16419 to PBITPOS and POFFSET. */
16421 static tree
16422 split_address_to_core_and_offset (tree exp,
16423 HOST_WIDE_INT *pbitpos, tree *poffset)
16425 tree core;
16426 enum machine_mode mode;
16427 int unsignedp, volatilep;
16428 HOST_WIDE_INT bitsize;
16429 location_t loc = EXPR_LOCATION (exp);
16431 if (TREE_CODE (exp) == ADDR_EXPR)
16433 core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
16434 poffset, &mode, &unsignedp, &volatilep,
16435 false);
16436 core = build_fold_addr_expr_loc (loc, core);
16438 else
16440 core = exp;
16441 *pbitpos = 0;
16442 *poffset = NULL_TREE;
16445 return core;
16448 /* Returns true if addresses of E1 and E2 differ by a constant, false
16449 otherwise. If they do, E1 - E2 is stored in *DIFF. */
16451 bool
16452 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
16454 tree core1, core2;
16455 HOST_WIDE_INT bitpos1, bitpos2;
16456 tree toffset1, toffset2, tdiff, type;
16458 core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
16459 core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
16461 if (bitpos1 % BITS_PER_UNIT != 0
16462 || bitpos2 % BITS_PER_UNIT != 0
16463 || !operand_equal_p (core1, core2, 0))
16464 return false;
16466 if (toffset1 && toffset2)
16468 type = TREE_TYPE (toffset1);
16469 if (type != TREE_TYPE (toffset2))
16470 toffset2 = fold_convert (type, toffset2);
16472 tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
16473 if (!cst_and_fits_in_hwi (tdiff))
16474 return false;
16476 *diff = int_cst_value (tdiff);
16478 else if (toffset1 || toffset2)
16480 /* If only one of the offsets is non-constant, the difference cannot
16481 be a constant. */
16482 return false;
16484 else
16485 *diff = 0;
16487 *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
16488 return true;
16491 /* Simplify the floating point expression EXP when the sign of the
16492 result is not significant. Return NULL_TREE if no simplification
16493 is possible. */
16495 tree
16496 fold_strip_sign_ops (tree exp)
16498 tree arg0, arg1;
16499 location_t loc = EXPR_LOCATION (exp);
16501 switch (TREE_CODE (exp))
16503 case ABS_EXPR:
16504 case NEGATE_EXPR:
16505 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16506 return arg0 ? arg0 : TREE_OPERAND (exp, 0);
16508 case MULT_EXPR:
16509 case RDIV_EXPR:
16510 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp))))
16511 return NULL_TREE;
16512 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16513 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16514 if (arg0 != NULL_TREE || arg1 != NULL_TREE)
16515 return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp),
16516 arg0 ? arg0 : TREE_OPERAND (exp, 0),
16517 arg1 ? arg1 : TREE_OPERAND (exp, 1));
16518 break;
16520 case COMPOUND_EXPR:
16521 arg0 = TREE_OPERAND (exp, 0);
16522 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16523 if (arg1)
16524 return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
16525 break;
16527 case COND_EXPR:
16528 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16529 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
16530 if (arg0 || arg1)
16531 return fold_build3_loc (loc,
16532 COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
16533 arg0 ? arg0 : TREE_OPERAND (exp, 1),
16534 arg1 ? arg1 : TREE_OPERAND (exp, 2));
16535 break;
16537 case CALL_EXPR:
16539 const enum built_in_function fcode = builtin_mathfn_code (exp);
16540 switch (fcode)
16542 CASE_FLT_FN (BUILT_IN_COPYSIGN):
16543 /* Strip copysign function call, return the 1st argument. */
16544 arg0 = CALL_EXPR_ARG (exp, 0);
16545 arg1 = CALL_EXPR_ARG (exp, 1);
16546 return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1);
16548 default:
16549 /* Strip sign ops from the argument of "odd" math functions. */
16550 if (negate_mathfn_p (fcode))
16552 arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
16553 if (arg0)
16554 return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0);
16556 break;
16559 break;
16561 default:
16562 break;
16564 return NULL_TREE;