fold-const.c revision 1.1.1.2
1/* Fold a constant sub-tree into a single node for C-compiler 2 Copyright (C) 1987-2013 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 3, or (at your option) any later 9version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20/*@@ This file should be rewritten to use an arbitrary precision 21 @@ representation for "struct tree_int_cst" and "struct tree_real_cst". 22 @@ Perhaps the routines could also be used for bc/dc, and made a lib. 23 @@ The routines that translate from the ap rep should 24 @@ warn if precision et. al. is lost. 25 @@ This would also make life easier when this technology is used 26 @@ for cross-compilers. */ 27 28/* The entry points in this file are fold, size_int_wide and size_binop. 29 30 fold takes a tree as argument and returns a simplified tree. 31 32 size_binop takes a tree code for an arithmetic operation 33 and two operands that are trees, and produces a tree for the 34 result, assuming the type comes from `sizetype'. 35 36 size_int takes an integer value, and creates a tree constant 37 with type from `sizetype'. 38 39 Note: Since the folders get called on non-gimple code as well as 40 gimple code, we need to handle GIMPLE tuples as well as their 41 corresponding tree equivalents. */ 42 43#include "config.h" 44#include "system.h" 45#include "coretypes.h" 46#include "tm.h" 47#include "flags.h" 48#include "tree.h" 49#include "realmpfr.h" 50#include "rtl.h" 51#include "expr.h" 52#include "tm_p.h" 53#include "target.h" 54#include "diagnostic-core.h" 55#include "intl.h" 56#include "ggc.h" 57#include "hash-table.h" 58#include "langhooks.h" 59#include "md5.h" 60#include "gimple.h" 61#include "tree-flow.h" 62 63/* Nonzero if we are folding constants inside an initializer; zero 64 otherwise. */ 65int folding_initializer = 0; 66 67/* The following constants represent a bit based encoding of GCC's 68 comparison operators. This encoding simplifies transformations 69 on relational comparison operators, such as AND and OR. */ 70enum comparison_code { 71 COMPCODE_FALSE = 0, 72 COMPCODE_LT = 1, 73 COMPCODE_EQ = 2, 74 COMPCODE_LE = 3, 75 COMPCODE_GT = 4, 76 COMPCODE_LTGT = 5, 77 COMPCODE_GE = 6, 78 COMPCODE_ORD = 7, 79 COMPCODE_UNORD = 8, 80 COMPCODE_UNLT = 9, 81 COMPCODE_UNEQ = 10, 82 COMPCODE_UNLE = 11, 83 COMPCODE_UNGT = 12, 84 COMPCODE_NE = 13, 85 COMPCODE_UNGE = 14, 86 COMPCODE_TRUE = 15 87}; 88 89static bool negate_mathfn_p (enum built_in_function); 90static bool negate_expr_p (tree); 91static tree negate_expr (tree); 92static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int); 93static tree associate_trees (location_t, tree, tree, enum tree_code, tree); 94static tree const_binop (enum tree_code, tree, tree); 95static enum comparison_code comparison_to_compcode (enum tree_code); 96static enum tree_code compcode_to_comparison (enum comparison_code); 97static int operand_equal_for_comparison_p (tree, tree, tree); 98static int twoval_comparison_p (tree, tree *, tree *, int *); 99static tree eval_subst (location_t, tree, tree, tree, tree, tree); 100static tree pedantic_omit_one_operand_loc (location_t, tree, tree, tree); 101static tree distribute_bit_expr (location_t, enum tree_code, tree, tree, tree); 102static tree make_bit_field_ref (location_t, tree, tree, 103 HOST_WIDE_INT, HOST_WIDE_INT, int); 104static tree optimize_bit_field_compare (location_t, enum tree_code, 105 tree, tree, tree); 106static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *, 107 HOST_WIDE_INT *, 108 enum machine_mode *, int *, int *, 109 tree *, tree *); 110static int all_ones_mask_p (const_tree, int); 111static tree sign_bit_p (tree, const_tree); 112static int simple_operand_p (const_tree); 113static bool simple_operand_p_2 (tree); 114static tree range_binop (enum tree_code, tree, tree, int, tree, int); 115static tree range_predecessor (tree); 116static tree range_successor (tree); 117static tree fold_range_test (location_t, enum tree_code, tree, tree, tree); 118static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree); 119static tree unextend (tree, int, int, tree); 120static tree optimize_minmax_comparison (location_t, enum tree_code, 121 tree, tree, tree); 122static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *); 123static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *); 124static tree fold_binary_op_with_conditional_arg (location_t, 125 enum tree_code, tree, 126 tree, tree, 127 tree, tree, int); 128static tree fold_mathfn_compare (location_t, 129 enum built_in_function, enum tree_code, 130 tree, tree, tree); 131static tree fold_inf_compare (location_t, enum tree_code, tree, tree, tree); 132static tree fold_div_compare (location_t, enum tree_code, tree, tree, tree); 133static bool reorder_operands_p (const_tree, const_tree); 134static tree fold_negate_const (tree, tree); 135static tree fold_not_const (const_tree, tree); 136static tree fold_relational_const (enum tree_code, tree, tree, tree); 137static tree fold_convert_const (enum tree_code, tree, tree); 138 139/* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION. 140 Otherwise, return LOC. */ 141 142static location_t 143expr_location_or (tree t, location_t loc) 144{ 145 location_t tloc = EXPR_LOCATION (t); 146 return tloc == UNKNOWN_LOCATION ? loc : tloc; 147} 148 149/* Similar to protected_set_expr_location, but never modify x in place, 150 if location can and needs to be set, unshare it. */ 151 152static inline tree 153protected_set_expr_location_unshare (tree x, location_t loc) 154{ 155 if (CAN_HAVE_LOCATION_P (x) 156 && EXPR_LOCATION (x) != loc 157 && !(TREE_CODE (x) == SAVE_EXPR 158 || TREE_CODE (x) == TARGET_EXPR 159 || TREE_CODE (x) == BIND_EXPR)) 160 { 161 x = copy_node (x); 162 SET_EXPR_LOCATION (x, loc); 163 } 164 return x; 165} 166 167/* If ARG2 divides ARG1 with zero remainder, carries out the division 168 of type CODE and returns the quotient. 169 Otherwise returns NULL_TREE. */ 170 171tree 172div_if_zero_remainder (enum tree_code code, const_tree arg1, const_tree arg2) 173{ 174 double_int quo, rem; 175 int uns; 176 177 /* The sign of the division is according to operand two, that 178 does the correct thing for POINTER_PLUS_EXPR where we want 179 a signed division. */ 180 uns = TYPE_UNSIGNED (TREE_TYPE (arg2)); 181 182 quo = tree_to_double_int (arg1).divmod (tree_to_double_int (arg2), 183 uns, code, &rem); 184 185 if (rem.is_zero ()) 186 return build_int_cst_wide (TREE_TYPE (arg1), quo.low, quo.high); 187 188 return NULL_TREE; 189} 190 191/* This is nonzero if we should defer warnings about undefined 192 overflow. This facility exists because these warnings are a 193 special case. The code to estimate loop iterations does not want 194 to issue any warnings, since it works with expressions which do not 195 occur in user code. Various bits of cleanup code call fold(), but 196 only use the result if it has certain characteristics (e.g., is a 197 constant); that code only wants to issue a warning if the result is 198 used. */ 199 200static int fold_deferring_overflow_warnings; 201 202/* If a warning about undefined overflow is deferred, this is the 203 warning. Note that this may cause us to turn two warnings into 204 one, but that is fine since it is sufficient to only give one 205 warning per expression. */ 206 207static const char* fold_deferred_overflow_warning; 208 209/* If a warning about undefined overflow is deferred, this is the 210 level at which the warning should be emitted. */ 211 212static enum warn_strict_overflow_code fold_deferred_overflow_code; 213 214/* Start deferring overflow warnings. We could use a stack here to 215 permit nested calls, but at present it is not necessary. */ 216 217void 218fold_defer_overflow_warnings (void) 219{ 220 ++fold_deferring_overflow_warnings; 221} 222 223/* Stop deferring overflow warnings. If there is a pending warning, 224 and ISSUE is true, then issue the warning if appropriate. STMT is 225 the statement with which the warning should be associated (used for 226 location information); STMT may be NULL. CODE is the level of the 227 warning--a warn_strict_overflow_code value. This function will use 228 the smaller of CODE and the deferred code when deciding whether to 229 issue the warning. CODE may be zero to mean to always use the 230 deferred code. */ 231 232void 233fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code) 234{ 235 const char *warnmsg; 236 location_t locus; 237 238 gcc_assert (fold_deferring_overflow_warnings > 0); 239 --fold_deferring_overflow_warnings; 240 if (fold_deferring_overflow_warnings > 0) 241 { 242 if (fold_deferred_overflow_warning != NULL 243 && code != 0 244 && code < (int) fold_deferred_overflow_code) 245 fold_deferred_overflow_code = (enum warn_strict_overflow_code) code; 246 return; 247 } 248 249 warnmsg = fold_deferred_overflow_warning; 250 fold_deferred_overflow_warning = NULL; 251 252 if (!issue || warnmsg == NULL) 253 return; 254 255 if (gimple_no_warning_p (stmt)) 256 return; 257 258 /* Use the smallest code level when deciding to issue the 259 warning. */ 260 if (code == 0 || code > (int) fold_deferred_overflow_code) 261 code = fold_deferred_overflow_code; 262 263 if (!issue_strict_overflow_warning (code)) 264 return; 265 266 if (stmt == NULL) 267 locus = input_location; 268 else 269 locus = gimple_location (stmt); 270 warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg); 271} 272 273/* Stop deferring overflow warnings, ignoring any deferred 274 warnings. */ 275 276void 277fold_undefer_and_ignore_overflow_warnings (void) 278{ 279 fold_undefer_overflow_warnings (false, NULL, 0); 280} 281 282/* Whether we are deferring overflow warnings. */ 283 284bool 285fold_deferring_overflow_warnings_p (void) 286{ 287 return fold_deferring_overflow_warnings > 0; 288} 289 290/* This is called when we fold something based on the fact that signed 291 overflow is undefined. */ 292 293static void 294fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc) 295{ 296 if (fold_deferring_overflow_warnings > 0) 297 { 298 if (fold_deferred_overflow_warning == NULL 299 || wc < fold_deferred_overflow_code) 300 { 301 fold_deferred_overflow_warning = gmsgid; 302 fold_deferred_overflow_code = wc; 303 } 304 } 305 else if (issue_strict_overflow_warning (wc)) 306 warning (OPT_Wstrict_overflow, gmsgid); 307} 308 309/* Return true if the built-in mathematical function specified by CODE 310 is odd, i.e. -f(x) == f(-x). */ 311 312static bool 313negate_mathfn_p (enum built_in_function code) 314{ 315 switch (code) 316 { 317 CASE_FLT_FN (BUILT_IN_ASIN): 318 CASE_FLT_FN (BUILT_IN_ASINH): 319 CASE_FLT_FN (BUILT_IN_ATAN): 320 CASE_FLT_FN (BUILT_IN_ATANH): 321 CASE_FLT_FN (BUILT_IN_CASIN): 322 CASE_FLT_FN (BUILT_IN_CASINH): 323 CASE_FLT_FN (BUILT_IN_CATAN): 324 CASE_FLT_FN (BUILT_IN_CATANH): 325 CASE_FLT_FN (BUILT_IN_CBRT): 326 CASE_FLT_FN (BUILT_IN_CPROJ): 327 CASE_FLT_FN (BUILT_IN_CSIN): 328 CASE_FLT_FN (BUILT_IN_CSINH): 329 CASE_FLT_FN (BUILT_IN_CTAN): 330 CASE_FLT_FN (BUILT_IN_CTANH): 331 CASE_FLT_FN (BUILT_IN_ERF): 332 CASE_FLT_FN (BUILT_IN_LLROUND): 333 CASE_FLT_FN (BUILT_IN_LROUND): 334 CASE_FLT_FN (BUILT_IN_ROUND): 335 CASE_FLT_FN (BUILT_IN_SIN): 336 CASE_FLT_FN (BUILT_IN_SINH): 337 CASE_FLT_FN (BUILT_IN_TAN): 338 CASE_FLT_FN (BUILT_IN_TANH): 339 CASE_FLT_FN (BUILT_IN_TRUNC): 340 return true; 341 342 CASE_FLT_FN (BUILT_IN_LLRINT): 343 CASE_FLT_FN (BUILT_IN_LRINT): 344 CASE_FLT_FN (BUILT_IN_NEARBYINT): 345 CASE_FLT_FN (BUILT_IN_RINT): 346 return !flag_rounding_math; 347 348 default: 349 break; 350 } 351 return false; 352} 353 354/* Check whether we may negate an integer constant T without causing 355 overflow. */ 356 357bool 358may_negate_without_overflow_p (const_tree t) 359{ 360 unsigned HOST_WIDE_INT val; 361 unsigned int prec; 362 tree type; 363 364 gcc_assert (TREE_CODE (t) == INTEGER_CST); 365 366 type = TREE_TYPE (t); 367 if (TYPE_UNSIGNED (type)) 368 return false; 369 370 prec = TYPE_PRECISION (type); 371 if (prec > HOST_BITS_PER_WIDE_INT) 372 { 373 if (TREE_INT_CST_LOW (t) != 0) 374 return true; 375 prec -= HOST_BITS_PER_WIDE_INT; 376 val = TREE_INT_CST_HIGH (t); 377 } 378 else 379 val = TREE_INT_CST_LOW (t); 380 if (prec < HOST_BITS_PER_WIDE_INT) 381 val &= ((unsigned HOST_WIDE_INT) 1 << prec) - 1; 382 return val != ((unsigned HOST_WIDE_INT) 1 << (prec - 1)); 383} 384 385/* Determine whether an expression T can be cheaply negated using 386 the function negate_expr without introducing undefined overflow. */ 387 388static bool 389negate_expr_p (tree t) 390{ 391 tree type; 392 393 if (t == 0) 394 return false; 395 396 type = TREE_TYPE (t); 397 398 STRIP_SIGN_NOPS (t); 399 switch (TREE_CODE (t)) 400 { 401 case INTEGER_CST: 402 if (TYPE_OVERFLOW_WRAPS (type)) 403 return true; 404 405 /* Check that -CST will not overflow type. */ 406 return may_negate_without_overflow_p (t); 407 case BIT_NOT_EXPR: 408 return (INTEGRAL_TYPE_P (type) 409 && TYPE_OVERFLOW_WRAPS (type)); 410 411 case FIXED_CST: 412 case NEGATE_EXPR: 413 return true; 414 415 case REAL_CST: 416 /* We want to canonicalize to positive real constants. Pretend 417 that only negative ones can be easily negated. */ 418 return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t)); 419 420 case COMPLEX_CST: 421 return negate_expr_p (TREE_REALPART (t)) 422 && negate_expr_p (TREE_IMAGPART (t)); 423 424 case COMPLEX_EXPR: 425 return negate_expr_p (TREE_OPERAND (t, 0)) 426 && negate_expr_p (TREE_OPERAND (t, 1)); 427 428 case CONJ_EXPR: 429 return negate_expr_p (TREE_OPERAND (t, 0)); 430 431 case PLUS_EXPR: 432 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) 433 || HONOR_SIGNED_ZEROS (TYPE_MODE (type))) 434 return false; 435 /* -(A + B) -> (-B) - A. */ 436 if (negate_expr_p (TREE_OPERAND (t, 1)) 437 && reorder_operands_p (TREE_OPERAND (t, 0), 438 TREE_OPERAND (t, 1))) 439 return true; 440 /* -(A + B) -> (-A) - B. */ 441 return negate_expr_p (TREE_OPERAND (t, 0)); 442 443 case MINUS_EXPR: 444 /* We can't turn -(A-B) into B-A when we honor signed zeros. */ 445 return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) 446 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)) 447 && reorder_operands_p (TREE_OPERAND (t, 0), 448 TREE_OPERAND (t, 1)); 449 450 case MULT_EXPR: 451 if (TYPE_UNSIGNED (TREE_TYPE (t))) 452 break; 453 454 /* Fall through. */ 455 456 case RDIV_EXPR: 457 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (t)))) 458 return negate_expr_p (TREE_OPERAND (t, 1)) 459 || negate_expr_p (TREE_OPERAND (t, 0)); 460 break; 461 462 case TRUNC_DIV_EXPR: 463 case ROUND_DIV_EXPR: 464 case EXACT_DIV_EXPR: 465 /* In general we can't negate A / B, because if A is INT_MIN and 466 B is 1, we may turn this into INT_MIN / -1 which is undefined 467 and actually traps on some architectures. But if overflow is 468 undefined, we can negate, because - (INT_MIN / 1) is an 469 overflow. */ 470 if (INTEGRAL_TYPE_P (TREE_TYPE (t))) 471 { 472 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))) 473 break; 474 /* If overflow is undefined then we have to be careful because 475 we ask whether it's ok to associate the negate with the 476 division which is not ok for example for 477 -((a - b) / c) where (-(a - b)) / c may invoke undefined 478 overflow because of negating INT_MIN. So do not use 479 negate_expr_p here but open-code the two important cases. */ 480 if (TREE_CODE (TREE_OPERAND (t, 0)) == NEGATE_EXPR 481 || (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST 482 && may_negate_without_overflow_p (TREE_OPERAND (t, 0)))) 483 return true; 484 } 485 else if (negate_expr_p (TREE_OPERAND (t, 0))) 486 return true; 487 return negate_expr_p (TREE_OPERAND (t, 1)); 488 489 case NOP_EXPR: 490 /* Negate -((double)float) as (double)(-float). */ 491 if (TREE_CODE (type) == REAL_TYPE) 492 { 493 tree tem = strip_float_extensions (t); 494 if (tem != t) 495 return negate_expr_p (tem); 496 } 497 break; 498 499 case CALL_EXPR: 500 /* Negate -f(x) as f(-x). */ 501 if (negate_mathfn_p (builtin_mathfn_code (t))) 502 return negate_expr_p (CALL_EXPR_ARG (t, 0)); 503 break; 504 505 case RSHIFT_EXPR: 506 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */ 507 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST) 508 { 509 tree op1 = TREE_OPERAND (t, 1); 510 if (TREE_INT_CST_HIGH (op1) == 0 511 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1) 512 == TREE_INT_CST_LOW (op1)) 513 return true; 514 } 515 break; 516 517 default: 518 break; 519 } 520 return false; 521} 522 523/* Given T, an expression, return a folded tree for -T or NULL_TREE, if no 524 simplification is possible. 525 If negate_expr_p would return true for T, NULL_TREE will never be 526 returned. */ 527 528static tree 529fold_negate_expr (location_t loc, tree t) 530{ 531 tree type = TREE_TYPE (t); 532 tree tem; 533 534 switch (TREE_CODE (t)) 535 { 536 /* Convert - (~A) to A + 1. */ 537 case BIT_NOT_EXPR: 538 if (INTEGRAL_TYPE_P (type)) 539 return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0), 540 build_int_cst (type, 1)); 541 break; 542 543 case INTEGER_CST: 544 tem = fold_negate_const (t, type); 545 if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t) 546 || !TYPE_OVERFLOW_TRAPS (type)) 547 return tem; 548 break; 549 550 case REAL_CST: 551 tem = fold_negate_const (t, type); 552 /* Two's complement FP formats, such as c4x, may overflow. */ 553 if (!TREE_OVERFLOW (tem) || !flag_trapping_math) 554 return tem; 555 break; 556 557 case FIXED_CST: 558 tem = fold_negate_const (t, type); 559 return tem; 560 561 case COMPLEX_CST: 562 { 563 tree rpart = negate_expr (TREE_REALPART (t)); 564 tree ipart = negate_expr (TREE_IMAGPART (t)); 565 566 if ((TREE_CODE (rpart) == REAL_CST 567 && TREE_CODE (ipart) == REAL_CST) 568 || (TREE_CODE (rpart) == INTEGER_CST 569 && TREE_CODE (ipart) == INTEGER_CST)) 570 return build_complex (type, rpart, ipart); 571 } 572 break; 573 574 case COMPLEX_EXPR: 575 if (negate_expr_p (t)) 576 return fold_build2_loc (loc, COMPLEX_EXPR, type, 577 fold_negate_expr (loc, TREE_OPERAND (t, 0)), 578 fold_negate_expr (loc, TREE_OPERAND (t, 1))); 579 break; 580 581 case CONJ_EXPR: 582 if (negate_expr_p (t)) 583 return fold_build1_loc (loc, CONJ_EXPR, type, 584 fold_negate_expr (loc, TREE_OPERAND (t, 0))); 585 break; 586 587 case NEGATE_EXPR: 588 return TREE_OPERAND (t, 0); 589 590 case PLUS_EXPR: 591 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) 592 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))) 593 { 594 /* -(A + B) -> (-B) - A. */ 595 if (negate_expr_p (TREE_OPERAND (t, 1)) 596 && reorder_operands_p (TREE_OPERAND (t, 0), 597 TREE_OPERAND (t, 1))) 598 { 599 tem = negate_expr (TREE_OPERAND (t, 1)); 600 return fold_build2_loc (loc, MINUS_EXPR, type, 601 tem, TREE_OPERAND (t, 0)); 602 } 603 604 /* -(A + B) -> (-A) - B. */ 605 if (negate_expr_p (TREE_OPERAND (t, 0))) 606 { 607 tem = negate_expr (TREE_OPERAND (t, 0)); 608 return fold_build2_loc (loc, MINUS_EXPR, type, 609 tem, TREE_OPERAND (t, 1)); 610 } 611 } 612 break; 613 614 case MINUS_EXPR: 615 /* - (A - B) -> B - A */ 616 if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) 617 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)) 618 && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1))) 619 return fold_build2_loc (loc, MINUS_EXPR, type, 620 TREE_OPERAND (t, 1), TREE_OPERAND (t, 0)); 621 break; 622 623 case MULT_EXPR: 624 if (TYPE_UNSIGNED (type)) 625 break; 626 627 /* Fall through. */ 628 629 case RDIV_EXPR: 630 if (! HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))) 631 { 632 tem = TREE_OPERAND (t, 1); 633 if (negate_expr_p (tem)) 634 return fold_build2_loc (loc, TREE_CODE (t), type, 635 TREE_OPERAND (t, 0), negate_expr (tem)); 636 tem = TREE_OPERAND (t, 0); 637 if (negate_expr_p (tem)) 638 return fold_build2_loc (loc, TREE_CODE (t), type, 639 negate_expr (tem), TREE_OPERAND (t, 1)); 640 } 641 break; 642 643 case TRUNC_DIV_EXPR: 644 case ROUND_DIV_EXPR: 645 case EXACT_DIV_EXPR: 646 /* In general we can't negate A / B, because if A is INT_MIN and 647 B is 1, we may turn this into INT_MIN / -1 which is undefined 648 and actually traps on some architectures. But if overflow is 649 undefined, we can negate, because - (INT_MIN / 1) is an 650 overflow. */ 651 if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) 652 { 653 const char * const warnmsg = G_("assuming signed overflow does not " 654 "occur when negating a division"); 655 tem = TREE_OPERAND (t, 1); 656 if (negate_expr_p (tem)) 657 { 658 if (INTEGRAL_TYPE_P (type) 659 && (TREE_CODE (tem) != INTEGER_CST 660 || integer_onep (tem))) 661 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC); 662 return fold_build2_loc (loc, TREE_CODE (t), type, 663 TREE_OPERAND (t, 0), negate_expr (tem)); 664 } 665 /* If overflow is undefined then we have to be careful because 666 we ask whether it's ok to associate the negate with the 667 division which is not ok for example for 668 -((a - b) / c) where (-(a - b)) / c may invoke undefined 669 overflow because of negating INT_MIN. So do not use 670 negate_expr_p here but open-code the two important cases. */ 671 tem = TREE_OPERAND (t, 0); 672 if ((INTEGRAL_TYPE_P (type) 673 && (TREE_CODE (tem) == NEGATE_EXPR 674 || (TREE_CODE (tem) == INTEGER_CST 675 && may_negate_without_overflow_p (tem)))) 676 || !INTEGRAL_TYPE_P (type)) 677 return fold_build2_loc (loc, TREE_CODE (t), type, 678 negate_expr (tem), TREE_OPERAND (t, 1)); 679 } 680 break; 681 682 case NOP_EXPR: 683 /* Convert -((double)float) into (double)(-float). */ 684 if (TREE_CODE (type) == REAL_TYPE) 685 { 686 tem = strip_float_extensions (t); 687 if (tem != t && negate_expr_p (tem)) 688 return fold_convert_loc (loc, type, negate_expr (tem)); 689 } 690 break; 691 692 case CALL_EXPR: 693 /* Negate -f(x) as f(-x). */ 694 if (negate_mathfn_p (builtin_mathfn_code (t)) 695 && negate_expr_p (CALL_EXPR_ARG (t, 0))) 696 { 697 tree fndecl, arg; 698 699 fndecl = get_callee_fndecl (t); 700 arg = negate_expr (CALL_EXPR_ARG (t, 0)); 701 return build_call_expr_loc (loc, fndecl, 1, arg); 702 } 703 break; 704 705 case RSHIFT_EXPR: 706 /* Optimize -((int)x >> 31) into (unsigned)x >> 31. */ 707 if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST) 708 { 709 tree op1 = TREE_OPERAND (t, 1); 710 if (TREE_INT_CST_HIGH (op1) == 0 711 && (unsigned HOST_WIDE_INT) (TYPE_PRECISION (type) - 1) 712 == TREE_INT_CST_LOW (op1)) 713 { 714 tree ntype = TYPE_UNSIGNED (type) 715 ? signed_type_for (type) 716 : unsigned_type_for (type); 717 tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0)); 718 temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1); 719 return fold_convert_loc (loc, type, temp); 720 } 721 } 722 break; 723 724 default: 725 break; 726 } 727 728 return NULL_TREE; 729} 730 731/* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be 732 negated in a simpler way. Also allow for T to be NULL_TREE, in which case 733 return NULL_TREE. */ 734 735static tree 736negate_expr (tree t) 737{ 738 tree type, tem; 739 location_t loc; 740 741 if (t == NULL_TREE) 742 return NULL_TREE; 743 744 loc = EXPR_LOCATION (t); 745 type = TREE_TYPE (t); 746 STRIP_SIGN_NOPS (t); 747 748 tem = fold_negate_expr (loc, t); 749 if (!tem) 750 tem = build1_loc (loc, NEGATE_EXPR, TREE_TYPE (t), t); 751 return fold_convert_loc (loc, type, tem); 752} 753 754/* Split a tree IN into a constant, literal and variable parts that could be 755 combined with CODE to make IN. "constant" means an expression with 756 TREE_CONSTANT but that isn't an actual constant. CODE must be a 757 commutative arithmetic operation. Store the constant part into *CONP, 758 the literal in *LITP and return the variable part. If a part isn't 759 present, set it to null. If the tree does not decompose in this way, 760 return the entire tree as the variable part and the other parts as null. 761 762 If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that 763 case, we negate an operand that was subtracted. Except if it is a 764 literal for which we use *MINUS_LITP instead. 765 766 If NEGATE_P is true, we are negating all of IN, again except a literal 767 for which we use *MINUS_LITP instead. 768 769 If IN is itself a literal or constant, return it as appropriate. 770 771 Note that we do not guarantee that any of the three values will be the 772 same type as IN, but they will have the same signedness and mode. */ 773 774static tree 775split_tree (tree in, enum tree_code code, tree *conp, tree *litp, 776 tree *minus_litp, int negate_p) 777{ 778 tree var = 0; 779 780 *conp = 0; 781 *litp = 0; 782 *minus_litp = 0; 783 784 /* Strip any conversions that don't change the machine mode or signedness. */ 785 STRIP_SIGN_NOPS (in); 786 787 if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST 788 || TREE_CODE (in) == FIXED_CST) 789 *litp = in; 790 else if (TREE_CODE (in) == code 791 || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math) 792 && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in)) 793 /* We can associate addition and subtraction together (even 794 though the C standard doesn't say so) for integers because 795 the value is not affected. For reals, the value might be 796 affected, so we can't. */ 797 && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR) 798 || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR)))) 799 { 800 tree op0 = TREE_OPERAND (in, 0); 801 tree op1 = TREE_OPERAND (in, 1); 802 int neg1_p = TREE_CODE (in) == MINUS_EXPR; 803 int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0; 804 805 /* First see if either of the operands is a literal, then a constant. */ 806 if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST 807 || TREE_CODE (op0) == FIXED_CST) 808 *litp = op0, op0 = 0; 809 else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST 810 || TREE_CODE (op1) == FIXED_CST) 811 *litp = op1, neg_litp_p = neg1_p, op1 = 0; 812 813 if (op0 != 0 && TREE_CONSTANT (op0)) 814 *conp = op0, op0 = 0; 815 else if (op1 != 0 && TREE_CONSTANT (op1)) 816 *conp = op1, neg_conp_p = neg1_p, op1 = 0; 817 818 /* If we haven't dealt with either operand, this is not a case we can 819 decompose. Otherwise, VAR is either of the ones remaining, if any. */ 820 if (op0 != 0 && op1 != 0) 821 var = in; 822 else if (op0 != 0) 823 var = op0; 824 else 825 var = op1, neg_var_p = neg1_p; 826 827 /* Now do any needed negations. */ 828 if (neg_litp_p) 829 *minus_litp = *litp, *litp = 0; 830 if (neg_conp_p) 831 *conp = negate_expr (*conp); 832 if (neg_var_p) 833 var = negate_expr (var); 834 } 835 else if (TREE_CODE (in) == BIT_NOT_EXPR 836 && code == PLUS_EXPR) 837 { 838 /* -X - 1 is folded to ~X, undo that here. */ 839 *minus_litp = build_one_cst (TREE_TYPE (in)); 840 var = negate_expr (TREE_OPERAND (in, 0)); 841 } 842 else if (TREE_CONSTANT (in)) 843 *conp = in; 844 else 845 var = in; 846 847 if (negate_p) 848 { 849 if (*litp) 850 *minus_litp = *litp, *litp = 0; 851 else if (*minus_litp) 852 *litp = *minus_litp, *minus_litp = 0; 853 *conp = negate_expr (*conp); 854 var = negate_expr (var); 855 } 856 857 return var; 858} 859 860/* Re-associate trees split by the above function. T1 and T2 are 861 either expressions to associate or null. Return the new 862 expression, if any. LOC is the location of the new expression. If 863 we build an operation, do it in TYPE and with CODE. */ 864 865static tree 866associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type) 867{ 868 if (t1 == 0) 869 return t2; 870 else if (t2 == 0) 871 return t1; 872 873 /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't 874 try to fold this since we will have infinite recursion. But do 875 deal with any NEGATE_EXPRs. */ 876 if (TREE_CODE (t1) == code || TREE_CODE (t2) == code 877 || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR) 878 { 879 if (code == PLUS_EXPR) 880 { 881 if (TREE_CODE (t1) == NEGATE_EXPR) 882 return build2_loc (loc, MINUS_EXPR, type, 883 fold_convert_loc (loc, type, t2), 884 fold_convert_loc (loc, type, 885 TREE_OPERAND (t1, 0))); 886 else if (TREE_CODE (t2) == NEGATE_EXPR) 887 return build2_loc (loc, MINUS_EXPR, type, 888 fold_convert_loc (loc, type, t1), 889 fold_convert_loc (loc, type, 890 TREE_OPERAND (t2, 0))); 891 else if (integer_zerop (t2)) 892 return fold_convert_loc (loc, type, t1); 893 } 894 else if (code == MINUS_EXPR) 895 { 896 if (integer_zerop (t2)) 897 return fold_convert_loc (loc, type, t1); 898 } 899 900 return build2_loc (loc, code, type, fold_convert_loc (loc, type, t1), 901 fold_convert_loc (loc, type, t2)); 902 } 903 904 return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1), 905 fold_convert_loc (loc, type, t2)); 906} 907 908/* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable 909 for use in int_const_binop, size_binop and size_diffop. */ 910 911static bool 912int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2) 913{ 914 if (!INTEGRAL_TYPE_P (type1) && !POINTER_TYPE_P (type1)) 915 return false; 916 if (!INTEGRAL_TYPE_P (type2) && !POINTER_TYPE_P (type2)) 917 return false; 918 919 switch (code) 920 { 921 case LSHIFT_EXPR: 922 case RSHIFT_EXPR: 923 case LROTATE_EXPR: 924 case RROTATE_EXPR: 925 return true; 926 927 default: 928 break; 929 } 930 931 return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2) 932 && TYPE_PRECISION (type1) == TYPE_PRECISION (type2) 933 && TYPE_MODE (type1) == TYPE_MODE (type2); 934} 935 936 937/* Combine two integer constants ARG1 and ARG2 under operation CODE 938 to produce a new constant. Return NULL_TREE if we don't know how 939 to evaluate CODE at compile-time. */ 940 941static tree 942int_const_binop_1 (enum tree_code code, const_tree arg1, const_tree arg2, 943 int overflowable) 944{ 945 double_int op1, op2, res, tmp; 946 tree t; 947 tree type = TREE_TYPE (arg1); 948 bool uns = TYPE_UNSIGNED (type); 949 bool overflow = false; 950 951 op1 = tree_to_double_int (arg1); 952 op2 = tree_to_double_int (arg2); 953 954 switch (code) 955 { 956 case BIT_IOR_EXPR: 957 res = op1 | op2; 958 break; 959 960 case BIT_XOR_EXPR: 961 res = op1 ^ op2; 962 break; 963 964 case BIT_AND_EXPR: 965 res = op1 & op2; 966 break; 967 968 case RSHIFT_EXPR: 969 res = op1.rshift (op2.to_shwi (), TYPE_PRECISION (type), !uns); 970 break; 971 972 case LSHIFT_EXPR: 973 /* It's unclear from the C standard whether shifts can overflow. 974 The following code ignores overflow; perhaps a C standard 975 interpretation ruling is needed. */ 976 res = op1.lshift (op2.to_shwi (), TYPE_PRECISION (type), !uns); 977 break; 978 979 case RROTATE_EXPR: 980 res = op1.rrotate (op2.to_shwi (), TYPE_PRECISION (type)); 981 break; 982 983 case LROTATE_EXPR: 984 res = op1.lrotate (op2.to_shwi (), TYPE_PRECISION (type)); 985 break; 986 987 case PLUS_EXPR: 988 res = op1.add_with_sign (op2, false, &overflow); 989 break; 990 991 case MINUS_EXPR: 992 res = op1.sub_with_overflow (op2, &overflow); 993 break; 994 995 case MULT_EXPR: 996 res = op1.mul_with_sign (op2, false, &overflow); 997 break; 998 999 case MULT_HIGHPART_EXPR: 1000 if (TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT) 1001 return NULL_TREE; 1002 else 1003 { 1004 bool dummy_overflow; 1005 /* MULT_HIGHPART_EXPR can't ever oveflow, as the multiplication 1006 is performed in twice the precision of arguments. */ 1007 tmp = op1.mul_with_sign (op2, false, &dummy_overflow); 1008 res = tmp.rshift (TYPE_PRECISION (type), 1009 2 * TYPE_PRECISION (type), !uns); 1010 } 1011 break; 1012 1013 case TRUNC_DIV_EXPR: 1014 case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR: 1015 case EXACT_DIV_EXPR: 1016 /* This is a shortcut for a common special case. */ 1017 if (op2.high == 0 && (HOST_WIDE_INT) op2.low > 0 1018 && !TREE_OVERFLOW (arg1) 1019 && !TREE_OVERFLOW (arg2) 1020 && op1.high == 0 && (HOST_WIDE_INT) op1.low >= 0) 1021 { 1022 if (code == CEIL_DIV_EXPR) 1023 op1.low += op2.low - 1; 1024 1025 res.low = op1.low / op2.low, res.high = 0; 1026 break; 1027 } 1028 1029 /* ... fall through ... */ 1030 1031 case ROUND_DIV_EXPR: 1032 if (op2.is_zero ()) 1033 return NULL_TREE; 1034 if (op2.is_one ()) 1035 { 1036 res = op1; 1037 break; 1038 } 1039 if (op1 == op2 && !op1.is_zero ()) 1040 { 1041 res = double_int_one; 1042 break; 1043 } 1044 res = op1.divmod_with_overflow (op2, uns, code, &tmp, &overflow); 1045 break; 1046 1047 case TRUNC_MOD_EXPR: 1048 case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR: 1049 /* This is a shortcut for a common special case. */ 1050 if (op2.high == 0 && (HOST_WIDE_INT) op2.low > 0 1051 && !TREE_OVERFLOW (arg1) 1052 && !TREE_OVERFLOW (arg2) 1053 && op1.high == 0 && (HOST_WIDE_INT) op1.low >= 0) 1054 { 1055 if (code == CEIL_MOD_EXPR) 1056 op1.low += op2.low - 1; 1057 res.low = op1.low % op2.low, res.high = 0; 1058 break; 1059 } 1060 1061 /* ... fall through ... */ 1062 1063 case ROUND_MOD_EXPR: 1064 if (op2.is_zero ()) 1065 return NULL_TREE; 1066 tmp = op1.divmod_with_overflow (op2, uns, code, &res, &overflow); 1067 break; 1068 1069 case MIN_EXPR: 1070 res = op1.min (op2, uns); 1071 break; 1072 1073 case MAX_EXPR: 1074 res = op1.max (op2, uns); 1075 break; 1076 1077 default: 1078 return NULL_TREE; 1079 } 1080 1081 t = force_fit_type_double (TREE_TYPE (arg1), res, overflowable, 1082 (!uns && overflow) 1083 | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2)); 1084 1085 return t; 1086} 1087 1088tree 1089int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2) 1090{ 1091 return int_const_binop_1 (code, arg1, arg2, 1); 1092} 1093 1094/* Combine two constants ARG1 and ARG2 under operation CODE to produce a new 1095 constant. We assume ARG1 and ARG2 have the same data type, or at least 1096 are the same kind of constant and the same machine mode. Return zero if 1097 combining the constants is not allowed in the current operating mode. */ 1098 1099static tree 1100const_binop (enum tree_code code, tree arg1, tree arg2) 1101{ 1102 /* Sanity check for the recursive cases. */ 1103 if (!arg1 || !arg2) 1104 return NULL_TREE; 1105 1106 STRIP_NOPS (arg1); 1107 STRIP_NOPS (arg2); 1108 1109 if (TREE_CODE (arg1) == INTEGER_CST) 1110 return int_const_binop (code, arg1, arg2); 1111 1112 if (TREE_CODE (arg1) == REAL_CST) 1113 { 1114 enum machine_mode mode; 1115 REAL_VALUE_TYPE d1; 1116 REAL_VALUE_TYPE d2; 1117 REAL_VALUE_TYPE value; 1118 REAL_VALUE_TYPE result; 1119 bool inexact; 1120 tree t, type; 1121 1122 /* The following codes are handled by real_arithmetic. */ 1123 switch (code) 1124 { 1125 case PLUS_EXPR: 1126 case MINUS_EXPR: 1127 case MULT_EXPR: 1128 case RDIV_EXPR: 1129 case MIN_EXPR: 1130 case MAX_EXPR: 1131 break; 1132 1133 default: 1134 return NULL_TREE; 1135 } 1136 1137 d1 = TREE_REAL_CST (arg1); 1138 d2 = TREE_REAL_CST (arg2); 1139 1140 type = TREE_TYPE (arg1); 1141 mode = TYPE_MODE (type); 1142 1143 /* Don't perform operation if we honor signaling NaNs and 1144 either operand is a NaN. */ 1145 if (HONOR_SNANS (mode) 1146 && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2))) 1147 return NULL_TREE; 1148 1149 /* Don't perform operation if it would raise a division 1150 by zero exception. */ 1151 if (code == RDIV_EXPR 1152 && REAL_VALUES_EQUAL (d2, dconst0) 1153 && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode))) 1154 return NULL_TREE; 1155 1156 /* If either operand is a NaN, just return it. Otherwise, set up 1157 for floating-point trap; we return an overflow. */ 1158 if (REAL_VALUE_ISNAN (d1)) 1159 return arg1; 1160 else if (REAL_VALUE_ISNAN (d2)) 1161 return arg2; 1162 1163 inexact = real_arithmetic (&value, code, &d1, &d2); 1164 real_convert (&result, mode, &value); 1165 1166 /* Don't constant fold this floating point operation if 1167 the result has overflowed and flag_trapping_math. */ 1168 if (flag_trapping_math 1169 && MODE_HAS_INFINITIES (mode) 1170 && REAL_VALUE_ISINF (result) 1171 && !REAL_VALUE_ISINF (d1) 1172 && !REAL_VALUE_ISINF (d2)) 1173 return NULL_TREE; 1174 1175 /* Don't constant fold this floating point operation if the 1176 result may dependent upon the run-time rounding mode and 1177 flag_rounding_math is set, or if GCC's software emulation 1178 is unable to accurately represent the result. */ 1179 if ((flag_rounding_math 1180 || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations)) 1181 && (inexact || !real_identical (&result, &value))) 1182 return NULL_TREE; 1183 1184 t = build_real (type, result); 1185 1186 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2); 1187 return t; 1188 } 1189 1190 if (TREE_CODE (arg1) == FIXED_CST) 1191 { 1192 FIXED_VALUE_TYPE f1; 1193 FIXED_VALUE_TYPE f2; 1194 FIXED_VALUE_TYPE result; 1195 tree t, type; 1196 int sat_p; 1197 bool overflow_p; 1198 1199 /* The following codes are handled by fixed_arithmetic. */ 1200 switch (code) 1201 { 1202 case PLUS_EXPR: 1203 case MINUS_EXPR: 1204 case MULT_EXPR: 1205 case TRUNC_DIV_EXPR: 1206 f2 = TREE_FIXED_CST (arg2); 1207 break; 1208 1209 case LSHIFT_EXPR: 1210 case RSHIFT_EXPR: 1211 f2.data.high = TREE_INT_CST_HIGH (arg2); 1212 f2.data.low = TREE_INT_CST_LOW (arg2); 1213 f2.mode = SImode; 1214 break; 1215 1216 default: 1217 return NULL_TREE; 1218 } 1219 1220 f1 = TREE_FIXED_CST (arg1); 1221 type = TREE_TYPE (arg1); 1222 sat_p = TYPE_SATURATING (type); 1223 overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p); 1224 t = build_fixed (type, result); 1225 /* Propagate overflow flags. */ 1226 if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2)) 1227 TREE_OVERFLOW (t) = 1; 1228 return t; 1229 } 1230 1231 if (TREE_CODE (arg1) == COMPLEX_CST) 1232 { 1233 tree type = TREE_TYPE (arg1); 1234 tree r1 = TREE_REALPART (arg1); 1235 tree i1 = TREE_IMAGPART (arg1); 1236 tree r2 = TREE_REALPART (arg2); 1237 tree i2 = TREE_IMAGPART (arg2); 1238 tree real, imag; 1239 1240 switch (code) 1241 { 1242 case PLUS_EXPR: 1243 case MINUS_EXPR: 1244 real = const_binop (code, r1, r2); 1245 imag = const_binop (code, i1, i2); 1246 break; 1247 1248 case MULT_EXPR: 1249 if (COMPLEX_FLOAT_TYPE_P (type)) 1250 return do_mpc_arg2 (arg1, arg2, type, 1251 /* do_nonfinite= */ folding_initializer, 1252 mpc_mul); 1253 1254 real = const_binop (MINUS_EXPR, 1255 const_binop (MULT_EXPR, r1, r2), 1256 const_binop (MULT_EXPR, i1, i2)); 1257 imag = const_binop (PLUS_EXPR, 1258 const_binop (MULT_EXPR, r1, i2), 1259 const_binop (MULT_EXPR, i1, r2)); 1260 break; 1261 1262 case RDIV_EXPR: 1263 if (COMPLEX_FLOAT_TYPE_P (type)) 1264 return do_mpc_arg2 (arg1, arg2, type, 1265 /* do_nonfinite= */ folding_initializer, 1266 mpc_div); 1267 /* Fallthru ... */ 1268 case TRUNC_DIV_EXPR: 1269 case CEIL_DIV_EXPR: 1270 case FLOOR_DIV_EXPR: 1271 case ROUND_DIV_EXPR: 1272 if (flag_complex_method == 0) 1273 { 1274 /* Keep this algorithm in sync with 1275 tree-complex.c:expand_complex_div_straight(). 1276 1277 Expand complex division to scalars, straightforward algorithm. 1278 a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t) 1279 t = br*br + bi*bi 1280 */ 1281 tree magsquared 1282 = const_binop (PLUS_EXPR, 1283 const_binop (MULT_EXPR, r2, r2), 1284 const_binop (MULT_EXPR, i2, i2)); 1285 tree t1 1286 = const_binop (PLUS_EXPR, 1287 const_binop (MULT_EXPR, r1, r2), 1288 const_binop (MULT_EXPR, i1, i2)); 1289 tree t2 1290 = const_binop (MINUS_EXPR, 1291 const_binop (MULT_EXPR, i1, r2), 1292 const_binop (MULT_EXPR, r1, i2)); 1293 1294 real = const_binop (code, t1, magsquared); 1295 imag = const_binop (code, t2, magsquared); 1296 } 1297 else 1298 { 1299 /* Keep this algorithm in sync with 1300 tree-complex.c:expand_complex_div_wide(). 1301 1302 Expand complex division to scalars, modified algorithm to minimize 1303 overflow with wide input ranges. */ 1304 tree compare = fold_build2 (LT_EXPR, boolean_type_node, 1305 fold_abs_const (r2, TREE_TYPE (type)), 1306 fold_abs_const (i2, TREE_TYPE (type))); 1307 1308 if (integer_nonzerop (compare)) 1309 { 1310 /* In the TRUE branch, we compute 1311 ratio = br/bi; 1312 div = (br * ratio) + bi; 1313 tr = (ar * ratio) + ai; 1314 ti = (ai * ratio) - ar; 1315 tr = tr / div; 1316 ti = ti / div; */ 1317 tree ratio = const_binop (code, r2, i2); 1318 tree div = const_binop (PLUS_EXPR, i2, 1319 const_binop (MULT_EXPR, r2, ratio)); 1320 real = const_binop (MULT_EXPR, r1, ratio); 1321 real = const_binop (PLUS_EXPR, real, i1); 1322 real = const_binop (code, real, div); 1323 1324 imag = const_binop (MULT_EXPR, i1, ratio); 1325 imag = const_binop (MINUS_EXPR, imag, r1); 1326 imag = const_binop (code, imag, div); 1327 } 1328 else 1329 { 1330 /* In the FALSE branch, we compute 1331 ratio = d/c; 1332 divisor = (d * ratio) + c; 1333 tr = (b * ratio) + a; 1334 ti = b - (a * ratio); 1335 tr = tr / div; 1336 ti = ti / div; */ 1337 tree ratio = const_binop (code, i2, r2); 1338 tree div = const_binop (PLUS_EXPR, r2, 1339 const_binop (MULT_EXPR, i2, ratio)); 1340 1341 real = const_binop (MULT_EXPR, i1, ratio); 1342 real = const_binop (PLUS_EXPR, real, r1); 1343 real = const_binop (code, real, div); 1344 1345 imag = const_binop (MULT_EXPR, r1, ratio); 1346 imag = const_binop (MINUS_EXPR, i1, imag); 1347 imag = const_binop (code, imag, div); 1348 } 1349 } 1350 break; 1351 1352 default: 1353 return NULL_TREE; 1354 } 1355 1356 if (real && imag) 1357 return build_complex (type, real, imag); 1358 } 1359 1360 if (TREE_CODE (arg1) == VECTOR_CST 1361 && TREE_CODE (arg2) == VECTOR_CST) 1362 { 1363 tree type = TREE_TYPE(arg1); 1364 int count = TYPE_VECTOR_SUBPARTS (type), i; 1365 tree *elts = XALLOCAVEC (tree, count); 1366 1367 for (i = 0; i < count; i++) 1368 { 1369 tree elem1 = VECTOR_CST_ELT (arg1, i); 1370 tree elem2 = VECTOR_CST_ELT (arg2, i); 1371 1372 elts[i] = const_binop (code, elem1, elem2); 1373 1374 /* It is possible that const_binop cannot handle the given 1375 code and return NULL_TREE */ 1376 if(elts[i] == NULL_TREE) 1377 return NULL_TREE; 1378 } 1379 1380 return build_vector (type, elts); 1381 } 1382 1383 /* Shifts allow a scalar offset for a vector. */ 1384 if (TREE_CODE (arg1) == VECTOR_CST 1385 && TREE_CODE (arg2) == INTEGER_CST) 1386 { 1387 tree type = TREE_TYPE (arg1); 1388 int count = TYPE_VECTOR_SUBPARTS (type), i; 1389 tree *elts = XALLOCAVEC (tree, count); 1390 1391 if (code == VEC_LSHIFT_EXPR 1392 || code == VEC_RSHIFT_EXPR) 1393 { 1394 if (!host_integerp (arg2, 1)) 1395 return NULL_TREE; 1396 1397 unsigned HOST_WIDE_INT shiftc = tree_low_cst (arg2, 1); 1398 unsigned HOST_WIDE_INT outerc = tree_low_cst (TYPE_SIZE (type), 1); 1399 unsigned HOST_WIDE_INT innerc 1400 = tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1); 1401 if (shiftc >= outerc || (shiftc % innerc) != 0) 1402 return NULL_TREE; 1403 int offset = shiftc / innerc; 1404 /* The direction of VEC_[LR]SHIFT_EXPR is endian dependent. 1405 For reductions, compiler emits VEC_RSHIFT_EXPR always, 1406 for !BYTES_BIG_ENDIAN picks first vector element, but 1407 for BYTES_BIG_ENDIAN last element from the vector. */ 1408 if ((code == VEC_RSHIFT_EXPR) ^ (!BYTES_BIG_ENDIAN)) 1409 offset = -offset; 1410 tree zero = build_zero_cst (TREE_TYPE (type)); 1411 for (i = 0; i < count; i++) 1412 { 1413 if (i + offset < 0 || i + offset >= count) 1414 elts[i] = zero; 1415 else 1416 elts[i] = VECTOR_CST_ELT (arg1, i + offset); 1417 } 1418 } 1419 else 1420 return NULL_TREE; 1421 1422 return build_vector (type, elts); 1423 } 1424 return NULL_TREE; 1425} 1426 1427/* Create a sizetype INT_CST node with NUMBER sign extended. KIND 1428 indicates which particular sizetype to create. */ 1429 1430tree 1431size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind) 1432{ 1433 return build_int_cst (sizetype_tab[(int) kind], number); 1434} 1435 1436/* Combine operands OP1 and OP2 with arithmetic operation CODE. CODE 1437 is a tree code. The type of the result is taken from the operands. 1438 Both must be equivalent integer types, ala int_binop_types_match_p. 1439 If the operands are constant, so is the result. */ 1440 1441tree 1442size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1) 1443{ 1444 tree type = TREE_TYPE (arg0); 1445 1446 if (arg0 == error_mark_node || arg1 == error_mark_node) 1447 return error_mark_node; 1448 1449 gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0), 1450 TREE_TYPE (arg1))); 1451 1452 /* Handle the special case of two integer constants faster. */ 1453 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) 1454 { 1455 /* And some specific cases even faster than that. */ 1456 if (code == PLUS_EXPR) 1457 { 1458 if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0)) 1459 return arg1; 1460 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1)) 1461 return arg0; 1462 } 1463 else if (code == MINUS_EXPR) 1464 { 1465 if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1)) 1466 return arg0; 1467 } 1468 else if (code == MULT_EXPR) 1469 { 1470 if (integer_onep (arg0) && !TREE_OVERFLOW (arg0)) 1471 return arg1; 1472 } 1473 1474 /* Handle general case of two integer constants. For sizetype 1475 constant calculations we always want to know about overflow, 1476 even in the unsigned case. */ 1477 return int_const_binop_1 (code, arg0, arg1, -1); 1478 } 1479 1480 return fold_build2_loc (loc, code, type, arg0, arg1); 1481} 1482 1483/* Given two values, either both of sizetype or both of bitsizetype, 1484 compute the difference between the two values. Return the value 1485 in signed type corresponding to the type of the operands. */ 1486 1487tree 1488size_diffop_loc (location_t loc, tree arg0, tree arg1) 1489{ 1490 tree type = TREE_TYPE (arg0); 1491 tree ctype; 1492 1493 gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0), 1494 TREE_TYPE (arg1))); 1495 1496 /* If the type is already signed, just do the simple thing. */ 1497 if (!TYPE_UNSIGNED (type)) 1498 return size_binop_loc (loc, MINUS_EXPR, arg0, arg1); 1499 1500 if (type == sizetype) 1501 ctype = ssizetype; 1502 else if (type == bitsizetype) 1503 ctype = sbitsizetype; 1504 else 1505 ctype = signed_type_for (type); 1506 1507 /* If either operand is not a constant, do the conversions to the signed 1508 type and subtract. The hardware will do the right thing with any 1509 overflow in the subtraction. */ 1510 if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST) 1511 return size_binop_loc (loc, MINUS_EXPR, 1512 fold_convert_loc (loc, ctype, arg0), 1513 fold_convert_loc (loc, ctype, arg1)); 1514 1515 /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE. 1516 Otherwise, subtract the other way, convert to CTYPE (we know that can't 1517 overflow) and negate (which can't either). Special-case a result 1518 of zero while we're here. */ 1519 if (tree_int_cst_equal (arg0, arg1)) 1520 return build_int_cst (ctype, 0); 1521 else if (tree_int_cst_lt (arg1, arg0)) 1522 return fold_convert_loc (loc, ctype, 1523 size_binop_loc (loc, MINUS_EXPR, arg0, arg1)); 1524 else 1525 return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0), 1526 fold_convert_loc (loc, ctype, 1527 size_binop_loc (loc, 1528 MINUS_EXPR, 1529 arg1, arg0))); 1530} 1531 1532/* A subroutine of fold_convert_const handling conversions of an 1533 INTEGER_CST to another integer type. */ 1534 1535static tree 1536fold_convert_const_int_from_int (tree type, const_tree arg1) 1537{ 1538 tree t; 1539 1540 /* Given an integer constant, make new constant with new type, 1541 appropriately sign-extended or truncated. */ 1542 t = force_fit_type_double (type, tree_to_double_int (arg1), 1543 !POINTER_TYPE_P (TREE_TYPE (arg1)), 1544 (TREE_INT_CST_HIGH (arg1) < 0 1545 && (TYPE_UNSIGNED (type) 1546 < TYPE_UNSIGNED (TREE_TYPE (arg1)))) 1547 | TREE_OVERFLOW (arg1)); 1548 1549 return t; 1550} 1551 1552/* A subroutine of fold_convert_const handling conversions a REAL_CST 1553 to an integer type. */ 1554 1555static tree 1556fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1) 1557{ 1558 int overflow = 0; 1559 tree t; 1560 1561 /* The following code implements the floating point to integer 1562 conversion rules required by the Java Language Specification, 1563 that IEEE NaNs are mapped to zero and values that overflow 1564 the target precision saturate, i.e. values greater than 1565 INT_MAX are mapped to INT_MAX, and values less than INT_MIN 1566 are mapped to INT_MIN. These semantics are allowed by the 1567 C and C++ standards that simply state that the behavior of 1568 FP-to-integer conversion is unspecified upon overflow. */ 1569 1570 double_int val; 1571 REAL_VALUE_TYPE r; 1572 REAL_VALUE_TYPE x = TREE_REAL_CST (arg1); 1573 1574 switch (code) 1575 { 1576 case FIX_TRUNC_EXPR: 1577 real_trunc (&r, VOIDmode, &x); 1578 break; 1579 1580 default: 1581 gcc_unreachable (); 1582 } 1583 1584 /* If R is NaN, return zero and show we have an overflow. */ 1585 if (REAL_VALUE_ISNAN (r)) 1586 { 1587 overflow = 1; 1588 val = double_int_zero; 1589 } 1590 1591 /* See if R is less than the lower bound or greater than the 1592 upper bound. */ 1593 1594 if (! overflow) 1595 { 1596 tree lt = TYPE_MIN_VALUE (type); 1597 REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt); 1598 if (REAL_VALUES_LESS (r, l)) 1599 { 1600 overflow = 1; 1601 val = tree_to_double_int (lt); 1602 } 1603 } 1604 1605 if (! overflow) 1606 { 1607 tree ut = TYPE_MAX_VALUE (type); 1608 if (ut) 1609 { 1610 REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut); 1611 if (REAL_VALUES_LESS (u, r)) 1612 { 1613 overflow = 1; 1614 val = tree_to_double_int (ut); 1615 } 1616 } 1617 } 1618 1619 if (! overflow) 1620 real_to_integer2 ((HOST_WIDE_INT *) &val.low, &val.high, &r); 1621 1622 t = force_fit_type_double (type, val, -1, overflow | TREE_OVERFLOW (arg1)); 1623 return t; 1624} 1625 1626/* A subroutine of fold_convert_const handling conversions of a 1627 FIXED_CST to an integer type. */ 1628 1629static tree 1630fold_convert_const_int_from_fixed (tree type, const_tree arg1) 1631{ 1632 tree t; 1633 double_int temp, temp_trunc; 1634 unsigned int mode; 1635 1636 /* Right shift FIXED_CST to temp by fbit. */ 1637 temp = TREE_FIXED_CST (arg1).data; 1638 mode = TREE_FIXED_CST (arg1).mode; 1639 if (GET_MODE_FBIT (mode) < HOST_BITS_PER_DOUBLE_INT) 1640 { 1641 temp = temp.rshift (GET_MODE_FBIT (mode), 1642 HOST_BITS_PER_DOUBLE_INT, 1643 SIGNED_FIXED_POINT_MODE_P (mode)); 1644 1645 /* Left shift temp to temp_trunc by fbit. */ 1646 temp_trunc = temp.lshift (GET_MODE_FBIT (mode), 1647 HOST_BITS_PER_DOUBLE_INT, 1648 SIGNED_FIXED_POINT_MODE_P (mode)); 1649 } 1650 else 1651 { 1652 temp = double_int_zero; 1653 temp_trunc = double_int_zero; 1654 } 1655 1656 /* If FIXED_CST is negative, we need to round the value toward 0. 1657 By checking if the fractional bits are not zero to add 1 to temp. */ 1658 if (SIGNED_FIXED_POINT_MODE_P (mode) 1659 && temp_trunc.is_negative () 1660 && TREE_FIXED_CST (arg1).data != temp_trunc) 1661 temp += double_int_one; 1662 1663 /* Given a fixed-point constant, make new constant with new type, 1664 appropriately sign-extended or truncated. */ 1665 t = force_fit_type_double (type, temp, -1, 1666 (temp.is_negative () 1667 && (TYPE_UNSIGNED (type) 1668 < TYPE_UNSIGNED (TREE_TYPE (arg1)))) 1669 | TREE_OVERFLOW (arg1)); 1670 1671 return t; 1672} 1673 1674/* A subroutine of fold_convert_const handling conversions a REAL_CST 1675 to another floating point type. */ 1676 1677static tree 1678fold_convert_const_real_from_real (tree type, const_tree arg1) 1679{ 1680 REAL_VALUE_TYPE value; 1681 tree t; 1682 1683 real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1)); 1684 t = build_real (type, value); 1685 1686 /* If converting an infinity or NAN to a representation that doesn't 1687 have one, set the overflow bit so that we can produce some kind of 1688 error message at the appropriate point if necessary. It's not the 1689 most user-friendly message, but it's better than nothing. */ 1690 if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1)) 1691 && !MODE_HAS_INFINITIES (TYPE_MODE (type))) 1692 TREE_OVERFLOW (t) = 1; 1693 else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)) 1694 && !MODE_HAS_NANS (TYPE_MODE (type))) 1695 TREE_OVERFLOW (t) = 1; 1696 /* Regular overflow, conversion produced an infinity in a mode that 1697 can't represent them. */ 1698 else if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) 1699 && REAL_VALUE_ISINF (value) 1700 && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1))) 1701 TREE_OVERFLOW (t) = 1; 1702 else 1703 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1); 1704 return t; 1705} 1706 1707/* A subroutine of fold_convert_const handling conversions a FIXED_CST 1708 to a floating point type. */ 1709 1710static tree 1711fold_convert_const_real_from_fixed (tree type, const_tree arg1) 1712{ 1713 REAL_VALUE_TYPE value; 1714 tree t; 1715 1716 real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1)); 1717 t = build_real (type, value); 1718 1719 TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1); 1720 return t; 1721} 1722 1723/* A subroutine of fold_convert_const handling conversions a FIXED_CST 1724 to another fixed-point type. */ 1725 1726static tree 1727fold_convert_const_fixed_from_fixed (tree type, const_tree arg1) 1728{ 1729 FIXED_VALUE_TYPE value; 1730 tree t; 1731 bool overflow_p; 1732 1733 overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1), 1734 TYPE_SATURATING (type)); 1735 t = build_fixed (type, value); 1736 1737 /* Propagate overflow flags. */ 1738 if (overflow_p | TREE_OVERFLOW (arg1)) 1739 TREE_OVERFLOW (t) = 1; 1740 return t; 1741} 1742 1743/* A subroutine of fold_convert_const handling conversions an INTEGER_CST 1744 to a fixed-point type. */ 1745 1746static tree 1747fold_convert_const_fixed_from_int (tree type, const_tree arg1) 1748{ 1749 FIXED_VALUE_TYPE value; 1750 tree t; 1751 bool overflow_p; 1752 1753 overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type), 1754 TREE_INT_CST (arg1), 1755 TYPE_UNSIGNED (TREE_TYPE (arg1)), 1756 TYPE_SATURATING (type)); 1757 t = build_fixed (type, value); 1758 1759 /* Propagate overflow flags. */ 1760 if (overflow_p | TREE_OVERFLOW (arg1)) 1761 TREE_OVERFLOW (t) = 1; 1762 return t; 1763} 1764 1765/* A subroutine of fold_convert_const handling conversions a REAL_CST 1766 to a fixed-point type. */ 1767 1768static tree 1769fold_convert_const_fixed_from_real (tree type, const_tree arg1) 1770{ 1771 FIXED_VALUE_TYPE value; 1772 tree t; 1773 bool overflow_p; 1774 1775 overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type), 1776 &TREE_REAL_CST (arg1), 1777 TYPE_SATURATING (type)); 1778 t = build_fixed (type, value); 1779 1780 /* Propagate overflow flags. */ 1781 if (overflow_p | TREE_OVERFLOW (arg1)) 1782 TREE_OVERFLOW (t) = 1; 1783 return t; 1784} 1785 1786/* Attempt to fold type conversion operation CODE of expression ARG1 to 1787 type TYPE. If no simplification can be done return NULL_TREE. */ 1788 1789static tree 1790fold_convert_const (enum tree_code code, tree type, tree arg1) 1791{ 1792 if (TREE_TYPE (arg1) == type) 1793 return arg1; 1794 1795 if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type) 1796 || TREE_CODE (type) == OFFSET_TYPE) 1797 { 1798 if (TREE_CODE (arg1) == INTEGER_CST) 1799 return fold_convert_const_int_from_int (type, arg1); 1800 else if (TREE_CODE (arg1) == REAL_CST) 1801 return fold_convert_const_int_from_real (code, type, arg1); 1802 else if (TREE_CODE (arg1) == FIXED_CST) 1803 return fold_convert_const_int_from_fixed (type, arg1); 1804 } 1805 else if (TREE_CODE (type) == REAL_TYPE) 1806 { 1807 if (TREE_CODE (arg1) == INTEGER_CST) 1808 return build_real_from_int_cst (type, arg1); 1809 else if (TREE_CODE (arg1) == REAL_CST) 1810 return fold_convert_const_real_from_real (type, arg1); 1811 else if (TREE_CODE (arg1) == FIXED_CST) 1812 return fold_convert_const_real_from_fixed (type, arg1); 1813 } 1814 else if (TREE_CODE (type) == FIXED_POINT_TYPE) 1815 { 1816 if (TREE_CODE (arg1) == FIXED_CST) 1817 return fold_convert_const_fixed_from_fixed (type, arg1); 1818 else if (TREE_CODE (arg1) == INTEGER_CST) 1819 return fold_convert_const_fixed_from_int (type, arg1); 1820 else if (TREE_CODE (arg1) == REAL_CST) 1821 return fold_convert_const_fixed_from_real (type, arg1); 1822 } 1823 return NULL_TREE; 1824} 1825 1826/* Construct a vector of zero elements of vector type TYPE. */ 1827 1828static tree 1829build_zero_vector (tree type) 1830{ 1831 tree t; 1832 1833 t = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node); 1834 return build_vector_from_val (type, t); 1835} 1836 1837/* Returns true, if ARG is convertible to TYPE using a NOP_EXPR. */ 1838 1839bool 1840fold_convertible_p (const_tree type, const_tree arg) 1841{ 1842 tree orig = TREE_TYPE (arg); 1843 1844 if (type == orig) 1845 return true; 1846 1847 if (TREE_CODE (arg) == ERROR_MARK 1848 || TREE_CODE (type) == ERROR_MARK 1849 || TREE_CODE (orig) == ERROR_MARK) 1850 return false; 1851 1852 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)) 1853 return true; 1854 1855 switch (TREE_CODE (type)) 1856 { 1857 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: 1858 case POINTER_TYPE: case REFERENCE_TYPE: 1859 case OFFSET_TYPE: 1860 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig) 1861 || TREE_CODE (orig) == OFFSET_TYPE) 1862 return true; 1863 return (TREE_CODE (orig) == VECTOR_TYPE 1864 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig))); 1865 1866 case REAL_TYPE: 1867 case FIXED_POINT_TYPE: 1868 case COMPLEX_TYPE: 1869 case VECTOR_TYPE: 1870 case VOID_TYPE: 1871 return TREE_CODE (type) == TREE_CODE (orig); 1872 1873 default: 1874 return false; 1875 } 1876} 1877 1878/* Convert expression ARG to type TYPE. Used by the middle-end for 1879 simple conversions in preference to calling the front-end's convert. */ 1880 1881tree 1882fold_convert_loc (location_t loc, tree type, tree arg) 1883{ 1884 tree orig = TREE_TYPE (arg); 1885 tree tem; 1886 1887 if (type == orig) 1888 return arg; 1889 1890 if (TREE_CODE (arg) == ERROR_MARK 1891 || TREE_CODE (type) == ERROR_MARK 1892 || TREE_CODE (orig) == ERROR_MARK) 1893 return error_mark_node; 1894 1895 switch (TREE_CODE (type)) 1896 { 1897 case POINTER_TYPE: 1898 case REFERENCE_TYPE: 1899 /* Handle conversions between pointers to different address spaces. */ 1900 if (POINTER_TYPE_P (orig) 1901 && (TYPE_ADDR_SPACE (TREE_TYPE (type)) 1902 != TYPE_ADDR_SPACE (TREE_TYPE (orig)))) 1903 return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg); 1904 /* fall through */ 1905 1906 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: 1907 case OFFSET_TYPE: 1908 if (TREE_CODE (arg) == INTEGER_CST) 1909 { 1910 tem = fold_convert_const (NOP_EXPR, type, arg); 1911 if (tem != NULL_TREE) 1912 return tem; 1913 } 1914 if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig) 1915 || TREE_CODE (orig) == OFFSET_TYPE) 1916 return fold_build1_loc (loc, NOP_EXPR, type, arg); 1917 if (TREE_CODE (orig) == COMPLEX_TYPE) 1918 return fold_convert_loc (loc, type, 1919 fold_build1_loc (loc, REALPART_EXPR, 1920 TREE_TYPE (orig), arg)); 1921 gcc_assert (TREE_CODE (orig) == VECTOR_TYPE 1922 && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig))); 1923 return fold_build1_loc (loc, NOP_EXPR, type, arg); 1924 1925 case REAL_TYPE: 1926 if (TREE_CODE (arg) == INTEGER_CST) 1927 { 1928 tem = fold_convert_const (FLOAT_EXPR, type, arg); 1929 if (tem != NULL_TREE) 1930 return tem; 1931 } 1932 else if (TREE_CODE (arg) == REAL_CST) 1933 { 1934 tem = fold_convert_const (NOP_EXPR, type, arg); 1935 if (tem != NULL_TREE) 1936 return tem; 1937 } 1938 else if (TREE_CODE (arg) == FIXED_CST) 1939 { 1940 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg); 1941 if (tem != NULL_TREE) 1942 return tem; 1943 } 1944 1945 switch (TREE_CODE (orig)) 1946 { 1947 case INTEGER_TYPE: 1948 case BOOLEAN_TYPE: case ENUMERAL_TYPE: 1949 case POINTER_TYPE: case REFERENCE_TYPE: 1950 return fold_build1_loc (loc, FLOAT_EXPR, type, arg); 1951 1952 case REAL_TYPE: 1953 return fold_build1_loc (loc, NOP_EXPR, type, arg); 1954 1955 case FIXED_POINT_TYPE: 1956 return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg); 1957 1958 case COMPLEX_TYPE: 1959 tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg); 1960 return fold_convert_loc (loc, type, tem); 1961 1962 default: 1963 gcc_unreachable (); 1964 } 1965 1966 case FIXED_POINT_TYPE: 1967 if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST 1968 || TREE_CODE (arg) == REAL_CST) 1969 { 1970 tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg); 1971 if (tem != NULL_TREE) 1972 goto fold_convert_exit; 1973 } 1974 1975 switch (TREE_CODE (orig)) 1976 { 1977 case FIXED_POINT_TYPE: 1978 case INTEGER_TYPE: 1979 case ENUMERAL_TYPE: 1980 case BOOLEAN_TYPE: 1981 case REAL_TYPE: 1982 return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg); 1983 1984 case COMPLEX_TYPE: 1985 tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg); 1986 return fold_convert_loc (loc, type, tem); 1987 1988 default: 1989 gcc_unreachable (); 1990 } 1991 1992 case COMPLEX_TYPE: 1993 switch (TREE_CODE (orig)) 1994 { 1995 case INTEGER_TYPE: 1996 case BOOLEAN_TYPE: case ENUMERAL_TYPE: 1997 case POINTER_TYPE: case REFERENCE_TYPE: 1998 case REAL_TYPE: 1999 case FIXED_POINT_TYPE: 2000 return fold_build2_loc (loc, COMPLEX_EXPR, type, 2001 fold_convert_loc (loc, TREE_TYPE (type), arg), 2002 fold_convert_loc (loc, TREE_TYPE (type), 2003 integer_zero_node)); 2004 case COMPLEX_TYPE: 2005 { 2006 tree rpart, ipart; 2007 2008 if (TREE_CODE (arg) == COMPLEX_EXPR) 2009 { 2010 rpart = fold_convert_loc (loc, TREE_TYPE (type), 2011 TREE_OPERAND (arg, 0)); 2012 ipart = fold_convert_loc (loc, TREE_TYPE (type), 2013 TREE_OPERAND (arg, 1)); 2014 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart); 2015 } 2016 2017 arg = save_expr (arg); 2018 rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg); 2019 ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg); 2020 rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart); 2021 ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart); 2022 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart); 2023 } 2024 2025 default: 2026 gcc_unreachable (); 2027 } 2028 2029 case VECTOR_TYPE: 2030 if (integer_zerop (arg)) 2031 return build_zero_vector (type); 2032 gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig))); 2033 gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig) 2034 || TREE_CODE (orig) == VECTOR_TYPE); 2035 return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg); 2036 2037 case VOID_TYPE: 2038 tem = fold_ignored_result (arg); 2039 return fold_build1_loc (loc, NOP_EXPR, type, tem); 2040 2041 default: 2042 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig)) 2043 return fold_build1_loc (loc, NOP_EXPR, type, arg); 2044 gcc_unreachable (); 2045 } 2046 fold_convert_exit: 2047 protected_set_expr_location_unshare (tem, loc); 2048 return tem; 2049} 2050 2051/* Return false if expr can be assumed not to be an lvalue, true 2052 otherwise. */ 2053 2054static bool 2055maybe_lvalue_p (const_tree x) 2056{ 2057 /* We only need to wrap lvalue tree codes. */ 2058 switch (TREE_CODE (x)) 2059 { 2060 case VAR_DECL: 2061 case PARM_DECL: 2062 case RESULT_DECL: 2063 case LABEL_DECL: 2064 case FUNCTION_DECL: 2065 case SSA_NAME: 2066 2067 case COMPONENT_REF: 2068 case MEM_REF: 2069 case INDIRECT_REF: 2070 case ARRAY_REF: 2071 case ARRAY_RANGE_REF: 2072 case BIT_FIELD_REF: 2073 case OBJ_TYPE_REF: 2074 2075 case REALPART_EXPR: 2076 case IMAGPART_EXPR: 2077 case PREINCREMENT_EXPR: 2078 case PREDECREMENT_EXPR: 2079 case SAVE_EXPR: 2080 case TRY_CATCH_EXPR: 2081 case WITH_CLEANUP_EXPR: 2082 case COMPOUND_EXPR: 2083 case MODIFY_EXPR: 2084 case TARGET_EXPR: 2085 case COND_EXPR: 2086 case BIND_EXPR: 2087 break; 2088 2089 default: 2090 /* Assume the worst for front-end tree codes. */ 2091 if ((int)TREE_CODE (x) >= NUM_TREE_CODES) 2092 break; 2093 return false; 2094 } 2095 2096 return true; 2097} 2098 2099/* Return an expr equal to X but certainly not valid as an lvalue. */ 2100 2101tree 2102non_lvalue_loc (location_t loc, tree x) 2103{ 2104 /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to 2105 us. */ 2106 if (in_gimple_form) 2107 return x; 2108 2109 if (! maybe_lvalue_p (x)) 2110 return x; 2111 return build1_loc (loc, NON_LVALUE_EXPR, TREE_TYPE (x), x); 2112} 2113 2114/* Nonzero means lvalues are limited to those valid in pedantic ANSI C. 2115 Zero means allow extended lvalues. */ 2116 2117int pedantic_lvalues; 2118 2119/* When pedantic, return an expr equal to X but certainly not valid as a 2120 pedantic lvalue. Otherwise, return X. */ 2121 2122static tree 2123pedantic_non_lvalue_loc (location_t loc, tree x) 2124{ 2125 if (pedantic_lvalues) 2126 return non_lvalue_loc (loc, x); 2127 2128 return protected_set_expr_location_unshare (x, loc); 2129} 2130 2131/* Given a tree comparison code, return the code that is the logical inverse. 2132 It is generally not safe to do this for floating-point comparisons, except 2133 for EQ_EXPR, NE_EXPR, ORDERED_EXPR and UNORDERED_EXPR, so we return 2134 ERROR_MARK in this case. */ 2135 2136enum tree_code 2137invert_tree_comparison (enum tree_code code, bool honor_nans) 2138{ 2139 if (honor_nans && flag_trapping_math && code != EQ_EXPR && code != NE_EXPR 2140 && code != ORDERED_EXPR && code != UNORDERED_EXPR) 2141 return ERROR_MARK; 2142 2143 switch (code) 2144 { 2145 case EQ_EXPR: 2146 return NE_EXPR; 2147 case NE_EXPR: 2148 return EQ_EXPR; 2149 case GT_EXPR: 2150 return honor_nans ? UNLE_EXPR : LE_EXPR; 2151 case GE_EXPR: 2152 return honor_nans ? UNLT_EXPR : LT_EXPR; 2153 case LT_EXPR: 2154 return honor_nans ? UNGE_EXPR : GE_EXPR; 2155 case LE_EXPR: 2156 return honor_nans ? UNGT_EXPR : GT_EXPR; 2157 case LTGT_EXPR: 2158 return UNEQ_EXPR; 2159 case UNEQ_EXPR: 2160 return LTGT_EXPR; 2161 case UNGT_EXPR: 2162 return LE_EXPR; 2163 case UNGE_EXPR: 2164 return LT_EXPR; 2165 case UNLT_EXPR: 2166 return GE_EXPR; 2167 case UNLE_EXPR: 2168 return GT_EXPR; 2169 case ORDERED_EXPR: 2170 return UNORDERED_EXPR; 2171 case UNORDERED_EXPR: 2172 return ORDERED_EXPR; 2173 default: 2174 gcc_unreachable (); 2175 } 2176} 2177 2178/* Similar, but return the comparison that results if the operands are 2179 swapped. This is safe for floating-point. */ 2180 2181enum tree_code 2182swap_tree_comparison (enum tree_code code) 2183{ 2184 switch (code) 2185 { 2186 case EQ_EXPR: 2187 case NE_EXPR: 2188 case ORDERED_EXPR: 2189 case UNORDERED_EXPR: 2190 case LTGT_EXPR: 2191 case UNEQ_EXPR: 2192 return code; 2193 case GT_EXPR: 2194 return LT_EXPR; 2195 case GE_EXPR: 2196 return LE_EXPR; 2197 case LT_EXPR: 2198 return GT_EXPR; 2199 case LE_EXPR: 2200 return GE_EXPR; 2201 case UNGT_EXPR: 2202 return UNLT_EXPR; 2203 case UNGE_EXPR: 2204 return UNLE_EXPR; 2205 case UNLT_EXPR: 2206 return UNGT_EXPR; 2207 case UNLE_EXPR: 2208 return UNGE_EXPR; 2209 default: 2210 gcc_unreachable (); 2211 } 2212} 2213 2214 2215/* Convert a comparison tree code from an enum tree_code representation 2216 into a compcode bit-based encoding. This function is the inverse of 2217 compcode_to_comparison. */ 2218 2219static enum comparison_code 2220comparison_to_compcode (enum tree_code code) 2221{ 2222 switch (code) 2223 { 2224 case LT_EXPR: 2225 return COMPCODE_LT; 2226 case EQ_EXPR: 2227 return COMPCODE_EQ; 2228 case LE_EXPR: 2229 return COMPCODE_LE; 2230 case GT_EXPR: 2231 return COMPCODE_GT; 2232 case NE_EXPR: 2233 return COMPCODE_NE; 2234 case GE_EXPR: 2235 return COMPCODE_GE; 2236 case ORDERED_EXPR: 2237 return COMPCODE_ORD; 2238 case UNORDERED_EXPR: 2239 return COMPCODE_UNORD; 2240 case UNLT_EXPR: 2241 return COMPCODE_UNLT; 2242 case UNEQ_EXPR: 2243 return COMPCODE_UNEQ; 2244 case UNLE_EXPR: 2245 return COMPCODE_UNLE; 2246 case UNGT_EXPR: 2247 return COMPCODE_UNGT; 2248 case LTGT_EXPR: 2249 return COMPCODE_LTGT; 2250 case UNGE_EXPR: 2251 return COMPCODE_UNGE; 2252 default: 2253 gcc_unreachable (); 2254 } 2255} 2256 2257/* Convert a compcode bit-based encoding of a comparison operator back 2258 to GCC's enum tree_code representation. This function is the 2259 inverse of comparison_to_compcode. */ 2260 2261static enum tree_code 2262compcode_to_comparison (enum comparison_code code) 2263{ 2264 switch (code) 2265 { 2266 case COMPCODE_LT: 2267 return LT_EXPR; 2268 case COMPCODE_EQ: 2269 return EQ_EXPR; 2270 case COMPCODE_LE: 2271 return LE_EXPR; 2272 case COMPCODE_GT: 2273 return GT_EXPR; 2274 case COMPCODE_NE: 2275 return NE_EXPR; 2276 case COMPCODE_GE: 2277 return GE_EXPR; 2278 case COMPCODE_ORD: 2279 return ORDERED_EXPR; 2280 case COMPCODE_UNORD: 2281 return UNORDERED_EXPR; 2282 case COMPCODE_UNLT: 2283 return UNLT_EXPR; 2284 case COMPCODE_UNEQ: 2285 return UNEQ_EXPR; 2286 case COMPCODE_UNLE: 2287 return UNLE_EXPR; 2288 case COMPCODE_UNGT: 2289 return UNGT_EXPR; 2290 case COMPCODE_LTGT: 2291 return LTGT_EXPR; 2292 case COMPCODE_UNGE: 2293 return UNGE_EXPR; 2294 default: 2295 gcc_unreachable (); 2296 } 2297} 2298 2299/* Return a tree for the comparison which is the combination of 2300 doing the AND or OR (depending on CODE) of the two operations LCODE 2301 and RCODE on the identical operands LL_ARG and LR_ARG. Take into account 2302 the possibility of trapping if the mode has NaNs, and return NULL_TREE 2303 if this makes the transformation invalid. */ 2304 2305tree 2306combine_comparisons (location_t loc, 2307 enum tree_code code, enum tree_code lcode, 2308 enum tree_code rcode, tree truth_type, 2309 tree ll_arg, tree lr_arg) 2310{ 2311 bool honor_nans = HONOR_NANS (TYPE_MODE (TREE_TYPE (ll_arg))); 2312 enum comparison_code lcompcode = comparison_to_compcode (lcode); 2313 enum comparison_code rcompcode = comparison_to_compcode (rcode); 2314 int compcode; 2315 2316 switch (code) 2317 { 2318 case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR: 2319 compcode = lcompcode & rcompcode; 2320 break; 2321 2322 case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR: 2323 compcode = lcompcode | rcompcode; 2324 break; 2325 2326 default: 2327 return NULL_TREE; 2328 } 2329 2330 if (!honor_nans) 2331 { 2332 /* Eliminate unordered comparisons, as well as LTGT and ORD 2333 which are not used unless the mode has NaNs. */ 2334 compcode &= ~COMPCODE_UNORD; 2335 if (compcode == COMPCODE_LTGT) 2336 compcode = COMPCODE_NE; 2337 else if (compcode == COMPCODE_ORD) 2338 compcode = COMPCODE_TRUE; 2339 } 2340 else if (flag_trapping_math) 2341 { 2342 /* Check that the original operation and the optimized ones will trap 2343 under the same condition. */ 2344 bool ltrap = (lcompcode & COMPCODE_UNORD) == 0 2345 && (lcompcode != COMPCODE_EQ) 2346 && (lcompcode != COMPCODE_ORD); 2347 bool rtrap = (rcompcode & COMPCODE_UNORD) == 0 2348 && (rcompcode != COMPCODE_EQ) 2349 && (rcompcode != COMPCODE_ORD); 2350 bool trap = (compcode & COMPCODE_UNORD) == 0 2351 && (compcode != COMPCODE_EQ) 2352 && (compcode != COMPCODE_ORD); 2353 2354 /* In a short-circuited boolean expression the LHS might be 2355 such that the RHS, if evaluated, will never trap. For 2356 example, in ORD (x, y) && (x < y), we evaluate the RHS only 2357 if neither x nor y is NaN. (This is a mixed blessing: for 2358 example, the expression above will never trap, hence 2359 optimizing it to x < y would be invalid). */ 2360 if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD)) 2361 || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD))) 2362 rtrap = false; 2363 2364 /* If the comparison was short-circuited, and only the RHS 2365 trapped, we may now generate a spurious trap. */ 2366 if (rtrap && !ltrap 2367 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)) 2368 return NULL_TREE; 2369 2370 /* If we changed the conditions that cause a trap, we lose. */ 2371 if ((ltrap || rtrap) != trap) 2372 return NULL_TREE; 2373 } 2374 2375 if (compcode == COMPCODE_TRUE) 2376 return constant_boolean_node (true, truth_type); 2377 else if (compcode == COMPCODE_FALSE) 2378 return constant_boolean_node (false, truth_type); 2379 else 2380 { 2381 enum tree_code tcode; 2382 2383 tcode = compcode_to_comparison ((enum comparison_code) compcode); 2384 return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg); 2385 } 2386} 2387 2388/* Return nonzero if two operands (typically of the same tree node) 2389 are necessarily equal. If either argument has side-effects this 2390 function returns zero. FLAGS modifies behavior as follows: 2391 2392 If OEP_ONLY_CONST is set, only return nonzero for constants. 2393 This function tests whether the operands are indistinguishable; 2394 it does not test whether they are equal using C's == operation. 2395 The distinction is important for IEEE floating point, because 2396 (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and 2397 (2) two NaNs may be indistinguishable, but NaN!=NaN. 2398 2399 If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself 2400 even though it may hold multiple values during a function. 2401 This is because a GCC tree node guarantees that nothing else is 2402 executed between the evaluation of its "operands" (which may often 2403 be evaluated in arbitrary order). Hence if the operands themselves 2404 don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the 2405 same value in each operand/subexpression. Hence leaving OEP_ONLY_CONST 2406 unset means assuming isochronic (or instantaneous) tree equivalence. 2407 Unless comparing arbitrary expression trees, such as from different 2408 statements, this flag can usually be left unset. 2409 2410 If OEP_PURE_SAME is set, then pure functions with identical arguments 2411 are considered the same. It is used when the caller has other ways 2412 to ensure that global memory is unchanged in between. */ 2413 2414int 2415operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) 2416{ 2417 /* If either is ERROR_MARK, they aren't equal. */ 2418 if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK 2419 || TREE_TYPE (arg0) == error_mark_node 2420 || TREE_TYPE (arg1) == error_mark_node) 2421 return 0; 2422 2423 /* Similar, if either does not have a type (like a released SSA name), 2424 they aren't equal. */ 2425 if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1)) 2426 return 0; 2427 2428 /* Check equality of integer constants before bailing out due to 2429 precision differences. */ 2430 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) 2431 return tree_int_cst_equal (arg0, arg1); 2432 2433 /* If both types don't have the same signedness, then we can't consider 2434 them equal. We must check this before the STRIP_NOPS calls 2435 because they may change the signedness of the arguments. As pointers 2436 strictly don't have a signedness, require either two pointers or 2437 two non-pointers as well. */ 2438 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)) 2439 || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1))) 2440 return 0; 2441 2442 /* We cannot consider pointers to different address space equal. */ 2443 if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1)) 2444 && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0))) 2445 != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1))))) 2446 return 0; 2447 2448 /* If both types don't have the same precision, then it is not safe 2449 to strip NOPs. */ 2450 if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1))) 2451 return 0; 2452 2453 STRIP_NOPS (arg0); 2454 STRIP_NOPS (arg1); 2455 2456 /* In case both args are comparisons but with different comparison 2457 code, try to swap the comparison operands of one arg to produce 2458 a match and compare that variant. */ 2459 if (TREE_CODE (arg0) != TREE_CODE (arg1) 2460 && COMPARISON_CLASS_P (arg0) 2461 && COMPARISON_CLASS_P (arg1)) 2462 { 2463 enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1)); 2464 2465 if (TREE_CODE (arg0) == swap_code) 2466 return operand_equal_p (TREE_OPERAND (arg0, 0), 2467 TREE_OPERAND (arg1, 1), flags) 2468 && operand_equal_p (TREE_OPERAND (arg0, 1), 2469 TREE_OPERAND (arg1, 0), flags); 2470 } 2471 2472 if (TREE_CODE (arg0) != TREE_CODE (arg1) 2473 /* This is needed for conversions and for COMPONENT_REF. 2474 Might as well play it safe and always test this. */ 2475 || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK 2476 || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK 2477 || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1))) 2478 return 0; 2479 2480 /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal. 2481 We don't care about side effects in that case because the SAVE_EXPR 2482 takes care of that for us. In all other cases, two expressions are 2483 equal if they have no side effects. If we have two identical 2484 expressions with side effects that should be treated the same due 2485 to the only side effects being identical SAVE_EXPR's, that will 2486 be detected in the recursive calls below. 2487 If we are taking an invariant address of two identical objects 2488 they are necessarily equal as well. */ 2489 if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST) 2490 && (TREE_CODE (arg0) == SAVE_EXPR 2491 || (flags & OEP_CONSTANT_ADDRESS_OF) 2492 || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1)))) 2493 return 1; 2494 2495 /* Next handle constant cases, those for which we can return 1 even 2496 if ONLY_CONST is set. */ 2497 if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)) 2498 switch (TREE_CODE (arg0)) 2499 { 2500 case INTEGER_CST: 2501 return tree_int_cst_equal (arg0, arg1); 2502 2503 case FIXED_CST: 2504 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0), 2505 TREE_FIXED_CST (arg1)); 2506 2507 case REAL_CST: 2508 if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0), 2509 TREE_REAL_CST (arg1))) 2510 return 1; 2511 2512 2513 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0)))) 2514 { 2515 /* If we do not distinguish between signed and unsigned zero, 2516 consider them equal. */ 2517 if (real_zerop (arg0) && real_zerop (arg1)) 2518 return 1; 2519 } 2520 return 0; 2521 2522 case VECTOR_CST: 2523 { 2524 unsigned i; 2525 2526 if (VECTOR_CST_NELTS (arg0) != VECTOR_CST_NELTS (arg1)) 2527 return 0; 2528 2529 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i) 2530 { 2531 if (!operand_equal_p (VECTOR_CST_ELT (arg0, i), 2532 VECTOR_CST_ELT (arg1, i), flags)) 2533 return 0; 2534 } 2535 return 1; 2536 } 2537 2538 case COMPLEX_CST: 2539 return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1), 2540 flags) 2541 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1), 2542 flags)); 2543 2544 case STRING_CST: 2545 return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1) 2546 && ! memcmp (TREE_STRING_POINTER (arg0), 2547 TREE_STRING_POINTER (arg1), 2548 TREE_STRING_LENGTH (arg0))); 2549 2550 case ADDR_EXPR: 2551 return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 2552 TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1) 2553 ? OEP_CONSTANT_ADDRESS_OF : 0); 2554 default: 2555 break; 2556 } 2557 2558 if (flags & OEP_ONLY_CONST) 2559 return 0; 2560 2561/* Define macros to test an operand from arg0 and arg1 for equality and a 2562 variant that allows null and views null as being different from any 2563 non-null value. In the latter case, if either is null, the both 2564 must be; otherwise, do the normal comparison. */ 2565#define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N), \ 2566 TREE_OPERAND (arg1, N), flags) 2567 2568#define OP_SAME_WITH_NULL(N) \ 2569 ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \ 2570 ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N)) 2571 2572 switch (TREE_CODE_CLASS (TREE_CODE (arg0))) 2573 { 2574 case tcc_unary: 2575 /* Two conversions are equal only if signedness and modes match. */ 2576 switch (TREE_CODE (arg0)) 2577 { 2578 CASE_CONVERT: 2579 case FIX_TRUNC_EXPR: 2580 if (TYPE_UNSIGNED (TREE_TYPE (arg0)) 2581 != TYPE_UNSIGNED (TREE_TYPE (arg1))) 2582 return 0; 2583 break; 2584 default: 2585 break; 2586 } 2587 2588 return OP_SAME (0); 2589 2590 2591 case tcc_comparison: 2592 case tcc_binary: 2593 if (OP_SAME (0) && OP_SAME (1)) 2594 return 1; 2595 2596 /* For commutative ops, allow the other order. */ 2597 return (commutative_tree_code (TREE_CODE (arg0)) 2598 && operand_equal_p (TREE_OPERAND (arg0, 0), 2599 TREE_OPERAND (arg1, 1), flags) 2600 && operand_equal_p (TREE_OPERAND (arg0, 1), 2601 TREE_OPERAND (arg1, 0), flags)); 2602 2603 case tcc_reference: 2604 /* If either of the pointer (or reference) expressions we are 2605 dereferencing contain a side effect, these cannot be equal, 2606 but their addresses can be. */ 2607 if ((flags & OEP_CONSTANT_ADDRESS_OF) == 0 2608 && (TREE_SIDE_EFFECTS (arg0) 2609 || TREE_SIDE_EFFECTS (arg1))) 2610 return 0; 2611 2612 switch (TREE_CODE (arg0)) 2613 { 2614 case INDIRECT_REF: 2615 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2616 return OP_SAME (0); 2617 2618 case REALPART_EXPR: 2619 case IMAGPART_EXPR: 2620 return OP_SAME (0); 2621 2622 case TARGET_MEM_REF: 2623 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2624 /* Require equal extra operands and then fall through to MEM_REF 2625 handling of the two common operands. */ 2626 if (!OP_SAME_WITH_NULL (2) 2627 || !OP_SAME_WITH_NULL (3) 2628 || !OP_SAME_WITH_NULL (4)) 2629 return 0; 2630 /* Fallthru. */ 2631 case MEM_REF: 2632 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2633 /* Require equal access sizes, and similar pointer types. 2634 We can have incomplete types for array references of 2635 variable-sized arrays from the Fortran frontent 2636 though. */ 2637 return ((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1)) 2638 || (TYPE_SIZE (TREE_TYPE (arg0)) 2639 && TYPE_SIZE (TREE_TYPE (arg1)) 2640 && operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)), 2641 TYPE_SIZE (TREE_TYPE (arg1)), flags))) 2642 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 1))) 2643 == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg1, 1)))) 2644 && OP_SAME (0) && OP_SAME (1)); 2645 2646 case ARRAY_REF: 2647 case ARRAY_RANGE_REF: 2648 /* Operands 2 and 3 may be null. 2649 Compare the array index by value if it is constant first as we 2650 may have different types but same value here. */ 2651 if (!OP_SAME (0)) 2652 return 0; 2653 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2654 return ((tree_int_cst_equal (TREE_OPERAND (arg0, 1), 2655 TREE_OPERAND (arg1, 1)) 2656 || OP_SAME (1)) 2657 && OP_SAME_WITH_NULL (2) 2658 && OP_SAME_WITH_NULL (3)); 2659 2660 case COMPONENT_REF: 2661 /* Handle operand 2 the same as for ARRAY_REF. Operand 0 2662 may be NULL when we're called to compare MEM_EXPRs. */ 2663 if (!OP_SAME_WITH_NULL (0) 2664 || !OP_SAME (1)) 2665 return 0; 2666 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2667 return OP_SAME_WITH_NULL (2); 2668 2669 case BIT_FIELD_REF: 2670 if (!OP_SAME (0)) 2671 return 0; 2672 flags &= ~OEP_CONSTANT_ADDRESS_OF; 2673 return OP_SAME (1) && OP_SAME (2); 2674 2675 default: 2676 return 0; 2677 } 2678 2679 case tcc_expression: 2680 switch (TREE_CODE (arg0)) 2681 { 2682 case ADDR_EXPR: 2683 case TRUTH_NOT_EXPR: 2684 return OP_SAME (0); 2685 2686 case TRUTH_ANDIF_EXPR: 2687 case TRUTH_ORIF_EXPR: 2688 return OP_SAME (0) && OP_SAME (1); 2689 2690 case FMA_EXPR: 2691 case WIDEN_MULT_PLUS_EXPR: 2692 case WIDEN_MULT_MINUS_EXPR: 2693 if (!OP_SAME (2)) 2694 return 0; 2695 /* The multiplcation operands are commutative. */ 2696 /* FALLTHRU */ 2697 2698 case TRUTH_AND_EXPR: 2699 case TRUTH_OR_EXPR: 2700 case TRUTH_XOR_EXPR: 2701 if (OP_SAME (0) && OP_SAME (1)) 2702 return 1; 2703 2704 /* Otherwise take into account this is a commutative operation. */ 2705 return (operand_equal_p (TREE_OPERAND (arg0, 0), 2706 TREE_OPERAND (arg1, 1), flags) 2707 && operand_equal_p (TREE_OPERAND (arg0, 1), 2708 TREE_OPERAND (arg1, 0), flags)); 2709 2710 case COND_EXPR: 2711 case VEC_COND_EXPR: 2712 case DOT_PROD_EXPR: 2713 return OP_SAME (0) && OP_SAME (1) && OP_SAME (2); 2714 2715 default: 2716 return 0; 2717 } 2718 2719 case tcc_vl_exp: 2720 switch (TREE_CODE (arg0)) 2721 { 2722 case CALL_EXPR: 2723 /* If the CALL_EXPRs call different functions, then they 2724 clearly can not be equal. */ 2725 if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1), 2726 flags)) 2727 return 0; 2728 2729 { 2730 unsigned int cef = call_expr_flags (arg0); 2731 if (flags & OEP_PURE_SAME) 2732 cef &= ECF_CONST | ECF_PURE; 2733 else 2734 cef &= ECF_CONST; 2735 if (!cef) 2736 return 0; 2737 } 2738 2739 /* Now see if all the arguments are the same. */ 2740 { 2741 const_call_expr_arg_iterator iter0, iter1; 2742 const_tree a0, a1; 2743 for (a0 = first_const_call_expr_arg (arg0, &iter0), 2744 a1 = first_const_call_expr_arg (arg1, &iter1); 2745 a0 && a1; 2746 a0 = next_const_call_expr_arg (&iter0), 2747 a1 = next_const_call_expr_arg (&iter1)) 2748 if (! operand_equal_p (a0, a1, flags)) 2749 return 0; 2750 2751 /* If we get here and both argument lists are exhausted 2752 then the CALL_EXPRs are equal. */ 2753 return ! (a0 || a1); 2754 } 2755 default: 2756 return 0; 2757 } 2758 2759 case tcc_declaration: 2760 /* Consider __builtin_sqrt equal to sqrt. */ 2761 return (TREE_CODE (arg0) == FUNCTION_DECL 2762 && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1) 2763 && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1) 2764 && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1)); 2765 2766 default: 2767 return 0; 2768 } 2769 2770#undef OP_SAME 2771#undef OP_SAME_WITH_NULL 2772} 2773 2774/* Similar to operand_equal_p, but see if ARG0 might have been made by 2775 shorten_compare from ARG1 when ARG1 was being compared with OTHER. 2776 2777 When in doubt, return 0. */ 2778 2779static int 2780operand_equal_for_comparison_p (tree arg0, tree arg1, tree other) 2781{ 2782 int unsignedp1, unsignedpo; 2783 tree primarg0, primarg1, primother; 2784 unsigned int correct_width; 2785 2786 if (operand_equal_p (arg0, arg1, 0)) 2787 return 1; 2788 2789 if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0)) 2790 || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1))) 2791 return 0; 2792 2793 /* Discard any conversions that don't change the modes of ARG0 and ARG1 2794 and see if the inner values are the same. This removes any 2795 signedness comparison, which doesn't matter here. */ 2796 primarg0 = arg0, primarg1 = arg1; 2797 STRIP_NOPS (primarg0); 2798 STRIP_NOPS (primarg1); 2799 if (operand_equal_p (primarg0, primarg1, 0)) 2800 return 1; 2801 2802 /* Duplicate what shorten_compare does to ARG1 and see if that gives the 2803 actual comparison operand, ARG0. 2804 2805 First throw away any conversions to wider types 2806 already present in the operands. */ 2807 2808 primarg1 = get_narrower (arg1, &unsignedp1); 2809 primother = get_narrower (other, &unsignedpo); 2810 2811 correct_width = TYPE_PRECISION (TREE_TYPE (arg1)); 2812 if (unsignedp1 == unsignedpo 2813 && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width 2814 && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width) 2815 { 2816 tree type = TREE_TYPE (arg0); 2817 2818 /* Make sure shorter operand is extended the right way 2819 to match the longer operand. */ 2820 primarg1 = fold_convert (signed_or_unsigned_type_for 2821 (unsignedp1, TREE_TYPE (primarg1)), primarg1); 2822 2823 if (operand_equal_p (arg0, fold_convert (type, primarg1), 0)) 2824 return 1; 2825 } 2826 2827 return 0; 2828} 2829 2830/* See if ARG is an expression that is either a comparison or is performing 2831 arithmetic on comparisons. The comparisons must only be comparing 2832 two different values, which will be stored in *CVAL1 and *CVAL2; if 2833 they are nonzero it means that some operands have already been found. 2834 No variables may be used anywhere else in the expression except in the 2835 comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around 2836 the expression and save_expr needs to be called with CVAL1 and CVAL2. 2837 2838 If this is true, return 1. Otherwise, return zero. */ 2839 2840static int 2841twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p) 2842{ 2843 enum tree_code code = TREE_CODE (arg); 2844 enum tree_code_class tclass = TREE_CODE_CLASS (code); 2845 2846 /* We can handle some of the tcc_expression cases here. */ 2847 if (tclass == tcc_expression && code == TRUTH_NOT_EXPR) 2848 tclass = tcc_unary; 2849 else if (tclass == tcc_expression 2850 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR 2851 || code == COMPOUND_EXPR)) 2852 tclass = tcc_binary; 2853 2854 else if (tclass == tcc_expression && code == SAVE_EXPR 2855 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0))) 2856 { 2857 /* If we've already found a CVAL1 or CVAL2, this expression is 2858 two complex to handle. */ 2859 if (*cval1 || *cval2) 2860 return 0; 2861 2862 tclass = tcc_unary; 2863 *save_p = 1; 2864 } 2865 2866 switch (tclass) 2867 { 2868 case tcc_unary: 2869 return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p); 2870 2871 case tcc_binary: 2872 return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p) 2873 && twoval_comparison_p (TREE_OPERAND (arg, 1), 2874 cval1, cval2, save_p)); 2875 2876 case tcc_constant: 2877 return 1; 2878 2879 case tcc_expression: 2880 if (code == COND_EXPR) 2881 return (twoval_comparison_p (TREE_OPERAND (arg, 0), 2882 cval1, cval2, save_p) 2883 && twoval_comparison_p (TREE_OPERAND (arg, 1), 2884 cval1, cval2, save_p) 2885 && twoval_comparison_p (TREE_OPERAND (arg, 2), 2886 cval1, cval2, save_p)); 2887 return 0; 2888 2889 case tcc_comparison: 2890 /* First see if we can handle the first operand, then the second. For 2891 the second operand, we know *CVAL1 can't be zero. It must be that 2892 one side of the comparison is each of the values; test for the 2893 case where this isn't true by failing if the two operands 2894 are the same. */ 2895 2896 if (operand_equal_p (TREE_OPERAND (arg, 0), 2897 TREE_OPERAND (arg, 1), 0)) 2898 return 0; 2899 2900 if (*cval1 == 0) 2901 *cval1 = TREE_OPERAND (arg, 0); 2902 else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0)) 2903 ; 2904 else if (*cval2 == 0) 2905 *cval2 = TREE_OPERAND (arg, 0); 2906 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0)) 2907 ; 2908 else 2909 return 0; 2910 2911 if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0)) 2912 ; 2913 else if (*cval2 == 0) 2914 *cval2 = TREE_OPERAND (arg, 1); 2915 else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0)) 2916 ; 2917 else 2918 return 0; 2919 2920 return 1; 2921 2922 default: 2923 return 0; 2924 } 2925} 2926 2927/* ARG is a tree that is known to contain just arithmetic operations and 2928 comparisons. Evaluate the operations in the tree substituting NEW0 for 2929 any occurrence of OLD0 as an operand of a comparison and likewise for 2930 NEW1 and OLD1. */ 2931 2932static tree 2933eval_subst (location_t loc, tree arg, tree old0, tree new0, 2934 tree old1, tree new1) 2935{ 2936 tree type = TREE_TYPE (arg); 2937 enum tree_code code = TREE_CODE (arg); 2938 enum tree_code_class tclass = TREE_CODE_CLASS (code); 2939 2940 /* We can handle some of the tcc_expression cases here. */ 2941 if (tclass == tcc_expression && code == TRUTH_NOT_EXPR) 2942 tclass = tcc_unary; 2943 else if (tclass == tcc_expression 2944 && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)) 2945 tclass = tcc_binary; 2946 2947 switch (tclass) 2948 { 2949 case tcc_unary: 2950 return fold_build1_loc (loc, code, type, 2951 eval_subst (loc, TREE_OPERAND (arg, 0), 2952 old0, new0, old1, new1)); 2953 2954 case tcc_binary: 2955 return fold_build2_loc (loc, code, type, 2956 eval_subst (loc, TREE_OPERAND (arg, 0), 2957 old0, new0, old1, new1), 2958 eval_subst (loc, TREE_OPERAND (arg, 1), 2959 old0, new0, old1, new1)); 2960 2961 case tcc_expression: 2962 switch (code) 2963 { 2964 case SAVE_EXPR: 2965 return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0, 2966 old1, new1); 2967 2968 case COMPOUND_EXPR: 2969 return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0, 2970 old1, new1); 2971 2972 case COND_EXPR: 2973 return fold_build3_loc (loc, code, type, 2974 eval_subst (loc, TREE_OPERAND (arg, 0), 2975 old0, new0, old1, new1), 2976 eval_subst (loc, TREE_OPERAND (arg, 1), 2977 old0, new0, old1, new1), 2978 eval_subst (loc, TREE_OPERAND (arg, 2), 2979 old0, new0, old1, new1)); 2980 default: 2981 break; 2982 } 2983 /* Fall through - ??? */ 2984 2985 case tcc_comparison: 2986 { 2987 tree arg0 = TREE_OPERAND (arg, 0); 2988 tree arg1 = TREE_OPERAND (arg, 1); 2989 2990 /* We need to check both for exact equality and tree equality. The 2991 former will be true if the operand has a side-effect. In that 2992 case, we know the operand occurred exactly once. */ 2993 2994 if (arg0 == old0 || operand_equal_p (arg0, old0, 0)) 2995 arg0 = new0; 2996 else if (arg0 == old1 || operand_equal_p (arg0, old1, 0)) 2997 arg0 = new1; 2998 2999 if (arg1 == old0 || operand_equal_p (arg1, old0, 0)) 3000 arg1 = new0; 3001 else if (arg1 == old1 || operand_equal_p (arg1, old1, 0)) 3002 arg1 = new1; 3003 3004 return fold_build2_loc (loc, code, type, arg0, arg1); 3005 } 3006 3007 default: 3008 return arg; 3009 } 3010} 3011 3012/* Return a tree for the case when the result of an expression is RESULT 3013 converted to TYPE and OMITTED was previously an operand of the expression 3014 but is now not needed (e.g., we folded OMITTED * 0). 3015 3016 If OMITTED has side effects, we must evaluate it. Otherwise, just do 3017 the conversion of RESULT to TYPE. */ 3018 3019tree 3020omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted) 3021{ 3022 tree t = fold_convert_loc (loc, type, result); 3023 3024 /* If the resulting operand is an empty statement, just return the omitted 3025 statement casted to void. */ 3026 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted)) 3027 return build1_loc (loc, NOP_EXPR, void_type_node, 3028 fold_ignored_result (omitted)); 3029 3030 if (TREE_SIDE_EFFECTS (omitted)) 3031 return build2_loc (loc, COMPOUND_EXPR, type, 3032 fold_ignored_result (omitted), t); 3033 3034 return non_lvalue_loc (loc, t); 3035} 3036 3037/* Similar, but call pedantic_non_lvalue instead of non_lvalue. */ 3038 3039static tree 3040pedantic_omit_one_operand_loc (location_t loc, tree type, tree result, 3041 tree omitted) 3042{ 3043 tree t = fold_convert_loc (loc, type, result); 3044 3045 /* If the resulting operand is an empty statement, just return the omitted 3046 statement casted to void. */ 3047 if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted)) 3048 return build1_loc (loc, NOP_EXPR, void_type_node, 3049 fold_ignored_result (omitted)); 3050 3051 if (TREE_SIDE_EFFECTS (omitted)) 3052 return build2_loc (loc, COMPOUND_EXPR, type, 3053 fold_ignored_result (omitted), t); 3054 3055 return pedantic_non_lvalue_loc (loc, t); 3056} 3057 3058/* Return a tree for the case when the result of an expression is RESULT 3059 converted to TYPE and OMITTED1 and OMITTED2 were previously operands 3060 of the expression but are now not needed. 3061 3062 If OMITTED1 or OMITTED2 has side effects, they must be evaluated. 3063 If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is 3064 evaluated before OMITTED2. Otherwise, if neither has side effects, 3065 just do the conversion of RESULT to TYPE. */ 3066 3067tree 3068omit_two_operands_loc (location_t loc, tree type, tree result, 3069 tree omitted1, tree omitted2) 3070{ 3071 tree t = fold_convert_loc (loc, type, result); 3072 3073 if (TREE_SIDE_EFFECTS (omitted2)) 3074 t = build2_loc (loc, COMPOUND_EXPR, type, omitted2, t); 3075 if (TREE_SIDE_EFFECTS (omitted1)) 3076 t = build2_loc (loc, COMPOUND_EXPR, type, omitted1, t); 3077 3078 return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t; 3079} 3080 3081 3082/* Return a simplified tree node for the truth-negation of ARG. This 3083 never alters ARG itself. We assume that ARG is an operation that 3084 returns a truth value (0 or 1). 3085 3086 FIXME: one would think we would fold the result, but it causes 3087 problems with the dominator optimizer. */ 3088 3089tree 3090fold_truth_not_expr (location_t loc, tree arg) 3091{ 3092 tree type = TREE_TYPE (arg); 3093 enum tree_code code = TREE_CODE (arg); 3094 location_t loc1, loc2; 3095 3096 /* If this is a comparison, we can simply invert it, except for 3097 floating-point non-equality comparisons, in which case we just 3098 enclose a TRUTH_NOT_EXPR around what we have. */ 3099 3100 if (TREE_CODE_CLASS (code) == tcc_comparison) 3101 { 3102 tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0)); 3103 if (FLOAT_TYPE_P (op_type) 3104 && flag_trapping_math 3105 && code != ORDERED_EXPR && code != UNORDERED_EXPR 3106 && code != NE_EXPR && code != EQ_EXPR) 3107 return NULL_TREE; 3108 3109 code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (op_type))); 3110 if (code == ERROR_MARK) 3111 return NULL_TREE; 3112 3113 return build2_loc (loc, code, type, TREE_OPERAND (arg, 0), 3114 TREE_OPERAND (arg, 1)); 3115 } 3116 3117 switch (code) 3118 { 3119 case INTEGER_CST: 3120 return constant_boolean_node (integer_zerop (arg), type); 3121 3122 case TRUTH_AND_EXPR: 3123 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3124 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3125 return build2_loc (loc, TRUTH_OR_EXPR, type, 3126 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)), 3127 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1))); 3128 3129 case TRUTH_OR_EXPR: 3130 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3131 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3132 return build2_loc (loc, TRUTH_AND_EXPR, type, 3133 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)), 3134 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1))); 3135 3136 case TRUTH_XOR_EXPR: 3137 /* Here we can invert either operand. We invert the first operand 3138 unless the second operand is a TRUTH_NOT_EXPR in which case our 3139 result is the XOR of the first operand with the inside of the 3140 negation of the second operand. */ 3141 3142 if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR) 3143 return build2_loc (loc, TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0), 3144 TREE_OPERAND (TREE_OPERAND (arg, 1), 0)); 3145 else 3146 return build2_loc (loc, TRUTH_XOR_EXPR, type, 3147 invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)), 3148 TREE_OPERAND (arg, 1)); 3149 3150 case TRUTH_ANDIF_EXPR: 3151 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3152 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3153 return build2_loc (loc, TRUTH_ORIF_EXPR, type, 3154 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)), 3155 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1))); 3156 3157 case TRUTH_ORIF_EXPR: 3158 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3159 loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3160 return build2_loc (loc, TRUTH_ANDIF_EXPR, type, 3161 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)), 3162 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1))); 3163 3164 case TRUTH_NOT_EXPR: 3165 return TREE_OPERAND (arg, 0); 3166 3167 case COND_EXPR: 3168 { 3169 tree arg1 = TREE_OPERAND (arg, 1); 3170 tree arg2 = TREE_OPERAND (arg, 2); 3171 3172 loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3173 loc2 = expr_location_or (TREE_OPERAND (arg, 2), loc); 3174 3175 /* A COND_EXPR may have a throw as one operand, which 3176 then has void type. Just leave void operands 3177 as they are. */ 3178 return build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg, 0), 3179 VOID_TYPE_P (TREE_TYPE (arg1)) 3180 ? arg1 : invert_truthvalue_loc (loc1, arg1), 3181 VOID_TYPE_P (TREE_TYPE (arg2)) 3182 ? arg2 : invert_truthvalue_loc (loc2, arg2)); 3183 } 3184 3185 case COMPOUND_EXPR: 3186 loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc); 3187 return build2_loc (loc, COMPOUND_EXPR, type, 3188 TREE_OPERAND (arg, 0), 3189 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1))); 3190 3191 case NON_LVALUE_EXPR: 3192 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3193 return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)); 3194 3195 CASE_CONVERT: 3196 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE) 3197 return build1_loc (loc, TRUTH_NOT_EXPR, type, arg); 3198 3199 /* ... fall through ... */ 3200 3201 case FLOAT_EXPR: 3202 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3203 return build1_loc (loc, TREE_CODE (arg), type, 3204 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0))); 3205 3206 case BIT_AND_EXPR: 3207 if (!integer_onep (TREE_OPERAND (arg, 1))) 3208 return NULL_TREE; 3209 return build2_loc (loc, EQ_EXPR, type, arg, build_int_cst (type, 0)); 3210 3211 case SAVE_EXPR: 3212 return build1_loc (loc, TRUTH_NOT_EXPR, type, arg); 3213 3214 case CLEANUP_POINT_EXPR: 3215 loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc); 3216 return build1_loc (loc, CLEANUP_POINT_EXPR, type, 3217 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0))); 3218 3219 default: 3220 return NULL_TREE; 3221 } 3222} 3223 3224/* Return a simplified tree node for the truth-negation of ARG. This 3225 never alters ARG itself. We assume that ARG is an operation that 3226 returns a truth value (0 or 1). 3227 3228 FIXME: one would think we would fold the result, but it causes 3229 problems with the dominator optimizer. */ 3230 3231tree 3232invert_truthvalue_loc (location_t loc, tree arg) 3233{ 3234 tree tem; 3235 3236 if (TREE_CODE (arg) == ERROR_MARK) 3237 return arg; 3238 3239 tem = fold_truth_not_expr (loc, arg); 3240 if (!tem) 3241 tem = build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg), arg); 3242 3243 return tem; 3244} 3245 3246/* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both 3247 operands are another bit-wise operation with a common input. If so, 3248 distribute the bit operations to save an operation and possibly two if 3249 constants are involved. For example, convert 3250 (A | B) & (A | C) into A | (B & C) 3251 Further simplification will occur if B and C are constants. 3252 3253 If this optimization cannot be done, 0 will be returned. */ 3254 3255static tree 3256distribute_bit_expr (location_t loc, enum tree_code code, tree type, 3257 tree arg0, tree arg1) 3258{ 3259 tree common; 3260 tree left, right; 3261 3262 if (TREE_CODE (arg0) != TREE_CODE (arg1) 3263 || TREE_CODE (arg0) == code 3264 || (TREE_CODE (arg0) != BIT_AND_EXPR 3265 && TREE_CODE (arg0) != BIT_IOR_EXPR)) 3266 return 0; 3267 3268 if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)) 3269 { 3270 common = TREE_OPERAND (arg0, 0); 3271 left = TREE_OPERAND (arg0, 1); 3272 right = TREE_OPERAND (arg1, 1); 3273 } 3274 else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0)) 3275 { 3276 common = TREE_OPERAND (arg0, 0); 3277 left = TREE_OPERAND (arg0, 1); 3278 right = TREE_OPERAND (arg1, 0); 3279 } 3280 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0)) 3281 { 3282 common = TREE_OPERAND (arg0, 1); 3283 left = TREE_OPERAND (arg0, 0); 3284 right = TREE_OPERAND (arg1, 1); 3285 } 3286 else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0)) 3287 { 3288 common = TREE_OPERAND (arg0, 1); 3289 left = TREE_OPERAND (arg0, 0); 3290 right = TREE_OPERAND (arg1, 0); 3291 } 3292 else 3293 return 0; 3294 3295 common = fold_convert_loc (loc, type, common); 3296 left = fold_convert_loc (loc, type, left); 3297 right = fold_convert_loc (loc, type, right); 3298 return fold_build2_loc (loc, TREE_CODE (arg0), type, common, 3299 fold_build2_loc (loc, code, type, left, right)); 3300} 3301 3302/* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation 3303 with code CODE. This optimization is unsafe. */ 3304static tree 3305distribute_real_division (location_t loc, enum tree_code code, tree type, 3306 tree arg0, tree arg1) 3307{ 3308 bool mul0 = TREE_CODE (arg0) == MULT_EXPR; 3309 bool mul1 = TREE_CODE (arg1) == MULT_EXPR; 3310 3311 /* (A / C) +- (B / C) -> (A +- B) / C. */ 3312 if (mul0 == mul1 3313 && operand_equal_p (TREE_OPERAND (arg0, 1), 3314 TREE_OPERAND (arg1, 1), 0)) 3315 return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type, 3316 fold_build2_loc (loc, code, type, 3317 TREE_OPERAND (arg0, 0), 3318 TREE_OPERAND (arg1, 0)), 3319 TREE_OPERAND (arg0, 1)); 3320 3321 /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2). */ 3322 if (operand_equal_p (TREE_OPERAND (arg0, 0), 3323 TREE_OPERAND (arg1, 0), 0) 3324 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST 3325 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST) 3326 { 3327 REAL_VALUE_TYPE r0, r1; 3328 r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1)); 3329 r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1)); 3330 if (!mul0) 3331 real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0); 3332 if (!mul1) 3333 real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1); 3334 real_arithmetic (&r0, code, &r0, &r1); 3335 return fold_build2_loc (loc, MULT_EXPR, type, 3336 TREE_OPERAND (arg0, 0), 3337 build_real (type, r0)); 3338 } 3339 3340 return NULL_TREE; 3341} 3342 3343/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER 3344 starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */ 3345 3346static tree 3347make_bit_field_ref (location_t loc, tree inner, tree type, 3348 HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp) 3349{ 3350 tree result, bftype; 3351 3352 if (bitpos == 0) 3353 { 3354 tree size = TYPE_SIZE (TREE_TYPE (inner)); 3355 if ((INTEGRAL_TYPE_P (TREE_TYPE (inner)) 3356 || POINTER_TYPE_P (TREE_TYPE (inner))) 3357 && host_integerp (size, 0) 3358 && tree_low_cst (size, 0) == bitsize) 3359 return fold_convert_loc (loc, type, inner); 3360 } 3361 3362 bftype = type; 3363 if (TYPE_PRECISION (bftype) != bitsize 3364 || TYPE_UNSIGNED (bftype) == !unsignedp) 3365 bftype = build_nonstandard_integer_type (bitsize, 0); 3366 3367 result = build3_loc (loc, BIT_FIELD_REF, bftype, inner, 3368 size_int (bitsize), bitsize_int (bitpos)); 3369 3370 if (bftype != type) 3371 result = fold_convert_loc (loc, type, result); 3372 3373 return result; 3374} 3375 3376/* Optimize a bit-field compare. 3377 3378 There are two cases: First is a compare against a constant and the 3379 second is a comparison of two items where the fields are at the same 3380 bit position relative to the start of a chunk (byte, halfword, word) 3381 large enough to contain it. In these cases we can avoid the shift 3382 implicit in bitfield extractions. 3383 3384 For constants, we emit a compare of the shifted constant with the 3385 BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being 3386 compared. For two fields at the same position, we do the ANDs with the 3387 similar mask and compare the result of the ANDs. 3388 3389 CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR. 3390 COMPARE_TYPE is the type of the comparison, and LHS and RHS 3391 are the left and right operands of the comparison, respectively. 3392 3393 If the optimization described above can be done, we return the resulting 3394 tree. Otherwise we return zero. */ 3395 3396static tree 3397optimize_bit_field_compare (location_t loc, enum tree_code code, 3398 tree compare_type, tree lhs, tree rhs) 3399{ 3400 HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize; 3401 tree type = TREE_TYPE (lhs); 3402 tree signed_type, unsigned_type; 3403 int const_p = TREE_CODE (rhs) == INTEGER_CST; 3404 enum machine_mode lmode, rmode, nmode; 3405 int lunsignedp, runsignedp; 3406 int lvolatilep = 0, rvolatilep = 0; 3407 tree linner, rinner = NULL_TREE; 3408 tree mask; 3409 tree offset; 3410 3411 /* In the strict volatile bitfields case, doing code changes here may prevent 3412 other optimizations, in particular in a SLOW_BYTE_ACCESS setting. */ 3413 if (flag_strict_volatile_bitfields > 0) 3414 return 0; 3415 3416 /* Get all the information about the extractions being done. If the bit size 3417 if the same as the size of the underlying object, we aren't doing an 3418 extraction at all and so can do nothing. We also don't want to 3419 do anything if the inner expression is a PLACEHOLDER_EXPR since we 3420 then will no longer be able to replace it. */ 3421 linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode, 3422 &lunsignedp, &lvolatilep, false); 3423 if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0 3424 || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR) 3425 return 0; 3426 3427 if (!const_p) 3428 { 3429 /* If this is not a constant, we can only do something if bit positions, 3430 sizes, and signedness are the same. */ 3431 rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode, 3432 &runsignedp, &rvolatilep, false); 3433 3434 if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize 3435 || lunsignedp != runsignedp || offset != 0 3436 || TREE_CODE (rinner) == PLACEHOLDER_EXPR) 3437 return 0; 3438 } 3439 3440 /* See if we can find a mode to refer to this field. We should be able to, 3441 but fail if we can't. */ 3442 if (lvolatilep 3443 && GET_MODE_BITSIZE (lmode) > 0 3444 && flag_strict_volatile_bitfields > 0) 3445 nmode = lmode; 3446 else 3447 nmode = get_best_mode (lbitsize, lbitpos, 0, 0, 3448 const_p ? TYPE_ALIGN (TREE_TYPE (linner)) 3449 : MIN (TYPE_ALIGN (TREE_TYPE (linner)), 3450 TYPE_ALIGN (TREE_TYPE (rinner))), 3451 word_mode, lvolatilep || rvolatilep); 3452 if (nmode == VOIDmode) 3453 return 0; 3454 3455 /* Set signed and unsigned types of the precision of this mode for the 3456 shifts below. */ 3457 signed_type = lang_hooks.types.type_for_mode (nmode, 0); 3458 unsigned_type = lang_hooks.types.type_for_mode (nmode, 1); 3459 3460 /* Compute the bit position and size for the new reference and our offset 3461 within it. If the new reference is the same size as the original, we 3462 won't optimize anything, so return zero. */ 3463 nbitsize = GET_MODE_BITSIZE (nmode); 3464 nbitpos = lbitpos & ~ (nbitsize - 1); 3465 lbitpos -= nbitpos; 3466 if (nbitsize == lbitsize) 3467 return 0; 3468 3469 if (BYTES_BIG_ENDIAN) 3470 lbitpos = nbitsize - lbitsize - lbitpos; 3471 3472 /* Make the mask to be used against the extracted field. */ 3473 mask = build_int_cst_type (unsigned_type, -1); 3474 mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize)); 3475 mask = const_binop (RSHIFT_EXPR, mask, 3476 size_int (nbitsize - lbitsize - lbitpos)); 3477 3478 if (! const_p) 3479 /* If not comparing with constant, just rework the comparison 3480 and return. */ 3481 return fold_build2_loc (loc, code, compare_type, 3482 fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, 3483 make_bit_field_ref (loc, linner, 3484 unsigned_type, 3485 nbitsize, nbitpos, 3486 1), 3487 mask), 3488 fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, 3489 make_bit_field_ref (loc, rinner, 3490 unsigned_type, 3491 nbitsize, nbitpos, 3492 1), 3493 mask)); 3494 3495 /* Otherwise, we are handling the constant case. See if the constant is too 3496 big for the field. Warn and return a tree of for 0 (false) if so. We do 3497 this not only for its own sake, but to avoid having to test for this 3498 error case below. If we didn't, we might generate wrong code. 3499 3500 For unsigned fields, the constant shifted right by the field length should 3501 be all zero. For signed fields, the high-order bits should agree with 3502 the sign bit. */ 3503 3504 if (lunsignedp) 3505 { 3506 if (! integer_zerop (const_binop (RSHIFT_EXPR, 3507 fold_convert_loc (loc, 3508 unsigned_type, rhs), 3509 size_int (lbitsize)))) 3510 { 3511 warning (0, "comparison is always %d due to width of bit-field", 3512 code == NE_EXPR); 3513 return constant_boolean_node (code == NE_EXPR, compare_type); 3514 } 3515 } 3516 else 3517 { 3518 tree tem = const_binop (RSHIFT_EXPR, 3519 fold_convert_loc (loc, signed_type, rhs), 3520 size_int (lbitsize - 1)); 3521 if (! integer_zerop (tem) && ! integer_all_onesp (tem)) 3522 { 3523 warning (0, "comparison is always %d due to width of bit-field", 3524 code == NE_EXPR); 3525 return constant_boolean_node (code == NE_EXPR, compare_type); 3526 } 3527 } 3528 3529 /* Single-bit compares should always be against zero. */ 3530 if (lbitsize == 1 && ! integer_zerop (rhs)) 3531 { 3532 code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR; 3533 rhs = build_int_cst (type, 0); 3534 } 3535 3536 /* Make a new bitfield reference, shift the constant over the 3537 appropriate number of bits and mask it with the computed mask 3538 (in case this was a signed field). If we changed it, make a new one. */ 3539 lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1); 3540 if (lvolatilep) 3541 { 3542 TREE_SIDE_EFFECTS (lhs) = 1; 3543 TREE_THIS_VOLATILE (lhs) = 1; 3544 } 3545 3546 rhs = const_binop (BIT_AND_EXPR, 3547 const_binop (LSHIFT_EXPR, 3548 fold_convert_loc (loc, unsigned_type, rhs), 3549 size_int (lbitpos)), 3550 mask); 3551 3552 lhs = build2_loc (loc, code, compare_type, 3553 build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs); 3554 return lhs; 3555} 3556 3557/* Subroutine for fold_truth_andor_1: decode a field reference. 3558 3559 If EXP is a comparison reference, we return the innermost reference. 3560 3561 *PBITSIZE is set to the number of bits in the reference, *PBITPOS is 3562 set to the starting bit number. 3563 3564 If the innermost field can be completely contained in a mode-sized 3565 unit, *PMODE is set to that mode. Otherwise, it is set to VOIDmode. 3566 3567 *PVOLATILEP is set to 1 if the any expression encountered is volatile; 3568 otherwise it is not changed. 3569 3570 *PUNSIGNEDP is set to the signedness of the field. 3571 3572 *PMASK is set to the mask used. This is either contained in a 3573 BIT_AND_EXPR or derived from the width of the field. 3574 3575 *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any. 3576 3577 Return 0 if this is not a component reference or is one that we can't 3578 do anything with. */ 3579 3580static tree 3581decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize, 3582 HOST_WIDE_INT *pbitpos, enum machine_mode *pmode, 3583 int *punsignedp, int *pvolatilep, 3584 tree *pmask, tree *pand_mask) 3585{ 3586 tree outer_type = 0; 3587 tree and_mask = 0; 3588 tree mask, inner, offset; 3589 tree unsigned_type; 3590 unsigned int precision; 3591 3592 /* All the optimizations using this function assume integer fields. 3593 There are problems with FP fields since the type_for_size call 3594 below can fail for, e.g., XFmode. */ 3595 if (! INTEGRAL_TYPE_P (TREE_TYPE (exp))) 3596 return 0; 3597 3598 /* We are interested in the bare arrangement of bits, so strip everything 3599 that doesn't affect the machine mode. However, record the type of the 3600 outermost expression if it may matter below. */ 3601 if (CONVERT_EXPR_P (exp) 3602 || TREE_CODE (exp) == NON_LVALUE_EXPR) 3603 outer_type = TREE_TYPE (exp); 3604 STRIP_NOPS (exp); 3605 3606 if (TREE_CODE (exp) == BIT_AND_EXPR) 3607 { 3608 and_mask = TREE_OPERAND (exp, 1); 3609 exp = TREE_OPERAND (exp, 0); 3610 STRIP_NOPS (exp); STRIP_NOPS (and_mask); 3611 if (TREE_CODE (and_mask) != INTEGER_CST) 3612 return 0; 3613 } 3614 3615 inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode, 3616 punsignedp, pvolatilep, false); 3617 if ((inner == exp && and_mask == 0) 3618 || *pbitsize < 0 || offset != 0 3619 || TREE_CODE (inner) == PLACEHOLDER_EXPR) 3620 return 0; 3621 3622 /* If the number of bits in the reference is the same as the bitsize of 3623 the outer type, then the outer type gives the signedness. Otherwise 3624 (in case of a small bitfield) the signedness is unchanged. */ 3625 if (outer_type && *pbitsize == TYPE_PRECISION (outer_type)) 3626 *punsignedp = TYPE_UNSIGNED (outer_type); 3627 3628 /* Compute the mask to access the bitfield. */ 3629 unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1); 3630 precision = TYPE_PRECISION (unsigned_type); 3631 3632 mask = build_int_cst_type (unsigned_type, -1); 3633 3634 mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize)); 3635 mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize)); 3636 3637 /* Merge it with the mask we found in the BIT_AND_EXPR, if any. */ 3638 if (and_mask != 0) 3639 mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, 3640 fold_convert_loc (loc, unsigned_type, and_mask), mask); 3641 3642 *pmask = mask; 3643 *pand_mask = and_mask; 3644 return inner; 3645} 3646 3647/* Return nonzero if MASK represents a mask of SIZE ones in the low-order 3648 bit positions. */ 3649 3650static int 3651all_ones_mask_p (const_tree mask, int size) 3652{ 3653 tree type = TREE_TYPE (mask); 3654 unsigned int precision = TYPE_PRECISION (type); 3655 tree tmask; 3656 3657 tmask = build_int_cst_type (signed_type_for (type), -1); 3658 3659 return 3660 tree_int_cst_equal (mask, 3661 const_binop (RSHIFT_EXPR, 3662 const_binop (LSHIFT_EXPR, tmask, 3663 size_int (precision - size)), 3664 size_int (precision - size))); 3665} 3666 3667/* Subroutine for fold: determine if VAL is the INTEGER_CONST that 3668 represents the sign bit of EXP's type. If EXP represents a sign 3669 or zero extension, also test VAL against the unextended type. 3670 The return value is the (sub)expression whose sign bit is VAL, 3671 or NULL_TREE otherwise. */ 3672 3673static tree 3674sign_bit_p (tree exp, const_tree val) 3675{ 3676 unsigned HOST_WIDE_INT mask_lo, lo; 3677 HOST_WIDE_INT mask_hi, hi; 3678 int width; 3679 tree t; 3680 3681 /* Tree EXP must have an integral type. */ 3682 t = TREE_TYPE (exp); 3683 if (! INTEGRAL_TYPE_P (t)) 3684 return NULL_TREE; 3685 3686 /* Tree VAL must be an integer constant. */ 3687 if (TREE_CODE (val) != INTEGER_CST 3688 || TREE_OVERFLOW (val)) 3689 return NULL_TREE; 3690 3691 width = TYPE_PRECISION (t); 3692 if (width > HOST_BITS_PER_WIDE_INT) 3693 { 3694 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1); 3695 lo = 0; 3696 3697 mask_hi = ((unsigned HOST_WIDE_INT) -1 3698 >> (HOST_BITS_PER_DOUBLE_INT - width)); 3699 mask_lo = -1; 3700 } 3701 else 3702 { 3703 hi = 0; 3704 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1); 3705 3706 mask_hi = 0; 3707 mask_lo = ((unsigned HOST_WIDE_INT) -1 3708 >> (HOST_BITS_PER_WIDE_INT - width)); 3709 } 3710 3711 /* We mask off those bits beyond TREE_TYPE (exp) so that we can 3712 treat VAL as if it were unsigned. */ 3713 if ((TREE_INT_CST_HIGH (val) & mask_hi) == hi 3714 && (TREE_INT_CST_LOW (val) & mask_lo) == lo) 3715 return exp; 3716 3717 /* Handle extension from a narrower type. */ 3718 if (TREE_CODE (exp) == NOP_EXPR 3719 && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width) 3720 return sign_bit_p (TREE_OPERAND (exp, 0), val); 3721 3722 return NULL_TREE; 3723} 3724 3725/* Subroutine for fold_truth_andor_1: determine if an operand is simple enough 3726 to be evaluated unconditionally. */ 3727 3728static int 3729simple_operand_p (const_tree exp) 3730{ 3731 /* Strip any conversions that don't change the machine mode. */ 3732 STRIP_NOPS (exp); 3733 3734 return (CONSTANT_CLASS_P (exp) 3735 || TREE_CODE (exp) == SSA_NAME 3736 || (DECL_P (exp) 3737 && ! TREE_ADDRESSABLE (exp) 3738 && ! TREE_THIS_VOLATILE (exp) 3739 && ! DECL_NONLOCAL (exp) 3740 /* Don't regard global variables as simple. They may be 3741 allocated in ways unknown to the compiler (shared memory, 3742 #pragma weak, etc). */ 3743 && ! TREE_PUBLIC (exp) 3744 && ! DECL_EXTERNAL (exp) 3745 /* Loading a static variable is unduly expensive, but global 3746 registers aren't expensive. */ 3747 && (! TREE_STATIC (exp) || DECL_REGISTER (exp)))); 3748} 3749 3750/* Subroutine for fold_truth_andor: determine if an operand is simple enough 3751 to be evaluated unconditionally. 3752 I addition to simple_operand_p, we assume that comparisons, conversions, 3753 and logic-not operations are simple, if their operands are simple, too. */ 3754 3755static bool 3756simple_operand_p_2 (tree exp) 3757{ 3758 enum tree_code code; 3759 3760 if (TREE_SIDE_EFFECTS (exp) 3761 || tree_could_trap_p (exp)) 3762 return false; 3763 3764 while (CONVERT_EXPR_P (exp)) 3765 exp = TREE_OPERAND (exp, 0); 3766 3767 code = TREE_CODE (exp); 3768 3769 if (TREE_CODE_CLASS (code) == tcc_comparison) 3770 return (simple_operand_p (TREE_OPERAND (exp, 0)) 3771 && simple_operand_p (TREE_OPERAND (exp, 1))); 3772 3773 if (code == TRUTH_NOT_EXPR) 3774 return simple_operand_p_2 (TREE_OPERAND (exp, 0)); 3775 3776 return simple_operand_p (exp); 3777} 3778 3779 3780/* The following functions are subroutines to fold_range_test and allow it to 3781 try to change a logical combination of comparisons into a range test. 3782 3783 For example, both 3784 X == 2 || X == 3 || X == 4 || X == 5 3785 and 3786 X >= 2 && X <= 5 3787 are converted to 3788 (unsigned) (X - 2) <= 3 3789 3790 We describe each set of comparisons as being either inside or outside 3791 a range, using a variable named like IN_P, and then describe the 3792 range with a lower and upper bound. If one of the bounds is omitted, 3793 it represents either the highest or lowest value of the type. 3794 3795 In the comments below, we represent a range by two numbers in brackets 3796 preceded by a "+" to designate being inside that range, or a "-" to 3797 designate being outside that range, so the condition can be inverted by 3798 flipping the prefix. An omitted bound is represented by a "-". For 3799 example, "- [-, 10]" means being outside the range starting at the lowest 3800 possible value and ending at 10, in other words, being greater than 10. 3801 The range "+ [-, -]" is always true and hence the range "- [-, -]" is 3802 always false. 3803 3804 We set up things so that the missing bounds are handled in a consistent 3805 manner so neither a missing bound nor "true" and "false" need to be 3806 handled using a special case. */ 3807 3808/* Return the result of applying CODE to ARG0 and ARG1, but handle the case 3809 of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P 3810 and UPPER1_P are nonzero if the respective argument is an upper bound 3811 and zero for a lower. TYPE, if nonzero, is the type of the result; it 3812 must be specified for a comparison. ARG1 will be converted to ARG0's 3813 type if both are specified. */ 3814 3815static tree 3816range_binop (enum tree_code code, tree type, tree arg0, int upper0_p, 3817 tree arg1, int upper1_p) 3818{ 3819 tree tem; 3820 int result; 3821 int sgn0, sgn1; 3822 3823 /* If neither arg represents infinity, do the normal operation. 3824 Else, if not a comparison, return infinity. Else handle the special 3825 comparison rules. Note that most of the cases below won't occur, but 3826 are handled for consistency. */ 3827 3828 if (arg0 != 0 && arg1 != 0) 3829 { 3830 tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0), 3831 arg0, fold_convert (TREE_TYPE (arg0), arg1)); 3832 STRIP_NOPS (tem); 3833 return TREE_CODE (tem) == INTEGER_CST ? tem : 0; 3834 } 3835 3836 if (TREE_CODE_CLASS (code) != tcc_comparison) 3837 return 0; 3838 3839 /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0 3840 for neither. In real maths, we cannot assume open ended ranges are 3841 the same. But, this is computer arithmetic, where numbers are finite. 3842 We can therefore make the transformation of any unbounded range with 3843 the value Z, Z being greater than any representable number. This permits 3844 us to treat unbounded ranges as equal. */ 3845 sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1); 3846 sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1); 3847 switch (code) 3848 { 3849 case EQ_EXPR: 3850 result = sgn0 == sgn1; 3851 break; 3852 case NE_EXPR: 3853 result = sgn0 != sgn1; 3854 break; 3855 case LT_EXPR: 3856 result = sgn0 < sgn1; 3857 break; 3858 case LE_EXPR: 3859 result = sgn0 <= sgn1; 3860 break; 3861 case GT_EXPR: 3862 result = sgn0 > sgn1; 3863 break; 3864 case GE_EXPR: 3865 result = sgn0 >= sgn1; 3866 break; 3867 default: 3868 gcc_unreachable (); 3869 } 3870 3871 return constant_boolean_node (result, type); 3872} 3873 3874/* Helper routine for make_range. Perform one step for it, return 3875 new expression if the loop should continue or NULL_TREE if it should 3876 stop. */ 3877 3878tree 3879make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1, 3880 tree exp_type, tree *p_low, tree *p_high, int *p_in_p, 3881 bool *strict_overflow_p) 3882{ 3883 tree arg0_type = TREE_TYPE (arg0); 3884 tree n_low, n_high, low = *p_low, high = *p_high; 3885 int in_p = *p_in_p, n_in_p; 3886 3887 switch (code) 3888 { 3889 case TRUTH_NOT_EXPR: 3890 /* We can only do something if the range is testing for zero. */ 3891 if (low == NULL_TREE || high == NULL_TREE 3892 || ! integer_zerop (low) || ! integer_zerop (high)) 3893 return NULL_TREE; 3894 *p_in_p = ! in_p; 3895 return arg0; 3896 3897 case EQ_EXPR: case NE_EXPR: 3898 case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR: 3899 /* We can only do something if the range is testing for zero 3900 and if the second operand is an integer constant. Note that 3901 saying something is "in" the range we make is done by 3902 complementing IN_P since it will set in the initial case of 3903 being not equal to zero; "out" is leaving it alone. */ 3904 if (low == NULL_TREE || high == NULL_TREE 3905 || ! integer_zerop (low) || ! integer_zerop (high) 3906 || TREE_CODE (arg1) != INTEGER_CST) 3907 return NULL_TREE; 3908 3909 switch (code) 3910 { 3911 case NE_EXPR: /* - [c, c] */ 3912 low = high = arg1; 3913 break; 3914 case EQ_EXPR: /* + [c, c] */ 3915 in_p = ! in_p, low = high = arg1; 3916 break; 3917 case GT_EXPR: /* - [-, c] */ 3918 low = 0, high = arg1; 3919 break; 3920 case GE_EXPR: /* + [c, -] */ 3921 in_p = ! in_p, low = arg1, high = 0; 3922 break; 3923 case LT_EXPR: /* - [c, -] */ 3924 low = arg1, high = 0; 3925 break; 3926 case LE_EXPR: /* + [-, c] */ 3927 in_p = ! in_p, low = 0, high = arg1; 3928 break; 3929 default: 3930 gcc_unreachable (); 3931 } 3932 3933 /* If this is an unsigned comparison, we also know that EXP is 3934 greater than or equal to zero. We base the range tests we make 3935 on that fact, so we record it here so we can parse existing 3936 range tests. We test arg0_type since often the return type 3937 of, e.g. EQ_EXPR, is boolean. */ 3938 if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0)) 3939 { 3940 if (! merge_ranges (&n_in_p, &n_low, &n_high, 3941 in_p, low, high, 1, 3942 build_int_cst (arg0_type, 0), 3943 NULL_TREE)) 3944 return NULL_TREE; 3945 3946 in_p = n_in_p, low = n_low, high = n_high; 3947 3948 /* If the high bound is missing, but we have a nonzero low 3949 bound, reverse the range so it goes from zero to the low bound 3950 minus 1. */ 3951 if (high == 0 && low && ! integer_zerop (low)) 3952 { 3953 in_p = ! in_p; 3954 high = range_binop (MINUS_EXPR, NULL_TREE, low, 0, 3955 integer_one_node, 0); 3956 low = build_int_cst (arg0_type, 0); 3957 } 3958 } 3959 3960 *p_low = low; 3961 *p_high = high; 3962 *p_in_p = in_p; 3963 return arg0; 3964 3965 case NEGATE_EXPR: 3966 /* If flag_wrapv and ARG0_TYPE is signed, make sure 3967 low and high are non-NULL, then normalize will DTRT. */ 3968 if (!TYPE_UNSIGNED (arg0_type) 3969 && !TYPE_OVERFLOW_UNDEFINED (arg0_type)) 3970 { 3971 if (low == NULL_TREE) 3972 low = TYPE_MIN_VALUE (arg0_type); 3973 if (high == NULL_TREE) 3974 high = TYPE_MAX_VALUE (arg0_type); 3975 } 3976 3977 /* (-x) IN [a,b] -> x in [-b, -a] */ 3978 n_low = range_binop (MINUS_EXPR, exp_type, 3979 build_int_cst (exp_type, 0), 3980 0, high, 1); 3981 n_high = range_binop (MINUS_EXPR, exp_type, 3982 build_int_cst (exp_type, 0), 3983 0, low, 0); 3984 if (n_high != 0 && TREE_OVERFLOW (n_high)) 3985 return NULL_TREE; 3986 goto normalize; 3987 3988 case BIT_NOT_EXPR: 3989 /* ~ X -> -X - 1 */ 3990 return build2_loc (loc, MINUS_EXPR, exp_type, negate_expr (arg0), 3991 build_int_cst (exp_type, 1)); 3992 3993 case PLUS_EXPR: 3994 case MINUS_EXPR: 3995 if (TREE_CODE (arg1) != INTEGER_CST) 3996 return NULL_TREE; 3997 3998 /* If flag_wrapv and ARG0_TYPE is signed, then we cannot 3999 move a constant to the other side. */ 4000 if (!TYPE_UNSIGNED (arg0_type) 4001 && !TYPE_OVERFLOW_UNDEFINED (arg0_type)) 4002 return NULL_TREE; 4003 4004 /* If EXP is signed, any overflow in the computation is undefined, 4005 so we don't worry about it so long as our computations on 4006 the bounds don't overflow. For unsigned, overflow is defined 4007 and this is exactly the right thing. */ 4008 n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR, 4009 arg0_type, low, 0, arg1, 0); 4010 n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR, 4011 arg0_type, high, 1, arg1, 0); 4012 if ((n_low != 0 && TREE_OVERFLOW (n_low)) 4013 || (n_high != 0 && TREE_OVERFLOW (n_high))) 4014 return NULL_TREE; 4015 4016 if (TYPE_OVERFLOW_UNDEFINED (arg0_type)) 4017 *strict_overflow_p = true; 4018 4019 normalize: 4020 /* Check for an unsigned range which has wrapped around the maximum 4021 value thus making n_high < n_low, and normalize it. */ 4022 if (n_low && n_high && tree_int_cst_lt (n_high, n_low)) 4023 { 4024 low = range_binop (PLUS_EXPR, arg0_type, n_high, 0, 4025 integer_one_node, 0); 4026 high = range_binop (MINUS_EXPR, arg0_type, n_low, 0, 4027 integer_one_node, 0); 4028 4029 /* If the range is of the form +/- [ x+1, x ], we won't 4030 be able to normalize it. But then, it represents the 4031 whole range or the empty set, so make it 4032 +/- [ -, - ]. */ 4033 if (tree_int_cst_equal (n_low, low) 4034 && tree_int_cst_equal (n_high, high)) 4035 low = high = 0; 4036 else 4037 in_p = ! in_p; 4038 } 4039 else 4040 low = n_low, high = n_high; 4041 4042 *p_low = low; 4043 *p_high = high; 4044 *p_in_p = in_p; 4045 return arg0; 4046 4047 CASE_CONVERT: 4048 case NON_LVALUE_EXPR: 4049 if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type)) 4050 return NULL_TREE; 4051 4052 if (! INTEGRAL_TYPE_P (arg0_type) 4053 || (low != 0 && ! int_fits_type_p (low, arg0_type)) 4054 || (high != 0 && ! int_fits_type_p (high, arg0_type))) 4055 return NULL_TREE; 4056 4057 n_low = low, n_high = high; 4058 4059 if (n_low != 0) 4060 n_low = fold_convert_loc (loc, arg0_type, n_low); 4061 4062 if (n_high != 0) 4063 n_high = fold_convert_loc (loc, arg0_type, n_high); 4064 4065 /* If we're converting arg0 from an unsigned type, to exp, 4066 a signed type, we will be doing the comparison as unsigned. 4067 The tests above have already verified that LOW and HIGH 4068 are both positive. 4069 4070 So we have to ensure that we will handle large unsigned 4071 values the same way that the current signed bounds treat 4072 negative values. */ 4073 4074 if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type)) 4075 { 4076 tree high_positive; 4077 tree equiv_type; 4078 /* For fixed-point modes, we need to pass the saturating flag 4079 as the 2nd parameter. */ 4080 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type))) 4081 equiv_type 4082 = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type), 4083 TYPE_SATURATING (arg0_type)); 4084 else 4085 equiv_type 4086 = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type), 1); 4087 4088 /* A range without an upper bound is, naturally, unbounded. 4089 Since convert would have cropped a very large value, use 4090 the max value for the destination type. */ 4091 high_positive 4092 = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type) 4093 : TYPE_MAX_VALUE (arg0_type); 4094 4095 if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type)) 4096 high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type, 4097 fold_convert_loc (loc, arg0_type, 4098 high_positive), 4099 build_int_cst (arg0_type, 1)); 4100 4101 /* If the low bound is specified, "and" the range with the 4102 range for which the original unsigned value will be 4103 positive. */ 4104 if (low != 0) 4105 { 4106 if (! merge_ranges (&n_in_p, &n_low, &n_high, 1, n_low, n_high, 4107 1, fold_convert_loc (loc, arg0_type, 4108 integer_zero_node), 4109 high_positive)) 4110 return NULL_TREE; 4111 4112 in_p = (n_in_p == in_p); 4113 } 4114 else 4115 { 4116 /* Otherwise, "or" the range with the range of the input 4117 that will be interpreted as negative. */ 4118 if (! merge_ranges (&n_in_p, &n_low, &n_high, 0, n_low, n_high, 4119 1, fold_convert_loc (loc, arg0_type, 4120 integer_zero_node), 4121 high_positive)) 4122 return NULL_TREE; 4123 4124 in_p = (in_p != n_in_p); 4125 } 4126 } 4127 4128 *p_low = n_low; 4129 *p_high = n_high; 4130 *p_in_p = in_p; 4131 return arg0; 4132 4133 default: 4134 return NULL_TREE; 4135 } 4136} 4137 4138/* Given EXP, a logical expression, set the range it is testing into 4139 variables denoted by PIN_P, PLOW, and PHIGH. Return the expression 4140 actually being tested. *PLOW and *PHIGH will be made of the same 4141 type as the returned expression. If EXP is not a comparison, we 4142 will most likely not be returning a useful value and range. Set 4143 *STRICT_OVERFLOW_P to true if the return value is only valid 4144 because signed overflow is undefined; otherwise, do not change 4145 *STRICT_OVERFLOW_P. */ 4146 4147tree 4148make_range (tree exp, int *pin_p, tree *plow, tree *phigh, 4149 bool *strict_overflow_p) 4150{ 4151 enum tree_code code; 4152 tree arg0, arg1 = NULL_TREE; 4153 tree exp_type, nexp; 4154 int in_p; 4155 tree low, high; 4156 location_t loc = EXPR_LOCATION (exp); 4157 4158 /* Start with simply saying "EXP != 0" and then look at the code of EXP 4159 and see if we can refine the range. Some of the cases below may not 4160 happen, but it doesn't seem worth worrying about this. We "continue" 4161 the outer loop when we've changed something; otherwise we "break" 4162 the switch, which will "break" the while. */ 4163 4164 in_p = 0; 4165 low = high = build_int_cst (TREE_TYPE (exp), 0); 4166 4167 while (1) 4168 { 4169 code = TREE_CODE (exp); 4170 exp_type = TREE_TYPE (exp); 4171 arg0 = NULL_TREE; 4172 4173 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))) 4174 { 4175 if (TREE_OPERAND_LENGTH (exp) > 0) 4176 arg0 = TREE_OPERAND (exp, 0); 4177 if (TREE_CODE_CLASS (code) == tcc_binary 4178 || TREE_CODE_CLASS (code) == tcc_comparison 4179 || (TREE_CODE_CLASS (code) == tcc_expression 4180 && TREE_OPERAND_LENGTH (exp) > 1)) 4181 arg1 = TREE_OPERAND (exp, 1); 4182 } 4183 if (arg0 == NULL_TREE) 4184 break; 4185 4186 nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low, 4187 &high, &in_p, strict_overflow_p); 4188 if (nexp == NULL_TREE) 4189 break; 4190 exp = nexp; 4191 } 4192 4193 /* If EXP is a constant, we can evaluate whether this is true or false. */ 4194 if (TREE_CODE (exp) == INTEGER_CST) 4195 { 4196 in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node, 4197 exp, 0, low, 0)) 4198 && integer_onep (range_binop (LE_EXPR, integer_type_node, 4199 exp, 1, high, 1))); 4200 low = high = 0; 4201 exp = 0; 4202 } 4203 4204 *pin_p = in_p, *plow = low, *phigh = high; 4205 return exp; 4206} 4207 4208/* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result 4209 type, TYPE, return an expression to test if EXP is in (or out of, depending 4210 on IN_P) the range. Return 0 if the test couldn't be created. */ 4211 4212tree 4213build_range_check (location_t loc, tree type, tree exp, int in_p, 4214 tree low, tree high) 4215{ 4216 tree etype = TREE_TYPE (exp), value; 4217 4218#ifdef HAVE_canonicalize_funcptr_for_compare 4219 /* Disable this optimization for function pointer expressions 4220 on targets that require function pointer canonicalization. */ 4221 if (HAVE_canonicalize_funcptr_for_compare 4222 && TREE_CODE (etype) == POINTER_TYPE 4223 && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE) 4224 return NULL_TREE; 4225#endif 4226 4227 if (! in_p) 4228 { 4229 value = build_range_check (loc, type, exp, 1, low, high); 4230 if (value != 0) 4231 return invert_truthvalue_loc (loc, value); 4232 4233 return 0; 4234 } 4235 4236 if (low == 0 && high == 0) 4237 return omit_one_operand_loc (loc, type, build_int_cst (type, 1), exp); 4238 4239 if (low == 0) 4240 return fold_build2_loc (loc, LE_EXPR, type, exp, 4241 fold_convert_loc (loc, etype, high)); 4242 4243 if (high == 0) 4244 return fold_build2_loc (loc, GE_EXPR, type, exp, 4245 fold_convert_loc (loc, etype, low)); 4246 4247 if (operand_equal_p (low, high, 0)) 4248 return fold_build2_loc (loc, EQ_EXPR, type, exp, 4249 fold_convert_loc (loc, etype, low)); 4250 4251 if (integer_zerop (low)) 4252 { 4253 if (! TYPE_UNSIGNED (etype)) 4254 { 4255 etype = unsigned_type_for (etype); 4256 high = fold_convert_loc (loc, etype, high); 4257 exp = fold_convert_loc (loc, etype, exp); 4258 } 4259 return build_range_check (loc, type, exp, 1, 0, high); 4260 } 4261 4262 /* Optimize (c>=1) && (c<=127) into (signed char)c > 0. */ 4263 if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST) 4264 { 4265 unsigned HOST_WIDE_INT lo; 4266 HOST_WIDE_INT hi; 4267 int prec; 4268 4269 prec = TYPE_PRECISION (etype); 4270 if (prec <= HOST_BITS_PER_WIDE_INT) 4271 { 4272 hi = 0; 4273 lo = ((unsigned HOST_WIDE_INT) 1 << (prec - 1)) - 1; 4274 } 4275 else 4276 { 4277 hi = ((HOST_WIDE_INT) 1 << (prec - HOST_BITS_PER_WIDE_INT - 1)) - 1; 4278 lo = (unsigned HOST_WIDE_INT) -1; 4279 } 4280 4281 if (TREE_INT_CST_HIGH (high) == hi && TREE_INT_CST_LOW (high) == lo) 4282 { 4283 if (TYPE_UNSIGNED (etype)) 4284 { 4285 tree signed_etype = signed_type_for (etype); 4286 if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype)) 4287 etype 4288 = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0); 4289 else 4290 etype = signed_etype; 4291 exp = fold_convert_loc (loc, etype, exp); 4292 } 4293 return fold_build2_loc (loc, GT_EXPR, type, exp, 4294 build_int_cst (etype, 0)); 4295 } 4296 } 4297 4298 /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low). 4299 This requires wrap-around arithmetics for the type of the expression. 4300 First make sure that arithmetics in this type is valid, then make sure 4301 that it wraps around. */ 4302 if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE) 4303 etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), 4304 TYPE_UNSIGNED (etype)); 4305 4306 if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype)) 4307 { 4308 tree utype, minv, maxv; 4309 4310 /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN 4311 for the type in question, as we rely on this here. */ 4312 utype = unsigned_type_for (etype); 4313 maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype)); 4314 maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1, 4315 integer_one_node, 1); 4316 minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype)); 4317 4318 if (integer_zerop (range_binop (NE_EXPR, integer_type_node, 4319 minv, 1, maxv, 1))) 4320 etype = utype; 4321 else 4322 return 0; 4323 } 4324 4325 high = fold_convert_loc (loc, etype, high); 4326 low = fold_convert_loc (loc, etype, low); 4327 exp = fold_convert_loc (loc, etype, exp); 4328 4329 value = const_binop (MINUS_EXPR, high, low); 4330 4331 4332 if (POINTER_TYPE_P (etype)) 4333 { 4334 if (value != 0 && !TREE_OVERFLOW (value)) 4335 { 4336 low = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (low), low); 4337 return build_range_check (loc, type, 4338 fold_build_pointer_plus_loc (loc, exp, low), 4339 1, build_int_cst (etype, 0), value); 4340 } 4341 return 0; 4342 } 4343 4344 if (value != 0 && !TREE_OVERFLOW (value)) 4345 return build_range_check (loc, type, 4346 fold_build2_loc (loc, MINUS_EXPR, etype, exp, low), 4347 1, build_int_cst (etype, 0), value); 4348 4349 return 0; 4350} 4351 4352/* Return the predecessor of VAL in its type, handling the infinite case. */ 4353 4354static tree 4355range_predecessor (tree val) 4356{ 4357 tree type = TREE_TYPE (val); 4358 4359 if (INTEGRAL_TYPE_P (type) 4360 && operand_equal_p (val, TYPE_MIN_VALUE (type), 0)) 4361 return 0; 4362 else 4363 return range_binop (MINUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0); 4364} 4365 4366/* Return the successor of VAL in its type, handling the infinite case. */ 4367 4368static tree 4369range_successor (tree val) 4370{ 4371 tree type = TREE_TYPE (val); 4372 4373 if (INTEGRAL_TYPE_P (type) 4374 && operand_equal_p (val, TYPE_MAX_VALUE (type), 0)) 4375 return 0; 4376 else 4377 return range_binop (PLUS_EXPR, NULL_TREE, val, 0, integer_one_node, 0); 4378} 4379 4380/* Given two ranges, see if we can merge them into one. Return 1 if we 4381 can, 0 if we can't. Set the output range into the specified parameters. */ 4382 4383bool 4384merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0, 4385 tree high0, int in1_p, tree low1, tree high1) 4386{ 4387 int no_overlap; 4388 int subset; 4389 int temp; 4390 tree tem; 4391 int in_p; 4392 tree low, high; 4393 int lowequal = ((low0 == 0 && low1 == 0) 4394 || integer_onep (range_binop (EQ_EXPR, integer_type_node, 4395 low0, 0, low1, 0))); 4396 int highequal = ((high0 == 0 && high1 == 0) 4397 || integer_onep (range_binop (EQ_EXPR, integer_type_node, 4398 high0, 1, high1, 1))); 4399 4400 /* Make range 0 be the range that starts first, or ends last if they 4401 start at the same value. Swap them if it isn't. */ 4402 if (integer_onep (range_binop (GT_EXPR, integer_type_node, 4403 low0, 0, low1, 0)) 4404 || (lowequal 4405 && integer_onep (range_binop (GT_EXPR, integer_type_node, 4406 high1, 1, high0, 1)))) 4407 { 4408 temp = in0_p, in0_p = in1_p, in1_p = temp; 4409 tem = low0, low0 = low1, low1 = tem; 4410 tem = high0, high0 = high1, high1 = tem; 4411 } 4412 4413 /* Now flag two cases, whether the ranges are disjoint or whether the 4414 second range is totally subsumed in the first. Note that the tests 4415 below are simplified by the ones above. */ 4416 no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node, 4417 high0, 1, low1, 0)); 4418 subset = integer_onep (range_binop (LE_EXPR, integer_type_node, 4419 high1, 1, high0, 1)); 4420 4421 /* We now have four cases, depending on whether we are including or 4422 excluding the two ranges. */ 4423 if (in0_p && in1_p) 4424 { 4425 /* If they don't overlap, the result is false. If the second range 4426 is a subset it is the result. Otherwise, the range is from the start 4427 of the second to the end of the first. */ 4428 if (no_overlap) 4429 in_p = 0, low = high = 0; 4430 else if (subset) 4431 in_p = 1, low = low1, high = high1; 4432 else 4433 in_p = 1, low = low1, high = high0; 4434 } 4435 4436 else if (in0_p && ! in1_p) 4437 { 4438 /* If they don't overlap, the result is the first range. If they are 4439 equal, the result is false. If the second range is a subset of the 4440 first, and the ranges begin at the same place, we go from just after 4441 the end of the second range to the end of the first. If the second 4442 range is not a subset of the first, or if it is a subset and both 4443 ranges end at the same place, the range starts at the start of the 4444 first range and ends just before the second range. 4445 Otherwise, we can't describe this as a single range. */ 4446 if (no_overlap) 4447 in_p = 1, low = low0, high = high0; 4448 else if (lowequal && highequal) 4449 in_p = 0, low = high = 0; 4450 else if (subset && lowequal) 4451 { 4452 low = range_successor (high1); 4453 high = high0; 4454 in_p = 1; 4455 if (low == 0) 4456 { 4457 /* We are in the weird situation where high0 > high1 but 4458 high1 has no successor. Punt. */ 4459 return 0; 4460 } 4461 } 4462 else if (! subset || highequal) 4463 { 4464 low = low0; 4465 high = range_predecessor (low1); 4466 in_p = 1; 4467 if (high == 0) 4468 { 4469 /* low0 < low1 but low1 has no predecessor. Punt. */ 4470 return 0; 4471 } 4472 } 4473 else 4474 return 0; 4475 } 4476 4477 else if (! in0_p && in1_p) 4478 { 4479 /* If they don't overlap, the result is the second range. If the second 4480 is a subset of the first, the result is false. Otherwise, 4481 the range starts just after the first range and ends at the 4482 end of the second. */ 4483 if (no_overlap) 4484 in_p = 1, low = low1, high = high1; 4485 else if (subset || highequal) 4486 in_p = 0, low = high = 0; 4487 else 4488 { 4489 low = range_successor (high0); 4490 high = high1; 4491 in_p = 1; 4492 if (low == 0) 4493 { 4494 /* high1 > high0 but high0 has no successor. Punt. */ 4495 return 0; 4496 } 4497 } 4498 } 4499 4500 else 4501 { 4502 /* The case where we are excluding both ranges. Here the complex case 4503 is if they don't overlap. In that case, the only time we have a 4504 range is if they are adjacent. If the second is a subset of the 4505 first, the result is the first. Otherwise, the range to exclude 4506 starts at the beginning of the first range and ends at the end of the 4507 second. */ 4508 if (no_overlap) 4509 { 4510 if (integer_onep (range_binop (EQ_EXPR, integer_type_node, 4511 range_successor (high0), 4512 1, low1, 0))) 4513 in_p = 0, low = low0, high = high1; 4514 else 4515 { 4516 /* Canonicalize - [min, x] into - [-, x]. */ 4517 if (low0 && TREE_CODE (low0) == INTEGER_CST) 4518 switch (TREE_CODE (TREE_TYPE (low0))) 4519 { 4520 case ENUMERAL_TYPE: 4521 if (TYPE_PRECISION (TREE_TYPE (low0)) 4522 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0)))) 4523 break; 4524 /* FALLTHROUGH */ 4525 case INTEGER_TYPE: 4526 if (tree_int_cst_equal (low0, 4527 TYPE_MIN_VALUE (TREE_TYPE (low0)))) 4528 low0 = 0; 4529 break; 4530 case POINTER_TYPE: 4531 if (TYPE_UNSIGNED (TREE_TYPE (low0)) 4532 && integer_zerop (low0)) 4533 low0 = 0; 4534 break; 4535 default: 4536 break; 4537 } 4538 4539 /* Canonicalize - [x, max] into - [x, -]. */ 4540 if (high1 && TREE_CODE (high1) == INTEGER_CST) 4541 switch (TREE_CODE (TREE_TYPE (high1))) 4542 { 4543 case ENUMERAL_TYPE: 4544 if (TYPE_PRECISION (TREE_TYPE (high1)) 4545 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1)))) 4546 break; 4547 /* FALLTHROUGH */ 4548 case INTEGER_TYPE: 4549 if (tree_int_cst_equal (high1, 4550 TYPE_MAX_VALUE (TREE_TYPE (high1)))) 4551 high1 = 0; 4552 break; 4553 case POINTER_TYPE: 4554 if (TYPE_UNSIGNED (TREE_TYPE (high1)) 4555 && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE, 4556 high1, 1, 4557 integer_one_node, 1))) 4558 high1 = 0; 4559 break; 4560 default: 4561 break; 4562 } 4563 4564 /* The ranges might be also adjacent between the maximum and 4565 minimum values of the given type. For 4566 - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y 4567 return + [x + 1, y - 1]. */ 4568 if (low0 == 0 && high1 == 0) 4569 { 4570 low = range_successor (high0); 4571 high = range_predecessor (low1); 4572 if (low == 0 || high == 0) 4573 return 0; 4574 4575 in_p = 1; 4576 } 4577 else 4578 return 0; 4579 } 4580 } 4581 else if (subset) 4582 in_p = 0, low = low0, high = high0; 4583 else 4584 in_p = 0, low = low0, high = high1; 4585 } 4586 4587 *pin_p = in_p, *plow = low, *phigh = high; 4588 return 1; 4589} 4590 4591 4592/* Subroutine of fold, looking inside expressions of the form 4593 A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands 4594 of the COND_EXPR. This function is being used also to optimize 4595 A op B ? C : A, by reversing the comparison first. 4596 4597 Return a folded expression whose code is not a COND_EXPR 4598 anymore, or NULL_TREE if no folding opportunity is found. */ 4599 4600static tree 4601fold_cond_expr_with_comparison (location_t loc, tree type, 4602 tree arg0, tree arg1, tree arg2) 4603{ 4604 enum tree_code comp_code = TREE_CODE (arg0); 4605 tree arg00 = TREE_OPERAND (arg0, 0); 4606 tree arg01 = TREE_OPERAND (arg0, 1); 4607 tree arg1_type = TREE_TYPE (arg1); 4608 tree tem; 4609 4610 STRIP_NOPS (arg1); 4611 STRIP_NOPS (arg2); 4612 4613 /* If we have A op 0 ? A : -A, consider applying the following 4614 transformations: 4615 4616 A == 0? A : -A same as -A 4617 A != 0? A : -A same as A 4618 A >= 0? A : -A same as abs (A) 4619 A > 0? A : -A same as abs (A) 4620 A <= 0? A : -A same as -abs (A) 4621 A < 0? A : -A same as -abs (A) 4622 4623 None of these transformations work for modes with signed 4624 zeros. If A is +/-0, the first two transformations will 4625 change the sign of the result (from +0 to -0, or vice 4626 versa). The last four will fix the sign of the result, 4627 even though the original expressions could be positive or 4628 negative, depending on the sign of A. 4629 4630 Note that all these transformations are correct if A is 4631 NaN, since the two alternatives (A and -A) are also NaNs. */ 4632 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) 4633 && (FLOAT_TYPE_P (TREE_TYPE (arg01)) 4634 ? real_zerop (arg01) 4635 : integer_zerop (arg01)) 4636 && ((TREE_CODE (arg2) == NEGATE_EXPR 4637 && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0)) 4638 /* In the case that A is of the form X-Y, '-A' (arg2) may 4639 have already been folded to Y-X, check for that. */ 4640 || (TREE_CODE (arg1) == MINUS_EXPR 4641 && TREE_CODE (arg2) == MINUS_EXPR 4642 && operand_equal_p (TREE_OPERAND (arg1, 0), 4643 TREE_OPERAND (arg2, 1), 0) 4644 && operand_equal_p (TREE_OPERAND (arg1, 1), 4645 TREE_OPERAND (arg2, 0), 0)))) 4646 switch (comp_code) 4647 { 4648 case EQ_EXPR: 4649 case UNEQ_EXPR: 4650 tem = fold_convert_loc (loc, arg1_type, arg1); 4651 return pedantic_non_lvalue_loc (loc, 4652 fold_convert_loc (loc, type, 4653 negate_expr (tem))); 4654 case NE_EXPR: 4655 case LTGT_EXPR: 4656 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 4657 case UNGE_EXPR: 4658 case UNGT_EXPR: 4659 if (flag_trapping_math) 4660 break; 4661 /* Fall through. */ 4662 case GE_EXPR: 4663 case GT_EXPR: 4664 if (TYPE_UNSIGNED (TREE_TYPE (arg1))) 4665 arg1 = fold_convert_loc (loc, signed_type_for 4666 (TREE_TYPE (arg1)), arg1); 4667 tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1); 4668 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem)); 4669 case UNLE_EXPR: 4670 case UNLT_EXPR: 4671 if (flag_trapping_math) 4672 break; 4673 case LE_EXPR: 4674 case LT_EXPR: 4675 if (TYPE_UNSIGNED (TREE_TYPE (arg1))) 4676 arg1 = fold_convert_loc (loc, signed_type_for 4677 (TREE_TYPE (arg1)), arg1); 4678 tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1); 4679 return negate_expr (fold_convert_loc (loc, type, tem)); 4680 default: 4681 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison); 4682 break; 4683 } 4684 4685 /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise 4686 A == 0 ? A : 0 is always 0 unless A is -0. Note that 4687 both transformations are correct when A is NaN: A != 0 4688 is then true, and A == 0 is false. */ 4689 4690 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) 4691 && integer_zerop (arg01) && integer_zerop (arg2)) 4692 { 4693 if (comp_code == NE_EXPR) 4694 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 4695 else if (comp_code == EQ_EXPR) 4696 return build_int_cst (type, 0); 4697 } 4698 4699 /* Try some transformations of A op B ? A : B. 4700 4701 A == B? A : B same as B 4702 A != B? A : B same as A 4703 A >= B? A : B same as max (A, B) 4704 A > B? A : B same as max (B, A) 4705 A <= B? A : B same as min (A, B) 4706 A < B? A : B same as min (B, A) 4707 4708 As above, these transformations don't work in the presence 4709 of signed zeros. For example, if A and B are zeros of 4710 opposite sign, the first two transformations will change 4711 the sign of the result. In the last four, the original 4712 expressions give different results for (A=+0, B=-0) and 4713 (A=-0, B=+0), but the transformed expressions do not. 4714 4715 The first two transformations are correct if either A or B 4716 is a NaN. In the first transformation, the condition will 4717 be false, and B will indeed be chosen. In the case of the 4718 second transformation, the condition A != B will be true, 4719 and A will be chosen. 4720 4721 The conversions to max() and min() are not correct if B is 4722 a number and A is not. The conditions in the original 4723 expressions will be false, so all four give B. The min() 4724 and max() versions would give a NaN instead. */ 4725 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type)) 4726 && operand_equal_for_comparison_p (arg01, arg2, arg00) 4727 /* Avoid these transformations if the COND_EXPR may be used 4728 as an lvalue in the C++ front-end. PR c++/19199. */ 4729 && (in_gimple_form 4730 || (strcmp (lang_hooks.name, "GNU C++") != 0 4731 && strcmp (lang_hooks.name, "GNU Objective-C++") != 0) 4732 || ! maybe_lvalue_p (arg1) 4733 || ! maybe_lvalue_p (arg2))) 4734 { 4735 tree comp_op0 = arg00; 4736 tree comp_op1 = arg01; 4737 tree comp_type = TREE_TYPE (comp_op0); 4738 4739 /* Avoid adding NOP_EXPRs in case this is an lvalue. */ 4740 if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type)) 4741 { 4742 comp_type = type; 4743 comp_op0 = arg1; 4744 comp_op1 = arg2; 4745 } 4746 4747 switch (comp_code) 4748 { 4749 case EQ_EXPR: 4750 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2)); 4751 case NE_EXPR: 4752 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 4753 case LE_EXPR: 4754 case LT_EXPR: 4755 case UNLE_EXPR: 4756 case UNLT_EXPR: 4757 /* In C++ a ?: expression can be an lvalue, so put the 4758 operand which will be used if they are equal first 4759 so that we can convert this back to the 4760 corresponding COND_EXPR. */ 4761 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) 4762 { 4763 comp_op0 = fold_convert_loc (loc, comp_type, comp_op0); 4764 comp_op1 = fold_convert_loc (loc, comp_type, comp_op1); 4765 tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR) 4766 ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1) 4767 : fold_build2_loc (loc, MIN_EXPR, comp_type, 4768 comp_op1, comp_op0); 4769 return pedantic_non_lvalue_loc (loc, 4770 fold_convert_loc (loc, type, tem)); 4771 } 4772 break; 4773 case GE_EXPR: 4774 case GT_EXPR: 4775 case UNGE_EXPR: 4776 case UNGT_EXPR: 4777 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) 4778 { 4779 comp_op0 = fold_convert_loc (loc, comp_type, comp_op0); 4780 comp_op1 = fold_convert_loc (loc, comp_type, comp_op1); 4781 tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR) 4782 ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1) 4783 : fold_build2_loc (loc, MAX_EXPR, comp_type, 4784 comp_op1, comp_op0); 4785 return pedantic_non_lvalue_loc (loc, 4786 fold_convert_loc (loc, type, tem)); 4787 } 4788 break; 4789 case UNEQ_EXPR: 4790 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) 4791 return pedantic_non_lvalue_loc (loc, 4792 fold_convert_loc (loc, type, arg2)); 4793 break; 4794 case LTGT_EXPR: 4795 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) 4796 return pedantic_non_lvalue_loc (loc, 4797 fold_convert_loc (loc, type, arg1)); 4798 break; 4799 default: 4800 gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison); 4801 break; 4802 } 4803 } 4804 4805 /* If this is A op C1 ? A : C2 with C1 and C2 constant integers, 4806 we might still be able to simplify this. For example, 4807 if C1 is one less or one more than C2, this might have started 4808 out as a MIN or MAX and been transformed by this function. 4809 Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */ 4810 4811 if (INTEGRAL_TYPE_P (type) 4812 && TREE_CODE (arg01) == INTEGER_CST 4813 && TREE_CODE (arg2) == INTEGER_CST) 4814 switch (comp_code) 4815 { 4816 case EQ_EXPR: 4817 if (TREE_CODE (arg1) == INTEGER_CST) 4818 break; 4819 /* We can replace A with C1 in this case. */ 4820 arg1 = fold_convert_loc (loc, type, arg01); 4821 return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2); 4822 4823 case LT_EXPR: 4824 /* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for 4825 MIN_EXPR, to preserve the signedness of the comparison. */ 4826 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 4827 OEP_ONLY_CONST) 4828 && operand_equal_p (arg01, 4829 const_binop (PLUS_EXPR, arg2, 4830 build_int_cst (type, 1)), 4831 OEP_ONLY_CONST)) 4832 { 4833 tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00, 4834 fold_convert_loc (loc, TREE_TYPE (arg00), 4835 arg2)); 4836 return pedantic_non_lvalue_loc (loc, 4837 fold_convert_loc (loc, type, tem)); 4838 } 4839 break; 4840 4841 case LE_EXPR: 4842 /* If C1 is C2 - 1, this is min(A, C2), with the same care 4843 as above. */ 4844 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 4845 OEP_ONLY_CONST) 4846 && operand_equal_p (arg01, 4847 const_binop (MINUS_EXPR, arg2, 4848 build_int_cst (type, 1)), 4849 OEP_ONLY_CONST)) 4850 { 4851 tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00, 4852 fold_convert_loc (loc, TREE_TYPE (arg00), 4853 arg2)); 4854 return pedantic_non_lvalue_loc (loc, 4855 fold_convert_loc (loc, type, tem)); 4856 } 4857 break; 4858 4859 case GT_EXPR: 4860 /* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for 4861 MAX_EXPR, to preserve the signedness of the comparison. */ 4862 if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type), 4863 OEP_ONLY_CONST) 4864 && operand_equal_p (arg01, 4865 const_binop (MINUS_EXPR, arg2, 4866 build_int_cst (type, 1)), 4867 OEP_ONLY_CONST)) 4868 { 4869 tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00, 4870 fold_convert_loc (loc, TREE_TYPE (arg00), 4871 arg2)); 4872 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem)); 4873 } 4874 break; 4875 4876 case GE_EXPR: 4877 /* If C1 is C2 + 1, this is max(A, C2), with the same care as above. */ 4878 if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type), 4879 OEP_ONLY_CONST) 4880 && operand_equal_p (arg01, 4881 const_binop (PLUS_EXPR, arg2, 4882 build_int_cst (type, 1)), 4883 OEP_ONLY_CONST)) 4884 { 4885 tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00, 4886 fold_convert_loc (loc, TREE_TYPE (arg00), 4887 arg2)); 4888 return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem)); 4889 } 4890 break; 4891 case NE_EXPR: 4892 break; 4893 default: 4894 gcc_unreachable (); 4895 } 4896 4897 return NULL_TREE; 4898} 4899 4900 4901 4902#ifndef LOGICAL_OP_NON_SHORT_CIRCUIT 4903#define LOGICAL_OP_NON_SHORT_CIRCUIT \ 4904 (BRANCH_COST (optimize_function_for_speed_p (cfun), \ 4905 false) >= 2) 4906#endif 4907 4908/* EXP is some logical combination of boolean tests. See if we can 4909 merge it into some range test. Return the new tree if so. */ 4910 4911static tree 4912fold_range_test (location_t loc, enum tree_code code, tree type, 4913 tree op0, tree op1) 4914{ 4915 int or_op = (code == TRUTH_ORIF_EXPR 4916 || code == TRUTH_OR_EXPR); 4917 int in0_p, in1_p, in_p; 4918 tree low0, low1, low, high0, high1, high; 4919 bool strict_overflow_p = false; 4920 tree tem, lhs, rhs; 4921 const char * const warnmsg = G_("assuming signed overflow does not occur " 4922 "when simplifying range test"); 4923 4924 if (!INTEGRAL_TYPE_P (type)) 4925 return 0; 4926 4927 lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p); 4928 rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p); 4929 4930 /* If this is an OR operation, invert both sides; we will invert 4931 again at the end. */ 4932 if (or_op) 4933 in0_p = ! in0_p, in1_p = ! in1_p; 4934 4935 /* If both expressions are the same, if we can merge the ranges, and we 4936 can build the range test, return it or it inverted. If one of the 4937 ranges is always true or always false, consider it to be the same 4938 expression as the other. */ 4939 if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0)) 4940 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0, 4941 in1_p, low1, high1) 4942 && 0 != (tem = (build_range_check (loc, type, 4943 lhs != 0 ? lhs 4944 : rhs != 0 ? rhs : integer_zero_node, 4945 in_p, low, high)))) 4946 { 4947 if (strict_overflow_p) 4948 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON); 4949 return or_op ? invert_truthvalue_loc (loc, tem) : tem; 4950 } 4951 4952 /* On machines where the branch cost is expensive, if this is a 4953 short-circuited branch and the underlying object on both sides 4954 is the same, make a non-short-circuit operation. */ 4955 else if (LOGICAL_OP_NON_SHORT_CIRCUIT 4956 && lhs != 0 && rhs != 0 4957 && (code == TRUTH_ANDIF_EXPR 4958 || code == TRUTH_ORIF_EXPR) 4959 && operand_equal_p (lhs, rhs, 0)) 4960 { 4961 /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR 4962 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in 4963 which cases we can't do this. */ 4964 if (simple_operand_p (lhs)) 4965 return build2_loc (loc, code == TRUTH_ANDIF_EXPR 4966 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR, 4967 type, op0, op1); 4968 4969 else if (!lang_hooks.decls.global_bindings_p () 4970 && !CONTAINS_PLACEHOLDER_P (lhs)) 4971 { 4972 tree common = save_expr (lhs); 4973 4974 if (0 != (lhs = build_range_check (loc, type, common, 4975 or_op ? ! in0_p : in0_p, 4976 low0, high0)) 4977 && (0 != (rhs = build_range_check (loc, type, common, 4978 or_op ? ! in1_p : in1_p, 4979 low1, high1)))) 4980 { 4981 if (strict_overflow_p) 4982 fold_overflow_warning (warnmsg, 4983 WARN_STRICT_OVERFLOW_COMPARISON); 4984 return build2_loc (loc, code == TRUTH_ANDIF_EXPR 4985 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR, 4986 type, lhs, rhs); 4987 } 4988 } 4989 } 4990 4991 return 0; 4992} 4993 4994/* Subroutine for fold_truth_andor_1: C is an INTEGER_CST interpreted as a P 4995 bit value. Arrange things so the extra bits will be set to zero if and 4996 only if C is signed-extended to its full width. If MASK is nonzero, 4997 it is an INTEGER_CST that should be AND'ed with the extra bits. */ 4998 4999static tree 5000unextend (tree c, int p, int unsignedp, tree mask) 5001{ 5002 tree type = TREE_TYPE (c); 5003 int modesize = GET_MODE_BITSIZE (TYPE_MODE (type)); 5004 tree temp; 5005 5006 if (p == modesize || unsignedp) 5007 return c; 5008 5009 /* We work by getting just the sign bit into the low-order bit, then 5010 into the high-order bit, then sign-extend. We then XOR that value 5011 with C. */ 5012 temp = const_binop (RSHIFT_EXPR, c, size_int (p - 1)); 5013 temp = const_binop (BIT_AND_EXPR, temp, size_int (1)); 5014 5015 /* We must use a signed type in order to get an arithmetic right shift. 5016 However, we must also avoid introducing accidental overflows, so that 5017 a subsequent call to integer_zerop will work. Hence we must 5018 do the type conversion here. At this point, the constant is either 5019 zero or one, and the conversion to a signed type can never overflow. 5020 We could get an overflow if this conversion is done anywhere else. */ 5021 if (TYPE_UNSIGNED (type)) 5022 temp = fold_convert (signed_type_for (type), temp); 5023 5024 temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1)); 5025 temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1)); 5026 if (mask != 0) 5027 temp = const_binop (BIT_AND_EXPR, temp, 5028 fold_convert (TREE_TYPE (c), mask)); 5029 /* If necessary, convert the type back to match the type of C. */ 5030 if (TYPE_UNSIGNED (type)) 5031 temp = fold_convert (type, temp); 5032 5033 return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp)); 5034} 5035 5036/* For an expression that has the form 5037 (A && B) || ~B 5038 or 5039 (A || B) && ~B, 5040 we can drop one of the inner expressions and simplify to 5041 A || ~B 5042 or 5043 A && ~B 5044 LOC is the location of the resulting expression. OP is the inner 5045 logical operation; the left-hand side in the examples above, while CMPOP 5046 is the right-hand side. RHS_ONLY is used to prevent us from accidentally 5047 removing a condition that guards another, as in 5048 (A != NULL && A->...) || A == NULL 5049 which we must not transform. If RHS_ONLY is true, only eliminate the 5050 right-most operand of the inner logical operation. */ 5051 5052static tree 5053merge_truthop_with_opposite_arm (location_t loc, tree op, tree cmpop, 5054 bool rhs_only) 5055{ 5056 tree type = TREE_TYPE (cmpop); 5057 enum tree_code code = TREE_CODE (cmpop); 5058 enum tree_code truthop_code = TREE_CODE (op); 5059 tree lhs = TREE_OPERAND (op, 0); 5060 tree rhs = TREE_OPERAND (op, 1); 5061 tree orig_lhs = lhs, orig_rhs = rhs; 5062 enum tree_code rhs_code = TREE_CODE (rhs); 5063 enum tree_code lhs_code = TREE_CODE (lhs); 5064 enum tree_code inv_code; 5065 5066 if (TREE_SIDE_EFFECTS (op) || TREE_SIDE_EFFECTS (cmpop)) 5067 return NULL_TREE; 5068 5069 if (TREE_CODE_CLASS (code) != tcc_comparison) 5070 return NULL_TREE; 5071 5072 if (rhs_code == truthop_code) 5073 { 5074 tree newrhs = merge_truthop_with_opposite_arm (loc, rhs, cmpop, rhs_only); 5075 if (newrhs != NULL_TREE) 5076 { 5077 rhs = newrhs; 5078 rhs_code = TREE_CODE (rhs); 5079 } 5080 } 5081 if (lhs_code == truthop_code && !rhs_only) 5082 { 5083 tree newlhs = merge_truthop_with_opposite_arm (loc, lhs, cmpop, false); 5084 if (newlhs != NULL_TREE) 5085 { 5086 lhs = newlhs; 5087 lhs_code = TREE_CODE (lhs); 5088 } 5089 } 5090 5091 inv_code = invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (type))); 5092 if (inv_code == rhs_code 5093 && operand_equal_p (TREE_OPERAND (rhs, 0), TREE_OPERAND (cmpop, 0), 0) 5094 && operand_equal_p (TREE_OPERAND (rhs, 1), TREE_OPERAND (cmpop, 1), 0)) 5095 return lhs; 5096 if (!rhs_only && inv_code == lhs_code 5097 && operand_equal_p (TREE_OPERAND (lhs, 0), TREE_OPERAND (cmpop, 0), 0) 5098 && operand_equal_p (TREE_OPERAND (lhs, 1), TREE_OPERAND (cmpop, 1), 0)) 5099 return rhs; 5100 if (rhs != orig_rhs || lhs != orig_lhs) 5101 return fold_build2_loc (loc, truthop_code, TREE_TYPE (cmpop), 5102 lhs, rhs); 5103 return NULL_TREE; 5104} 5105 5106/* Find ways of folding logical expressions of LHS and RHS: 5107 Try to merge two comparisons to the same innermost item. 5108 Look for range tests like "ch >= '0' && ch <= '9'". 5109 Look for combinations of simple terms on machines with expensive branches 5110 and evaluate the RHS unconditionally. 5111 5112 For example, if we have p->a == 2 && p->b == 4 and we can make an 5113 object large enough to span both A and B, we can do this with a comparison 5114 against the object ANDed with the a mask. 5115 5116 If we have p->a == q->a && p->b == q->b, we may be able to use bit masking 5117 operations to do this with one comparison. 5118 5119 We check for both normal comparisons and the BIT_AND_EXPRs made this by 5120 function and the one above. 5121 5122 CODE is the logical operation being done. It can be TRUTH_ANDIF_EXPR, 5123 TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR. 5124 5125 TRUTH_TYPE is the type of the logical operand and LHS and RHS are its 5126 two operands. 5127 5128 We return the simplified tree or 0 if no optimization is possible. */ 5129 5130static tree 5131fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type, 5132 tree lhs, tree rhs) 5133{ 5134 /* If this is the "or" of two comparisons, we can do something if 5135 the comparisons are NE_EXPR. If this is the "and", we can do something 5136 if the comparisons are EQ_EXPR. I.e., 5137 (a->b == 2 && a->c == 4) can become (a->new == NEW). 5138 5139 WANTED_CODE is this operation code. For single bit fields, we can 5140 convert EQ_EXPR to NE_EXPR so we need not reject the "wrong" 5141 comparison for one-bit fields. */ 5142 5143 enum tree_code wanted_code; 5144 enum tree_code lcode, rcode; 5145 tree ll_arg, lr_arg, rl_arg, rr_arg; 5146 tree ll_inner, lr_inner, rl_inner, rr_inner; 5147 HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos; 5148 HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos; 5149 HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos; 5150 HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos; 5151 int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp; 5152 enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode; 5153 enum machine_mode lnmode, rnmode; 5154 tree ll_mask, lr_mask, rl_mask, rr_mask; 5155 tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask; 5156 tree l_const, r_const; 5157 tree lntype, rntype, result; 5158 HOST_WIDE_INT first_bit, end_bit; 5159 int volatilep; 5160 5161 /* Start by getting the comparison codes. Fail if anything is volatile. 5162 If one operand is a BIT_AND_EXPR with the constant one, treat it as if 5163 it were surrounded with a NE_EXPR. */ 5164 5165 if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs)) 5166 return 0; 5167 5168 lcode = TREE_CODE (lhs); 5169 rcode = TREE_CODE (rhs); 5170 5171 if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1))) 5172 { 5173 lhs = build2 (NE_EXPR, truth_type, lhs, 5174 build_int_cst (TREE_TYPE (lhs), 0)); 5175 lcode = NE_EXPR; 5176 } 5177 5178 if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1))) 5179 { 5180 rhs = build2 (NE_EXPR, truth_type, rhs, 5181 build_int_cst (TREE_TYPE (rhs), 0)); 5182 rcode = NE_EXPR; 5183 } 5184 5185 if (TREE_CODE_CLASS (lcode) != tcc_comparison 5186 || TREE_CODE_CLASS (rcode) != tcc_comparison) 5187 return 0; 5188 5189 ll_arg = TREE_OPERAND (lhs, 0); 5190 lr_arg = TREE_OPERAND (lhs, 1); 5191 rl_arg = TREE_OPERAND (rhs, 0); 5192 rr_arg = TREE_OPERAND (rhs, 1); 5193 5194 /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations. */ 5195 if (simple_operand_p (ll_arg) 5196 && simple_operand_p (lr_arg)) 5197 { 5198 if (operand_equal_p (ll_arg, rl_arg, 0) 5199 && operand_equal_p (lr_arg, rr_arg, 0)) 5200 { 5201 result = combine_comparisons (loc, code, lcode, rcode, 5202 truth_type, ll_arg, lr_arg); 5203 if (result) 5204 return result; 5205 } 5206 else if (operand_equal_p (ll_arg, rr_arg, 0) 5207 && operand_equal_p (lr_arg, rl_arg, 0)) 5208 { 5209 result = combine_comparisons (loc, code, lcode, 5210 swap_tree_comparison (rcode), 5211 truth_type, ll_arg, lr_arg); 5212 if (result) 5213 return result; 5214 } 5215 } 5216 5217 code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR) 5218 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR); 5219 5220 /* If the RHS can be evaluated unconditionally and its operands are 5221 simple, it wins to evaluate the RHS unconditionally on machines 5222 with expensive branches. In this case, this isn't a comparison 5223 that can be merged. */ 5224 5225 if (BRANCH_COST (optimize_function_for_speed_p (cfun), 5226 false) >= 2 5227 && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg)) 5228 && simple_operand_p (rl_arg) 5229 && simple_operand_p (rr_arg)) 5230 { 5231 /* Convert (a != 0) || (b != 0) into (a | b) != 0. */ 5232 if (code == TRUTH_OR_EXPR 5233 && lcode == NE_EXPR && integer_zerop (lr_arg) 5234 && rcode == NE_EXPR && integer_zerop (rr_arg) 5235 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg) 5236 && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg))) 5237 return build2_loc (loc, NE_EXPR, truth_type, 5238 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg), 5239 ll_arg, rl_arg), 5240 build_int_cst (TREE_TYPE (ll_arg), 0)); 5241 5242 /* Convert (a == 0) && (b == 0) into (a | b) == 0. */ 5243 if (code == TRUTH_AND_EXPR 5244 && lcode == EQ_EXPR && integer_zerop (lr_arg) 5245 && rcode == EQ_EXPR && integer_zerop (rr_arg) 5246 && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg) 5247 && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg))) 5248 return build2_loc (loc, EQ_EXPR, truth_type, 5249 build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg), 5250 ll_arg, rl_arg), 5251 build_int_cst (TREE_TYPE (ll_arg), 0)); 5252 } 5253 5254 /* See if the comparisons can be merged. Then get all the parameters for 5255 each side. */ 5256 5257 if ((lcode != EQ_EXPR && lcode != NE_EXPR) 5258 || (rcode != EQ_EXPR && rcode != NE_EXPR)) 5259 return 0; 5260 5261 volatilep = 0; 5262 ll_inner = decode_field_reference (loc, ll_arg, 5263 &ll_bitsize, &ll_bitpos, &ll_mode, 5264 &ll_unsignedp, &volatilep, &ll_mask, 5265 &ll_and_mask); 5266 lr_inner = decode_field_reference (loc, lr_arg, 5267 &lr_bitsize, &lr_bitpos, &lr_mode, 5268 &lr_unsignedp, &volatilep, &lr_mask, 5269 &lr_and_mask); 5270 rl_inner = decode_field_reference (loc, rl_arg, 5271 &rl_bitsize, &rl_bitpos, &rl_mode, 5272 &rl_unsignedp, &volatilep, &rl_mask, 5273 &rl_and_mask); 5274 rr_inner = decode_field_reference (loc, rr_arg, 5275 &rr_bitsize, &rr_bitpos, &rr_mode, 5276 &rr_unsignedp, &volatilep, &rr_mask, 5277 &rr_and_mask); 5278 5279 /* It must be true that the inner operation on the lhs of each 5280 comparison must be the same if we are to be able to do anything. 5281 Then see if we have constants. If not, the same must be true for 5282 the rhs's. */ 5283 if (volatilep || ll_inner == 0 || rl_inner == 0 5284 || ! operand_equal_p (ll_inner, rl_inner, 0)) 5285 return 0; 5286 5287 if (TREE_CODE (lr_arg) == INTEGER_CST 5288 && TREE_CODE (rr_arg) == INTEGER_CST) 5289 l_const = lr_arg, r_const = rr_arg; 5290 else if (lr_inner == 0 || rr_inner == 0 5291 || ! operand_equal_p (lr_inner, rr_inner, 0)) 5292 return 0; 5293 else 5294 l_const = r_const = 0; 5295 5296 /* If either comparison code is not correct for our logical operation, 5297 fail. However, we can convert a one-bit comparison against zero into 5298 the opposite comparison against that bit being set in the field. */ 5299 5300 wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR); 5301 if (lcode != wanted_code) 5302 { 5303 if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask)) 5304 { 5305 /* Make the left operand unsigned, since we are only interested 5306 in the value of one bit. Otherwise we are doing the wrong 5307 thing below. */ 5308 ll_unsignedp = 1; 5309 l_const = ll_mask; 5310 } 5311 else 5312 return 0; 5313 } 5314 5315 /* This is analogous to the code for l_const above. */ 5316 if (rcode != wanted_code) 5317 { 5318 if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask)) 5319 { 5320 rl_unsignedp = 1; 5321 r_const = rl_mask; 5322 } 5323 else 5324 return 0; 5325 } 5326 5327 /* See if we can find a mode that contains both fields being compared on 5328 the left. If we can't, fail. Otherwise, update all constants and masks 5329 to be relative to a field of that size. */ 5330 first_bit = MIN (ll_bitpos, rl_bitpos); 5331 end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize); 5332 lnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0, 5333 TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode, 5334 volatilep); 5335 if (lnmode == VOIDmode) 5336 return 0; 5337 5338 lnbitsize = GET_MODE_BITSIZE (lnmode); 5339 lnbitpos = first_bit & ~ (lnbitsize - 1); 5340 lntype = lang_hooks.types.type_for_size (lnbitsize, 1); 5341 xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos; 5342 5343 if (BYTES_BIG_ENDIAN) 5344 { 5345 xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize; 5346 xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize; 5347 } 5348 5349 ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask), 5350 size_int (xll_bitpos)); 5351 rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask), 5352 size_int (xrl_bitpos)); 5353 5354 if (l_const) 5355 { 5356 l_const = fold_convert_loc (loc, lntype, l_const); 5357 l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask); 5358 l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos)); 5359 if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const, 5360 fold_build1_loc (loc, BIT_NOT_EXPR, 5361 lntype, ll_mask)))) 5362 { 5363 warning (0, "comparison is always %d", wanted_code == NE_EXPR); 5364 5365 return constant_boolean_node (wanted_code == NE_EXPR, truth_type); 5366 } 5367 } 5368 if (r_const) 5369 { 5370 r_const = fold_convert_loc (loc, lntype, r_const); 5371 r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask); 5372 r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos)); 5373 if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const, 5374 fold_build1_loc (loc, BIT_NOT_EXPR, 5375 lntype, rl_mask)))) 5376 { 5377 warning (0, "comparison is always %d", wanted_code == NE_EXPR); 5378 5379 return constant_boolean_node (wanted_code == NE_EXPR, truth_type); 5380 } 5381 } 5382 5383 /* If the right sides are not constant, do the same for it. Also, 5384 disallow this optimization if a size or signedness mismatch occurs 5385 between the left and right sides. */ 5386 if (l_const == 0) 5387 { 5388 if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize 5389 || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp 5390 /* Make sure the two fields on the right 5391 correspond to the left without being swapped. */ 5392 || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos) 5393 return 0; 5394 5395 first_bit = MIN (lr_bitpos, rr_bitpos); 5396 end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize); 5397 rnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0, 5398 TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode, 5399 volatilep); 5400 if (rnmode == VOIDmode) 5401 return 0; 5402 5403 rnbitsize = GET_MODE_BITSIZE (rnmode); 5404 rnbitpos = first_bit & ~ (rnbitsize - 1); 5405 rntype = lang_hooks.types.type_for_size (rnbitsize, 1); 5406 xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos; 5407 5408 if (BYTES_BIG_ENDIAN) 5409 { 5410 xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize; 5411 xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize; 5412 } 5413 5414 lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, 5415 rntype, lr_mask), 5416 size_int (xlr_bitpos)); 5417 rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, 5418 rntype, rr_mask), 5419 size_int (xrr_bitpos)); 5420 5421 /* Make a mask that corresponds to both fields being compared. 5422 Do this for both items being compared. If the operands are the 5423 same size and the bits being compared are in the same position 5424 then we can do this by masking both and comparing the masked 5425 results. */ 5426 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask); 5427 lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask); 5428 if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos) 5429 { 5430 lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos, 5431 ll_unsignedp || rl_unsignedp); 5432 if (! all_ones_mask_p (ll_mask, lnbitsize)) 5433 lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask); 5434 5435 rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos, 5436 lr_unsignedp || rr_unsignedp); 5437 if (! all_ones_mask_p (lr_mask, rnbitsize)) 5438 rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask); 5439 5440 return build2_loc (loc, wanted_code, truth_type, lhs, rhs); 5441 } 5442 5443 /* There is still another way we can do something: If both pairs of 5444 fields being compared are adjacent, we may be able to make a wider 5445 field containing them both. 5446 5447 Note that we still must mask the lhs/rhs expressions. Furthermore, 5448 the mask must be shifted to account for the shift done by 5449 make_bit_field_ref. */ 5450 if ((ll_bitsize + ll_bitpos == rl_bitpos 5451 && lr_bitsize + lr_bitpos == rr_bitpos) 5452 || (ll_bitpos == rl_bitpos + rl_bitsize 5453 && lr_bitpos == rr_bitpos + rr_bitsize)) 5454 { 5455 tree type; 5456 5457 lhs = make_bit_field_ref (loc, ll_inner, lntype, 5458 ll_bitsize + rl_bitsize, 5459 MIN (ll_bitpos, rl_bitpos), ll_unsignedp); 5460 rhs = make_bit_field_ref (loc, lr_inner, rntype, 5461 lr_bitsize + rr_bitsize, 5462 MIN (lr_bitpos, rr_bitpos), lr_unsignedp); 5463 5464 ll_mask = const_binop (RSHIFT_EXPR, ll_mask, 5465 size_int (MIN (xll_bitpos, xrl_bitpos))); 5466 lr_mask = const_binop (RSHIFT_EXPR, lr_mask, 5467 size_int (MIN (xlr_bitpos, xrr_bitpos))); 5468 5469 /* Convert to the smaller type before masking out unwanted bits. */ 5470 type = lntype; 5471 if (lntype != rntype) 5472 { 5473 if (lnbitsize > rnbitsize) 5474 { 5475 lhs = fold_convert_loc (loc, rntype, lhs); 5476 ll_mask = fold_convert_loc (loc, rntype, ll_mask); 5477 type = rntype; 5478 } 5479 else if (lnbitsize < rnbitsize) 5480 { 5481 rhs = fold_convert_loc (loc, lntype, rhs); 5482 lr_mask = fold_convert_loc (loc, lntype, lr_mask); 5483 type = lntype; 5484 } 5485 } 5486 5487 if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize)) 5488 lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask); 5489 5490 if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize)) 5491 rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask); 5492 5493 return build2_loc (loc, wanted_code, truth_type, lhs, rhs); 5494 } 5495 5496 return 0; 5497 } 5498 5499 /* Handle the case of comparisons with constants. If there is something in 5500 common between the masks, those bits of the constants must be the same. 5501 If not, the condition is always false. Test for this to avoid generating 5502 incorrect code below. */ 5503 result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask); 5504 if (! integer_zerop (result) 5505 && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const), 5506 const_binop (BIT_AND_EXPR, result, r_const)) != 1) 5507 { 5508 if (wanted_code == NE_EXPR) 5509 { 5510 warning (0, "%<or%> of unmatched not-equal tests is always 1"); 5511 return constant_boolean_node (true, truth_type); 5512 } 5513 else 5514 { 5515 warning (0, "%<and%> of mutually exclusive equal-tests is always 0"); 5516 return constant_boolean_node (false, truth_type); 5517 } 5518 } 5519 5520 /* Construct the expression we will return. First get the component 5521 reference we will make. Unless the mask is all ones the width of 5522 that field, perform the mask operation. Then compare with the 5523 merged constant. */ 5524 result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos, 5525 ll_unsignedp || rl_unsignedp); 5526 5527 ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask); 5528 if (! all_ones_mask_p (ll_mask, lnbitsize)) 5529 result = build2_loc (loc, BIT_AND_EXPR, lntype, result, ll_mask); 5530 5531 return build2_loc (loc, wanted_code, truth_type, result, 5532 const_binop (BIT_IOR_EXPR, l_const, r_const)); 5533} 5534 5535/* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a 5536 constant. */ 5537 5538static tree 5539optimize_minmax_comparison (location_t loc, enum tree_code code, tree type, 5540 tree op0, tree op1) 5541{ 5542 tree arg0 = op0; 5543 enum tree_code op_code; 5544 tree comp_const; 5545 tree minmax_const; 5546 int consts_equal, consts_lt; 5547 tree inner; 5548 5549 STRIP_SIGN_NOPS (arg0); 5550 5551 op_code = TREE_CODE (arg0); 5552 minmax_const = TREE_OPERAND (arg0, 1); 5553 comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1); 5554 consts_equal = tree_int_cst_equal (minmax_const, comp_const); 5555 consts_lt = tree_int_cst_lt (minmax_const, comp_const); 5556 inner = TREE_OPERAND (arg0, 0); 5557 5558 /* If something does not permit us to optimize, return the original tree. */ 5559 if ((op_code != MIN_EXPR && op_code != MAX_EXPR) 5560 || TREE_CODE (comp_const) != INTEGER_CST 5561 || TREE_OVERFLOW (comp_const) 5562 || TREE_CODE (minmax_const) != INTEGER_CST 5563 || TREE_OVERFLOW (minmax_const)) 5564 return NULL_TREE; 5565 5566 /* Now handle all the various comparison codes. We only handle EQ_EXPR 5567 and GT_EXPR, doing the rest with recursive calls using logical 5568 simplifications. */ 5569 switch (code) 5570 { 5571 case NE_EXPR: case LT_EXPR: case LE_EXPR: 5572 { 5573 tree tem 5574 = optimize_minmax_comparison (loc, 5575 invert_tree_comparison (code, false), 5576 type, op0, op1); 5577 if (tem) 5578 return invert_truthvalue_loc (loc, tem); 5579 return NULL_TREE; 5580 } 5581 5582 case GE_EXPR: 5583 return 5584 fold_build2_loc (loc, TRUTH_ORIF_EXPR, type, 5585 optimize_minmax_comparison 5586 (loc, EQ_EXPR, type, arg0, comp_const), 5587 optimize_minmax_comparison 5588 (loc, GT_EXPR, type, arg0, comp_const)); 5589 5590 case EQ_EXPR: 5591 if (op_code == MAX_EXPR && consts_equal) 5592 /* MAX (X, 0) == 0 -> X <= 0 */ 5593 return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const); 5594 5595 else if (op_code == MAX_EXPR && consts_lt) 5596 /* MAX (X, 0) == 5 -> X == 5 */ 5597 return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const); 5598 5599 else if (op_code == MAX_EXPR) 5600 /* MAX (X, 0) == -1 -> false */ 5601 return omit_one_operand_loc (loc, type, integer_zero_node, inner); 5602 5603 else if (consts_equal) 5604 /* MIN (X, 0) == 0 -> X >= 0 */ 5605 return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const); 5606 5607 else if (consts_lt) 5608 /* MIN (X, 0) == 5 -> false */ 5609 return omit_one_operand_loc (loc, type, integer_zero_node, inner); 5610 5611 else 5612 /* MIN (X, 0) == -1 -> X == -1 */ 5613 return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const); 5614 5615 case GT_EXPR: 5616 if (op_code == MAX_EXPR && (consts_equal || consts_lt)) 5617 /* MAX (X, 0) > 0 -> X > 0 5618 MAX (X, 0) > 5 -> X > 5 */ 5619 return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const); 5620 5621 else if (op_code == MAX_EXPR) 5622 /* MAX (X, 0) > -1 -> true */ 5623 return omit_one_operand_loc (loc, type, integer_one_node, inner); 5624 5625 else if (op_code == MIN_EXPR && (consts_equal || consts_lt)) 5626 /* MIN (X, 0) > 0 -> false 5627 MIN (X, 0) > 5 -> false */ 5628 return omit_one_operand_loc (loc, type, integer_zero_node, inner); 5629 5630 else 5631 /* MIN (X, 0) > -1 -> X > -1 */ 5632 return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const); 5633 5634 default: 5635 return NULL_TREE; 5636 } 5637} 5638 5639/* T is an integer expression that is being multiplied, divided, or taken a 5640 modulus (CODE says which and what kind of divide or modulus) by a 5641 constant C. See if we can eliminate that operation by folding it with 5642 other operations already in T. WIDE_TYPE, if non-null, is a type that 5643 should be used for the computation if wider than our type. 5644 5645 For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return 5646 (X * 2) + (Y * 4). We must, however, be assured that either the original 5647 expression would not overflow or that overflow is undefined for the type 5648 in the language in question. 5649 5650 If we return a non-null expression, it is an equivalent form of the 5651 original computation, but need not be in the original type. 5652 5653 We set *STRICT_OVERFLOW_P to true if the return values depends on 5654 signed overflow being undefined. Otherwise we do not change 5655 *STRICT_OVERFLOW_P. */ 5656 5657static tree 5658extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type, 5659 bool *strict_overflow_p) 5660{ 5661 /* To avoid exponential search depth, refuse to allow recursion past 5662 three levels. Beyond that (1) it's highly unlikely that we'll find 5663 something interesting and (2) we've probably processed it before 5664 when we built the inner expression. */ 5665 5666 static int depth; 5667 tree ret; 5668 5669 if (depth > 3) 5670 return NULL; 5671 5672 depth++; 5673 ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p); 5674 depth--; 5675 5676 return ret; 5677} 5678 5679static tree 5680extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type, 5681 bool *strict_overflow_p) 5682{ 5683 tree type = TREE_TYPE (t); 5684 enum tree_code tcode = TREE_CODE (t); 5685 tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type)) 5686 > GET_MODE_SIZE (TYPE_MODE (type))) 5687 ? wide_type : type); 5688 tree t1, t2; 5689 int same_p = tcode == code; 5690 tree op0 = NULL_TREE, op1 = NULL_TREE; 5691 bool sub_strict_overflow_p; 5692 5693 /* Don't deal with constants of zero here; they confuse the code below. */ 5694 if (integer_zerop (c)) 5695 return NULL_TREE; 5696 5697 if (TREE_CODE_CLASS (tcode) == tcc_unary) 5698 op0 = TREE_OPERAND (t, 0); 5699 5700 if (TREE_CODE_CLASS (tcode) == tcc_binary) 5701 op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1); 5702 5703 /* Note that we need not handle conditional operations here since fold 5704 already handles those cases. So just do arithmetic here. */ 5705 switch (tcode) 5706 { 5707 case INTEGER_CST: 5708 /* For a constant, we can always simplify if we are a multiply 5709 or (for divide and modulus) if it is a multiple of our constant. */ 5710 if (code == MULT_EXPR 5711 || integer_zerop (const_binop (TRUNC_MOD_EXPR, t, c))) 5712 return const_binop (code, fold_convert (ctype, t), 5713 fold_convert (ctype, c)); 5714 break; 5715 5716 CASE_CONVERT: case NON_LVALUE_EXPR: 5717 /* If op0 is an expression ... */ 5718 if ((COMPARISON_CLASS_P (op0) 5719 || UNARY_CLASS_P (op0) 5720 || BINARY_CLASS_P (op0) 5721 || VL_EXP_CLASS_P (op0) 5722 || EXPRESSION_CLASS_P (op0)) 5723 /* ... and has wrapping overflow, and its type is smaller 5724 than ctype, then we cannot pass through as widening. */ 5725 && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0)) 5726 && (TYPE_PRECISION (ctype) 5727 > TYPE_PRECISION (TREE_TYPE (op0)))) 5728 /* ... or this is a truncation (t is narrower than op0), 5729 then we cannot pass through this narrowing. */ 5730 || (TYPE_PRECISION (type) 5731 < TYPE_PRECISION (TREE_TYPE (op0))) 5732 /* ... or signedness changes for division or modulus, 5733 then we cannot pass through this conversion. */ 5734 || (code != MULT_EXPR 5735 && (TYPE_UNSIGNED (ctype) 5736 != TYPE_UNSIGNED (TREE_TYPE (op0)))) 5737 /* ... or has undefined overflow while the converted to 5738 type has not, we cannot do the operation in the inner type 5739 as that would introduce undefined overflow. */ 5740 || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)) 5741 && !TYPE_OVERFLOW_UNDEFINED (type)))) 5742 break; 5743 5744 /* Pass the constant down and see if we can make a simplification. If 5745 we can, replace this expression with the inner simplification for 5746 possible later conversion to our or some other type. */ 5747 if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0 5748 && TREE_CODE (t2) == INTEGER_CST 5749 && !TREE_OVERFLOW (t2) 5750 && (0 != (t1 = extract_muldiv (op0, t2, code, 5751 code == MULT_EXPR 5752 ? ctype : NULL_TREE, 5753 strict_overflow_p)))) 5754 return t1; 5755 break; 5756 5757 case ABS_EXPR: 5758 /* If widening the type changes it from signed to unsigned, then we 5759 must avoid building ABS_EXPR itself as unsigned. */ 5760 if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type)) 5761 { 5762 tree cstype = (*signed_type_for) (ctype); 5763 if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p)) 5764 != 0) 5765 { 5766 t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1)); 5767 return fold_convert (ctype, t1); 5768 } 5769 break; 5770 } 5771 /* If the constant is negative, we cannot simplify this. */ 5772 if (tree_int_cst_sgn (c) == -1) 5773 break; 5774 /* FALLTHROUGH */ 5775 case NEGATE_EXPR: 5776 /* For division and modulus, type can't be unsigned, as e.g. 5777 (-(x / 2U)) / 2U isn't equal to -((x / 2U) / 2U) for x >= 2. 5778 For signed types, even with wrapping overflow, this is fine. */ 5779 if (code != MULT_EXPR && TYPE_UNSIGNED (type)) 5780 break; 5781 if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p)) 5782 != 0) 5783 return fold_build1 (tcode, ctype, fold_convert (ctype, t1)); 5784 break; 5785 5786 case MIN_EXPR: case MAX_EXPR: 5787 /* If widening the type changes the signedness, then we can't perform 5788 this optimization as that changes the result. */ 5789 if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type)) 5790 break; 5791 5792 /* MIN (a, b) / 5 -> MIN (a / 5, b / 5) */ 5793 sub_strict_overflow_p = false; 5794 if ((t1 = extract_muldiv (op0, c, code, wide_type, 5795 &sub_strict_overflow_p)) != 0 5796 && (t2 = extract_muldiv (op1, c, code, wide_type, 5797 &sub_strict_overflow_p)) != 0) 5798 { 5799 if (tree_int_cst_sgn (c) < 0) 5800 tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR); 5801 if (sub_strict_overflow_p) 5802 *strict_overflow_p = true; 5803 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), 5804 fold_convert (ctype, t2)); 5805 } 5806 break; 5807 5808 case LSHIFT_EXPR: case RSHIFT_EXPR: 5809 /* If the second operand is constant, this is a multiplication 5810 or floor division, by a power of two, so we can treat it that 5811 way unless the multiplier or divisor overflows. Signed 5812 left-shift overflow is implementation-defined rather than 5813 undefined in C90, so do not convert signed left shift into 5814 multiplication. */ 5815 if (TREE_CODE (op1) == INTEGER_CST 5816 && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0))) 5817 /* const_binop may not detect overflow correctly, 5818 so check for it explicitly here. */ 5819 && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1) 5820 && TREE_INT_CST_HIGH (op1) == 0 5821 && 0 != (t1 = fold_convert (ctype, 5822 const_binop (LSHIFT_EXPR, 5823 size_one_node, 5824 op1))) 5825 && !TREE_OVERFLOW (t1)) 5826 return extract_muldiv (build2 (tcode == LSHIFT_EXPR 5827 ? MULT_EXPR : FLOOR_DIV_EXPR, 5828 ctype, 5829 fold_convert (ctype, op0), 5830 t1), 5831 c, code, wide_type, strict_overflow_p); 5832 break; 5833 5834 case PLUS_EXPR: case MINUS_EXPR: 5835 /* See if we can eliminate the operation on both sides. If we can, we 5836 can return a new PLUS or MINUS. If we can't, the only remaining 5837 cases where we can do anything are if the second operand is a 5838 constant. */ 5839 sub_strict_overflow_p = false; 5840 t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p); 5841 t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p); 5842 if (t1 != 0 && t2 != 0 5843 && (code == MULT_EXPR 5844 /* If not multiplication, we can only do this if both operands 5845 are divisible by c. */ 5846 || (multiple_of_p (ctype, op0, c) 5847 && multiple_of_p (ctype, op1, c)))) 5848 { 5849 if (sub_strict_overflow_p) 5850 *strict_overflow_p = true; 5851 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), 5852 fold_convert (ctype, t2)); 5853 } 5854 5855 /* If this was a subtraction, negate OP1 and set it to be an addition. 5856 This simplifies the logic below. */ 5857 if (tcode == MINUS_EXPR) 5858 { 5859 tcode = PLUS_EXPR, op1 = negate_expr (op1); 5860 /* If OP1 was not easily negatable, the constant may be OP0. */ 5861 if (TREE_CODE (op0) == INTEGER_CST) 5862 { 5863 tree tem = op0; 5864 op0 = op1; 5865 op1 = tem; 5866 tem = t1; 5867 t1 = t2; 5868 t2 = tem; 5869 } 5870 } 5871 5872 if (TREE_CODE (op1) != INTEGER_CST) 5873 break; 5874 5875 /* If either OP1 or C are negative, this optimization is not safe for 5876 some of the division and remainder types while for others we need 5877 to change the code. */ 5878 if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0) 5879 { 5880 if (code == CEIL_DIV_EXPR) 5881 code = FLOOR_DIV_EXPR; 5882 else if (code == FLOOR_DIV_EXPR) 5883 code = CEIL_DIV_EXPR; 5884 else if (code != MULT_EXPR 5885 && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR) 5886 break; 5887 } 5888 5889 /* If it's a multiply or a division/modulus operation of a multiple 5890 of our constant, do the operation and verify it doesn't overflow. */ 5891 if (code == MULT_EXPR 5892 || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c))) 5893 { 5894 op1 = const_binop (code, fold_convert (ctype, op1), 5895 fold_convert (ctype, c)); 5896 /* We allow the constant to overflow with wrapping semantics. */ 5897 if (op1 == 0 5898 || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype))) 5899 break; 5900 } 5901 else 5902 break; 5903 5904 /* If we have an unsigned type, we cannot widen the operation since it 5905 will change the result if the original computation overflowed. */ 5906 if (TYPE_UNSIGNED (ctype) && ctype != type) 5907 break; 5908 5909 /* If we were able to eliminate our operation from the first side, 5910 apply our operation to the second side and reform the PLUS. */ 5911 if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR)) 5912 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1); 5913 5914 /* The last case is if we are a multiply. In that case, we can 5915 apply the distributive law to commute the multiply and addition 5916 if the multiplication of the constants doesn't overflow 5917 and overflow is defined. With undefined overflow 5918 op0 * c might overflow, while (op0 + orig_op1) * c doesn't. */ 5919 if (code == MULT_EXPR && TYPE_OVERFLOW_WRAPS (ctype)) 5920 return fold_build2 (tcode, ctype, 5921 fold_build2 (code, ctype, 5922 fold_convert (ctype, op0), 5923 fold_convert (ctype, c)), 5924 op1); 5925 5926 break; 5927 5928 case MULT_EXPR: 5929 /* We have a special case here if we are doing something like 5930 (C * 8) % 4 since we know that's zero. */ 5931 if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR 5932 || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR) 5933 /* If the multiplication can overflow we cannot optimize this. */ 5934 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)) 5935 && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST 5936 && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c))) 5937 { 5938 *strict_overflow_p = true; 5939 return omit_one_operand (type, integer_zero_node, op0); 5940 } 5941 5942 /* ... fall through ... */ 5943 5944 case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: 5945 case ROUND_DIV_EXPR: case EXACT_DIV_EXPR: 5946 /* If we can extract our operation from the LHS, do so and return a 5947 new operation. Likewise for the RHS from a MULT_EXPR. Otherwise, 5948 do something only if the second operand is a constant. */ 5949 if (same_p 5950 && (t1 = extract_muldiv (op0, c, code, wide_type, 5951 strict_overflow_p)) != 0) 5952 return fold_build2 (tcode, ctype, fold_convert (ctype, t1), 5953 fold_convert (ctype, op1)); 5954 else if (tcode == MULT_EXPR && code == MULT_EXPR 5955 && (t1 = extract_muldiv (op1, c, code, wide_type, 5956 strict_overflow_p)) != 0) 5957 return fold_build2 (tcode, ctype, fold_convert (ctype, op0), 5958 fold_convert (ctype, t1)); 5959 else if (TREE_CODE (op1) != INTEGER_CST) 5960 return 0; 5961 5962 /* If these are the same operation types, we can associate them 5963 assuming no overflow. */ 5964 if (tcode == code) 5965 { 5966 double_int mul; 5967 bool overflow_p; 5968 unsigned prec = TYPE_PRECISION (ctype); 5969 bool uns = TYPE_UNSIGNED (ctype); 5970 double_int diop1 = tree_to_double_int (op1).ext (prec, uns); 5971 double_int dic = tree_to_double_int (c).ext (prec, uns); 5972 mul = diop1.mul_with_sign (dic, false, &overflow_p); 5973 overflow_p = ((!uns && overflow_p) 5974 | TREE_OVERFLOW (c) | TREE_OVERFLOW (op1)); 5975 if (!double_int_fits_to_tree_p (ctype, mul) 5976 && ((uns && tcode != MULT_EXPR) || !uns)) 5977 overflow_p = 1; 5978 if (!overflow_p) 5979 return fold_build2 (tcode, ctype, fold_convert (ctype, op0), 5980 double_int_to_tree (ctype, mul)); 5981 } 5982 5983 /* If these operations "cancel" each other, we have the main 5984 optimizations of this pass, which occur when either constant is a 5985 multiple of the other, in which case we replace this with either an 5986 operation or CODE or TCODE. 5987 5988 If we have an unsigned type, we cannot do this since it will change 5989 the result if the original computation overflowed. */ 5990 if (TYPE_OVERFLOW_UNDEFINED (ctype) 5991 && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR) 5992 || (tcode == MULT_EXPR 5993 && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR 5994 && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR 5995 && code != MULT_EXPR))) 5996 { 5997 if (integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c))) 5998 { 5999 if (TYPE_OVERFLOW_UNDEFINED (ctype)) 6000 *strict_overflow_p = true; 6001 return fold_build2 (tcode, ctype, fold_convert (ctype, op0), 6002 fold_convert (ctype, 6003 const_binop (TRUNC_DIV_EXPR, 6004 op1, c))); 6005 } 6006 else if (integer_zerop (const_binop (TRUNC_MOD_EXPR, c, op1))) 6007 { 6008 if (TYPE_OVERFLOW_UNDEFINED (ctype)) 6009 *strict_overflow_p = true; 6010 return fold_build2 (code, ctype, fold_convert (ctype, op0), 6011 fold_convert (ctype, 6012 const_binop (TRUNC_DIV_EXPR, 6013 c, op1))); 6014 } 6015 } 6016 break; 6017 6018 default: 6019 break; 6020 } 6021 6022 return 0; 6023} 6024 6025/* Return a node which has the indicated constant VALUE (either 0 or 6026 1 for scalars or {-1,-1,..} or {0,0,...} for vectors), 6027 and is of the indicated TYPE. */ 6028 6029tree 6030constant_boolean_node (bool value, tree type) 6031{ 6032 if (type == integer_type_node) 6033 return value ? integer_one_node : integer_zero_node; 6034 else if (type == boolean_type_node) 6035 return value ? boolean_true_node : boolean_false_node; 6036 else if (TREE_CODE (type) == VECTOR_TYPE) 6037 return build_vector_from_val (type, 6038 build_int_cst (TREE_TYPE (type), 6039 value ? -1 : 0)); 6040 else 6041 return fold_convert (type, value ? integer_one_node : integer_zero_node); 6042} 6043 6044 6045/* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'. 6046 Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'. Here 6047 CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)' 6048 expression, and ARG to `a'. If COND_FIRST_P is nonzero, then the 6049 COND is the first argument to CODE; otherwise (as in the example 6050 given here), it is the second argument. TYPE is the type of the 6051 original expression. Return NULL_TREE if no simplification is 6052 possible. */ 6053 6054static tree 6055fold_binary_op_with_conditional_arg (location_t loc, 6056 enum tree_code code, 6057 tree type, tree op0, tree op1, 6058 tree cond, tree arg, int cond_first_p) 6059{ 6060 tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1); 6061 tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0); 6062 tree test, true_value, false_value; 6063 tree lhs = NULL_TREE; 6064 tree rhs = NULL_TREE; 6065 enum tree_code cond_code = COND_EXPR; 6066 6067 if (TREE_CODE (cond) == COND_EXPR 6068 || TREE_CODE (cond) == VEC_COND_EXPR) 6069 { 6070 test = TREE_OPERAND (cond, 0); 6071 true_value = TREE_OPERAND (cond, 1); 6072 false_value = TREE_OPERAND (cond, 2); 6073 /* If this operand throws an expression, then it does not make 6074 sense to try to perform a logical or arithmetic operation 6075 involving it. */ 6076 if (VOID_TYPE_P (TREE_TYPE (true_value))) 6077 lhs = true_value; 6078 if (VOID_TYPE_P (TREE_TYPE (false_value))) 6079 rhs = false_value; 6080 } 6081 else 6082 { 6083 tree testtype = TREE_TYPE (cond); 6084 test = cond; 6085 true_value = constant_boolean_node (true, testtype); 6086 false_value = constant_boolean_node (false, testtype); 6087 } 6088 6089 if (TREE_CODE (TREE_TYPE (test)) == VECTOR_TYPE) 6090 cond_code = VEC_COND_EXPR; 6091 6092 /* This transformation is only worthwhile if we don't have to wrap ARG 6093 in a SAVE_EXPR and the operation can be simplified without recursing 6094 on at least one of the branches once its pushed inside the COND_EXPR. */ 6095 if (!TREE_CONSTANT (arg) 6096 && (TREE_SIDE_EFFECTS (arg) 6097 || TREE_CODE (arg) == COND_EXPR || TREE_CODE (arg) == VEC_COND_EXPR 6098 || TREE_CONSTANT (true_value) || TREE_CONSTANT (false_value))) 6099 return NULL_TREE; 6100 6101 arg = fold_convert_loc (loc, arg_type, arg); 6102 if (lhs == 0) 6103 { 6104 true_value = fold_convert_loc (loc, cond_type, true_value); 6105 if (cond_first_p) 6106 lhs = fold_build2_loc (loc, code, type, true_value, arg); 6107 else 6108 lhs = fold_build2_loc (loc, code, type, arg, true_value); 6109 } 6110 if (rhs == 0) 6111 { 6112 false_value = fold_convert_loc (loc, cond_type, false_value); 6113 if (cond_first_p) 6114 rhs = fold_build2_loc (loc, code, type, false_value, arg); 6115 else 6116 rhs = fold_build2_loc (loc, code, type, arg, false_value); 6117 } 6118 6119 /* Check that we have simplified at least one of the branches. */ 6120 if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs)) 6121 return NULL_TREE; 6122 6123 return fold_build3_loc (loc, cond_code, type, test, lhs, rhs); 6124} 6125 6126 6127/* Subroutine of fold() that checks for the addition of +/- 0.0. 6128 6129 If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type 6130 TYPE, X + ADDEND is the same as X. If NEGATE, return true if X - 6131 ADDEND is the same as X. 6132 6133 X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero 6134 and finite. The problematic cases are when X is zero, and its mode 6135 has signed zeros. In the case of rounding towards -infinity, 6136 X - 0 is not the same as X because 0 - 0 is -0. In other rounding 6137 modes, X + 0 is not the same as X because -0 + 0 is 0. */ 6138 6139bool 6140fold_real_zero_addition_p (const_tree type, const_tree addend, int negate) 6141{ 6142 if (!real_zerop (addend)) 6143 return false; 6144 6145 /* Don't allow the fold with -fsignaling-nans. */ 6146 if (HONOR_SNANS (TYPE_MODE (type))) 6147 return false; 6148 6149 /* Allow the fold if zeros aren't signed, or their sign isn't important. */ 6150 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))) 6151 return true; 6152 6153 /* Treat x + -0 as x - 0 and x - -0 as x + 0. */ 6154 if (TREE_CODE (addend) == REAL_CST 6155 && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend))) 6156 negate = !negate; 6157 6158 /* The mode has signed zeros, and we have to honor their sign. 6159 In this situation, there is only one case we can return true for. 6160 X - 0 is the same as X unless rounding towards -infinity is 6161 supported. */ 6162 return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)); 6163} 6164 6165/* Subroutine of fold() that checks comparisons of built-in math 6166 functions against real constants. 6167 6168 FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison 6169 operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR. TYPE 6170 is the type of the result and ARG0 and ARG1 are the operands of the 6171 comparison. ARG1 must be a TREE_REAL_CST. 6172 6173 The function returns the constant folded tree if a simplification 6174 can be made, and NULL_TREE otherwise. */ 6175 6176static tree 6177fold_mathfn_compare (location_t loc, 6178 enum built_in_function fcode, enum tree_code code, 6179 tree type, tree arg0, tree arg1) 6180{ 6181 REAL_VALUE_TYPE c; 6182 6183 if (BUILTIN_SQRT_P (fcode)) 6184 { 6185 tree arg = CALL_EXPR_ARG (arg0, 0); 6186 enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg0)); 6187 6188 c = TREE_REAL_CST (arg1); 6189 if (REAL_VALUE_NEGATIVE (c)) 6190 { 6191 /* sqrt(x) < y is always false, if y is negative. */ 6192 if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR) 6193 return omit_one_operand_loc (loc, type, integer_zero_node, arg); 6194 6195 /* sqrt(x) > y is always true, if y is negative and we 6196 don't care about NaNs, i.e. negative values of x. */ 6197 if (code == NE_EXPR || !HONOR_NANS (mode)) 6198 return omit_one_operand_loc (loc, type, integer_one_node, arg); 6199 6200 /* sqrt(x) > y is the same as x >= 0, if y is negative. */ 6201 return fold_build2_loc (loc, GE_EXPR, type, arg, 6202 build_real (TREE_TYPE (arg), dconst0)); 6203 } 6204 else if (code == GT_EXPR || code == GE_EXPR) 6205 { 6206 REAL_VALUE_TYPE c2; 6207 6208 REAL_ARITHMETIC (c2, MULT_EXPR, c, c); 6209 real_convert (&c2, mode, &c2); 6210 6211 if (REAL_VALUE_ISINF (c2)) 6212 { 6213 /* sqrt(x) > y is x == +Inf, when y is very large. */ 6214 if (HONOR_INFINITIES (mode)) 6215 return fold_build2_loc (loc, EQ_EXPR, type, arg, 6216 build_real (TREE_TYPE (arg), c2)); 6217 6218 /* sqrt(x) > y is always false, when y is very large 6219 and we don't care about infinities. */ 6220 return omit_one_operand_loc (loc, type, integer_zero_node, arg); 6221 } 6222 6223 /* sqrt(x) > c is the same as x > c*c. */ 6224 return fold_build2_loc (loc, code, type, arg, 6225 build_real (TREE_TYPE (arg), c2)); 6226 } 6227 else if (code == LT_EXPR || code == LE_EXPR) 6228 { 6229 REAL_VALUE_TYPE c2; 6230 6231 REAL_ARITHMETIC (c2, MULT_EXPR, c, c); 6232 real_convert (&c2, mode, &c2); 6233 6234 if (REAL_VALUE_ISINF (c2)) 6235 { 6236 /* sqrt(x) < y is always true, when y is a very large 6237 value and we don't care about NaNs or Infinities. */ 6238 if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode)) 6239 return omit_one_operand_loc (loc, type, integer_one_node, arg); 6240 6241 /* sqrt(x) < y is x != +Inf when y is very large and we 6242 don't care about NaNs. */ 6243 if (! HONOR_NANS (mode)) 6244 return fold_build2_loc (loc, NE_EXPR, type, arg, 6245 build_real (TREE_TYPE (arg), c2)); 6246 6247 /* sqrt(x) < y is x >= 0 when y is very large and we 6248 don't care about Infinities. */ 6249 if (! HONOR_INFINITIES (mode)) 6250 return fold_build2_loc (loc, GE_EXPR, type, arg, 6251 build_real (TREE_TYPE (arg), dconst0)); 6252 6253 /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */ 6254 arg = save_expr (arg); 6255 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type, 6256 fold_build2_loc (loc, GE_EXPR, type, arg, 6257 build_real (TREE_TYPE (arg), 6258 dconst0)), 6259 fold_build2_loc (loc, NE_EXPR, type, arg, 6260 build_real (TREE_TYPE (arg), 6261 c2))); 6262 } 6263 6264 /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */ 6265 if (! HONOR_NANS (mode)) 6266 return fold_build2_loc (loc, code, type, arg, 6267 build_real (TREE_TYPE (arg), c2)); 6268 6269 /* sqrt(x) < c is the same as x >= 0 && x < c*c. */ 6270 arg = save_expr (arg); 6271 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type, 6272 fold_build2_loc (loc, GE_EXPR, type, arg, 6273 build_real (TREE_TYPE (arg), 6274 dconst0)), 6275 fold_build2_loc (loc, code, type, arg, 6276 build_real (TREE_TYPE (arg), 6277 c2))); 6278 } 6279 } 6280 6281 return NULL_TREE; 6282} 6283 6284/* Subroutine of fold() that optimizes comparisons against Infinities, 6285 either +Inf or -Inf. 6286 6287 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, 6288 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1 6289 are the operands of the comparison. ARG1 must be a TREE_REAL_CST. 6290 6291 The function returns the constant folded tree if a simplification 6292 can be made, and NULL_TREE otherwise. */ 6293 6294static tree 6295fold_inf_compare (location_t loc, enum tree_code code, tree type, 6296 tree arg0, tree arg1) 6297{ 6298 enum machine_mode mode; 6299 REAL_VALUE_TYPE max; 6300 tree temp; 6301 bool neg; 6302 6303 mode = TYPE_MODE (TREE_TYPE (arg0)); 6304 6305 /* For negative infinity swap the sense of the comparison. */ 6306 neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)); 6307 if (neg) 6308 code = swap_tree_comparison (code); 6309 6310 switch (code) 6311 { 6312 case GT_EXPR: 6313 /* x > +Inf is always false, if with ignore sNANs. */ 6314 if (HONOR_SNANS (mode)) 6315 return NULL_TREE; 6316 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 6317 6318 case LE_EXPR: 6319 /* x <= +Inf is always true, if we don't case about NaNs. */ 6320 if (! HONOR_NANS (mode)) 6321 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 6322 6323 /* x <= +Inf is the same as x == x, i.e. isfinite(x). */ 6324 arg0 = save_expr (arg0); 6325 return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0); 6326 6327 case EQ_EXPR: 6328 case GE_EXPR: 6329 /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX. */ 6330 real_maxval (&max, neg, mode); 6331 return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type, 6332 arg0, build_real (TREE_TYPE (arg0), max)); 6333 6334 case LT_EXPR: 6335 /* x < +Inf is always equal to x <= DBL_MAX. */ 6336 real_maxval (&max, neg, mode); 6337 return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type, 6338 arg0, build_real (TREE_TYPE (arg0), max)); 6339 6340 case NE_EXPR: 6341 /* x != +Inf is always equal to !(x > DBL_MAX). */ 6342 real_maxval (&max, neg, mode); 6343 if (! HONOR_NANS (mode)) 6344 return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type, 6345 arg0, build_real (TREE_TYPE (arg0), max)); 6346 6347 temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type, 6348 arg0, build_real (TREE_TYPE (arg0), max)); 6349 return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp); 6350 6351 default: 6352 break; 6353 } 6354 6355 return NULL_TREE; 6356} 6357 6358/* Subroutine of fold() that optimizes comparisons of a division by 6359 a nonzero integer constant against an integer constant, i.e. 6360 X/C1 op C2. 6361 6362 CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, 6363 GE_EXPR or LE_EXPR. TYPE is the type of the result and ARG0 and ARG1 6364 are the operands of the comparison. ARG1 must be a TREE_REAL_CST. 6365 6366 The function returns the constant folded tree if a simplification 6367 can be made, and NULL_TREE otherwise. */ 6368 6369static tree 6370fold_div_compare (location_t loc, 6371 enum tree_code code, tree type, tree arg0, tree arg1) 6372{ 6373 tree prod, tmp, hi, lo; 6374 tree arg00 = TREE_OPERAND (arg0, 0); 6375 tree arg01 = TREE_OPERAND (arg0, 1); 6376 double_int val; 6377 bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (arg0)); 6378 bool neg_overflow; 6379 bool overflow; 6380 6381 /* We have to do this the hard way to detect unsigned overflow. 6382 prod = int_const_binop (MULT_EXPR, arg01, arg1); */ 6383 val = TREE_INT_CST (arg01) 6384 .mul_with_sign (TREE_INT_CST (arg1), unsigned_p, &overflow); 6385 prod = force_fit_type_double (TREE_TYPE (arg00), val, -1, overflow); 6386 neg_overflow = false; 6387 6388 if (unsigned_p) 6389 { 6390 tmp = int_const_binop (MINUS_EXPR, arg01, 6391 build_int_cst (TREE_TYPE (arg01), 1)); 6392 lo = prod; 6393 6394 /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp). */ 6395 val = TREE_INT_CST (prod) 6396 .add_with_sign (TREE_INT_CST (tmp), unsigned_p, &overflow); 6397 hi = force_fit_type_double (TREE_TYPE (arg00), val, 6398 -1, overflow | TREE_OVERFLOW (prod)); 6399 } 6400 else if (tree_int_cst_sgn (arg01) >= 0) 6401 { 6402 tmp = int_const_binop (MINUS_EXPR, arg01, 6403 build_int_cst (TREE_TYPE (arg01), 1)); 6404 switch (tree_int_cst_sgn (arg1)) 6405 { 6406 case -1: 6407 neg_overflow = true; 6408 lo = int_const_binop (MINUS_EXPR, prod, tmp); 6409 hi = prod; 6410 break; 6411 6412 case 0: 6413 lo = fold_negate_const (tmp, TREE_TYPE (arg0)); 6414 hi = tmp; 6415 break; 6416 6417 case 1: 6418 hi = int_const_binop (PLUS_EXPR, prod, tmp); 6419 lo = prod; 6420 break; 6421 6422 default: 6423 gcc_unreachable (); 6424 } 6425 } 6426 else 6427 { 6428 /* A negative divisor reverses the relational operators. */ 6429 code = swap_tree_comparison (code); 6430 6431 tmp = int_const_binop (PLUS_EXPR, arg01, 6432 build_int_cst (TREE_TYPE (arg01), 1)); 6433 switch (tree_int_cst_sgn (arg1)) 6434 { 6435 case -1: 6436 hi = int_const_binop (MINUS_EXPR, prod, tmp); 6437 lo = prod; 6438 break; 6439 6440 case 0: 6441 hi = fold_negate_const (tmp, TREE_TYPE (arg0)); 6442 lo = tmp; 6443 break; 6444 6445 case 1: 6446 neg_overflow = true; 6447 lo = int_const_binop (PLUS_EXPR, prod, tmp); 6448 hi = prod; 6449 break; 6450 6451 default: 6452 gcc_unreachable (); 6453 } 6454 } 6455 6456 switch (code) 6457 { 6458 case EQ_EXPR: 6459 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi)) 6460 return omit_one_operand_loc (loc, type, integer_zero_node, arg00); 6461 if (TREE_OVERFLOW (hi)) 6462 return fold_build2_loc (loc, GE_EXPR, type, arg00, lo); 6463 if (TREE_OVERFLOW (lo)) 6464 return fold_build2_loc (loc, LE_EXPR, type, arg00, hi); 6465 return build_range_check (loc, type, arg00, 1, lo, hi); 6466 6467 case NE_EXPR: 6468 if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi)) 6469 return omit_one_operand_loc (loc, type, integer_one_node, arg00); 6470 if (TREE_OVERFLOW (hi)) 6471 return fold_build2_loc (loc, LT_EXPR, type, arg00, lo); 6472 if (TREE_OVERFLOW (lo)) 6473 return fold_build2_loc (loc, GT_EXPR, type, arg00, hi); 6474 return build_range_check (loc, type, arg00, 0, lo, hi); 6475 6476 case LT_EXPR: 6477 if (TREE_OVERFLOW (lo)) 6478 { 6479 tmp = neg_overflow ? integer_zero_node : integer_one_node; 6480 return omit_one_operand_loc (loc, type, tmp, arg00); 6481 } 6482 return fold_build2_loc (loc, LT_EXPR, type, arg00, lo); 6483 6484 case LE_EXPR: 6485 if (TREE_OVERFLOW (hi)) 6486 { 6487 tmp = neg_overflow ? integer_zero_node : integer_one_node; 6488 return omit_one_operand_loc (loc, type, tmp, arg00); 6489 } 6490 return fold_build2_loc (loc, LE_EXPR, type, arg00, hi); 6491 6492 case GT_EXPR: 6493 if (TREE_OVERFLOW (hi)) 6494 { 6495 tmp = neg_overflow ? integer_one_node : integer_zero_node; 6496 return omit_one_operand_loc (loc, type, tmp, arg00); 6497 } 6498 return fold_build2_loc (loc, GT_EXPR, type, arg00, hi); 6499 6500 case GE_EXPR: 6501 if (TREE_OVERFLOW (lo)) 6502 { 6503 tmp = neg_overflow ? integer_one_node : integer_zero_node; 6504 return omit_one_operand_loc (loc, type, tmp, arg00); 6505 } 6506 return fold_build2_loc (loc, GE_EXPR, type, arg00, lo); 6507 6508 default: 6509 break; 6510 } 6511 6512 return NULL_TREE; 6513} 6514 6515 6516/* If CODE with arguments ARG0 and ARG1 represents a single bit 6517 equality/inequality test, then return a simplified form of the test 6518 using a sign testing. Otherwise return NULL. TYPE is the desired 6519 result type. */ 6520 6521static tree 6522fold_single_bit_test_into_sign_test (location_t loc, 6523 enum tree_code code, tree arg0, tree arg1, 6524 tree result_type) 6525{ 6526 /* If this is testing a single bit, we can optimize the test. */ 6527 if ((code == NE_EXPR || code == EQ_EXPR) 6528 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1) 6529 && integer_pow2p (TREE_OPERAND (arg0, 1))) 6530 { 6531 /* If we have (A & C) != 0 where C is the sign bit of A, convert 6532 this into A < 0. Similarly for (A & C) == 0 into A >= 0. */ 6533 tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1)); 6534 6535 if (arg00 != NULL_TREE 6536 /* This is only a win if casting to a signed type is cheap, 6537 i.e. when arg00's type is not a partial mode. */ 6538 && TYPE_PRECISION (TREE_TYPE (arg00)) 6539 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg00)))) 6540 { 6541 tree stype = signed_type_for (TREE_TYPE (arg00)); 6542 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, 6543 result_type, 6544 fold_convert_loc (loc, stype, arg00), 6545 build_int_cst (stype, 0)); 6546 } 6547 } 6548 6549 return NULL_TREE; 6550} 6551 6552/* If CODE with arguments ARG0 and ARG1 represents a single bit 6553 equality/inequality test, then return a simplified form of 6554 the test using shifts and logical operations. Otherwise return 6555 NULL. TYPE is the desired result type. */ 6556 6557tree 6558fold_single_bit_test (location_t loc, enum tree_code code, 6559 tree arg0, tree arg1, tree result_type) 6560{ 6561 /* If this is testing a single bit, we can optimize the test. */ 6562 if ((code == NE_EXPR || code == EQ_EXPR) 6563 && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1) 6564 && integer_pow2p (TREE_OPERAND (arg0, 1))) 6565 { 6566 tree inner = TREE_OPERAND (arg0, 0); 6567 tree type = TREE_TYPE (arg0); 6568 int bitnum = tree_log2 (TREE_OPERAND (arg0, 1)); 6569 enum machine_mode operand_mode = TYPE_MODE (type); 6570 int ops_unsigned; 6571 tree signed_type, unsigned_type, intermediate_type; 6572 tree tem, one; 6573 6574 /* First, see if we can fold the single bit test into a sign-bit 6575 test. */ 6576 tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, 6577 result_type); 6578 if (tem) 6579 return tem; 6580 6581 /* Otherwise we have (A & C) != 0 where C is a single bit, 6582 convert that into ((A >> C2) & 1). Where C2 = log2(C). 6583 Similarly for (A & C) == 0. */ 6584 6585 /* If INNER is a right shift of a constant and it plus BITNUM does 6586 not overflow, adjust BITNUM and INNER. */ 6587 if (TREE_CODE (inner) == RSHIFT_EXPR 6588 && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST 6589 && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0 6590 && bitnum < TYPE_PRECISION (type) 6591 && 0 > compare_tree_int (TREE_OPERAND (inner, 1), 6592 bitnum - TYPE_PRECISION (type))) 6593 { 6594 bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1)); 6595 inner = TREE_OPERAND (inner, 0); 6596 } 6597 6598 /* If we are going to be able to omit the AND below, we must do our 6599 operations as unsigned. If we must use the AND, we have a choice. 6600 Normally unsigned is faster, but for some machines signed is. */ 6601#ifdef LOAD_EXTEND_OP 6602 ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND 6603 && !flag_syntax_only) ? 0 : 1; 6604#else 6605 ops_unsigned = 1; 6606#endif 6607 6608 signed_type = lang_hooks.types.type_for_mode (operand_mode, 0); 6609 unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1); 6610 intermediate_type = ops_unsigned ? unsigned_type : signed_type; 6611 inner = fold_convert_loc (loc, intermediate_type, inner); 6612 6613 if (bitnum != 0) 6614 inner = build2 (RSHIFT_EXPR, intermediate_type, 6615 inner, size_int (bitnum)); 6616 6617 one = build_int_cst (intermediate_type, 1); 6618 6619 if (code == EQ_EXPR) 6620 inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one); 6621 6622 /* Put the AND last so it can combine with more things. */ 6623 inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one); 6624 6625 /* Make sure to return the proper type. */ 6626 inner = fold_convert_loc (loc, result_type, inner); 6627 6628 return inner; 6629 } 6630 return NULL_TREE; 6631} 6632 6633/* Check whether we are allowed to reorder operands arg0 and arg1, 6634 such that the evaluation of arg1 occurs before arg0. */ 6635 6636static bool 6637reorder_operands_p (const_tree arg0, const_tree arg1) 6638{ 6639 if (! flag_evaluation_order) 6640 return true; 6641 if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1)) 6642 return true; 6643 return ! TREE_SIDE_EFFECTS (arg0) 6644 && ! TREE_SIDE_EFFECTS (arg1); 6645} 6646 6647/* Test whether it is preferable two swap two operands, ARG0 and 6648 ARG1, for example because ARG0 is an integer constant and ARG1 6649 isn't. If REORDER is true, only recommend swapping if we can 6650 evaluate the operands in reverse order. */ 6651 6652bool 6653tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder) 6654{ 6655 STRIP_SIGN_NOPS (arg0); 6656 STRIP_SIGN_NOPS (arg1); 6657 6658 if (TREE_CODE (arg1) == INTEGER_CST) 6659 return 0; 6660 if (TREE_CODE (arg0) == INTEGER_CST) 6661 return 1; 6662 6663 if (TREE_CODE (arg1) == REAL_CST) 6664 return 0; 6665 if (TREE_CODE (arg0) == REAL_CST) 6666 return 1; 6667 6668 if (TREE_CODE (arg1) == FIXED_CST) 6669 return 0; 6670 if (TREE_CODE (arg0) == FIXED_CST) 6671 return 1; 6672 6673 if (TREE_CODE (arg1) == COMPLEX_CST) 6674 return 0; 6675 if (TREE_CODE (arg0) == COMPLEX_CST) 6676 return 1; 6677 6678 if (TREE_CONSTANT (arg1)) 6679 return 0; 6680 if (TREE_CONSTANT (arg0)) 6681 return 1; 6682 6683 if (optimize_function_for_size_p (cfun)) 6684 return 0; 6685 6686 if (reorder && flag_evaluation_order 6687 && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))) 6688 return 0; 6689 6690 /* It is preferable to swap two SSA_NAME to ensure a canonical form 6691 for commutative and comparison operators. Ensuring a canonical 6692 form allows the optimizers to find additional redundancies without 6693 having to explicitly check for both orderings. */ 6694 if (TREE_CODE (arg0) == SSA_NAME 6695 && TREE_CODE (arg1) == SSA_NAME 6696 && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1)) 6697 return 1; 6698 6699 /* Put SSA_NAMEs last. */ 6700 if (TREE_CODE (arg1) == SSA_NAME) 6701 return 0; 6702 if (TREE_CODE (arg0) == SSA_NAME) 6703 return 1; 6704 6705 /* Put variables last. */ 6706 if (DECL_P (arg1)) 6707 return 0; 6708 if (DECL_P (arg0)) 6709 return 1; 6710 6711 return 0; 6712} 6713 6714/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where 6715 ARG0 is extended to a wider type. */ 6716 6717static tree 6718fold_widened_comparison (location_t loc, enum tree_code code, 6719 tree type, tree arg0, tree arg1) 6720{ 6721 tree arg0_unw = get_unwidened (arg0, NULL_TREE); 6722 tree arg1_unw; 6723 tree shorter_type, outer_type; 6724 tree min, max; 6725 bool above, below; 6726 6727 if (arg0_unw == arg0) 6728 return NULL_TREE; 6729 shorter_type = TREE_TYPE (arg0_unw); 6730 6731#ifdef HAVE_canonicalize_funcptr_for_compare 6732 /* Disable this optimization if we're casting a function pointer 6733 type on targets that require function pointer canonicalization. */ 6734 if (HAVE_canonicalize_funcptr_for_compare 6735 && TREE_CODE (shorter_type) == POINTER_TYPE 6736 && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE) 6737 return NULL_TREE; 6738#endif 6739 6740 if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type)) 6741 return NULL_TREE; 6742 6743 arg1_unw = get_unwidened (arg1, NULL_TREE); 6744 6745 /* If possible, express the comparison in the shorter mode. */ 6746 if ((code == EQ_EXPR || code == NE_EXPR 6747 || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type)) 6748 && (TREE_TYPE (arg1_unw) == shorter_type 6749 || ((TYPE_PRECISION (shorter_type) 6750 >= TYPE_PRECISION (TREE_TYPE (arg1_unw))) 6751 && (TYPE_UNSIGNED (shorter_type) 6752 == TYPE_UNSIGNED (TREE_TYPE (arg1_unw)))) 6753 || (TREE_CODE (arg1_unw) == INTEGER_CST 6754 && (TREE_CODE (shorter_type) == INTEGER_TYPE 6755 || TREE_CODE (shorter_type) == BOOLEAN_TYPE) 6756 && int_fits_type_p (arg1_unw, shorter_type)))) 6757 return fold_build2_loc (loc, code, type, arg0_unw, 6758 fold_convert_loc (loc, shorter_type, arg1_unw)); 6759 6760 if (TREE_CODE (arg1_unw) != INTEGER_CST 6761 || TREE_CODE (shorter_type) != INTEGER_TYPE 6762 || !int_fits_type_p (arg1_unw, shorter_type)) 6763 return NULL_TREE; 6764 6765 /* If we are comparing with the integer that does not fit into the range 6766 of the shorter type, the result is known. */ 6767 outer_type = TREE_TYPE (arg1_unw); 6768 min = lower_bound_in_type (outer_type, shorter_type); 6769 max = upper_bound_in_type (outer_type, shorter_type); 6770 6771 above = integer_nonzerop (fold_relational_const (LT_EXPR, type, 6772 max, arg1_unw)); 6773 below = integer_nonzerop (fold_relational_const (LT_EXPR, type, 6774 arg1_unw, min)); 6775 6776 switch (code) 6777 { 6778 case EQ_EXPR: 6779 if (above || below) 6780 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 6781 break; 6782 6783 case NE_EXPR: 6784 if (above || below) 6785 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 6786 break; 6787 6788 case LT_EXPR: 6789 case LE_EXPR: 6790 if (above) 6791 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 6792 else if (below) 6793 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 6794 6795 case GT_EXPR: 6796 case GE_EXPR: 6797 if (above) 6798 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 6799 else if (below) 6800 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 6801 6802 default: 6803 break; 6804 } 6805 6806 return NULL_TREE; 6807} 6808 6809/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for 6810 ARG0 just the signedness is changed. */ 6811 6812static tree 6813fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type, 6814 tree arg0, tree arg1) 6815{ 6816 tree arg0_inner; 6817 tree inner_type, outer_type; 6818 6819 if (!CONVERT_EXPR_P (arg0)) 6820 return NULL_TREE; 6821 6822 outer_type = TREE_TYPE (arg0); 6823 arg0_inner = TREE_OPERAND (arg0, 0); 6824 inner_type = TREE_TYPE (arg0_inner); 6825 6826#ifdef HAVE_canonicalize_funcptr_for_compare 6827 /* Disable this optimization if we're casting a function pointer 6828 type on targets that require function pointer canonicalization. */ 6829 if (HAVE_canonicalize_funcptr_for_compare 6830 && TREE_CODE (inner_type) == POINTER_TYPE 6831 && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE) 6832 return NULL_TREE; 6833#endif 6834 6835 if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type)) 6836 return NULL_TREE; 6837 6838 if (TREE_CODE (arg1) != INTEGER_CST 6839 && !(CONVERT_EXPR_P (arg1) 6840 && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type)) 6841 return NULL_TREE; 6842 6843 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type) 6844 && code != NE_EXPR 6845 && code != EQ_EXPR) 6846 return NULL_TREE; 6847 6848 if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type)) 6849 return NULL_TREE; 6850 6851 if (TREE_CODE (arg1) == INTEGER_CST) 6852 arg1 = force_fit_type_double (inner_type, tree_to_double_int (arg1), 6853 0, TREE_OVERFLOW (arg1)); 6854 else 6855 arg1 = fold_convert_loc (loc, inner_type, arg1); 6856 6857 return fold_build2_loc (loc, code, type, arg0_inner, arg1); 6858} 6859 6860/* Tries to replace &a[idx] p+ s * delta with &a[idx + delta], if s is 6861 step of the array. Reconstructs s and delta in the case of s * 6862 delta being an integer constant (and thus already folded). ADDR is 6863 the address. MULT is the multiplicative expression. If the 6864 function succeeds, the new address expression is returned. 6865 Otherwise NULL_TREE is returned. LOC is the location of the 6866 resulting expression. */ 6867 6868static tree 6869try_move_mult_to_index (location_t loc, tree addr, tree op1) 6870{ 6871 tree s, delta, step; 6872 tree ref = TREE_OPERAND (addr, 0), pref; 6873 tree ret, pos; 6874 tree itype; 6875 bool mdim = false; 6876 6877 /* Strip the nops that might be added when converting op1 to sizetype. */ 6878 STRIP_NOPS (op1); 6879 6880 /* Canonicalize op1 into a possibly non-constant delta 6881 and an INTEGER_CST s. */ 6882 if (TREE_CODE (op1) == MULT_EXPR) 6883 { 6884 tree arg0 = TREE_OPERAND (op1, 0), arg1 = TREE_OPERAND (op1, 1); 6885 6886 STRIP_NOPS (arg0); 6887 STRIP_NOPS (arg1); 6888 6889 if (TREE_CODE (arg0) == INTEGER_CST) 6890 { 6891 s = arg0; 6892 delta = arg1; 6893 } 6894 else if (TREE_CODE (arg1) == INTEGER_CST) 6895 { 6896 s = arg1; 6897 delta = arg0; 6898 } 6899 else 6900 return NULL_TREE; 6901 } 6902 else if (TREE_CODE (op1) == INTEGER_CST) 6903 { 6904 delta = op1; 6905 s = NULL_TREE; 6906 } 6907 else 6908 { 6909 /* Simulate we are delta * 1. */ 6910 delta = op1; 6911 s = integer_one_node; 6912 } 6913 6914 /* Handle &x.array the same as we would handle &x.array[0]. */ 6915 if (TREE_CODE (ref) == COMPONENT_REF 6916 && TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE) 6917 { 6918 tree domain; 6919 6920 /* Remember if this was a multi-dimensional array. */ 6921 if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF) 6922 mdim = true; 6923 6924 domain = TYPE_DOMAIN (TREE_TYPE (ref)); 6925 if (! domain) 6926 goto cont; 6927 itype = TREE_TYPE (domain); 6928 6929 step = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ref))); 6930 if (TREE_CODE (step) != INTEGER_CST) 6931 goto cont; 6932 6933 if (s) 6934 { 6935 if (! tree_int_cst_equal (step, s)) 6936 goto cont; 6937 } 6938 else 6939 { 6940 /* Try if delta is a multiple of step. */ 6941 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step); 6942 if (! tmp) 6943 goto cont; 6944 delta = tmp; 6945 } 6946 6947 /* Only fold here if we can verify we do not overflow one 6948 dimension of a multi-dimensional array. */ 6949 if (mdim) 6950 { 6951 tree tmp; 6952 6953 if (!TYPE_MIN_VALUE (domain) 6954 || !TYPE_MAX_VALUE (domain) 6955 || TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST) 6956 goto cont; 6957 6958 tmp = fold_binary_loc (loc, PLUS_EXPR, itype, 6959 fold_convert_loc (loc, itype, 6960 TYPE_MIN_VALUE (domain)), 6961 fold_convert_loc (loc, itype, delta)); 6962 if (TREE_CODE (tmp) != INTEGER_CST 6963 || tree_int_cst_lt (TYPE_MAX_VALUE (domain), tmp)) 6964 goto cont; 6965 } 6966 6967 /* We found a suitable component reference. */ 6968 6969 pref = TREE_OPERAND (addr, 0); 6970 ret = copy_node (pref); 6971 SET_EXPR_LOCATION (ret, loc); 6972 6973 ret = build4_loc (loc, ARRAY_REF, TREE_TYPE (TREE_TYPE (ref)), ret, 6974 fold_build2_loc 6975 (loc, PLUS_EXPR, itype, 6976 fold_convert_loc (loc, itype, 6977 TYPE_MIN_VALUE 6978 (TYPE_DOMAIN (TREE_TYPE (ref)))), 6979 fold_convert_loc (loc, itype, delta)), 6980 NULL_TREE, NULL_TREE); 6981 return build_fold_addr_expr_loc (loc, ret); 6982 } 6983 6984cont: 6985 6986 for (;; ref = TREE_OPERAND (ref, 0)) 6987 { 6988 if (TREE_CODE (ref) == ARRAY_REF) 6989 { 6990 tree domain; 6991 6992 /* Remember if this was a multi-dimensional array. */ 6993 if (TREE_CODE (TREE_OPERAND (ref, 0)) == ARRAY_REF) 6994 mdim = true; 6995 6996 domain = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (ref, 0))); 6997 if (! domain) 6998 continue; 6999 itype = TREE_TYPE (domain); 7000 7001 step = array_ref_element_size (ref); 7002 if (TREE_CODE (step) != INTEGER_CST) 7003 continue; 7004 7005 if (s) 7006 { 7007 if (! tree_int_cst_equal (step, s)) 7008 continue; 7009 } 7010 else 7011 { 7012 /* Try if delta is a multiple of step. */ 7013 tree tmp = div_if_zero_remainder (EXACT_DIV_EXPR, op1, step); 7014 if (! tmp) 7015 continue; 7016 delta = tmp; 7017 } 7018 7019 /* Only fold here if we can verify we do not overflow one 7020 dimension of a multi-dimensional array. */ 7021 if (mdim) 7022 { 7023 tree tmp; 7024 7025 if (TREE_CODE (TREE_OPERAND (ref, 1)) != INTEGER_CST 7026 || !TYPE_MAX_VALUE (domain) 7027 || TREE_CODE (TYPE_MAX_VALUE (domain)) != INTEGER_CST) 7028 continue; 7029 7030 tmp = fold_binary_loc (loc, PLUS_EXPR, itype, 7031 fold_convert_loc (loc, itype, 7032 TREE_OPERAND (ref, 1)), 7033 fold_convert_loc (loc, itype, delta)); 7034 if (!tmp 7035 || TREE_CODE (tmp) != INTEGER_CST 7036 || tree_int_cst_lt (TYPE_MAX_VALUE (domain), tmp)) 7037 continue; 7038 } 7039 7040 break; 7041 } 7042 else 7043 mdim = false; 7044 7045 if (!handled_component_p (ref)) 7046 return NULL_TREE; 7047 } 7048 7049 /* We found the suitable array reference. So copy everything up to it, 7050 and replace the index. */ 7051 7052 pref = TREE_OPERAND (addr, 0); 7053 ret = copy_node (pref); 7054 SET_EXPR_LOCATION (ret, loc); 7055 pos = ret; 7056 7057 while (pref != ref) 7058 { 7059 pref = TREE_OPERAND (pref, 0); 7060 TREE_OPERAND (pos, 0) = copy_node (pref); 7061 pos = TREE_OPERAND (pos, 0); 7062 } 7063 7064 TREE_OPERAND (pos, 1) 7065 = fold_build2_loc (loc, PLUS_EXPR, itype, 7066 fold_convert_loc (loc, itype, TREE_OPERAND (pos, 1)), 7067 fold_convert_loc (loc, itype, delta)); 7068 return fold_build1_loc (loc, ADDR_EXPR, TREE_TYPE (addr), ret); 7069} 7070 7071 7072/* Fold A < X && A + 1 > Y to A < X && A >= Y. Normally A + 1 > Y 7073 means A >= Y && A != MAX, but in this case we know that 7074 A < X <= MAX. INEQ is A + 1 > Y, BOUND is A < X. */ 7075 7076static tree 7077fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound) 7078{ 7079 tree a, typea, type = TREE_TYPE (ineq), a1, diff, y; 7080 7081 if (TREE_CODE (bound) == LT_EXPR) 7082 a = TREE_OPERAND (bound, 0); 7083 else if (TREE_CODE (bound) == GT_EXPR) 7084 a = TREE_OPERAND (bound, 1); 7085 else 7086 return NULL_TREE; 7087 7088 typea = TREE_TYPE (a); 7089 if (!INTEGRAL_TYPE_P (typea) 7090 && !POINTER_TYPE_P (typea)) 7091 return NULL_TREE; 7092 7093 if (TREE_CODE (ineq) == LT_EXPR) 7094 { 7095 a1 = TREE_OPERAND (ineq, 1); 7096 y = TREE_OPERAND (ineq, 0); 7097 } 7098 else if (TREE_CODE (ineq) == GT_EXPR) 7099 { 7100 a1 = TREE_OPERAND (ineq, 0); 7101 y = TREE_OPERAND (ineq, 1); 7102 } 7103 else 7104 return NULL_TREE; 7105 7106 if (TREE_TYPE (a1) != typea) 7107 return NULL_TREE; 7108 7109 if (POINTER_TYPE_P (typea)) 7110 { 7111 /* Convert the pointer types into integer before taking the difference. */ 7112 tree ta = fold_convert_loc (loc, ssizetype, a); 7113 tree ta1 = fold_convert_loc (loc, ssizetype, a1); 7114 diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta); 7115 } 7116 else 7117 diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a); 7118 7119 if (!diff || !integer_onep (diff)) 7120 return NULL_TREE; 7121 7122 return fold_build2_loc (loc, GE_EXPR, type, a, y); 7123} 7124 7125/* Fold a sum or difference of at least one multiplication. 7126 Returns the folded tree or NULL if no simplification could be made. */ 7127 7128static tree 7129fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type, 7130 tree arg0, tree arg1) 7131{ 7132 tree arg00, arg01, arg10, arg11; 7133 tree alt0 = NULL_TREE, alt1 = NULL_TREE, same; 7134 7135 /* (A * C) +- (B * C) -> (A+-B) * C. 7136 (A * C) +- A -> A * (C+-1). 7137 We are most concerned about the case where C is a constant, 7138 but other combinations show up during loop reduction. Since 7139 it is not difficult, try all four possibilities. */ 7140 7141 if (TREE_CODE (arg0) == MULT_EXPR) 7142 { 7143 arg00 = TREE_OPERAND (arg0, 0); 7144 arg01 = TREE_OPERAND (arg0, 1); 7145 } 7146 else if (TREE_CODE (arg0) == INTEGER_CST) 7147 { 7148 arg00 = build_one_cst (type); 7149 arg01 = arg0; 7150 } 7151 else 7152 { 7153 /* We cannot generate constant 1 for fract. */ 7154 if (ALL_FRACT_MODE_P (TYPE_MODE (type))) 7155 return NULL_TREE; 7156 arg00 = arg0; 7157 arg01 = build_one_cst (type); 7158 } 7159 if (TREE_CODE (arg1) == MULT_EXPR) 7160 { 7161 arg10 = TREE_OPERAND (arg1, 0); 7162 arg11 = TREE_OPERAND (arg1, 1); 7163 } 7164 else if (TREE_CODE (arg1) == INTEGER_CST) 7165 { 7166 arg10 = build_one_cst (type); 7167 /* As we canonicalize A - 2 to A + -2 get rid of that sign for 7168 the purpose of this canonicalization. */ 7169 if (TREE_INT_CST_HIGH (arg1) == -1 7170 && negate_expr_p (arg1) 7171 && code == PLUS_EXPR) 7172 { 7173 arg11 = negate_expr (arg1); 7174 code = MINUS_EXPR; 7175 } 7176 else 7177 arg11 = arg1; 7178 } 7179 else 7180 { 7181 /* We cannot generate constant 1 for fract. */ 7182 if (ALL_FRACT_MODE_P (TYPE_MODE (type))) 7183 return NULL_TREE; 7184 arg10 = arg1; 7185 arg11 = build_one_cst (type); 7186 } 7187 same = NULL_TREE; 7188 7189 if (operand_equal_p (arg01, arg11, 0)) 7190 same = arg01, alt0 = arg00, alt1 = arg10; 7191 else if (operand_equal_p (arg00, arg10, 0)) 7192 same = arg00, alt0 = arg01, alt1 = arg11; 7193 else if (operand_equal_p (arg00, arg11, 0)) 7194 same = arg00, alt0 = arg01, alt1 = arg10; 7195 else if (operand_equal_p (arg01, arg10, 0)) 7196 same = arg01, alt0 = arg00, alt1 = arg11; 7197 7198 /* No identical multiplicands; see if we can find a common 7199 power-of-two factor in non-power-of-two multiplies. This 7200 can help in multi-dimensional array access. */ 7201 else if (host_integerp (arg01, 0) 7202 && host_integerp (arg11, 0)) 7203 { 7204 HOST_WIDE_INT int01, int11, tmp; 7205 bool swap = false; 7206 tree maybe_same; 7207 int01 = TREE_INT_CST_LOW (arg01); 7208 int11 = TREE_INT_CST_LOW (arg11); 7209 7210 /* Move min of absolute values to int11. */ 7211 if (absu_hwi (int01) < absu_hwi (int11)) 7212 { 7213 tmp = int01, int01 = int11, int11 = tmp; 7214 alt0 = arg00, arg00 = arg10, arg10 = alt0; 7215 maybe_same = arg01; 7216 swap = true; 7217 } 7218 else 7219 maybe_same = arg11; 7220 7221 if (exact_log2 (absu_hwi (int11)) > 0 && int01 % int11 == 0 7222 /* The remainder should not be a constant, otherwise we 7223 end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has 7224 increased the number of multiplications necessary. */ 7225 && TREE_CODE (arg10) != INTEGER_CST) 7226 { 7227 alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00, 7228 build_int_cst (TREE_TYPE (arg00), 7229 int01 / int11)); 7230 alt1 = arg10; 7231 same = maybe_same; 7232 if (swap) 7233 maybe_same = alt0, alt0 = alt1, alt1 = maybe_same; 7234 } 7235 } 7236 7237 if (same) 7238 return fold_build2_loc (loc, MULT_EXPR, type, 7239 fold_build2_loc (loc, code, type, 7240 fold_convert_loc (loc, type, alt0), 7241 fold_convert_loc (loc, type, alt1)), 7242 fold_convert_loc (loc, type, same)); 7243 7244 return NULL_TREE; 7245} 7246 7247/* Subroutine of native_encode_expr. Encode the INTEGER_CST 7248 specified by EXPR into the buffer PTR of length LEN bytes. 7249 Return the number of bytes placed in the buffer, or zero 7250 upon failure. */ 7251 7252static int 7253native_encode_int (const_tree expr, unsigned char *ptr, int len) 7254{ 7255 tree type = TREE_TYPE (expr); 7256 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); 7257 int byte, offset, word, words; 7258 unsigned char value; 7259 7260 if (total_bytes > len) 7261 return 0; 7262 words = total_bytes / UNITS_PER_WORD; 7263 7264 for (byte = 0; byte < total_bytes; byte++) 7265 { 7266 int bitpos = byte * BITS_PER_UNIT; 7267 if (bitpos < HOST_BITS_PER_WIDE_INT) 7268 value = (unsigned char) (TREE_INT_CST_LOW (expr) >> bitpos); 7269 else 7270 value = (unsigned char) (TREE_INT_CST_HIGH (expr) 7271 >> (bitpos - HOST_BITS_PER_WIDE_INT)); 7272 7273 if (total_bytes > UNITS_PER_WORD) 7274 { 7275 word = byte / UNITS_PER_WORD; 7276 if (WORDS_BIG_ENDIAN) 7277 word = (words - 1) - word; 7278 offset = word * UNITS_PER_WORD; 7279 if (BYTES_BIG_ENDIAN) 7280 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD); 7281 else 7282 offset += byte % UNITS_PER_WORD; 7283 } 7284 else 7285 offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte; 7286 ptr[offset] = value; 7287 } 7288 return total_bytes; 7289} 7290 7291 7292/* Subroutine of native_encode_expr. Encode the FIXED_CST 7293 specified by EXPR into the buffer PTR of length LEN bytes. 7294 Return the number of bytes placed in the buffer, or zero 7295 upon failure. */ 7296 7297static int 7298native_encode_fixed (const_tree expr, unsigned char *ptr, int len) 7299{ 7300 tree type = TREE_TYPE (expr); 7301 enum machine_mode mode = TYPE_MODE (type); 7302 int total_bytes = GET_MODE_SIZE (mode); 7303 FIXED_VALUE_TYPE value; 7304 tree i_value, i_type; 7305 7306 if (total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT) 7307 return 0; 7308 7309 i_type = lang_hooks.types.type_for_size (GET_MODE_BITSIZE (mode), 1); 7310 7311 if (NULL_TREE == i_type 7312 || TYPE_PRECISION (i_type) != total_bytes) 7313 return 0; 7314 7315 value = TREE_FIXED_CST (expr); 7316 i_value = double_int_to_tree (i_type, value.data); 7317 7318 return native_encode_int (i_value, ptr, len); 7319} 7320 7321 7322/* Subroutine of native_encode_expr. Encode the REAL_CST 7323 specified by EXPR into the buffer PTR of length LEN bytes. 7324 Return the number of bytes placed in the buffer, or zero 7325 upon failure. */ 7326 7327static int 7328native_encode_real (const_tree expr, unsigned char *ptr, int len) 7329{ 7330 tree type = TREE_TYPE (expr); 7331 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); 7332 int byte, offset, word, words, bitpos; 7333 unsigned char value; 7334 7335 /* There are always 32 bits in each long, no matter the size of 7336 the hosts long. We handle floating point representations with 7337 up to 192 bits. */ 7338 long tmp[6]; 7339 7340 if (total_bytes > len) 7341 return 0; 7342 words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD; 7343 7344 real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type)); 7345 7346 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT; 7347 bitpos += BITS_PER_UNIT) 7348 { 7349 byte = (bitpos / BITS_PER_UNIT) & 3; 7350 value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31)); 7351 7352 if (UNITS_PER_WORD < 4) 7353 { 7354 word = byte / UNITS_PER_WORD; 7355 if (WORDS_BIG_ENDIAN) 7356 word = (words - 1) - word; 7357 offset = word * UNITS_PER_WORD; 7358 if (BYTES_BIG_ENDIAN) 7359 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD); 7360 else 7361 offset += byte % UNITS_PER_WORD; 7362 } 7363 else 7364 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte; 7365 ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value; 7366 } 7367 return total_bytes; 7368} 7369 7370/* Subroutine of native_encode_expr. Encode the COMPLEX_CST 7371 specified by EXPR into the buffer PTR of length LEN bytes. 7372 Return the number of bytes placed in the buffer, or zero 7373 upon failure. */ 7374 7375static int 7376native_encode_complex (const_tree expr, unsigned char *ptr, int len) 7377{ 7378 int rsize, isize; 7379 tree part; 7380 7381 part = TREE_REALPART (expr); 7382 rsize = native_encode_expr (part, ptr, len); 7383 if (rsize == 0) 7384 return 0; 7385 part = TREE_IMAGPART (expr); 7386 isize = native_encode_expr (part, ptr+rsize, len-rsize); 7387 if (isize != rsize) 7388 return 0; 7389 return rsize + isize; 7390} 7391 7392 7393/* Subroutine of native_encode_expr. Encode the VECTOR_CST 7394 specified by EXPR into the buffer PTR of length LEN bytes. 7395 Return the number of bytes placed in the buffer, or zero 7396 upon failure. */ 7397 7398static int 7399native_encode_vector (const_tree expr, unsigned char *ptr, int len) 7400{ 7401 unsigned i, count; 7402 int size, offset; 7403 tree itype, elem; 7404 7405 offset = 0; 7406 count = VECTOR_CST_NELTS (expr); 7407 itype = TREE_TYPE (TREE_TYPE (expr)); 7408 size = GET_MODE_SIZE (TYPE_MODE (itype)); 7409 for (i = 0; i < count; i++) 7410 { 7411 elem = VECTOR_CST_ELT (expr, i); 7412 if (native_encode_expr (elem, ptr+offset, len-offset) != size) 7413 return 0; 7414 offset += size; 7415 } 7416 return offset; 7417} 7418 7419 7420/* Subroutine of native_encode_expr. Encode the STRING_CST 7421 specified by EXPR into the buffer PTR of length LEN bytes. 7422 Return the number of bytes placed in the buffer, or zero 7423 upon failure. */ 7424 7425static int 7426native_encode_string (const_tree expr, unsigned char *ptr, int len) 7427{ 7428 tree type = TREE_TYPE (expr); 7429 HOST_WIDE_INT total_bytes; 7430 7431 if (TREE_CODE (type) != ARRAY_TYPE 7432 || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE 7433 || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT 7434 || !host_integerp (TYPE_SIZE_UNIT (type), 0)) 7435 return 0; 7436 total_bytes = tree_low_cst (TYPE_SIZE_UNIT (type), 0); 7437 if (total_bytes > len) 7438 return 0; 7439 if (TREE_STRING_LENGTH (expr) < total_bytes) 7440 { 7441 memcpy (ptr, TREE_STRING_POINTER (expr), TREE_STRING_LENGTH (expr)); 7442 memset (ptr + TREE_STRING_LENGTH (expr), 0, 7443 total_bytes - TREE_STRING_LENGTH (expr)); 7444 } 7445 else 7446 memcpy (ptr, TREE_STRING_POINTER (expr), total_bytes); 7447 return total_bytes; 7448} 7449 7450 7451/* Subroutine of fold_view_convert_expr. Encode the INTEGER_CST, 7452 REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the 7453 buffer PTR of length LEN bytes. Return the number of bytes 7454 placed in the buffer, or zero upon failure. */ 7455 7456int 7457native_encode_expr (const_tree expr, unsigned char *ptr, int len) 7458{ 7459 switch (TREE_CODE (expr)) 7460 { 7461 case INTEGER_CST: 7462 return native_encode_int (expr, ptr, len); 7463 7464 case REAL_CST: 7465 return native_encode_real (expr, ptr, len); 7466 7467 case FIXED_CST: 7468 return native_encode_fixed (expr, ptr, len); 7469 7470 case COMPLEX_CST: 7471 return native_encode_complex (expr, ptr, len); 7472 7473 case VECTOR_CST: 7474 return native_encode_vector (expr, ptr, len); 7475 7476 case STRING_CST: 7477 return native_encode_string (expr, ptr, len); 7478 7479 default: 7480 return 0; 7481 } 7482} 7483 7484 7485/* Subroutine of native_interpret_expr. Interpret the contents of 7486 the buffer PTR of length LEN as an INTEGER_CST of type TYPE. 7487 If the buffer cannot be interpreted, return NULL_TREE. */ 7488 7489static tree 7490native_interpret_int (tree type, const unsigned char *ptr, int len) 7491{ 7492 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); 7493 double_int result; 7494 7495 if (total_bytes > len 7496 || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT) 7497 return NULL_TREE; 7498 7499 result = double_int::from_buffer (ptr, total_bytes); 7500 7501 return double_int_to_tree (type, result); 7502} 7503 7504 7505/* Subroutine of native_interpret_expr. Interpret the contents of 7506 the buffer PTR of length LEN as a FIXED_CST of type TYPE. 7507 If the buffer cannot be interpreted, return NULL_TREE. */ 7508 7509static tree 7510native_interpret_fixed (tree type, const unsigned char *ptr, int len) 7511{ 7512 int total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); 7513 double_int result; 7514 FIXED_VALUE_TYPE fixed_value; 7515 7516 if (total_bytes > len 7517 || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT) 7518 return NULL_TREE; 7519 7520 result = double_int::from_buffer (ptr, total_bytes); 7521 fixed_value = fixed_from_double_int (result, TYPE_MODE (type)); 7522 7523 return build_fixed (type, fixed_value); 7524} 7525 7526 7527/* Subroutine of native_interpret_expr. Interpret the contents of 7528 the buffer PTR of length LEN as a REAL_CST of type TYPE. 7529 If the buffer cannot be interpreted, return NULL_TREE. */ 7530 7531static tree 7532native_interpret_real (tree type, const unsigned char *ptr, int len) 7533{ 7534 enum machine_mode mode = TYPE_MODE (type); 7535 int total_bytes = GET_MODE_SIZE (mode); 7536 int byte, offset, word, words, bitpos; 7537 unsigned char value; 7538 /* There are always 32 bits in each long, no matter the size of 7539 the hosts long. We handle floating point representations with 7540 up to 192 bits. */ 7541 REAL_VALUE_TYPE r; 7542 long tmp[6]; 7543 7544 total_bytes = GET_MODE_SIZE (TYPE_MODE (type)); 7545 if (total_bytes > len || total_bytes > 24) 7546 return NULL_TREE; 7547 words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD; 7548 7549 memset (tmp, 0, sizeof (tmp)); 7550 for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT; 7551 bitpos += BITS_PER_UNIT) 7552 { 7553 byte = (bitpos / BITS_PER_UNIT) & 3; 7554 if (UNITS_PER_WORD < 4) 7555 { 7556 word = byte / UNITS_PER_WORD; 7557 if (WORDS_BIG_ENDIAN) 7558 word = (words - 1) - word; 7559 offset = word * UNITS_PER_WORD; 7560 if (BYTES_BIG_ENDIAN) 7561 offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD); 7562 else 7563 offset += byte % UNITS_PER_WORD; 7564 } 7565 else 7566 offset = BYTES_BIG_ENDIAN ? 3 - byte : byte; 7567 value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)]; 7568 7569 tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31); 7570 } 7571 7572 real_from_target (&r, tmp, mode); 7573 return build_real (type, r); 7574} 7575 7576 7577/* Subroutine of native_interpret_expr. Interpret the contents of 7578 the buffer PTR of length LEN as a COMPLEX_CST of type TYPE. 7579 If the buffer cannot be interpreted, return NULL_TREE. */ 7580 7581static tree 7582native_interpret_complex (tree type, const unsigned char *ptr, int len) 7583{ 7584 tree etype, rpart, ipart; 7585 int size; 7586 7587 etype = TREE_TYPE (type); 7588 size = GET_MODE_SIZE (TYPE_MODE (etype)); 7589 if (size * 2 > len) 7590 return NULL_TREE; 7591 rpart = native_interpret_expr (etype, ptr, size); 7592 if (!rpart) 7593 return NULL_TREE; 7594 ipart = native_interpret_expr (etype, ptr+size, size); 7595 if (!ipart) 7596 return NULL_TREE; 7597 return build_complex (type, rpart, ipart); 7598} 7599 7600 7601/* Subroutine of native_interpret_expr. Interpret the contents of 7602 the buffer PTR of length LEN as a VECTOR_CST of type TYPE. 7603 If the buffer cannot be interpreted, return NULL_TREE. */ 7604 7605static tree 7606native_interpret_vector (tree type, const unsigned char *ptr, int len) 7607{ 7608 tree etype, elem; 7609 int i, size, count; 7610 tree *elements; 7611 7612 etype = TREE_TYPE (type); 7613 size = GET_MODE_SIZE (TYPE_MODE (etype)); 7614 count = TYPE_VECTOR_SUBPARTS (type); 7615 if (size * count > len) 7616 return NULL_TREE; 7617 7618 elements = XALLOCAVEC (tree, count); 7619 for (i = count - 1; i >= 0; i--) 7620 { 7621 elem = native_interpret_expr (etype, ptr+(i*size), size); 7622 if (!elem) 7623 return NULL_TREE; 7624 elements[i] = elem; 7625 } 7626 return build_vector (type, elements); 7627} 7628 7629 7630/* Subroutine of fold_view_convert_expr. Interpret the contents of 7631 the buffer PTR of length LEN as a constant of type TYPE. For 7632 INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P 7633 we return a REAL_CST, etc... If the buffer cannot be interpreted, 7634 return NULL_TREE. */ 7635 7636tree 7637native_interpret_expr (tree type, const unsigned char *ptr, int len) 7638{ 7639 switch (TREE_CODE (type)) 7640 { 7641 case INTEGER_TYPE: 7642 case ENUMERAL_TYPE: 7643 case BOOLEAN_TYPE: 7644 case POINTER_TYPE: 7645 case REFERENCE_TYPE: 7646 return native_interpret_int (type, ptr, len); 7647 7648 case REAL_TYPE: 7649 return native_interpret_real (type, ptr, len); 7650 7651 case FIXED_POINT_TYPE: 7652 return native_interpret_fixed (type, ptr, len); 7653 7654 case COMPLEX_TYPE: 7655 return native_interpret_complex (type, ptr, len); 7656 7657 case VECTOR_TYPE: 7658 return native_interpret_vector (type, ptr, len); 7659 7660 default: 7661 return NULL_TREE; 7662 } 7663} 7664 7665/* Returns true if we can interpret the contents of a native encoding 7666 as TYPE. */ 7667 7668static bool 7669can_native_interpret_type_p (tree type) 7670{ 7671 switch (TREE_CODE (type)) 7672 { 7673 case INTEGER_TYPE: 7674 case ENUMERAL_TYPE: 7675 case BOOLEAN_TYPE: 7676 case POINTER_TYPE: 7677 case REFERENCE_TYPE: 7678 case FIXED_POINT_TYPE: 7679 case REAL_TYPE: 7680 case COMPLEX_TYPE: 7681 case VECTOR_TYPE: 7682 return true; 7683 default: 7684 return false; 7685 } 7686} 7687 7688/* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type 7689 TYPE at compile-time. If we're unable to perform the conversion 7690 return NULL_TREE. */ 7691 7692static tree 7693fold_view_convert_expr (tree type, tree expr) 7694{ 7695 /* We support up to 512-bit values (for V8DFmode). */ 7696 unsigned char buffer[64]; 7697 int len; 7698 7699 /* Check that the host and target are sane. */ 7700 if (CHAR_BIT != 8 || BITS_PER_UNIT != 8) 7701 return NULL_TREE; 7702 7703 len = native_encode_expr (expr, buffer, sizeof (buffer)); 7704 if (len == 0) 7705 return NULL_TREE; 7706 7707 return native_interpret_expr (type, buffer, len); 7708} 7709 7710/* Build an expression for the address of T. Folds away INDIRECT_REF 7711 to avoid confusing the gimplify process. */ 7712 7713tree 7714build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype) 7715{ 7716 /* The size of the object is not relevant when talking about its address. */ 7717 if (TREE_CODE (t) == WITH_SIZE_EXPR) 7718 t = TREE_OPERAND (t, 0); 7719 7720 if (TREE_CODE (t) == INDIRECT_REF) 7721 { 7722 t = TREE_OPERAND (t, 0); 7723 7724 if (TREE_TYPE (t) != ptrtype) 7725 t = build1_loc (loc, NOP_EXPR, ptrtype, t); 7726 } 7727 else if (TREE_CODE (t) == MEM_REF 7728 && integer_zerop (TREE_OPERAND (t, 1))) 7729 return TREE_OPERAND (t, 0); 7730 else if (TREE_CODE (t) == MEM_REF 7731 && TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST) 7732 return fold_binary (POINTER_PLUS_EXPR, ptrtype, 7733 TREE_OPERAND (t, 0), 7734 convert_to_ptrofftype (TREE_OPERAND (t, 1))); 7735 else if (TREE_CODE (t) == VIEW_CONVERT_EXPR) 7736 { 7737 t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0)); 7738 7739 if (TREE_TYPE (t) != ptrtype) 7740 t = fold_convert_loc (loc, ptrtype, t); 7741 } 7742 else 7743 t = build1_loc (loc, ADDR_EXPR, ptrtype, t); 7744 7745 return t; 7746} 7747 7748/* Build an expression for the address of T. */ 7749 7750tree 7751build_fold_addr_expr_loc (location_t loc, tree t) 7752{ 7753 tree ptrtype = build_pointer_type (TREE_TYPE (t)); 7754 7755 return build_fold_addr_expr_with_type_loc (loc, t, ptrtype); 7756} 7757 7758static bool vec_cst_ctor_to_array (tree, tree *); 7759 7760/* Fold a unary expression of code CODE and type TYPE with operand 7761 OP0. Return the folded expression if folding is successful. 7762 Otherwise, return NULL_TREE. */ 7763 7764tree 7765fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) 7766{ 7767 tree tem; 7768 tree arg0; 7769 enum tree_code_class kind = TREE_CODE_CLASS (code); 7770 7771 gcc_assert (IS_EXPR_CODE_CLASS (kind) 7772 && TREE_CODE_LENGTH (code) == 1); 7773 7774 arg0 = op0; 7775 if (arg0) 7776 { 7777 if (CONVERT_EXPR_CODE_P (code) 7778 || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR) 7779 { 7780 /* Don't use STRIP_NOPS, because signedness of argument type 7781 matters. */ 7782 STRIP_SIGN_NOPS (arg0); 7783 } 7784 else 7785 { 7786 /* Strip any conversions that don't change the mode. This 7787 is safe for every expression, except for a comparison 7788 expression because its signedness is derived from its 7789 operands. 7790 7791 Note that this is done as an internal manipulation within 7792 the constant folder, in order to find the simplest 7793 representation of the arguments so that their form can be 7794 studied. In any cases, the appropriate type conversions 7795 should be put back in the tree that will get out of the 7796 constant folder. */ 7797 STRIP_NOPS (arg0); 7798 } 7799 } 7800 7801 if (TREE_CODE_CLASS (code) == tcc_unary) 7802 { 7803 if (TREE_CODE (arg0) == COMPOUND_EXPR) 7804 return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), 7805 fold_build1_loc (loc, code, type, 7806 fold_convert_loc (loc, TREE_TYPE (op0), 7807 TREE_OPERAND (arg0, 1)))); 7808 else if (TREE_CODE (arg0) == COND_EXPR) 7809 { 7810 tree arg01 = TREE_OPERAND (arg0, 1); 7811 tree arg02 = TREE_OPERAND (arg0, 2); 7812 if (! VOID_TYPE_P (TREE_TYPE (arg01))) 7813 arg01 = fold_build1_loc (loc, code, type, 7814 fold_convert_loc (loc, 7815 TREE_TYPE (op0), arg01)); 7816 if (! VOID_TYPE_P (TREE_TYPE (arg02))) 7817 arg02 = fold_build1_loc (loc, code, type, 7818 fold_convert_loc (loc, 7819 TREE_TYPE (op0), arg02)); 7820 tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0), 7821 arg01, arg02); 7822 7823 /* If this was a conversion, and all we did was to move into 7824 inside the COND_EXPR, bring it back out. But leave it if 7825 it is a conversion from integer to integer and the 7826 result precision is no wider than a word since such a 7827 conversion is cheap and may be optimized away by combine, 7828 while it couldn't if it were outside the COND_EXPR. Then return 7829 so we don't get into an infinite recursion loop taking the 7830 conversion out and then back in. */ 7831 7832 if ((CONVERT_EXPR_CODE_P (code) 7833 || code == NON_LVALUE_EXPR) 7834 && TREE_CODE (tem) == COND_EXPR 7835 && TREE_CODE (TREE_OPERAND (tem, 1)) == code 7836 && TREE_CODE (TREE_OPERAND (tem, 2)) == code 7837 && ! VOID_TYPE_P (TREE_OPERAND (tem, 1)) 7838 && ! VOID_TYPE_P (TREE_OPERAND (tem, 2)) 7839 && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0)) 7840 == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0))) 7841 && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem)) 7842 && (INTEGRAL_TYPE_P 7843 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0)))) 7844 && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD) 7845 || flag_syntax_only)) 7846 tem = build1_loc (loc, code, type, 7847 build3 (COND_EXPR, 7848 TREE_TYPE (TREE_OPERAND 7849 (TREE_OPERAND (tem, 1), 0)), 7850 TREE_OPERAND (tem, 0), 7851 TREE_OPERAND (TREE_OPERAND (tem, 1), 0), 7852 TREE_OPERAND (TREE_OPERAND (tem, 2), 7853 0))); 7854 return tem; 7855 } 7856 } 7857 7858 switch (code) 7859 { 7860 case PAREN_EXPR: 7861 /* Re-association barriers around constants and other re-association 7862 barriers can be removed. */ 7863 if (CONSTANT_CLASS_P (op0) 7864 || TREE_CODE (op0) == PAREN_EXPR) 7865 return fold_convert_loc (loc, type, op0); 7866 return NULL_TREE; 7867 7868 case NON_LVALUE_EXPR: 7869 if (!maybe_lvalue_p (op0)) 7870 return fold_convert_loc (loc, type, op0); 7871 return NULL_TREE; 7872 7873 CASE_CONVERT: 7874 case FLOAT_EXPR: 7875 case FIX_TRUNC_EXPR: 7876 if (TREE_TYPE (op0) == type) 7877 return op0; 7878 7879 if (COMPARISON_CLASS_P (op0)) 7880 { 7881 /* If we have (type) (a CMP b) and type is an integral type, return 7882 new expression involving the new type. Canonicalize 7883 (type) (a CMP b) to (a CMP b) ? (type) true : (type) false for 7884 non-integral type. 7885 Do not fold the result as that would not simplify further, also 7886 folding again results in recursions. */ 7887 if (TREE_CODE (type) == BOOLEAN_TYPE) 7888 return build2_loc (loc, TREE_CODE (op0), type, 7889 TREE_OPERAND (op0, 0), 7890 TREE_OPERAND (op0, 1)); 7891 else if (!INTEGRAL_TYPE_P (type) && !VOID_TYPE_P (type) 7892 && TREE_CODE (type) != VECTOR_TYPE) 7893 return build3_loc (loc, COND_EXPR, type, op0, 7894 constant_boolean_node (true, type), 7895 constant_boolean_node (false, type)); 7896 } 7897 7898 /* Handle cases of two conversions in a row. */ 7899 if (CONVERT_EXPR_P (op0)) 7900 { 7901 tree inside_type = TREE_TYPE (TREE_OPERAND (op0, 0)); 7902 tree inter_type = TREE_TYPE (op0); 7903 int inside_int = INTEGRAL_TYPE_P (inside_type); 7904 int inside_ptr = POINTER_TYPE_P (inside_type); 7905 int inside_float = FLOAT_TYPE_P (inside_type); 7906 int inside_vec = TREE_CODE (inside_type) == VECTOR_TYPE; 7907 unsigned int inside_prec = TYPE_PRECISION (inside_type); 7908 int inside_unsignedp = TYPE_UNSIGNED (inside_type); 7909 int inter_int = INTEGRAL_TYPE_P (inter_type); 7910 int inter_ptr = POINTER_TYPE_P (inter_type); 7911 int inter_float = FLOAT_TYPE_P (inter_type); 7912 int inter_vec = TREE_CODE (inter_type) == VECTOR_TYPE; 7913 unsigned int inter_prec = TYPE_PRECISION (inter_type); 7914 int inter_unsignedp = TYPE_UNSIGNED (inter_type); 7915 int final_int = INTEGRAL_TYPE_P (type); 7916 int final_ptr = POINTER_TYPE_P (type); 7917 int final_float = FLOAT_TYPE_P (type); 7918 int final_vec = TREE_CODE (type) == VECTOR_TYPE; 7919 unsigned int final_prec = TYPE_PRECISION (type); 7920 int final_unsignedp = TYPE_UNSIGNED (type); 7921 7922 /* In addition to the cases of two conversions in a row 7923 handled below, if we are converting something to its own 7924 type via an object of identical or wider precision, neither 7925 conversion is needed. */ 7926 if (TYPE_MAIN_VARIANT (inside_type) == TYPE_MAIN_VARIANT (type) 7927 && (((inter_int || inter_ptr) && final_int) 7928 || (inter_float && final_float)) 7929 && inter_prec >= final_prec) 7930 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0)); 7931 7932 /* Likewise, if the intermediate and initial types are either both 7933 float or both integer, we don't need the middle conversion if the 7934 former is wider than the latter and doesn't change the signedness 7935 (for integers). Avoid this if the final type is a pointer since 7936 then we sometimes need the middle conversion. Likewise if the 7937 final type has a precision not equal to the size of its mode. */ 7938 if (((inter_int && inside_int) || (inter_float && inside_float)) 7939 && (final_int || final_float) 7940 && inter_prec >= inside_prec 7941 && (inter_float || inter_unsignedp == inside_unsignedp) 7942 && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type)) 7943 && TYPE_MODE (type) == TYPE_MODE (inter_type))) 7944 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0)); 7945 7946 /* If we have a sign-extension of a zero-extended value, we can 7947 replace that by a single zero-extension. Likewise if the 7948 final conversion does not change precision we can drop the 7949 intermediate conversion. */ 7950 if (inside_int && inter_int && final_int 7951 && ((inside_prec < inter_prec && inter_prec < final_prec 7952 && inside_unsignedp && !inter_unsignedp) 7953 || final_prec == inter_prec)) 7954 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0)); 7955 7956 /* Two conversions in a row are not needed unless: 7957 - some conversion is floating-point (overstrict for now), or 7958 - some conversion is a vector (overstrict for now), or 7959 - the intermediate type is narrower than both initial and 7960 final, or 7961 - the intermediate type and innermost type differ in signedness, 7962 and the outermost type is wider than the intermediate, or 7963 - the initial type is a pointer type and the precisions of the 7964 intermediate and final types differ, or 7965 - the final type is a pointer type and the precisions of the 7966 initial and intermediate types differ. */ 7967 if (! inside_float && ! inter_float && ! final_float 7968 && ! inside_vec && ! inter_vec && ! final_vec 7969 && (inter_prec >= inside_prec || inter_prec >= final_prec) 7970 && ! (inside_int && inter_int 7971 && inter_unsignedp != inside_unsignedp 7972 && inter_prec < final_prec) 7973 && ((inter_unsignedp && inter_prec > inside_prec) 7974 == (final_unsignedp && final_prec > inter_prec)) 7975 && ! (inside_ptr && inter_prec != final_prec) 7976 && ! (final_ptr && inside_prec != inter_prec) 7977 && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type)) 7978 && TYPE_MODE (type) == TYPE_MODE (inter_type))) 7979 return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0)); 7980 } 7981 7982 /* Handle (T *)&A.B.C for A being of type T and B and C 7983 living at offset zero. This occurs frequently in 7984 C++ upcasting and then accessing the base. */ 7985 if (TREE_CODE (op0) == ADDR_EXPR 7986 && POINTER_TYPE_P (type) 7987 && handled_component_p (TREE_OPERAND (op0, 0))) 7988 { 7989 HOST_WIDE_INT bitsize, bitpos; 7990 tree offset; 7991 enum machine_mode mode; 7992 int unsignedp, volatilep; 7993 tree base = TREE_OPERAND (op0, 0); 7994 base = get_inner_reference (base, &bitsize, &bitpos, &offset, 7995 &mode, &unsignedp, &volatilep, false); 7996 /* If the reference was to a (constant) zero offset, we can use 7997 the address of the base if it has the same base type 7998 as the result type and the pointer type is unqualified. */ 7999 if (! offset && bitpos == 0 8000 && (TYPE_MAIN_VARIANT (TREE_TYPE (type)) 8001 == TYPE_MAIN_VARIANT (TREE_TYPE (base))) 8002 && TYPE_QUALS (type) == TYPE_UNQUALIFIED) 8003 return fold_convert_loc (loc, type, 8004 build_fold_addr_expr_loc (loc, base)); 8005 } 8006 8007 if (TREE_CODE (op0) == MODIFY_EXPR 8008 && TREE_CONSTANT (TREE_OPERAND (op0, 1)) 8009 /* Detect assigning a bitfield. */ 8010 && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF 8011 && DECL_BIT_FIELD 8012 (TREE_OPERAND (TREE_OPERAND (op0, 0), 1)))) 8013 { 8014 /* Don't leave an assignment inside a conversion 8015 unless assigning a bitfield. */ 8016 tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1)); 8017 /* First do the assignment, then return converted constant. */ 8018 tem = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (tem), op0, tem); 8019 TREE_NO_WARNING (tem) = 1; 8020 TREE_USED (tem) = 1; 8021 return tem; 8022 } 8023 8024 /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer 8025 constants (if x has signed type, the sign bit cannot be set 8026 in c). This folds extension into the BIT_AND_EXPR. 8027 ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they 8028 very likely don't have maximal range for their precision and this 8029 transformation effectively doesn't preserve non-maximal ranges. */ 8030 if (TREE_CODE (type) == INTEGER_TYPE 8031 && TREE_CODE (op0) == BIT_AND_EXPR 8032 && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST) 8033 { 8034 tree and_expr = op0; 8035 tree and0 = TREE_OPERAND (and_expr, 0); 8036 tree and1 = TREE_OPERAND (and_expr, 1); 8037 int change = 0; 8038 8039 if (TYPE_UNSIGNED (TREE_TYPE (and_expr)) 8040 || (TYPE_PRECISION (type) 8041 <= TYPE_PRECISION (TREE_TYPE (and_expr)))) 8042 change = 1; 8043 else if (TYPE_PRECISION (TREE_TYPE (and1)) 8044 <= HOST_BITS_PER_WIDE_INT 8045 && host_integerp (and1, 1)) 8046 { 8047 unsigned HOST_WIDE_INT cst; 8048 8049 cst = tree_low_cst (and1, 1); 8050 cst &= (HOST_WIDE_INT) -1 8051 << (TYPE_PRECISION (TREE_TYPE (and1)) - 1); 8052 change = (cst == 0); 8053#ifdef LOAD_EXTEND_OP 8054 if (change 8055 && !flag_syntax_only 8056 && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0))) 8057 == ZERO_EXTEND)) 8058 { 8059 tree uns = unsigned_type_for (TREE_TYPE (and0)); 8060 and0 = fold_convert_loc (loc, uns, and0); 8061 and1 = fold_convert_loc (loc, uns, and1); 8062 } 8063#endif 8064 } 8065 if (change) 8066 { 8067 tem = force_fit_type_double (type, tree_to_double_int (and1), 8068 0, TREE_OVERFLOW (and1)); 8069 return fold_build2_loc (loc, BIT_AND_EXPR, type, 8070 fold_convert_loc (loc, type, and0), tem); 8071 } 8072 } 8073 8074 /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type, 8075 when one of the new casts will fold away. Conservatively we assume 8076 that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */ 8077 if (POINTER_TYPE_P (type) 8078 && TREE_CODE (arg0) == POINTER_PLUS_EXPR 8079 && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0))) 8080 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 8081 || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR 8082 || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR)) 8083 { 8084 tree arg00 = TREE_OPERAND (arg0, 0); 8085 tree arg01 = TREE_OPERAND (arg0, 1); 8086 8087 return fold_build_pointer_plus_loc 8088 (loc, fold_convert_loc (loc, type, arg00), arg01); 8089 } 8090 8091 /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types 8092 of the same precision, and X is an integer type not narrower than 8093 types T1 or T2, i.e. the cast (T2)X isn't an extension. */ 8094 if (INTEGRAL_TYPE_P (type) 8095 && TREE_CODE (op0) == BIT_NOT_EXPR 8096 && INTEGRAL_TYPE_P (TREE_TYPE (op0)) 8097 && CONVERT_EXPR_P (TREE_OPERAND (op0, 0)) 8098 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))) 8099 { 8100 tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0); 8101 if (INTEGRAL_TYPE_P (TREE_TYPE (tem)) 8102 && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem))) 8103 return fold_build1_loc (loc, BIT_NOT_EXPR, type, 8104 fold_convert_loc (loc, type, tem)); 8105 } 8106 8107 /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the 8108 type of X and Y (integer types only). */ 8109 if (INTEGRAL_TYPE_P (type) 8110 && TREE_CODE (op0) == MULT_EXPR 8111 && INTEGRAL_TYPE_P (TREE_TYPE (op0)) 8112 && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0))) 8113 { 8114 /* Be careful not to introduce new overflows. */ 8115 tree mult_type; 8116 if (TYPE_OVERFLOW_WRAPS (type)) 8117 mult_type = type; 8118 else 8119 mult_type = unsigned_type_for (type); 8120 8121 if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0))) 8122 { 8123 tem = fold_build2_loc (loc, MULT_EXPR, mult_type, 8124 fold_convert_loc (loc, mult_type, 8125 TREE_OPERAND (op0, 0)), 8126 fold_convert_loc (loc, mult_type, 8127 TREE_OPERAND (op0, 1))); 8128 return fold_convert_loc (loc, type, tem); 8129 } 8130 } 8131 8132 tem = fold_convert_const (code, type, arg0); 8133 return tem ? tem : NULL_TREE; 8134 8135 case ADDR_SPACE_CONVERT_EXPR: 8136 if (integer_zerop (arg0)) 8137 return fold_convert_const (code, type, arg0); 8138 return NULL_TREE; 8139 8140 case FIXED_CONVERT_EXPR: 8141 tem = fold_convert_const (code, type, arg0); 8142 return tem ? tem : NULL_TREE; 8143 8144 case VIEW_CONVERT_EXPR: 8145 if (TREE_TYPE (op0) == type) 8146 return op0; 8147 if (TREE_CODE (op0) == VIEW_CONVERT_EXPR) 8148 return fold_build1_loc (loc, VIEW_CONVERT_EXPR, 8149 type, TREE_OPERAND (op0, 0)); 8150 if (TREE_CODE (op0) == MEM_REF) 8151 return fold_build2_loc (loc, MEM_REF, type, 8152 TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1)); 8153 8154 /* For integral conversions with the same precision or pointer 8155 conversions use a NOP_EXPR instead. */ 8156 if ((INTEGRAL_TYPE_P (type) 8157 || POINTER_TYPE_P (type)) 8158 && (INTEGRAL_TYPE_P (TREE_TYPE (op0)) 8159 || POINTER_TYPE_P (TREE_TYPE (op0))) 8160 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))) 8161 return fold_convert_loc (loc, type, op0); 8162 8163 /* Strip inner integral conversions that do not change the precision. */ 8164 if (CONVERT_EXPR_P (op0) 8165 && (INTEGRAL_TYPE_P (TREE_TYPE (op0)) 8166 || POINTER_TYPE_P (TREE_TYPE (op0))) 8167 && (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))) 8168 || POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))) 8169 && (TYPE_PRECISION (TREE_TYPE (op0)) 8170 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0))))) 8171 return fold_build1_loc (loc, VIEW_CONVERT_EXPR, 8172 type, TREE_OPERAND (op0, 0)); 8173 8174 return fold_view_convert_expr (type, op0); 8175 8176 case NEGATE_EXPR: 8177 tem = fold_negate_expr (loc, arg0); 8178 if (tem) 8179 return fold_convert_loc (loc, type, tem); 8180 return NULL_TREE; 8181 8182 case ABS_EXPR: 8183 if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST) 8184 return fold_abs_const (arg0, type); 8185 else if (TREE_CODE (arg0) == NEGATE_EXPR) 8186 return fold_build1_loc (loc, ABS_EXPR, type, TREE_OPERAND (arg0, 0)); 8187 /* Convert fabs((double)float) into (double)fabsf(float). */ 8188 else if (TREE_CODE (arg0) == NOP_EXPR 8189 && TREE_CODE (type) == REAL_TYPE) 8190 { 8191 tree targ0 = strip_float_extensions (arg0); 8192 if (targ0 != arg0) 8193 return fold_convert_loc (loc, type, 8194 fold_build1_loc (loc, ABS_EXPR, 8195 TREE_TYPE (targ0), 8196 targ0)); 8197 } 8198 /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on. */ 8199 else if (TREE_CODE (arg0) == ABS_EXPR) 8200 return arg0; 8201 else if (tree_expr_nonnegative_p (arg0)) 8202 return arg0; 8203 8204 /* Strip sign ops from argument. */ 8205 if (TREE_CODE (type) == REAL_TYPE) 8206 { 8207 tem = fold_strip_sign_ops (arg0); 8208 if (tem) 8209 return fold_build1_loc (loc, ABS_EXPR, type, 8210 fold_convert_loc (loc, type, tem)); 8211 } 8212 return NULL_TREE; 8213 8214 case CONJ_EXPR: 8215 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE) 8216 return fold_convert_loc (loc, type, arg0); 8217 if (TREE_CODE (arg0) == COMPLEX_EXPR) 8218 { 8219 tree itype = TREE_TYPE (type); 8220 tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0)); 8221 tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1)); 8222 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, 8223 negate_expr (ipart)); 8224 } 8225 if (TREE_CODE (arg0) == COMPLEX_CST) 8226 { 8227 tree itype = TREE_TYPE (type); 8228 tree rpart = fold_convert_loc (loc, itype, TREE_REALPART (arg0)); 8229 tree ipart = fold_convert_loc (loc, itype, TREE_IMAGPART (arg0)); 8230 return build_complex (type, rpart, negate_expr (ipart)); 8231 } 8232 if (TREE_CODE (arg0) == CONJ_EXPR) 8233 return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 8234 return NULL_TREE; 8235 8236 case BIT_NOT_EXPR: 8237 if (TREE_CODE (arg0) == INTEGER_CST) 8238 return fold_not_const (arg0, type); 8239 else if (TREE_CODE (arg0) == BIT_NOT_EXPR) 8240 return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 8241 /* Convert ~ (-A) to A - 1. */ 8242 else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR) 8243 return fold_build2_loc (loc, MINUS_EXPR, type, 8244 fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)), 8245 build_int_cst (type, 1)); 8246 /* Convert ~ (A - 1) or ~ (A + -1) to -A. */ 8247 else if (INTEGRAL_TYPE_P (type) 8248 && ((TREE_CODE (arg0) == MINUS_EXPR 8249 && integer_onep (TREE_OPERAND (arg0, 1))) 8250 || (TREE_CODE (arg0) == PLUS_EXPR 8251 && integer_all_onesp (TREE_OPERAND (arg0, 1))))) 8252 { 8253 /* Perform the negation in ARG0's type and only then convert 8254 to TYPE as to avoid introducing undefined behavior. */ 8255 tree t = fold_build1_loc (loc, NEGATE_EXPR, 8256 TREE_TYPE (TREE_OPERAND (arg0, 0)), 8257 TREE_OPERAND (arg0, 0)); 8258 return fold_convert_loc (loc, type, t); 8259 } 8260 /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. */ 8261 else if (TREE_CODE (arg0) == BIT_XOR_EXPR 8262 && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type, 8263 fold_convert_loc (loc, type, 8264 TREE_OPERAND (arg0, 0))))) 8265 return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem, 8266 fold_convert_loc (loc, type, 8267 TREE_OPERAND (arg0, 1))); 8268 else if (TREE_CODE (arg0) == BIT_XOR_EXPR 8269 && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type, 8270 fold_convert_loc (loc, type, 8271 TREE_OPERAND (arg0, 1))))) 8272 return fold_build2_loc (loc, BIT_XOR_EXPR, type, 8273 fold_convert_loc (loc, type, 8274 TREE_OPERAND (arg0, 0)), tem); 8275 /* Perform BIT_NOT_EXPR on each element individually. */ 8276 else if (TREE_CODE (arg0) == VECTOR_CST) 8277 { 8278 tree *elements; 8279 tree elem; 8280 unsigned count = VECTOR_CST_NELTS (arg0), i; 8281 8282 elements = XALLOCAVEC (tree, count); 8283 for (i = 0; i < count; i++) 8284 { 8285 elem = VECTOR_CST_ELT (arg0, i); 8286 elem = fold_unary_loc (loc, BIT_NOT_EXPR, TREE_TYPE (type), elem); 8287 if (elem == NULL_TREE) 8288 break; 8289 elements[i] = elem; 8290 } 8291 if (i == count) 8292 return build_vector (type, elements); 8293 } 8294 8295 return NULL_TREE; 8296 8297 case TRUTH_NOT_EXPR: 8298 /* The argument to invert_truthvalue must have Boolean type. */ 8299 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE) 8300 arg0 = fold_convert_loc (loc, boolean_type_node, arg0); 8301 8302 /* Note that the operand of this must be an int 8303 and its values must be 0 or 1. 8304 ("true" is a fixed value perhaps depending on the language, 8305 but we don't handle values other than 1 correctly yet.) */ 8306 tem = fold_truth_not_expr (loc, arg0); 8307 if (!tem) 8308 return NULL_TREE; 8309 return fold_convert_loc (loc, type, tem); 8310 8311 case REALPART_EXPR: 8312 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE) 8313 return fold_convert_loc (loc, type, arg0); 8314 if (TREE_CODE (arg0) == COMPLEX_EXPR) 8315 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0), 8316 TREE_OPERAND (arg0, 1)); 8317 if (TREE_CODE (arg0) == COMPLEX_CST) 8318 return fold_convert_loc (loc, type, TREE_REALPART (arg0)); 8319 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) 8320 { 8321 tree itype = TREE_TYPE (TREE_TYPE (arg0)); 8322 tem = fold_build2_loc (loc, TREE_CODE (arg0), itype, 8323 fold_build1_loc (loc, REALPART_EXPR, itype, 8324 TREE_OPERAND (arg0, 0)), 8325 fold_build1_loc (loc, REALPART_EXPR, itype, 8326 TREE_OPERAND (arg0, 1))); 8327 return fold_convert_loc (loc, type, tem); 8328 } 8329 if (TREE_CODE (arg0) == CONJ_EXPR) 8330 { 8331 tree itype = TREE_TYPE (TREE_TYPE (arg0)); 8332 tem = fold_build1_loc (loc, REALPART_EXPR, itype, 8333 TREE_OPERAND (arg0, 0)); 8334 return fold_convert_loc (loc, type, tem); 8335 } 8336 if (TREE_CODE (arg0) == CALL_EXPR) 8337 { 8338 tree fn = get_callee_fndecl (arg0); 8339 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL) 8340 switch (DECL_FUNCTION_CODE (fn)) 8341 { 8342 CASE_FLT_FN (BUILT_IN_CEXPI): 8343 fn = mathfn_built_in (type, BUILT_IN_COS); 8344 if (fn) 8345 return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0)); 8346 break; 8347 8348 default: 8349 break; 8350 } 8351 } 8352 return NULL_TREE; 8353 8354 case IMAGPART_EXPR: 8355 if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE) 8356 return build_zero_cst (type); 8357 if (TREE_CODE (arg0) == COMPLEX_EXPR) 8358 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 1), 8359 TREE_OPERAND (arg0, 0)); 8360 if (TREE_CODE (arg0) == COMPLEX_CST) 8361 return fold_convert_loc (loc, type, TREE_IMAGPART (arg0)); 8362 if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) 8363 { 8364 tree itype = TREE_TYPE (TREE_TYPE (arg0)); 8365 tem = fold_build2_loc (loc, TREE_CODE (arg0), itype, 8366 fold_build1_loc (loc, IMAGPART_EXPR, itype, 8367 TREE_OPERAND (arg0, 0)), 8368 fold_build1_loc (loc, IMAGPART_EXPR, itype, 8369 TREE_OPERAND (arg0, 1))); 8370 return fold_convert_loc (loc, type, tem); 8371 } 8372 if (TREE_CODE (arg0) == CONJ_EXPR) 8373 { 8374 tree itype = TREE_TYPE (TREE_TYPE (arg0)); 8375 tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0)); 8376 return fold_convert_loc (loc, type, negate_expr (tem)); 8377 } 8378 if (TREE_CODE (arg0) == CALL_EXPR) 8379 { 8380 tree fn = get_callee_fndecl (arg0); 8381 if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL) 8382 switch (DECL_FUNCTION_CODE (fn)) 8383 { 8384 CASE_FLT_FN (BUILT_IN_CEXPI): 8385 fn = mathfn_built_in (type, BUILT_IN_SIN); 8386 if (fn) 8387 return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0)); 8388 break; 8389 8390 default: 8391 break; 8392 } 8393 } 8394 return NULL_TREE; 8395 8396 case INDIRECT_REF: 8397 /* Fold *&X to X if X is an lvalue. */ 8398 if (TREE_CODE (op0) == ADDR_EXPR) 8399 { 8400 tree op00 = TREE_OPERAND (op0, 0); 8401 if ((TREE_CODE (op00) == VAR_DECL 8402 || TREE_CODE (op00) == PARM_DECL 8403 || TREE_CODE (op00) == RESULT_DECL) 8404 && !TREE_READONLY (op00)) 8405 return op00; 8406 } 8407 return NULL_TREE; 8408 8409 case VEC_UNPACK_LO_EXPR: 8410 case VEC_UNPACK_HI_EXPR: 8411 case VEC_UNPACK_FLOAT_LO_EXPR: 8412 case VEC_UNPACK_FLOAT_HI_EXPR: 8413 { 8414 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i; 8415 tree *elts; 8416 enum tree_code subcode; 8417 8418 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2); 8419 if (TREE_CODE (arg0) != VECTOR_CST) 8420 return NULL_TREE; 8421 8422 elts = XALLOCAVEC (tree, nelts * 2); 8423 if (!vec_cst_ctor_to_array (arg0, elts)) 8424 return NULL_TREE; 8425 8426 if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_UNPACK_LO_EXPR 8427 || code == VEC_UNPACK_FLOAT_LO_EXPR)) 8428 elts += nelts; 8429 8430 if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR) 8431 subcode = NOP_EXPR; 8432 else 8433 subcode = FLOAT_EXPR; 8434 8435 for (i = 0; i < nelts; i++) 8436 { 8437 elts[i] = fold_convert_const (subcode, TREE_TYPE (type), elts[i]); 8438 if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i])) 8439 return NULL_TREE; 8440 } 8441 8442 return build_vector (type, elts); 8443 } 8444 8445 case REDUC_MIN_EXPR: 8446 case REDUC_MAX_EXPR: 8447 case REDUC_PLUS_EXPR: 8448 { 8449 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i; 8450 tree *elts; 8451 enum tree_code subcode; 8452 8453 if (TREE_CODE (op0) != VECTOR_CST) 8454 return NULL_TREE; 8455 8456 elts = XALLOCAVEC (tree, nelts); 8457 if (!vec_cst_ctor_to_array (op0, elts)) 8458 return NULL_TREE; 8459 8460 switch (code) 8461 { 8462 case REDUC_MIN_EXPR: subcode = MIN_EXPR; break; 8463 case REDUC_MAX_EXPR: subcode = MAX_EXPR; break; 8464 case REDUC_PLUS_EXPR: subcode = PLUS_EXPR; break; 8465 default: gcc_unreachable (); 8466 } 8467 8468 for (i = 1; i < nelts; i++) 8469 { 8470 elts[0] = const_binop (subcode, elts[0], elts[i]); 8471 if (elts[0] == NULL_TREE || !CONSTANT_CLASS_P (elts[0])) 8472 return NULL_TREE; 8473 elts[i] = build_zero_cst (TREE_TYPE (type)); 8474 } 8475 8476 return build_vector (type, elts); 8477 } 8478 8479 default: 8480 return NULL_TREE; 8481 } /* switch (code) */ 8482} 8483 8484 8485/* If the operation was a conversion do _not_ mark a resulting constant 8486 with TREE_OVERFLOW if the original constant was not. These conversions 8487 have implementation defined behavior and retaining the TREE_OVERFLOW 8488 flag here would confuse later passes such as VRP. */ 8489tree 8490fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code, 8491 tree type, tree op0) 8492{ 8493 tree res = fold_unary_loc (loc, code, type, op0); 8494 if (res 8495 && TREE_CODE (res) == INTEGER_CST 8496 && TREE_CODE (op0) == INTEGER_CST 8497 && CONVERT_EXPR_CODE_P (code)) 8498 TREE_OVERFLOW (res) = TREE_OVERFLOW (op0); 8499 8500 return res; 8501} 8502 8503/* Fold a binary bitwise/truth expression of code CODE and type TYPE with 8504 operands OP0 and OP1. LOC is the location of the resulting expression. 8505 ARG0 and ARG1 are the NOP_STRIPed results of OP0 and OP1. 8506 Return the folded expression if folding is successful. Otherwise, 8507 return NULL_TREE. */ 8508static tree 8509fold_truth_andor (location_t loc, enum tree_code code, tree type, 8510 tree arg0, tree arg1, tree op0, tree op1) 8511{ 8512 tree tem; 8513 8514 /* We only do these simplifications if we are optimizing. */ 8515 if (!optimize) 8516 return NULL_TREE; 8517 8518 /* Check for things like (A || B) && (A || C). We can convert this 8519 to A || (B && C). Note that either operator can be any of the four 8520 truth and/or operations and the transformation will still be 8521 valid. Also note that we only care about order for the 8522 ANDIF and ORIF operators. If B contains side effects, this 8523 might change the truth-value of A. */ 8524 if (TREE_CODE (arg0) == TREE_CODE (arg1) 8525 && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR 8526 || TREE_CODE (arg0) == TRUTH_ORIF_EXPR 8527 || TREE_CODE (arg0) == TRUTH_AND_EXPR 8528 || TREE_CODE (arg0) == TRUTH_OR_EXPR) 8529 && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1))) 8530 { 8531 tree a00 = TREE_OPERAND (arg0, 0); 8532 tree a01 = TREE_OPERAND (arg0, 1); 8533 tree a10 = TREE_OPERAND (arg1, 0); 8534 tree a11 = TREE_OPERAND (arg1, 1); 8535 int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR 8536 || TREE_CODE (arg0) == TRUTH_AND_EXPR) 8537 && (code == TRUTH_AND_EXPR 8538 || code == TRUTH_OR_EXPR)); 8539 8540 if (operand_equal_p (a00, a10, 0)) 8541 return fold_build2_loc (loc, TREE_CODE (arg0), type, a00, 8542 fold_build2_loc (loc, code, type, a01, a11)); 8543 else if (commutative && operand_equal_p (a00, a11, 0)) 8544 return fold_build2_loc (loc, TREE_CODE (arg0), type, a00, 8545 fold_build2_loc (loc, code, type, a01, a10)); 8546 else if (commutative && operand_equal_p (a01, a10, 0)) 8547 return fold_build2_loc (loc, TREE_CODE (arg0), type, a01, 8548 fold_build2_loc (loc, code, type, a00, a11)); 8549 8550 /* This case if tricky because we must either have commutative 8551 operators or else A10 must not have side-effects. */ 8552 8553 else if ((commutative || ! TREE_SIDE_EFFECTS (a10)) 8554 && operand_equal_p (a01, a11, 0)) 8555 return fold_build2_loc (loc, TREE_CODE (arg0), type, 8556 fold_build2_loc (loc, code, type, a00, a10), 8557 a01); 8558 } 8559 8560 /* See if we can build a range comparison. */ 8561 if (0 != (tem = fold_range_test (loc, code, type, op0, op1))) 8562 return tem; 8563 8564 if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg0) == TRUTH_ORIF_EXPR) 8565 || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg0) == TRUTH_ANDIF_EXPR)) 8566 { 8567 tem = merge_truthop_with_opposite_arm (loc, arg0, arg1, true); 8568 if (tem) 8569 return fold_build2_loc (loc, code, type, tem, arg1); 8570 } 8571 8572 if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg1) == TRUTH_ORIF_EXPR) 8573 || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg1) == TRUTH_ANDIF_EXPR)) 8574 { 8575 tem = merge_truthop_with_opposite_arm (loc, arg1, arg0, false); 8576 if (tem) 8577 return fold_build2_loc (loc, code, type, arg0, tem); 8578 } 8579 8580 /* Check for the possibility of merging component references. If our 8581 lhs is another similar operation, try to merge its rhs with our 8582 rhs. Then try to merge our lhs and rhs. */ 8583 if (TREE_CODE (arg0) == code 8584 && 0 != (tem = fold_truth_andor_1 (loc, code, type, 8585 TREE_OPERAND (arg0, 1), arg1))) 8586 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); 8587 8588 if ((tem = fold_truth_andor_1 (loc, code, type, arg0, arg1)) != 0) 8589 return tem; 8590 8591 if (LOGICAL_OP_NON_SHORT_CIRCUIT 8592 && (code == TRUTH_AND_EXPR 8593 || code == TRUTH_ANDIF_EXPR 8594 || code == TRUTH_OR_EXPR 8595 || code == TRUTH_ORIF_EXPR)) 8596 { 8597 enum tree_code ncode, icode; 8598 8599 ncode = (code == TRUTH_ANDIF_EXPR || code == TRUTH_AND_EXPR) 8600 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR; 8601 icode = ncode == TRUTH_AND_EXPR ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR; 8602 8603 /* Transform ((A AND-IF B) AND[-IF] C) into (A AND-IF (B AND C)), 8604 or ((A OR-IF B) OR[-IF] C) into (A OR-IF (B OR C)) 8605 We don't want to pack more than two leafs to a non-IF AND/OR 8606 expression. 8607 If tree-code of left-hand operand isn't an AND/OR-IF code and not 8608 equal to IF-CODE, then we don't want to add right-hand operand. 8609 If the inner right-hand side of left-hand operand has 8610 side-effects, or isn't simple, then we can't add to it, 8611 as otherwise we might destroy if-sequence. */ 8612 if (TREE_CODE (arg0) == icode 8613 && simple_operand_p_2 (arg1) 8614 /* Needed for sequence points to handle trappings, and 8615 side-effects. */ 8616 && simple_operand_p_2 (TREE_OPERAND (arg0, 1))) 8617 { 8618 tem = fold_build2_loc (loc, ncode, type, TREE_OPERAND (arg0, 1), 8619 arg1); 8620 return fold_build2_loc (loc, icode, type, TREE_OPERAND (arg0, 0), 8621 tem); 8622 } 8623 /* Same as abouve but for (A AND[-IF] (B AND-IF C)) -> ((A AND B) AND-IF C), 8624 or (A OR[-IF] (B OR-IF C) -> ((A OR B) OR-IF C). */ 8625 else if (TREE_CODE (arg1) == icode 8626 && simple_operand_p_2 (arg0) 8627 /* Needed for sequence points to handle trappings, and 8628 side-effects. */ 8629 && simple_operand_p_2 (TREE_OPERAND (arg1, 0))) 8630 { 8631 tem = fold_build2_loc (loc, ncode, type, 8632 arg0, TREE_OPERAND (arg1, 0)); 8633 return fold_build2_loc (loc, icode, type, tem, 8634 TREE_OPERAND (arg1, 1)); 8635 } 8636 /* Transform (A AND-IF B) into (A AND B), or (A OR-IF B) 8637 into (A OR B). 8638 For sequence point consistancy, we need to check for trapping, 8639 and side-effects. */ 8640 else if (code == icode && simple_operand_p_2 (arg0) 8641 && simple_operand_p_2 (arg1)) 8642 return fold_build2_loc (loc, ncode, type, arg0, arg1); 8643 } 8644 8645 return NULL_TREE; 8646} 8647 8648/* Fold a binary expression of code CODE and type TYPE with operands 8649 OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination. 8650 Return the folded expression if folding is successful. Otherwise, 8651 return NULL_TREE. */ 8652 8653static tree 8654fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1) 8655{ 8656 enum tree_code compl_code; 8657 8658 if (code == MIN_EXPR) 8659 compl_code = MAX_EXPR; 8660 else if (code == MAX_EXPR) 8661 compl_code = MIN_EXPR; 8662 else 8663 gcc_unreachable (); 8664 8665 /* MIN (MAX (a, b), b) == b. */ 8666 if (TREE_CODE (op0) == compl_code 8667 && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0)) 8668 return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0)); 8669 8670 /* MIN (MAX (b, a), b) == b. */ 8671 if (TREE_CODE (op0) == compl_code 8672 && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0) 8673 && reorder_operands_p (TREE_OPERAND (op0, 1), op1)) 8674 return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1)); 8675 8676 /* MIN (a, MAX (a, b)) == a. */ 8677 if (TREE_CODE (op1) == compl_code 8678 && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0) 8679 && reorder_operands_p (op0, TREE_OPERAND (op1, 1))) 8680 return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1)); 8681 8682 /* MIN (a, MAX (b, a)) == a. */ 8683 if (TREE_CODE (op1) == compl_code 8684 && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0) 8685 && reorder_operands_p (op0, TREE_OPERAND (op1, 0))) 8686 return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0)); 8687 8688 return NULL_TREE; 8689} 8690 8691/* Helper that tries to canonicalize the comparison ARG0 CODE ARG1 8692 by changing CODE to reduce the magnitude of constants involved in 8693 ARG0 of the comparison. 8694 Returns a canonicalized comparison tree if a simplification was 8695 possible, otherwise returns NULL_TREE. 8696 Set *STRICT_OVERFLOW_P to true if the canonicalization is only 8697 valid if signed overflow is undefined. */ 8698 8699static tree 8700maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type, 8701 tree arg0, tree arg1, 8702 bool *strict_overflow_p) 8703{ 8704 enum tree_code code0 = TREE_CODE (arg0); 8705 tree t, cst0 = NULL_TREE; 8706 int sgn0; 8707 bool swap = false; 8708 8709 /* Match A +- CST code arg1 and CST code arg1. We can change the 8710 first form only if overflow is undefined. */ 8711 if (!((TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)) 8712 /* In principle pointers also have undefined overflow behavior, 8713 but that causes problems elsewhere. */ 8714 && !POINTER_TYPE_P (TREE_TYPE (arg0)) 8715 && (code0 == MINUS_EXPR 8716 || code0 == PLUS_EXPR) 8717 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 8718 || code0 == INTEGER_CST)) 8719 return NULL_TREE; 8720 8721 /* Identify the constant in arg0 and its sign. */ 8722 if (code0 == INTEGER_CST) 8723 cst0 = arg0; 8724 else 8725 cst0 = TREE_OPERAND (arg0, 1); 8726 sgn0 = tree_int_cst_sgn (cst0); 8727 8728 /* Overflowed constants and zero will cause problems. */ 8729 if (integer_zerop (cst0) 8730 || TREE_OVERFLOW (cst0)) 8731 return NULL_TREE; 8732 8733 /* See if we can reduce the magnitude of the constant in 8734 arg0 by changing the comparison code. */ 8735 if (code0 == INTEGER_CST) 8736 { 8737 /* CST <= arg1 -> CST-1 < arg1. */ 8738 if (code == LE_EXPR && sgn0 == 1) 8739 code = LT_EXPR; 8740 /* -CST < arg1 -> -CST-1 <= arg1. */ 8741 else if (code == LT_EXPR && sgn0 == -1) 8742 code = LE_EXPR; 8743 /* CST > arg1 -> CST-1 >= arg1. */ 8744 else if (code == GT_EXPR && sgn0 == 1) 8745 code = GE_EXPR; 8746 /* -CST >= arg1 -> -CST-1 > arg1. */ 8747 else if (code == GE_EXPR && sgn0 == -1) 8748 code = GT_EXPR; 8749 else 8750 return NULL_TREE; 8751 /* arg1 code' CST' might be more canonical. */ 8752 swap = true; 8753 } 8754 else 8755 { 8756 /* A - CST < arg1 -> A - CST-1 <= arg1. */ 8757 if (code == LT_EXPR 8758 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR)) 8759 code = LE_EXPR; 8760 /* A + CST > arg1 -> A + CST-1 >= arg1. */ 8761 else if (code == GT_EXPR 8762 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR)) 8763 code = GE_EXPR; 8764 /* A + CST <= arg1 -> A + CST-1 < arg1. */ 8765 else if (code == LE_EXPR 8766 && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR)) 8767 code = LT_EXPR; 8768 /* A - CST >= arg1 -> A - CST-1 > arg1. */ 8769 else if (code == GE_EXPR 8770 && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR)) 8771 code = GT_EXPR; 8772 else 8773 return NULL_TREE; 8774 *strict_overflow_p = true; 8775 } 8776 8777 /* Now build the constant reduced in magnitude. But not if that 8778 would produce one outside of its types range. */ 8779 if (INTEGRAL_TYPE_P (TREE_TYPE (cst0)) 8780 && ((sgn0 == 1 8781 && TYPE_MIN_VALUE (TREE_TYPE (cst0)) 8782 && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0)))) 8783 || (sgn0 == -1 8784 && TYPE_MAX_VALUE (TREE_TYPE (cst0)) 8785 && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0)))))) 8786 /* We cannot swap the comparison here as that would cause us to 8787 endlessly recurse. */ 8788 return NULL_TREE; 8789 8790 t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR, 8791 cst0, build_int_cst (TREE_TYPE (cst0), 1)); 8792 if (code0 != INTEGER_CST) 8793 t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t); 8794 t = fold_convert (TREE_TYPE (arg1), t); 8795 8796 /* If swapping might yield to a more canonical form, do so. */ 8797 if (swap) 8798 return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t); 8799 else 8800 return fold_build2_loc (loc, code, type, t, arg1); 8801} 8802 8803/* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined 8804 overflow further. Try to decrease the magnitude of constants involved 8805 by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa 8806 and put sole constants at the second argument position. 8807 Returns the canonicalized tree if changed, otherwise NULL_TREE. */ 8808 8809static tree 8810maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type, 8811 tree arg0, tree arg1) 8812{ 8813 tree t; 8814 bool strict_overflow_p; 8815 const char * const warnmsg = G_("assuming signed overflow does not occur " 8816 "when reducing constant in comparison"); 8817 8818 /* Try canonicalization by simplifying arg0. */ 8819 strict_overflow_p = false; 8820 t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1, 8821 &strict_overflow_p); 8822 if (t) 8823 { 8824 if (strict_overflow_p) 8825 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE); 8826 return t; 8827 } 8828 8829 /* Try canonicalization by simplifying arg1 using the swapped 8830 comparison. */ 8831 code = swap_tree_comparison (code); 8832 strict_overflow_p = false; 8833 t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0, 8834 &strict_overflow_p); 8835 if (t && strict_overflow_p) 8836 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE); 8837 return t; 8838} 8839 8840/* Return whether BASE + OFFSET + BITPOS may wrap around the address 8841 space. This is used to avoid issuing overflow warnings for 8842 expressions like &p->x which can not wrap. */ 8843 8844static bool 8845pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos) 8846{ 8847 double_int di_offset, total; 8848 8849 if (!POINTER_TYPE_P (TREE_TYPE (base))) 8850 return true; 8851 8852 if (bitpos < 0) 8853 return true; 8854 8855 if (offset == NULL_TREE) 8856 di_offset = double_int_zero; 8857 else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset)) 8858 return true; 8859 else 8860 di_offset = TREE_INT_CST (offset); 8861 8862 bool overflow; 8863 double_int units = double_int::from_uhwi (bitpos / BITS_PER_UNIT); 8864 total = di_offset.add_with_sign (units, true, &overflow); 8865 if (overflow) 8866 return true; 8867 8868 if (total.high != 0) 8869 return true; 8870 8871 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base))); 8872 if (size <= 0) 8873 return true; 8874 8875 /* We can do slightly better for SIZE if we have an ADDR_EXPR of an 8876 array. */ 8877 if (TREE_CODE (base) == ADDR_EXPR) 8878 { 8879 HOST_WIDE_INT base_size; 8880 8881 base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0))); 8882 if (base_size > 0 && size < base_size) 8883 size = base_size; 8884 } 8885 8886 return total.low > (unsigned HOST_WIDE_INT) size; 8887} 8888 8889/* Subroutine of fold_binary. This routine performs all of the 8890 transformations that are common to the equality/inequality 8891 operators (EQ_EXPR and NE_EXPR) and the ordering operators 8892 (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR). Callers other than 8893 fold_binary should call fold_binary. Fold a comparison with 8894 tree code CODE and type TYPE with operands OP0 and OP1. Return 8895 the folded comparison or NULL_TREE. */ 8896 8897static tree 8898fold_comparison (location_t loc, enum tree_code code, tree type, 8899 tree op0, tree op1) 8900{ 8901 tree arg0, arg1, tem; 8902 8903 arg0 = op0; 8904 arg1 = op1; 8905 8906 STRIP_SIGN_NOPS (arg0); 8907 STRIP_SIGN_NOPS (arg1); 8908 8909 tem = fold_relational_const (code, type, arg0, arg1); 8910 if (tem != NULL_TREE) 8911 return tem; 8912 8913 /* If one arg is a real or integer constant, put it last. */ 8914 if (tree_swap_operands_p (arg0, arg1, true)) 8915 return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0); 8916 8917 /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1. */ 8918 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) 8919 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 8920 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)) 8921 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 8922 && (TREE_CODE (arg1) == INTEGER_CST 8923 && !TREE_OVERFLOW (arg1))) 8924 { 8925 tree const1 = TREE_OPERAND (arg0, 1); 8926 tree const2 = arg1; 8927 tree variable = TREE_OPERAND (arg0, 0); 8928 tree lhs; 8929 int lhs_add; 8930 lhs_add = TREE_CODE (arg0) != PLUS_EXPR; 8931 8932 lhs = fold_build2_loc (loc, lhs_add ? PLUS_EXPR : MINUS_EXPR, 8933 TREE_TYPE (arg1), const2, const1); 8934 8935 /* If the constant operation overflowed this can be 8936 simplified as a comparison against INT_MAX/INT_MIN. */ 8937 if (TREE_CODE (lhs) == INTEGER_CST 8938 && TREE_OVERFLOW (lhs) 8939 && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))) 8940 { 8941 int const1_sgn = tree_int_cst_sgn (const1); 8942 enum tree_code code2 = code; 8943 8944 /* Get the sign of the constant on the lhs if the 8945 operation were VARIABLE + CONST1. */ 8946 if (TREE_CODE (arg0) == MINUS_EXPR) 8947 const1_sgn = -const1_sgn; 8948 8949 /* The sign of the constant determines if we overflowed 8950 INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1). 8951 Canonicalize to the INT_MIN overflow by swapping the comparison 8952 if necessary. */ 8953 if (const1_sgn == -1) 8954 code2 = swap_tree_comparison (code); 8955 8956 /* We now can look at the canonicalized case 8957 VARIABLE + 1 CODE2 INT_MIN 8958 and decide on the result. */ 8959 if (code2 == LT_EXPR 8960 || code2 == LE_EXPR 8961 || code2 == EQ_EXPR) 8962 return omit_one_operand_loc (loc, type, boolean_false_node, variable); 8963 else if (code2 == NE_EXPR 8964 || code2 == GE_EXPR 8965 || code2 == GT_EXPR) 8966 return omit_one_operand_loc (loc, type, boolean_true_node, variable); 8967 } 8968 8969 if (TREE_CODE (lhs) == TREE_CODE (arg1) 8970 && (TREE_CODE (lhs) != INTEGER_CST 8971 || !TREE_OVERFLOW (lhs))) 8972 { 8973 if (code != EQ_EXPR && code != NE_EXPR) 8974 fold_overflow_warning ("assuming signed overflow does not occur " 8975 "when changing X +- C1 cmp C2 to " 8976 "X cmp C1 +- C2", 8977 WARN_STRICT_OVERFLOW_COMPARISON); 8978 return fold_build2_loc (loc, code, type, variable, lhs); 8979 } 8980 } 8981 8982 /* For comparisons of pointers we can decompose it to a compile time 8983 comparison of the base objects and the offsets into the object. 8984 This requires at least one operand being an ADDR_EXPR or a 8985 POINTER_PLUS_EXPR to do more than the operand_equal_p test below. */ 8986 if (POINTER_TYPE_P (TREE_TYPE (arg0)) 8987 && (TREE_CODE (arg0) == ADDR_EXPR 8988 || TREE_CODE (arg1) == ADDR_EXPR 8989 || TREE_CODE (arg0) == POINTER_PLUS_EXPR 8990 || TREE_CODE (arg1) == POINTER_PLUS_EXPR)) 8991 { 8992 tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE; 8993 HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0; 8994 enum machine_mode mode; 8995 int volatilep, unsignedp; 8996 bool indirect_base0 = false, indirect_base1 = false; 8997 8998 /* Get base and offset for the access. Strip ADDR_EXPR for 8999 get_inner_reference, but put it back by stripping INDIRECT_REF 9000 off the base object if possible. indirect_baseN will be true 9001 if baseN is not an address but refers to the object itself. */ 9002 base0 = arg0; 9003 if (TREE_CODE (arg0) == ADDR_EXPR) 9004 { 9005 base0 = get_inner_reference (TREE_OPERAND (arg0, 0), 9006 &bitsize, &bitpos0, &offset0, &mode, 9007 &unsignedp, &volatilep, false); 9008 if (TREE_CODE (base0) == INDIRECT_REF) 9009 base0 = TREE_OPERAND (base0, 0); 9010 else 9011 indirect_base0 = true; 9012 } 9013 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR) 9014 { 9015 base0 = TREE_OPERAND (arg0, 0); 9016 STRIP_SIGN_NOPS (base0); 9017 if (TREE_CODE (base0) == ADDR_EXPR) 9018 { 9019 base0 = TREE_OPERAND (base0, 0); 9020 indirect_base0 = true; 9021 } 9022 offset0 = TREE_OPERAND (arg0, 1); 9023 if (host_integerp (offset0, 0)) 9024 { 9025 HOST_WIDE_INT off = size_low_cst (offset0); 9026 if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off) 9027 * BITS_PER_UNIT) 9028 / BITS_PER_UNIT == (HOST_WIDE_INT) off) 9029 { 9030 bitpos0 = off * BITS_PER_UNIT; 9031 offset0 = NULL_TREE; 9032 } 9033 } 9034 } 9035 9036 base1 = arg1; 9037 if (TREE_CODE (arg1) == ADDR_EXPR) 9038 { 9039 base1 = get_inner_reference (TREE_OPERAND (arg1, 0), 9040 &bitsize, &bitpos1, &offset1, &mode, 9041 &unsignedp, &volatilep, false); 9042 if (TREE_CODE (base1) == INDIRECT_REF) 9043 base1 = TREE_OPERAND (base1, 0); 9044 else 9045 indirect_base1 = true; 9046 } 9047 else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR) 9048 { 9049 base1 = TREE_OPERAND (arg1, 0); 9050 STRIP_SIGN_NOPS (base1); 9051 if (TREE_CODE (base1) == ADDR_EXPR) 9052 { 9053 base1 = TREE_OPERAND (base1, 0); 9054 indirect_base1 = true; 9055 } 9056 offset1 = TREE_OPERAND (arg1, 1); 9057 if (host_integerp (offset1, 0)) 9058 { 9059 HOST_WIDE_INT off = size_low_cst (offset1); 9060 if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off) 9061 * BITS_PER_UNIT) 9062 / BITS_PER_UNIT == (HOST_WIDE_INT) off) 9063 { 9064 bitpos1 = off * BITS_PER_UNIT; 9065 offset1 = NULL_TREE; 9066 } 9067 } 9068 } 9069 9070 /* A local variable can never be pointed to by 9071 the default SSA name of an incoming parameter. */ 9072 if ((TREE_CODE (arg0) == ADDR_EXPR 9073 && indirect_base0 9074 && TREE_CODE (base0) == VAR_DECL 9075 && auto_var_in_fn_p (base0, current_function_decl) 9076 && !indirect_base1 9077 && TREE_CODE (base1) == SSA_NAME 9078 && SSA_NAME_IS_DEFAULT_DEF (base1) 9079 && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL) 9080 || (TREE_CODE (arg1) == ADDR_EXPR 9081 && indirect_base1 9082 && TREE_CODE (base1) == VAR_DECL 9083 && auto_var_in_fn_p (base1, current_function_decl) 9084 && !indirect_base0 9085 && TREE_CODE (base0) == SSA_NAME 9086 && SSA_NAME_IS_DEFAULT_DEF (base0) 9087 && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL)) 9088 { 9089 if (code == NE_EXPR) 9090 return constant_boolean_node (1, type); 9091 else if (code == EQ_EXPR) 9092 return constant_boolean_node (0, type); 9093 } 9094 /* If we have equivalent bases we might be able to simplify. */ 9095 else if (indirect_base0 == indirect_base1 9096 && operand_equal_p (base0, base1, 0)) 9097 { 9098 /* We can fold this expression to a constant if the non-constant 9099 offset parts are equal. */ 9100 if ((offset0 == offset1 9101 || (offset0 && offset1 9102 && operand_equal_p (offset0, offset1, 0))) 9103 && (code == EQ_EXPR 9104 || code == NE_EXPR 9105 || (indirect_base0 && DECL_P (base0)) 9106 || POINTER_TYPE_OVERFLOW_UNDEFINED)) 9107 9108 { 9109 if (code != EQ_EXPR 9110 && code != NE_EXPR 9111 && bitpos0 != bitpos1 9112 && (pointer_may_wrap_p (base0, offset0, bitpos0) 9113 || pointer_may_wrap_p (base1, offset1, bitpos1))) 9114 fold_overflow_warning (("assuming pointer wraparound does not " 9115 "occur when comparing P +- C1 with " 9116 "P +- C2"), 9117 WARN_STRICT_OVERFLOW_CONDITIONAL); 9118 9119 switch (code) 9120 { 9121 case EQ_EXPR: 9122 return constant_boolean_node (bitpos0 == bitpos1, type); 9123 case NE_EXPR: 9124 return constant_boolean_node (bitpos0 != bitpos1, type); 9125 case LT_EXPR: 9126 return constant_boolean_node (bitpos0 < bitpos1, type); 9127 case LE_EXPR: 9128 return constant_boolean_node (bitpos0 <= bitpos1, type); 9129 case GE_EXPR: 9130 return constant_boolean_node (bitpos0 >= bitpos1, type); 9131 case GT_EXPR: 9132 return constant_boolean_node (bitpos0 > bitpos1, type); 9133 default:; 9134 } 9135 } 9136 /* We can simplify the comparison to a comparison of the variable 9137 offset parts if the constant offset parts are equal. 9138 Be careful to use signed sizetype here because otherwise we 9139 mess with array offsets in the wrong way. This is possible 9140 because pointer arithmetic is restricted to retain within an 9141 object and overflow on pointer differences is undefined as of 9142 6.5.6/8 and /9 with respect to the signed ptrdiff_t. */ 9143 else if (bitpos0 == bitpos1 9144 && ((code == EQ_EXPR || code == NE_EXPR) 9145 || (indirect_base0 && DECL_P (base0)) 9146 || POINTER_TYPE_OVERFLOW_UNDEFINED)) 9147 { 9148 /* By converting to signed sizetype we cover middle-end pointer 9149 arithmetic which operates on unsigned pointer types of size 9150 type size and ARRAY_REF offsets which are properly sign or 9151 zero extended from their type in case it is narrower than 9152 sizetype. */ 9153 if (offset0 == NULL_TREE) 9154 offset0 = build_int_cst (ssizetype, 0); 9155 else 9156 offset0 = fold_convert_loc (loc, ssizetype, offset0); 9157 if (offset1 == NULL_TREE) 9158 offset1 = build_int_cst (ssizetype, 0); 9159 else 9160 offset1 = fold_convert_loc (loc, ssizetype, offset1); 9161 9162 if (code != EQ_EXPR 9163 && code != NE_EXPR 9164 && (pointer_may_wrap_p (base0, offset0, bitpos0) 9165 || pointer_may_wrap_p (base1, offset1, bitpos1))) 9166 fold_overflow_warning (("assuming pointer wraparound does not " 9167 "occur when comparing P +- C1 with " 9168 "P +- C2"), 9169 WARN_STRICT_OVERFLOW_COMPARISON); 9170 9171 return fold_build2_loc (loc, code, type, offset0, offset1); 9172 } 9173 } 9174 /* For non-equal bases we can simplify if they are addresses 9175 of local binding decls or constants. */ 9176 else if (indirect_base0 && indirect_base1 9177 /* We know that !operand_equal_p (base0, base1, 0) 9178 because the if condition was false. But make 9179 sure two decls are not the same. */ 9180 && base0 != base1 9181 && TREE_CODE (arg0) == ADDR_EXPR 9182 && TREE_CODE (arg1) == ADDR_EXPR 9183 && (((TREE_CODE (base0) == VAR_DECL 9184 || TREE_CODE (base0) == PARM_DECL) 9185 && (targetm.binds_local_p (base0) 9186 || CONSTANT_CLASS_P (base1))) 9187 || CONSTANT_CLASS_P (base0)) 9188 && (((TREE_CODE (base1) == VAR_DECL 9189 || TREE_CODE (base1) == PARM_DECL) 9190 && (targetm.binds_local_p (base1) 9191 || CONSTANT_CLASS_P (base0))) 9192 || CONSTANT_CLASS_P (base1))) 9193 { 9194 if (code == EQ_EXPR) 9195 return omit_two_operands_loc (loc, type, boolean_false_node, 9196 arg0, arg1); 9197 else if (code == NE_EXPR) 9198 return omit_two_operands_loc (loc, type, boolean_true_node, 9199 arg0, arg1); 9200 } 9201 /* For equal offsets we can simplify to a comparison of the 9202 base addresses. */ 9203 else if (bitpos0 == bitpos1 9204 && (indirect_base0 9205 ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0) 9206 && (indirect_base1 9207 ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1) 9208 && ((offset0 == offset1) 9209 || (offset0 && offset1 9210 && operand_equal_p (offset0, offset1, 0)))) 9211 { 9212 if (indirect_base0) 9213 base0 = build_fold_addr_expr_loc (loc, base0); 9214 if (indirect_base1) 9215 base1 = build_fold_addr_expr_loc (loc, base1); 9216 return fold_build2_loc (loc, code, type, base0, base1); 9217 } 9218 } 9219 9220 /* Transform comparisons of the form X +- C1 CMP Y +- C2 to 9221 X CMP Y +- C2 +- C1 for signed X, Y. This is valid if 9222 the resulting offset is smaller in absolute value than the 9223 original one and has the same sign. */ 9224 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)) 9225 && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) 9226 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 9227 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))) 9228 && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR) 9229 && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST 9230 && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1)))) 9231 { 9232 tree const1 = TREE_OPERAND (arg0, 1); 9233 tree const2 = TREE_OPERAND (arg1, 1); 9234 tree variable1 = TREE_OPERAND (arg0, 0); 9235 tree variable2 = TREE_OPERAND (arg1, 0); 9236 tree cst; 9237 const char * const warnmsg = G_("assuming signed overflow does not " 9238 "occur when combining constants around " 9239 "a comparison"); 9240 9241 /* Put the constant on the side where it doesn't overflow and is 9242 of lower absolute value and of same sign than before. */ 9243 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1) 9244 ? MINUS_EXPR : PLUS_EXPR, 9245 const2, const1); 9246 if (!TREE_OVERFLOW (cst) 9247 && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2) 9248 && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2)) 9249 { 9250 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON); 9251 return fold_build2_loc (loc, code, type, 9252 variable1, 9253 fold_build2_loc (loc, TREE_CODE (arg1), 9254 TREE_TYPE (arg1), 9255 variable2, cst)); 9256 } 9257 9258 cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1) 9259 ? MINUS_EXPR : PLUS_EXPR, 9260 const1, const2); 9261 if (!TREE_OVERFLOW (cst) 9262 && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1) 9263 && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1)) 9264 { 9265 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON); 9266 return fold_build2_loc (loc, code, type, 9267 fold_build2_loc (loc, TREE_CODE (arg0), 9268 TREE_TYPE (arg0), 9269 variable1, cst), 9270 variable2); 9271 } 9272 } 9273 9274 /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the 9275 signed arithmetic case. That form is created by the compiler 9276 often enough for folding it to be of value. One example is in 9277 computing loop trip counts after Operator Strength Reduction. */ 9278 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)) 9279 && TREE_CODE (arg0) == MULT_EXPR 9280 && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 9281 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))) 9282 && integer_zerop (arg1)) 9283 { 9284 tree const1 = TREE_OPERAND (arg0, 1); 9285 tree const2 = arg1; /* zero */ 9286 tree variable1 = TREE_OPERAND (arg0, 0); 9287 enum tree_code cmp_code = code; 9288 9289 /* Handle unfolded multiplication by zero. */ 9290 if (integer_zerop (const1)) 9291 return fold_build2_loc (loc, cmp_code, type, const1, const2); 9292 9293 fold_overflow_warning (("assuming signed overflow does not occur when " 9294 "eliminating multiplication in comparison " 9295 "with zero"), 9296 WARN_STRICT_OVERFLOW_COMPARISON); 9297 9298 /* If const1 is negative we swap the sense of the comparison. */ 9299 if (tree_int_cst_sgn (const1) < 0) 9300 cmp_code = swap_tree_comparison (cmp_code); 9301 9302 return fold_build2_loc (loc, cmp_code, type, variable1, const2); 9303 } 9304 9305 tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1); 9306 if (tem) 9307 return tem; 9308 9309 if (FLOAT_TYPE_P (TREE_TYPE (arg0))) 9310 { 9311 tree targ0 = strip_float_extensions (arg0); 9312 tree targ1 = strip_float_extensions (arg1); 9313 tree newtype = TREE_TYPE (targ0); 9314 9315 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype)) 9316 newtype = TREE_TYPE (targ1); 9317 9318 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */ 9319 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0))) 9320 return fold_build2_loc (loc, code, type, 9321 fold_convert_loc (loc, newtype, targ0), 9322 fold_convert_loc (loc, newtype, targ1)); 9323 9324 /* (-a) CMP (-b) -> b CMP a */ 9325 if (TREE_CODE (arg0) == NEGATE_EXPR 9326 && TREE_CODE (arg1) == NEGATE_EXPR) 9327 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0), 9328 TREE_OPERAND (arg0, 0)); 9329 9330 if (TREE_CODE (arg1) == REAL_CST) 9331 { 9332 REAL_VALUE_TYPE cst; 9333 cst = TREE_REAL_CST (arg1); 9334 9335 /* (-a) CMP CST -> a swap(CMP) (-CST) */ 9336 if (TREE_CODE (arg0) == NEGATE_EXPR) 9337 return fold_build2_loc (loc, swap_tree_comparison (code), type, 9338 TREE_OPERAND (arg0, 0), 9339 build_real (TREE_TYPE (arg1), 9340 real_value_negate (&cst))); 9341 9342 /* IEEE doesn't distinguish +0 and -0 in comparisons. */ 9343 /* a CMP (-0) -> a CMP 0 */ 9344 if (REAL_VALUE_MINUS_ZERO (cst)) 9345 return fold_build2_loc (loc, code, type, arg0, 9346 build_real (TREE_TYPE (arg1), dconst0)); 9347 9348 /* x != NaN is always true, other ops are always false. */ 9349 if (REAL_VALUE_ISNAN (cst) 9350 && ! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))) 9351 { 9352 tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node; 9353 return omit_one_operand_loc (loc, type, tem, arg0); 9354 } 9355 9356 /* Fold comparisons against infinity. */ 9357 if (REAL_VALUE_ISINF (cst) 9358 && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))) 9359 { 9360 tem = fold_inf_compare (loc, code, type, arg0, arg1); 9361 if (tem != NULL_TREE) 9362 return tem; 9363 } 9364 } 9365 9366 /* If this is a comparison of a real constant with a PLUS_EXPR 9367 or a MINUS_EXPR of a real constant, we can convert it into a 9368 comparison with a revised real constant as long as no overflow 9369 occurs when unsafe_math_optimizations are enabled. */ 9370 if (flag_unsafe_math_optimizations 9371 && TREE_CODE (arg1) == REAL_CST 9372 && (TREE_CODE (arg0) == PLUS_EXPR 9373 || TREE_CODE (arg0) == MINUS_EXPR) 9374 && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST 9375 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR 9376 ? MINUS_EXPR : PLUS_EXPR, 9377 arg1, TREE_OPERAND (arg0, 1))) 9378 && !TREE_OVERFLOW (tem)) 9379 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); 9380 9381 /* Likewise, we can simplify a comparison of a real constant with 9382 a MINUS_EXPR whose first operand is also a real constant, i.e. 9383 (c1 - x) < c2 becomes x > c1-c2. Reordering is allowed on 9384 floating-point types only if -fassociative-math is set. */ 9385 if (flag_associative_math 9386 && TREE_CODE (arg1) == REAL_CST 9387 && TREE_CODE (arg0) == MINUS_EXPR 9388 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST 9389 && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0), 9390 arg1)) 9391 && !TREE_OVERFLOW (tem)) 9392 return fold_build2_loc (loc, swap_tree_comparison (code), type, 9393 TREE_OPERAND (arg0, 1), tem); 9394 9395 /* Fold comparisons against built-in math functions. */ 9396 if (TREE_CODE (arg1) == REAL_CST 9397 && flag_unsafe_math_optimizations 9398 && ! flag_errno_math) 9399 { 9400 enum built_in_function fcode = builtin_mathfn_code (arg0); 9401 9402 if (fcode != END_BUILTINS) 9403 { 9404 tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1); 9405 if (tem != NULL_TREE) 9406 return tem; 9407 } 9408 } 9409 } 9410 9411 if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE 9412 && CONVERT_EXPR_P (arg0)) 9413 { 9414 /* If we are widening one operand of an integer comparison, 9415 see if the other operand is similarly being widened. Perhaps we 9416 can do the comparison in the narrower type. */ 9417 tem = fold_widened_comparison (loc, code, type, arg0, arg1); 9418 if (tem) 9419 return tem; 9420 9421 /* Or if we are changing signedness. */ 9422 tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1); 9423 if (tem) 9424 return tem; 9425 } 9426 9427 /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a 9428 constant, we can simplify it. */ 9429 if (TREE_CODE (arg1) == INTEGER_CST 9430 && (TREE_CODE (arg0) == MIN_EXPR 9431 || TREE_CODE (arg0) == MAX_EXPR) 9432 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 9433 { 9434 tem = optimize_minmax_comparison (loc, code, type, op0, op1); 9435 if (tem) 9436 return tem; 9437 } 9438 9439 /* Simplify comparison of something with itself. (For IEEE 9440 floating-point, we can only do some of these simplifications.) */ 9441 if (operand_equal_p (arg0, arg1, 0)) 9442 { 9443 switch (code) 9444 { 9445 case EQ_EXPR: 9446 if (! FLOAT_TYPE_P (TREE_TYPE (arg0)) 9447 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))) 9448 return constant_boolean_node (1, type); 9449 break; 9450 9451 case GE_EXPR: 9452 case LE_EXPR: 9453 if (! FLOAT_TYPE_P (TREE_TYPE (arg0)) 9454 || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))) 9455 return constant_boolean_node (1, type); 9456 return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1); 9457 9458 case NE_EXPR: 9459 /* For NE, we can only do this simplification if integer 9460 or we don't honor IEEE floating point NaNs. */ 9461 if (FLOAT_TYPE_P (TREE_TYPE (arg0)) 9462 && HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))) 9463 break; 9464 /* ... fall through ... */ 9465 case GT_EXPR: 9466 case LT_EXPR: 9467 return constant_boolean_node (0, type); 9468 default: 9469 gcc_unreachable (); 9470 } 9471 } 9472 9473 /* If we are comparing an expression that just has comparisons 9474 of two integer values, arithmetic expressions of those comparisons, 9475 and constants, we can simplify it. There are only three cases 9476 to check: the two values can either be equal, the first can be 9477 greater, or the second can be greater. Fold the expression for 9478 those three values. Since each value must be 0 or 1, we have 9479 eight possibilities, each of which corresponds to the constant 0 9480 or 1 or one of the six possible comparisons. 9481 9482 This handles common cases like (a > b) == 0 but also handles 9483 expressions like ((x > y) - (y > x)) > 0, which supposedly 9484 occur in macroized code. */ 9485 9486 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST) 9487 { 9488 tree cval1 = 0, cval2 = 0; 9489 int save_p = 0; 9490 9491 if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p) 9492 /* Don't handle degenerate cases here; they should already 9493 have been handled anyway. */ 9494 && cval1 != 0 && cval2 != 0 9495 && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2)) 9496 && TREE_TYPE (cval1) == TREE_TYPE (cval2) 9497 && INTEGRAL_TYPE_P (TREE_TYPE (cval1)) 9498 && TYPE_MAX_VALUE (TREE_TYPE (cval1)) 9499 && TYPE_MAX_VALUE (TREE_TYPE (cval2)) 9500 && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)), 9501 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0)) 9502 { 9503 tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1)); 9504 tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1)); 9505 9506 /* We can't just pass T to eval_subst in case cval1 or cval2 9507 was the same as ARG1. */ 9508 9509 tree high_result 9510 = fold_build2_loc (loc, code, type, 9511 eval_subst (loc, arg0, cval1, maxval, 9512 cval2, minval), 9513 arg1); 9514 tree equal_result 9515 = fold_build2_loc (loc, code, type, 9516 eval_subst (loc, arg0, cval1, maxval, 9517 cval2, maxval), 9518 arg1); 9519 tree low_result 9520 = fold_build2_loc (loc, code, type, 9521 eval_subst (loc, arg0, cval1, minval, 9522 cval2, maxval), 9523 arg1); 9524 9525 /* All three of these results should be 0 or 1. Confirm they are. 9526 Then use those values to select the proper code to use. */ 9527 9528 if (TREE_CODE (high_result) == INTEGER_CST 9529 && TREE_CODE (equal_result) == INTEGER_CST 9530 && TREE_CODE (low_result) == INTEGER_CST) 9531 { 9532 /* Make a 3-bit mask with the high-order bit being the 9533 value for `>', the next for '=', and the low for '<'. */ 9534 switch ((integer_onep (high_result) * 4) 9535 + (integer_onep (equal_result) * 2) 9536 + integer_onep (low_result)) 9537 { 9538 case 0: 9539 /* Always false. */ 9540 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 9541 case 1: 9542 code = LT_EXPR; 9543 break; 9544 case 2: 9545 code = EQ_EXPR; 9546 break; 9547 case 3: 9548 code = LE_EXPR; 9549 break; 9550 case 4: 9551 code = GT_EXPR; 9552 break; 9553 case 5: 9554 code = NE_EXPR; 9555 break; 9556 case 6: 9557 code = GE_EXPR; 9558 break; 9559 case 7: 9560 /* Always true. */ 9561 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 9562 } 9563 9564 if (save_p) 9565 { 9566 tem = save_expr (build2 (code, type, cval1, cval2)); 9567 SET_EXPR_LOCATION (tem, loc); 9568 return tem; 9569 } 9570 return fold_build2_loc (loc, code, type, cval1, cval2); 9571 } 9572 } 9573 } 9574 9575 /* We can fold X/C1 op C2 where C1 and C2 are integer constants 9576 into a single range test. */ 9577 if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR 9578 || TREE_CODE (arg0) == EXACT_DIV_EXPR) 9579 && TREE_CODE (arg1) == INTEGER_CST 9580 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 9581 && !integer_zerop (TREE_OPERAND (arg0, 1)) 9582 && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)) 9583 && !TREE_OVERFLOW (arg1)) 9584 { 9585 tem = fold_div_compare (loc, code, type, arg0, arg1); 9586 if (tem != NULL_TREE) 9587 return tem; 9588 } 9589 9590 /* Fold ~X op ~Y as Y op X. */ 9591 if (TREE_CODE (arg0) == BIT_NOT_EXPR 9592 && TREE_CODE (arg1) == BIT_NOT_EXPR) 9593 { 9594 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0)); 9595 return fold_build2_loc (loc, code, type, 9596 fold_convert_loc (loc, cmp_type, 9597 TREE_OPERAND (arg1, 0)), 9598 TREE_OPERAND (arg0, 0)); 9599 } 9600 9601 /* Fold ~X op C as X op' ~C, where op' is the swapped comparison. */ 9602 if (TREE_CODE (arg0) == BIT_NOT_EXPR 9603 && TREE_CODE (arg1) == INTEGER_CST) 9604 { 9605 tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0)); 9606 return fold_build2_loc (loc, swap_tree_comparison (code), type, 9607 TREE_OPERAND (arg0, 0), 9608 fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type, 9609 fold_convert_loc (loc, cmp_type, arg1))); 9610 } 9611 9612 return NULL_TREE; 9613} 9614 9615 9616/* Subroutine of fold_binary. Optimize complex multiplications of the 9617 form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2). The 9618 argument EXPR represents the expression "z" of type TYPE. */ 9619 9620static tree 9621fold_mult_zconjz (location_t loc, tree type, tree expr) 9622{ 9623 tree itype = TREE_TYPE (type); 9624 tree rpart, ipart, tem; 9625 9626 if (TREE_CODE (expr) == COMPLEX_EXPR) 9627 { 9628 rpart = TREE_OPERAND (expr, 0); 9629 ipart = TREE_OPERAND (expr, 1); 9630 } 9631 else if (TREE_CODE (expr) == COMPLEX_CST) 9632 { 9633 rpart = TREE_REALPART (expr); 9634 ipart = TREE_IMAGPART (expr); 9635 } 9636 else 9637 { 9638 expr = save_expr (expr); 9639 rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr); 9640 ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr); 9641 } 9642 9643 rpart = save_expr (rpart); 9644 ipart = save_expr (ipart); 9645 tem = fold_build2_loc (loc, PLUS_EXPR, itype, 9646 fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart), 9647 fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart)); 9648 return fold_build2_loc (loc, COMPLEX_EXPR, type, tem, 9649 build_zero_cst (itype)); 9650} 9651 9652 9653/* Subroutine of fold_binary. If P is the value of EXPR, computes 9654 power-of-two M and (arbitrary) N such that M divides (P-N). This condition 9655 guarantees that P and N have the same least significant log2(M) bits. 9656 N is not otherwise constrained. In particular, N is not normalized to 9657 0 <= N < M as is common. In general, the precise value of P is unknown. 9658 M is chosen as large as possible such that constant N can be determined. 9659 9660 Returns M and sets *RESIDUE to N. 9661 9662 If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into 9663 account. This is not always possible due to PR 35705. 9664 */ 9665 9666static unsigned HOST_WIDE_INT 9667get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue, 9668 bool allow_func_align) 9669{ 9670 enum tree_code code; 9671 9672 *residue = 0; 9673 9674 code = TREE_CODE (expr); 9675 if (code == ADDR_EXPR) 9676 { 9677 unsigned int bitalign; 9678 get_object_alignment_1 (TREE_OPERAND (expr, 0), &bitalign, residue); 9679 *residue /= BITS_PER_UNIT; 9680 return bitalign / BITS_PER_UNIT; 9681 } 9682 else if (code == POINTER_PLUS_EXPR) 9683 { 9684 tree op0, op1; 9685 unsigned HOST_WIDE_INT modulus; 9686 enum tree_code inner_code; 9687 9688 op0 = TREE_OPERAND (expr, 0); 9689 STRIP_NOPS (op0); 9690 modulus = get_pointer_modulus_and_residue (op0, residue, 9691 allow_func_align); 9692 9693 op1 = TREE_OPERAND (expr, 1); 9694 STRIP_NOPS (op1); 9695 inner_code = TREE_CODE (op1); 9696 if (inner_code == INTEGER_CST) 9697 { 9698 *residue += TREE_INT_CST_LOW (op1); 9699 return modulus; 9700 } 9701 else if (inner_code == MULT_EXPR) 9702 { 9703 op1 = TREE_OPERAND (op1, 1); 9704 if (TREE_CODE (op1) == INTEGER_CST) 9705 { 9706 unsigned HOST_WIDE_INT align; 9707 9708 /* Compute the greatest power-of-2 divisor of op1. */ 9709 align = TREE_INT_CST_LOW (op1); 9710 align &= -align; 9711 9712 /* If align is non-zero and less than *modulus, replace 9713 *modulus with align., If align is 0, then either op1 is 0 9714 or the greatest power-of-2 divisor of op1 doesn't fit in an 9715 unsigned HOST_WIDE_INT. In either case, no additional 9716 constraint is imposed. */ 9717 if (align) 9718 modulus = MIN (modulus, align); 9719 9720 return modulus; 9721 } 9722 } 9723 } 9724 9725 /* If we get here, we were unable to determine anything useful about the 9726 expression. */ 9727 return 1; 9728} 9729 9730/* Helper function for fold_vec_perm. Store elements of VECTOR_CST or 9731 CONSTRUCTOR ARG into array ELTS and return true if successful. */ 9732 9733static bool 9734vec_cst_ctor_to_array (tree arg, tree *elts) 9735{ 9736 unsigned int nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)), i; 9737 9738 if (TREE_CODE (arg) == VECTOR_CST) 9739 { 9740 for (i = 0; i < VECTOR_CST_NELTS (arg); ++i) 9741 elts[i] = VECTOR_CST_ELT (arg, i); 9742 } 9743 else if (TREE_CODE (arg) == CONSTRUCTOR) 9744 { 9745 constructor_elt *elt; 9746 9747 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (arg), i, elt) 9748 if (i >= nelts || TREE_CODE (TREE_TYPE (elt->value)) == VECTOR_TYPE) 9749 return false; 9750 else 9751 elts[i] = elt->value; 9752 } 9753 else 9754 return false; 9755 for (; i < nelts; i++) 9756 elts[i] 9757 = fold_convert (TREE_TYPE (TREE_TYPE (arg)), integer_zero_node); 9758 return true; 9759} 9760 9761/* Attempt to fold vector permutation of ARG0 and ARG1 vectors using SEL 9762 selector. Return the folded VECTOR_CST or CONSTRUCTOR if successful, 9763 NULL_TREE otherwise. */ 9764 9765static tree 9766fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel) 9767{ 9768 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i; 9769 tree *elts; 9770 bool need_ctor = false; 9771 9772 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts 9773 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts); 9774 if (TREE_TYPE (TREE_TYPE (arg0)) != TREE_TYPE (type) 9775 || TREE_TYPE (TREE_TYPE (arg1)) != TREE_TYPE (type)) 9776 return NULL_TREE; 9777 9778 elts = XALLOCAVEC (tree, nelts * 3); 9779 if (!vec_cst_ctor_to_array (arg0, elts) 9780 || !vec_cst_ctor_to_array (arg1, elts + nelts)) 9781 return NULL_TREE; 9782 9783 for (i = 0; i < nelts; i++) 9784 { 9785 if (!CONSTANT_CLASS_P (elts[sel[i]])) 9786 need_ctor = true; 9787 elts[i + 2 * nelts] = unshare_expr (elts[sel[i]]); 9788 } 9789 9790 if (need_ctor) 9791 { 9792 vec<constructor_elt, va_gc> *v; 9793 vec_alloc (v, nelts); 9794 for (i = 0; i < nelts; i++) 9795 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[2 * nelts + i]); 9796 return build_constructor (type, v); 9797 } 9798 else 9799 return build_vector (type, &elts[2 * nelts]); 9800} 9801 9802/* Try to fold a pointer difference of type TYPE two address expressions of 9803 array references AREF0 and AREF1 using location LOC. Return a 9804 simplified expression for the difference or NULL_TREE. */ 9805 9806static tree 9807fold_addr_of_array_ref_difference (location_t loc, tree type, 9808 tree aref0, tree aref1) 9809{ 9810 tree base0 = TREE_OPERAND (aref0, 0); 9811 tree base1 = TREE_OPERAND (aref1, 0); 9812 tree base_offset = build_int_cst (type, 0); 9813 9814 /* If the bases are array references as well, recurse. If the bases 9815 are pointer indirections compute the difference of the pointers. 9816 If the bases are equal, we are set. */ 9817 if ((TREE_CODE (base0) == ARRAY_REF 9818 && TREE_CODE (base1) == ARRAY_REF 9819 && (base_offset 9820 = fold_addr_of_array_ref_difference (loc, type, base0, base1))) 9821 || (INDIRECT_REF_P (base0) 9822 && INDIRECT_REF_P (base1) 9823 && (base_offset = fold_binary_loc (loc, MINUS_EXPR, type, 9824 TREE_OPERAND (base0, 0), 9825 TREE_OPERAND (base1, 0)))) 9826 || operand_equal_p (base0, base1, 0)) 9827 { 9828 tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1)); 9829 tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1)); 9830 tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0)); 9831 tree diff = build2 (MINUS_EXPR, type, op0, op1); 9832 return fold_build2_loc (loc, PLUS_EXPR, type, 9833 base_offset, 9834 fold_build2_loc (loc, MULT_EXPR, type, 9835 diff, esz)); 9836 } 9837 return NULL_TREE; 9838} 9839 9840/* If the real or vector real constant CST of type TYPE has an exact 9841 inverse, return it, else return NULL. */ 9842 9843static tree 9844exact_inverse (tree type, tree cst) 9845{ 9846 REAL_VALUE_TYPE r; 9847 tree unit_type, *elts; 9848 enum machine_mode mode; 9849 unsigned vec_nelts, i; 9850 9851 switch (TREE_CODE (cst)) 9852 { 9853 case REAL_CST: 9854 r = TREE_REAL_CST (cst); 9855 9856 if (exact_real_inverse (TYPE_MODE (type), &r)) 9857 return build_real (type, r); 9858 9859 return NULL_TREE; 9860 9861 case VECTOR_CST: 9862 vec_nelts = VECTOR_CST_NELTS (cst); 9863 elts = XALLOCAVEC (tree, vec_nelts); 9864 unit_type = TREE_TYPE (type); 9865 mode = TYPE_MODE (unit_type); 9866 9867 for (i = 0; i < vec_nelts; i++) 9868 { 9869 r = TREE_REAL_CST (VECTOR_CST_ELT (cst, i)); 9870 if (!exact_real_inverse (mode, &r)) 9871 return NULL_TREE; 9872 elts[i] = build_real (unit_type, r); 9873 } 9874 9875 return build_vector (type, elts); 9876 9877 default: 9878 return NULL_TREE; 9879 } 9880} 9881 9882/* Mask out the tz least significant bits of X of type TYPE where 9883 tz is the number of trailing zeroes in Y. */ 9884static double_int 9885mask_with_tz (tree type, double_int x, double_int y) 9886{ 9887 int tz = y.trailing_zeros (); 9888 9889 if (tz > 0) 9890 { 9891 double_int mask; 9892 9893 mask = ~double_int::mask (tz); 9894 mask = mask.ext (TYPE_PRECISION (type), TYPE_UNSIGNED (type)); 9895 return mask & x; 9896 } 9897 return x; 9898} 9899 9900/* Fold a binary expression of code CODE and type TYPE with operands 9901 OP0 and OP1. LOC is the location of the resulting expression. 9902 Return the folded expression if folding is successful. Otherwise, 9903 return NULL_TREE. */ 9904 9905tree 9906fold_binary_loc (location_t loc, 9907 enum tree_code code, tree type, tree op0, tree op1) 9908{ 9909 enum tree_code_class kind = TREE_CODE_CLASS (code); 9910 tree arg0, arg1, tem; 9911 tree t1 = NULL_TREE; 9912 bool strict_overflow_p; 9913 9914 gcc_assert (IS_EXPR_CODE_CLASS (kind) 9915 && TREE_CODE_LENGTH (code) == 2 9916 && op0 != NULL_TREE 9917 && op1 != NULL_TREE); 9918 9919 arg0 = op0; 9920 arg1 = op1; 9921 9922 /* Strip any conversions that don't change the mode. This is 9923 safe for every expression, except for a comparison expression 9924 because its signedness is derived from its operands. So, in 9925 the latter case, only strip conversions that don't change the 9926 signedness. MIN_EXPR/MAX_EXPR also need signedness of arguments 9927 preserved. 9928 9929 Note that this is done as an internal manipulation within the 9930 constant folder, in order to find the simplest representation 9931 of the arguments so that their form can be studied. In any 9932 cases, the appropriate type conversions should be put back in 9933 the tree that will get out of the constant folder. */ 9934 9935 if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR) 9936 { 9937 STRIP_SIGN_NOPS (arg0); 9938 STRIP_SIGN_NOPS (arg1); 9939 } 9940 else 9941 { 9942 STRIP_NOPS (arg0); 9943 STRIP_NOPS (arg1); 9944 } 9945 9946 /* Note that TREE_CONSTANT isn't enough: static var addresses are 9947 constant but we can't do arithmetic on them. */ 9948 if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) 9949 || (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST) 9950 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == FIXED_CST) 9951 || (TREE_CODE (arg0) == FIXED_CST && TREE_CODE (arg1) == INTEGER_CST) 9952 || (TREE_CODE (arg0) == COMPLEX_CST && TREE_CODE (arg1) == COMPLEX_CST) 9953 || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST) 9954 || (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == INTEGER_CST)) 9955 { 9956 if (kind == tcc_binary) 9957 { 9958 /* Make sure type and arg0 have the same saturating flag. */ 9959 gcc_assert (TYPE_SATURATING (type) 9960 == TYPE_SATURATING (TREE_TYPE (arg0))); 9961 tem = const_binop (code, arg0, arg1); 9962 } 9963 else if (kind == tcc_comparison) 9964 tem = fold_relational_const (code, type, arg0, arg1); 9965 else 9966 tem = NULL_TREE; 9967 9968 if (tem != NULL_TREE) 9969 { 9970 if (TREE_TYPE (tem) != type) 9971 tem = fold_convert_loc (loc, type, tem); 9972 return tem; 9973 } 9974 } 9975 9976 /* If this is a commutative operation, and ARG0 is a constant, move it 9977 to ARG1 to reduce the number of tests below. */ 9978 if (commutative_tree_code (code) 9979 && tree_swap_operands_p (arg0, arg1, true)) 9980 return fold_build2_loc (loc, code, type, op1, op0); 9981 9982 /* ARG0 is the first operand of EXPR, and ARG1 is the second operand. 9983 9984 First check for cases where an arithmetic operation is applied to a 9985 compound, conditional, or comparison operation. Push the arithmetic 9986 operation inside the compound or conditional to see if any folding 9987 can then be done. Convert comparison to conditional for this purpose. 9988 The also optimizes non-constant cases that used to be done in 9989 expand_expr. 9990 9991 Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR, 9992 one of the operands is a comparison and the other is a comparison, a 9993 BIT_AND_EXPR with the constant 1, or a truth value. In that case, the 9994 code below would make the expression more complex. Change it to a 9995 TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to 9996 TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */ 9997 9998 if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR 9999 || code == EQ_EXPR || code == NE_EXPR) 10000 && TREE_CODE (type) != VECTOR_TYPE 10001 && ((truth_value_p (TREE_CODE (arg0)) 10002 && (truth_value_p (TREE_CODE (arg1)) 10003 || (TREE_CODE (arg1) == BIT_AND_EXPR 10004 && integer_onep (TREE_OPERAND (arg1, 1))))) 10005 || (truth_value_p (TREE_CODE (arg1)) 10006 && (truth_value_p (TREE_CODE (arg0)) 10007 || (TREE_CODE (arg0) == BIT_AND_EXPR 10008 && integer_onep (TREE_OPERAND (arg0, 1))))))) 10009 { 10010 tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR 10011 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR 10012 : TRUTH_XOR_EXPR, 10013 boolean_type_node, 10014 fold_convert_loc (loc, boolean_type_node, arg0), 10015 fold_convert_loc (loc, boolean_type_node, arg1)); 10016 10017 if (code == EQ_EXPR) 10018 tem = invert_truthvalue_loc (loc, tem); 10019 10020 return fold_convert_loc (loc, type, tem); 10021 } 10022 10023 if (TREE_CODE_CLASS (code) == tcc_binary 10024 || TREE_CODE_CLASS (code) == tcc_comparison) 10025 { 10026 if (TREE_CODE (arg0) == COMPOUND_EXPR) 10027 { 10028 tem = fold_build2_loc (loc, code, type, 10029 fold_convert_loc (loc, TREE_TYPE (op0), 10030 TREE_OPERAND (arg0, 1)), op1); 10031 return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), 10032 tem); 10033 } 10034 if (TREE_CODE (arg1) == COMPOUND_EXPR 10035 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) 10036 { 10037 tem = fold_build2_loc (loc, code, type, op0, 10038 fold_convert_loc (loc, TREE_TYPE (op1), 10039 TREE_OPERAND (arg1, 1))); 10040 return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0), 10041 tem); 10042 } 10043 10044 if (TREE_CODE (arg0) == COND_EXPR 10045 || TREE_CODE (arg0) == VEC_COND_EXPR 10046 || COMPARISON_CLASS_P (arg0)) 10047 { 10048 tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1, 10049 arg0, arg1, 10050 /*cond_first_p=*/1); 10051 if (tem != NULL_TREE) 10052 return tem; 10053 } 10054 10055 if (TREE_CODE (arg1) == COND_EXPR 10056 || TREE_CODE (arg1) == VEC_COND_EXPR 10057 || COMPARISON_CLASS_P (arg1)) 10058 { 10059 tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1, 10060 arg1, arg0, 10061 /*cond_first_p=*/0); 10062 if (tem != NULL_TREE) 10063 return tem; 10064 } 10065 } 10066 10067 switch (code) 10068 { 10069 case MEM_REF: 10070 /* MEM[&MEM[p, CST1], CST2] -> MEM[p, CST1 + CST2]. */ 10071 if (TREE_CODE (arg0) == ADDR_EXPR 10072 && TREE_CODE (TREE_OPERAND (arg0, 0)) == MEM_REF) 10073 { 10074 tree iref = TREE_OPERAND (arg0, 0); 10075 return fold_build2 (MEM_REF, type, 10076 TREE_OPERAND (iref, 0), 10077 int_const_binop (PLUS_EXPR, arg1, 10078 TREE_OPERAND (iref, 1))); 10079 } 10080 10081 /* MEM[&a.b, CST2] -> MEM[&a, offsetof (a, b) + CST2]. */ 10082 if (TREE_CODE (arg0) == ADDR_EXPR 10083 && handled_component_p (TREE_OPERAND (arg0, 0))) 10084 { 10085 tree base; 10086 HOST_WIDE_INT coffset; 10087 base = get_addr_base_and_unit_offset (TREE_OPERAND (arg0, 0), 10088 &coffset); 10089 if (!base) 10090 return NULL_TREE; 10091 return fold_build2 (MEM_REF, type, 10092 build_fold_addr_expr (base), 10093 int_const_binop (PLUS_EXPR, arg1, 10094 size_int (coffset))); 10095 } 10096 10097 return NULL_TREE; 10098 10099 case POINTER_PLUS_EXPR: 10100 /* 0 +p index -> (type)index */ 10101 if (integer_zerop (arg0)) 10102 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 10103 10104 /* PTR +p 0 -> PTR */ 10105 if (integer_zerop (arg1)) 10106 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10107 10108 /* INT +p INT -> (PTR)(INT + INT). Stripping types allows for this. */ 10109 if (INTEGRAL_TYPE_P (TREE_TYPE (arg1)) 10110 && INTEGRAL_TYPE_P (TREE_TYPE (arg0))) 10111 return fold_convert_loc (loc, type, 10112 fold_build2_loc (loc, PLUS_EXPR, sizetype, 10113 fold_convert_loc (loc, sizetype, 10114 arg1), 10115 fold_convert_loc (loc, sizetype, 10116 arg0))); 10117 10118 /* (PTR +p B) +p A -> PTR +p (B + A) */ 10119 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR) 10120 { 10121 tree inner; 10122 tree arg01 = fold_convert_loc (loc, sizetype, TREE_OPERAND (arg0, 1)); 10123 tree arg00 = TREE_OPERAND (arg0, 0); 10124 inner = fold_build2_loc (loc, PLUS_EXPR, sizetype, 10125 arg01, fold_convert_loc (loc, sizetype, arg1)); 10126 return fold_convert_loc (loc, type, 10127 fold_build_pointer_plus_loc (loc, 10128 arg00, inner)); 10129 } 10130 10131 /* PTR_CST +p CST -> CST1 */ 10132 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) 10133 return fold_build2_loc (loc, PLUS_EXPR, type, arg0, 10134 fold_convert_loc (loc, type, arg1)); 10135 10136 /* Try replacing &a[i1] +p c * i2 with &a[i1 + i2], if c is step 10137 of the array. Loop optimizer sometimes produce this type of 10138 expressions. */ 10139 if (TREE_CODE (arg0) == ADDR_EXPR) 10140 { 10141 tem = try_move_mult_to_index (loc, arg0, 10142 fold_convert_loc (loc, 10143 ssizetype, arg1)); 10144 if (tem) 10145 return fold_convert_loc (loc, type, tem); 10146 } 10147 10148 return NULL_TREE; 10149 10150 case PLUS_EXPR: 10151 /* A + (-B) -> A - B */ 10152 if (TREE_CODE (arg1) == NEGATE_EXPR) 10153 return fold_build2_loc (loc, MINUS_EXPR, type, 10154 fold_convert_loc (loc, type, arg0), 10155 fold_convert_loc (loc, type, 10156 TREE_OPERAND (arg1, 0))); 10157 /* (-A) + B -> B - A */ 10158 if (TREE_CODE (arg0) == NEGATE_EXPR 10159 && reorder_operands_p (TREE_OPERAND (arg0, 0), arg1)) 10160 return fold_build2_loc (loc, MINUS_EXPR, type, 10161 fold_convert_loc (loc, type, arg1), 10162 fold_convert_loc (loc, type, 10163 TREE_OPERAND (arg0, 0))); 10164 10165 if (INTEGRAL_TYPE_P (type)) 10166 { 10167 /* Convert ~A + 1 to -A. */ 10168 if (TREE_CODE (arg0) == BIT_NOT_EXPR 10169 && integer_onep (arg1)) 10170 return fold_build1_loc (loc, NEGATE_EXPR, type, 10171 fold_convert_loc (loc, type, 10172 TREE_OPERAND (arg0, 0))); 10173 10174 /* ~X + X is -1. */ 10175 if (TREE_CODE (arg0) == BIT_NOT_EXPR 10176 && !TYPE_OVERFLOW_TRAPS (type)) 10177 { 10178 tree tem = TREE_OPERAND (arg0, 0); 10179 10180 STRIP_NOPS (tem); 10181 if (operand_equal_p (tem, arg1, 0)) 10182 { 10183 t1 = build_int_cst_type (type, -1); 10184 return omit_one_operand_loc (loc, type, t1, arg1); 10185 } 10186 } 10187 10188 /* X + ~X is -1. */ 10189 if (TREE_CODE (arg1) == BIT_NOT_EXPR 10190 && !TYPE_OVERFLOW_TRAPS (type)) 10191 { 10192 tree tem = TREE_OPERAND (arg1, 0); 10193 10194 STRIP_NOPS (tem); 10195 if (operand_equal_p (arg0, tem, 0)) 10196 { 10197 t1 = build_int_cst_type (type, -1); 10198 return omit_one_operand_loc (loc, type, t1, arg0); 10199 } 10200 } 10201 10202 /* X + (X / CST) * -CST is X % CST. */ 10203 if (TREE_CODE (arg1) == MULT_EXPR 10204 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR 10205 && operand_equal_p (arg0, 10206 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)) 10207 { 10208 tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1); 10209 tree cst1 = TREE_OPERAND (arg1, 1); 10210 tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1), 10211 cst1, cst0); 10212 if (sum && integer_zerop (sum)) 10213 return fold_convert_loc (loc, type, 10214 fold_build2_loc (loc, TRUNC_MOD_EXPR, 10215 TREE_TYPE (arg0), arg0, 10216 cst0)); 10217 } 10218 } 10219 10220 /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or 10221 one. Make sure the type is not saturating and has the signedness of 10222 the stripped operands, as fold_plusminus_mult_expr will re-associate. 10223 ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */ 10224 if ((TREE_CODE (arg0) == MULT_EXPR 10225 || TREE_CODE (arg1) == MULT_EXPR) 10226 && !TYPE_SATURATING (type) 10227 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0)) 10228 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1)) 10229 && (!FLOAT_TYPE_P (type) || flag_associative_math)) 10230 { 10231 tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1); 10232 if (tem) 10233 return tem; 10234 } 10235 10236 if (! FLOAT_TYPE_P (type)) 10237 { 10238 if (integer_zerop (arg1)) 10239 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10240 10241 /* If we are adding two BIT_AND_EXPR's, both of which are and'ing 10242 with a constant, and the two constants have no bits in common, 10243 we should treat this as a BIT_IOR_EXPR since this may produce more 10244 simplifications. */ 10245 if (TREE_CODE (arg0) == BIT_AND_EXPR 10246 && TREE_CODE (arg1) == BIT_AND_EXPR 10247 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 10248 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST 10249 && integer_zerop (const_binop (BIT_AND_EXPR, 10250 TREE_OPERAND (arg0, 1), 10251 TREE_OPERAND (arg1, 1)))) 10252 { 10253 code = BIT_IOR_EXPR; 10254 goto bit_ior; 10255 } 10256 10257 /* Reassociate (plus (plus (mult) (foo)) (mult)) as 10258 (plus (plus (mult) (mult)) (foo)) so that we can 10259 take advantage of the factoring cases below. */ 10260 if (TYPE_OVERFLOW_WRAPS (type) 10261 && (((TREE_CODE (arg0) == PLUS_EXPR 10262 || TREE_CODE (arg0) == MINUS_EXPR) 10263 && TREE_CODE (arg1) == MULT_EXPR) 10264 || ((TREE_CODE (arg1) == PLUS_EXPR 10265 || TREE_CODE (arg1) == MINUS_EXPR) 10266 && TREE_CODE (arg0) == MULT_EXPR))) 10267 { 10268 tree parg0, parg1, parg, marg; 10269 enum tree_code pcode; 10270 10271 if (TREE_CODE (arg1) == MULT_EXPR) 10272 parg = arg0, marg = arg1; 10273 else 10274 parg = arg1, marg = arg0; 10275 pcode = TREE_CODE (parg); 10276 parg0 = TREE_OPERAND (parg, 0); 10277 parg1 = TREE_OPERAND (parg, 1); 10278 STRIP_NOPS (parg0); 10279 STRIP_NOPS (parg1); 10280 10281 if (TREE_CODE (parg0) == MULT_EXPR 10282 && TREE_CODE (parg1) != MULT_EXPR) 10283 return fold_build2_loc (loc, pcode, type, 10284 fold_build2_loc (loc, PLUS_EXPR, type, 10285 fold_convert_loc (loc, type, 10286 parg0), 10287 fold_convert_loc (loc, type, 10288 marg)), 10289 fold_convert_loc (loc, type, parg1)); 10290 if (TREE_CODE (parg0) != MULT_EXPR 10291 && TREE_CODE (parg1) == MULT_EXPR) 10292 return 10293 fold_build2_loc (loc, PLUS_EXPR, type, 10294 fold_convert_loc (loc, type, parg0), 10295 fold_build2_loc (loc, pcode, type, 10296 fold_convert_loc (loc, type, marg), 10297 fold_convert_loc (loc, type, 10298 parg1))); 10299 } 10300 } 10301 else 10302 { 10303 /* See if ARG1 is zero and X + ARG1 reduces to X. */ 10304 if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 0)) 10305 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10306 10307 /* Likewise if the operands are reversed. */ 10308 if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0)) 10309 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 10310 10311 /* Convert X + -C into X - C. */ 10312 if (TREE_CODE (arg1) == REAL_CST 10313 && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))) 10314 { 10315 tem = fold_negate_const (arg1, type); 10316 if (!TREE_OVERFLOW (arg1) || !flag_trapping_math) 10317 return fold_build2_loc (loc, MINUS_EXPR, type, 10318 fold_convert_loc (loc, type, arg0), 10319 fold_convert_loc (loc, type, tem)); 10320 } 10321 10322 /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y ) 10323 to __complex__ ( x, y ). This is not the same for SNaNs or 10324 if signed zeros are involved. */ 10325 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 10326 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 10327 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))) 10328 { 10329 tree rtype = TREE_TYPE (TREE_TYPE (arg0)); 10330 tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0); 10331 tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0); 10332 bool arg0rz = false, arg0iz = false; 10333 if ((arg0r && (arg0rz = real_zerop (arg0r))) 10334 || (arg0i && (arg0iz = real_zerop (arg0i)))) 10335 { 10336 tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1); 10337 tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1); 10338 if (arg0rz && arg1i && real_zerop (arg1i)) 10339 { 10340 tree rp = arg1r ? arg1r 10341 : build1 (REALPART_EXPR, rtype, arg1); 10342 tree ip = arg0i ? arg0i 10343 : build1 (IMAGPART_EXPR, rtype, arg0); 10344 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip); 10345 } 10346 else if (arg0iz && arg1r && real_zerop (arg1r)) 10347 { 10348 tree rp = arg0r ? arg0r 10349 : build1 (REALPART_EXPR, rtype, arg0); 10350 tree ip = arg1i ? arg1i 10351 : build1 (IMAGPART_EXPR, rtype, arg1); 10352 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip); 10353 } 10354 } 10355 } 10356 10357 if (flag_unsafe_math_optimizations 10358 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR) 10359 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR) 10360 && (tem = distribute_real_division (loc, code, type, arg0, arg1))) 10361 return tem; 10362 10363 /* Convert x+x into x*2.0. */ 10364 if (operand_equal_p (arg0, arg1, 0) 10365 && SCALAR_FLOAT_TYPE_P (type)) 10366 return fold_build2_loc (loc, MULT_EXPR, type, arg0, 10367 build_real (type, dconst2)); 10368 10369 /* Convert a + (b*c + d*e) into (a + b*c) + d*e. 10370 We associate floats only if the user has specified 10371 -fassociative-math. */ 10372 if (flag_associative_math 10373 && TREE_CODE (arg1) == PLUS_EXPR 10374 && TREE_CODE (arg0) != MULT_EXPR) 10375 { 10376 tree tree10 = TREE_OPERAND (arg1, 0); 10377 tree tree11 = TREE_OPERAND (arg1, 1); 10378 if (TREE_CODE (tree11) == MULT_EXPR 10379 && TREE_CODE (tree10) == MULT_EXPR) 10380 { 10381 tree tree0; 10382 tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10); 10383 return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11); 10384 } 10385 } 10386 /* Convert (b*c + d*e) + a into b*c + (d*e +a). 10387 We associate floats only if the user has specified 10388 -fassociative-math. */ 10389 if (flag_associative_math 10390 && TREE_CODE (arg0) == PLUS_EXPR 10391 && TREE_CODE (arg1) != MULT_EXPR) 10392 { 10393 tree tree00 = TREE_OPERAND (arg0, 0); 10394 tree tree01 = TREE_OPERAND (arg0, 1); 10395 if (TREE_CODE (tree01) == MULT_EXPR 10396 && TREE_CODE (tree00) == MULT_EXPR) 10397 { 10398 tree tree0; 10399 tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1); 10400 return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0); 10401 } 10402 } 10403 } 10404 10405 bit_rotate: 10406 /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A 10407 is a rotate of A by C1 bits. */ 10408 /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A 10409 is a rotate of A by B bits. */ 10410 { 10411 enum tree_code code0, code1; 10412 tree rtype; 10413 code0 = TREE_CODE (arg0); 10414 code1 = TREE_CODE (arg1); 10415 if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR) 10416 || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR)) 10417 && operand_equal_p (TREE_OPERAND (arg0, 0), 10418 TREE_OPERAND (arg1, 0), 0) 10419 && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)), 10420 TYPE_UNSIGNED (rtype)) 10421 /* Only create rotates in complete modes. Other cases are not 10422 expanded properly. */ 10423 && TYPE_PRECISION (rtype) == GET_MODE_PRECISION (TYPE_MODE (rtype))) 10424 { 10425 tree tree01, tree11; 10426 enum tree_code code01, code11; 10427 10428 tree01 = TREE_OPERAND (arg0, 1); 10429 tree11 = TREE_OPERAND (arg1, 1); 10430 STRIP_NOPS (tree01); 10431 STRIP_NOPS (tree11); 10432 code01 = TREE_CODE (tree01); 10433 code11 = TREE_CODE (tree11); 10434 if (code01 == INTEGER_CST 10435 && code11 == INTEGER_CST 10436 && TREE_INT_CST_HIGH (tree01) == 0 10437 && TREE_INT_CST_HIGH (tree11) == 0 10438 && ((TREE_INT_CST_LOW (tree01) + TREE_INT_CST_LOW (tree11)) 10439 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0))))) 10440 { 10441 tem = build2_loc (loc, LROTATE_EXPR, 10442 TREE_TYPE (TREE_OPERAND (arg0, 0)), 10443 TREE_OPERAND (arg0, 0), 10444 code0 == LSHIFT_EXPR ? tree01 : tree11); 10445 return fold_convert_loc (loc, type, tem); 10446 } 10447 else if (code11 == MINUS_EXPR) 10448 { 10449 tree tree110, tree111; 10450 tree110 = TREE_OPERAND (tree11, 0); 10451 tree111 = TREE_OPERAND (tree11, 1); 10452 STRIP_NOPS (tree110); 10453 STRIP_NOPS (tree111); 10454 if (TREE_CODE (tree110) == INTEGER_CST 10455 && 0 == compare_tree_int (tree110, 10456 TYPE_PRECISION 10457 (TREE_TYPE (TREE_OPERAND 10458 (arg0, 0)))) 10459 && operand_equal_p (tree01, tree111, 0)) 10460 return 10461 fold_convert_loc (loc, type, 10462 build2 ((code0 == LSHIFT_EXPR 10463 ? LROTATE_EXPR 10464 : RROTATE_EXPR), 10465 TREE_TYPE (TREE_OPERAND (arg0, 0)), 10466 TREE_OPERAND (arg0, 0), tree01)); 10467 } 10468 else if (code01 == MINUS_EXPR) 10469 { 10470 tree tree010, tree011; 10471 tree010 = TREE_OPERAND (tree01, 0); 10472 tree011 = TREE_OPERAND (tree01, 1); 10473 STRIP_NOPS (tree010); 10474 STRIP_NOPS (tree011); 10475 if (TREE_CODE (tree010) == INTEGER_CST 10476 && 0 == compare_tree_int (tree010, 10477 TYPE_PRECISION 10478 (TREE_TYPE (TREE_OPERAND 10479 (arg0, 0)))) 10480 && operand_equal_p (tree11, tree011, 0)) 10481 return fold_convert_loc 10482 (loc, type, 10483 build2 ((code0 != LSHIFT_EXPR 10484 ? LROTATE_EXPR 10485 : RROTATE_EXPR), 10486 TREE_TYPE (TREE_OPERAND (arg0, 0)), 10487 TREE_OPERAND (arg0, 0), tree11)); 10488 } 10489 } 10490 } 10491 10492 associate: 10493 /* In most languages, can't associate operations on floats through 10494 parentheses. Rather than remember where the parentheses were, we 10495 don't associate floats at all, unless the user has specified 10496 -fassociative-math. 10497 And, we need to make sure type is not saturating. */ 10498 10499 if ((! FLOAT_TYPE_P (type) || flag_associative_math) 10500 && !TYPE_SATURATING (type)) 10501 { 10502 tree var0, con0, lit0, minus_lit0; 10503 tree var1, con1, lit1, minus_lit1; 10504 tree atype = type; 10505 bool ok = true; 10506 10507 /* Split both trees into variables, constants, and literals. Then 10508 associate each group together, the constants with literals, 10509 then the result with variables. This increases the chances of 10510 literals being recombined later and of generating relocatable 10511 expressions for the sum of a constant and literal. */ 10512 var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0); 10513 var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1, 10514 code == MINUS_EXPR); 10515 10516 /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */ 10517 if (code == MINUS_EXPR) 10518 code = PLUS_EXPR; 10519 10520 /* With undefined overflow prefer doing association in a type 10521 which wraps on overflow, if that is one of the operand types. */ 10522 if ((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED) 10523 || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type))) 10524 { 10525 if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) 10526 && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))) 10527 atype = TREE_TYPE (arg0); 10528 else if (INTEGRAL_TYPE_P (TREE_TYPE (arg1)) 10529 && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))) 10530 atype = TREE_TYPE (arg1); 10531 gcc_assert (TYPE_PRECISION (atype) == TYPE_PRECISION (type)); 10532 } 10533 10534 /* With undefined overflow we can only associate constants with one 10535 variable, and constants whose association doesn't overflow. */ 10536 if ((POINTER_TYPE_P (atype) && POINTER_TYPE_OVERFLOW_UNDEFINED) 10537 || (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype))) 10538 { 10539 if (var0 && var1) 10540 { 10541 tree tmp0 = var0; 10542 tree tmp1 = var1; 10543 10544 if (TREE_CODE (tmp0) == NEGATE_EXPR) 10545 tmp0 = TREE_OPERAND (tmp0, 0); 10546 if (CONVERT_EXPR_P (tmp0) 10547 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp0, 0))) 10548 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp0, 0))) 10549 <= TYPE_PRECISION (atype))) 10550 tmp0 = TREE_OPERAND (tmp0, 0); 10551 if (TREE_CODE (tmp1) == NEGATE_EXPR) 10552 tmp1 = TREE_OPERAND (tmp1, 0); 10553 if (CONVERT_EXPR_P (tmp1) 10554 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp1, 0))) 10555 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp1, 0))) 10556 <= TYPE_PRECISION (atype))) 10557 tmp1 = TREE_OPERAND (tmp1, 0); 10558 /* The only case we can still associate with two variables 10559 is if they are the same, modulo negation and bit-pattern 10560 preserving conversions. */ 10561 if (!operand_equal_p (tmp0, tmp1, 0)) 10562 ok = false; 10563 } 10564 } 10565 10566 /* Only do something if we found more than two objects. Otherwise, 10567 nothing has changed and we risk infinite recursion. */ 10568 if (ok 10569 && (2 < ((var0 != 0) + (var1 != 0) 10570 + (con0 != 0) + (con1 != 0) 10571 + (lit0 != 0) + (lit1 != 0) 10572 + (minus_lit0 != 0) + (minus_lit1 != 0)))) 10573 { 10574 bool any_overflows = false; 10575 if (lit0) any_overflows |= TREE_OVERFLOW (lit0); 10576 if (lit1) any_overflows |= TREE_OVERFLOW (lit1); 10577 if (minus_lit0) any_overflows |= TREE_OVERFLOW (minus_lit0); 10578 if (minus_lit1) any_overflows |= TREE_OVERFLOW (minus_lit1); 10579 var0 = associate_trees (loc, var0, var1, code, atype); 10580 con0 = associate_trees (loc, con0, con1, code, atype); 10581 lit0 = associate_trees (loc, lit0, lit1, code, atype); 10582 minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1, 10583 code, atype); 10584 10585 /* Preserve the MINUS_EXPR if the negative part of the literal is 10586 greater than the positive part. Otherwise, the multiplicative 10587 folding code (i.e extract_muldiv) may be fooled in case 10588 unsigned constants are subtracted, like in the following 10589 example: ((X*2 + 4) - 8U)/2. */ 10590 if (minus_lit0 && lit0) 10591 { 10592 if (TREE_CODE (lit0) == INTEGER_CST 10593 && TREE_CODE (minus_lit0) == INTEGER_CST 10594 && tree_int_cst_lt (lit0, minus_lit0)) 10595 { 10596 minus_lit0 = associate_trees (loc, minus_lit0, lit0, 10597 MINUS_EXPR, atype); 10598 lit0 = 0; 10599 } 10600 else 10601 { 10602 lit0 = associate_trees (loc, lit0, minus_lit0, 10603 MINUS_EXPR, atype); 10604 minus_lit0 = 0; 10605 } 10606 } 10607 10608 /* Don't introduce overflows through reassociation. */ 10609 if (!any_overflows 10610 && ((lit0 && TREE_OVERFLOW_P (lit0)) 10611 || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0)))) 10612 return NULL_TREE; 10613 10614 if (minus_lit0) 10615 { 10616 if (con0 == 0) 10617 return 10618 fold_convert_loc (loc, type, 10619 associate_trees (loc, var0, minus_lit0, 10620 MINUS_EXPR, atype)); 10621 else 10622 { 10623 con0 = associate_trees (loc, con0, minus_lit0, 10624 MINUS_EXPR, atype); 10625 return 10626 fold_convert_loc (loc, type, 10627 associate_trees (loc, var0, con0, 10628 PLUS_EXPR, atype)); 10629 } 10630 } 10631 10632 con0 = associate_trees (loc, con0, lit0, code, atype); 10633 return 10634 fold_convert_loc (loc, type, associate_trees (loc, var0, con0, 10635 code, atype)); 10636 } 10637 } 10638 10639 return NULL_TREE; 10640 10641 case MINUS_EXPR: 10642 /* Pointer simplifications for subtraction, simple reassociations. */ 10643 if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0))) 10644 { 10645 /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */ 10646 if (TREE_CODE (arg0) == POINTER_PLUS_EXPR 10647 && TREE_CODE (arg1) == POINTER_PLUS_EXPR) 10648 { 10649 tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 10650 tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 10651 tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0)); 10652 tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1)); 10653 return fold_build2_loc (loc, PLUS_EXPR, type, 10654 fold_build2_loc (loc, MINUS_EXPR, type, 10655 arg00, arg10), 10656 fold_build2_loc (loc, MINUS_EXPR, type, 10657 arg01, arg11)); 10658 } 10659 /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */ 10660 else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR) 10661 { 10662 tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 10663 tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 10664 tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00, 10665 fold_convert_loc (loc, type, arg1)); 10666 if (tmp) 10667 return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01); 10668 } 10669 } 10670 /* A - (-B) -> A + B */ 10671 if (TREE_CODE (arg1) == NEGATE_EXPR) 10672 return fold_build2_loc (loc, PLUS_EXPR, type, op0, 10673 fold_convert_loc (loc, type, 10674 TREE_OPERAND (arg1, 0))); 10675 /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */ 10676 if (TREE_CODE (arg0) == NEGATE_EXPR 10677 && (FLOAT_TYPE_P (type) 10678 || INTEGRAL_TYPE_P (type)) 10679 && negate_expr_p (arg1) 10680 && reorder_operands_p (arg0, arg1)) 10681 return fold_build2_loc (loc, MINUS_EXPR, type, 10682 fold_convert_loc (loc, type, 10683 negate_expr (arg1)), 10684 fold_convert_loc (loc, type, 10685 TREE_OPERAND (arg0, 0))); 10686 /* Convert -A - 1 to ~A. */ 10687 if (INTEGRAL_TYPE_P (type) 10688 && TREE_CODE (arg0) == NEGATE_EXPR 10689 && integer_onep (arg1) 10690 && !TYPE_OVERFLOW_TRAPS (type)) 10691 return fold_build1_loc (loc, BIT_NOT_EXPR, type, 10692 fold_convert_loc (loc, type, 10693 TREE_OPERAND (arg0, 0))); 10694 10695 /* Convert -1 - A to ~A. */ 10696 if (INTEGRAL_TYPE_P (type) 10697 && integer_all_onesp (arg0)) 10698 return fold_build1_loc (loc, BIT_NOT_EXPR, type, op1); 10699 10700 10701 /* X - (X / CST) * CST is X % CST. */ 10702 if (INTEGRAL_TYPE_P (type) 10703 && TREE_CODE (arg1) == MULT_EXPR 10704 && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR 10705 && operand_equal_p (arg0, 10706 TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0) 10707 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1), 10708 TREE_OPERAND (arg1, 1), 0)) 10709 return 10710 fold_convert_loc (loc, type, 10711 fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0), 10712 arg0, TREE_OPERAND (arg1, 1))); 10713 10714 if (! FLOAT_TYPE_P (type)) 10715 { 10716 if (integer_zerop (arg0)) 10717 return negate_expr (fold_convert_loc (loc, type, arg1)); 10718 if (integer_zerop (arg1)) 10719 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10720 10721 /* Fold A - (A & B) into ~B & A. */ 10722 if (!TREE_SIDE_EFFECTS (arg0) 10723 && TREE_CODE (arg1) == BIT_AND_EXPR) 10724 { 10725 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)) 10726 { 10727 tree arg10 = fold_convert_loc (loc, type, 10728 TREE_OPERAND (arg1, 0)); 10729 return fold_build2_loc (loc, BIT_AND_EXPR, type, 10730 fold_build1_loc (loc, BIT_NOT_EXPR, 10731 type, arg10), 10732 fold_convert_loc (loc, type, arg0)); 10733 } 10734 if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 10735 { 10736 tree arg11 = fold_convert_loc (loc, 10737 type, TREE_OPERAND (arg1, 1)); 10738 return fold_build2_loc (loc, BIT_AND_EXPR, type, 10739 fold_build1_loc (loc, BIT_NOT_EXPR, 10740 type, arg11), 10741 fold_convert_loc (loc, type, arg0)); 10742 } 10743 } 10744 10745 /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is 10746 any power of 2 minus 1. */ 10747 if (TREE_CODE (arg0) == BIT_AND_EXPR 10748 && TREE_CODE (arg1) == BIT_AND_EXPR 10749 && operand_equal_p (TREE_OPERAND (arg0, 0), 10750 TREE_OPERAND (arg1, 0), 0)) 10751 { 10752 tree mask0 = TREE_OPERAND (arg0, 1); 10753 tree mask1 = TREE_OPERAND (arg1, 1); 10754 tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0); 10755 10756 if (operand_equal_p (tem, mask1, 0)) 10757 { 10758 tem = fold_build2_loc (loc, BIT_XOR_EXPR, type, 10759 TREE_OPERAND (arg0, 0), mask1); 10760 return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1); 10761 } 10762 } 10763 } 10764 10765 /* See if ARG1 is zero and X - ARG1 reduces to X. */ 10766 else if (fold_real_zero_addition_p (TREE_TYPE (arg0), arg1, 1)) 10767 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10768 10769 /* (ARG0 - ARG1) is the same as (-ARG1 + ARG0). So check whether 10770 ARG0 is zero and X + ARG0 reduces to X, since that would mean 10771 (-ARG1 + ARG0) reduces to -ARG1. */ 10772 else if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0)) 10773 return negate_expr (fold_convert_loc (loc, type, arg1)); 10774 10775 /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to 10776 __complex__ ( x, -y ). This is not the same for SNaNs or if 10777 signed zeros are involved. */ 10778 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 10779 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 10780 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))) 10781 { 10782 tree rtype = TREE_TYPE (TREE_TYPE (arg0)); 10783 tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0); 10784 tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0); 10785 bool arg0rz = false, arg0iz = false; 10786 if ((arg0r && (arg0rz = real_zerop (arg0r))) 10787 || (arg0i && (arg0iz = real_zerop (arg0i)))) 10788 { 10789 tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1); 10790 tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1); 10791 if (arg0rz && arg1i && real_zerop (arg1i)) 10792 { 10793 tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype, 10794 arg1r ? arg1r 10795 : build1 (REALPART_EXPR, rtype, arg1)); 10796 tree ip = arg0i ? arg0i 10797 : build1 (IMAGPART_EXPR, rtype, arg0); 10798 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip); 10799 } 10800 else if (arg0iz && arg1r && real_zerop (arg1r)) 10801 { 10802 tree rp = arg0r ? arg0r 10803 : build1 (REALPART_EXPR, rtype, arg0); 10804 tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype, 10805 arg1i ? arg1i 10806 : build1 (IMAGPART_EXPR, rtype, arg1)); 10807 return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip); 10808 } 10809 } 10810 } 10811 10812 /* Fold &x - &x. This can happen from &x.foo - &x. 10813 This is unsafe for certain floats even in non-IEEE formats. 10814 In IEEE, it is unsafe because it does wrong for NaNs. 10815 Also note that operand_equal_p is always false if an operand 10816 is volatile. */ 10817 10818 if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type))) 10819 && operand_equal_p (arg0, arg1, 0)) 10820 return build_zero_cst (type); 10821 10822 /* A - B -> A + (-B) if B is easily negatable. */ 10823 if (negate_expr_p (arg1) 10824 && ((FLOAT_TYPE_P (type) 10825 /* Avoid this transformation if B is a positive REAL_CST. */ 10826 && (TREE_CODE (arg1) != REAL_CST 10827 || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))) 10828 || INTEGRAL_TYPE_P (type))) 10829 return fold_build2_loc (loc, PLUS_EXPR, type, 10830 fold_convert_loc (loc, type, arg0), 10831 fold_convert_loc (loc, type, 10832 negate_expr (arg1))); 10833 10834 /* Try folding difference of addresses. */ 10835 { 10836 HOST_WIDE_INT diff; 10837 10838 if ((TREE_CODE (arg0) == ADDR_EXPR 10839 || TREE_CODE (arg1) == ADDR_EXPR) 10840 && ptr_difference_const (arg0, arg1, &diff)) 10841 return build_int_cst_type (type, diff); 10842 } 10843 10844 /* Fold &a[i] - &a[j] to i-j. */ 10845 if (TREE_CODE (arg0) == ADDR_EXPR 10846 && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF 10847 && TREE_CODE (arg1) == ADDR_EXPR 10848 && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF) 10849 { 10850 tree tem = fold_addr_of_array_ref_difference (loc, type, 10851 TREE_OPERAND (arg0, 0), 10852 TREE_OPERAND (arg1, 0)); 10853 if (tem) 10854 return tem; 10855 } 10856 10857 if (FLOAT_TYPE_P (type) 10858 && flag_unsafe_math_optimizations 10859 && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR) 10860 && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR) 10861 && (tem = distribute_real_division (loc, code, type, arg0, arg1))) 10862 return tem; 10863 10864 /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or 10865 one. Make sure the type is not saturating and has the signedness of 10866 the stripped operands, as fold_plusminus_mult_expr will re-associate. 10867 ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */ 10868 if ((TREE_CODE (arg0) == MULT_EXPR 10869 || TREE_CODE (arg1) == MULT_EXPR) 10870 && !TYPE_SATURATING (type) 10871 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0)) 10872 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1)) 10873 && (!FLOAT_TYPE_P (type) || flag_associative_math)) 10874 { 10875 tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1); 10876 if (tem) 10877 return tem; 10878 } 10879 10880 goto associate; 10881 10882 case MULT_EXPR: 10883 /* (-A) * (-B) -> A * B */ 10884 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1)) 10885 return fold_build2_loc (loc, MULT_EXPR, type, 10886 fold_convert_loc (loc, type, 10887 TREE_OPERAND (arg0, 0)), 10888 fold_convert_loc (loc, type, 10889 negate_expr (arg1))); 10890 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0)) 10891 return fold_build2_loc (loc, MULT_EXPR, type, 10892 fold_convert_loc (loc, type, 10893 negate_expr (arg0)), 10894 fold_convert_loc (loc, type, 10895 TREE_OPERAND (arg1, 0))); 10896 10897 if (! FLOAT_TYPE_P (type)) 10898 { 10899 if (integer_zerop (arg1)) 10900 return omit_one_operand_loc (loc, type, arg1, arg0); 10901 if (integer_onep (arg1)) 10902 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10903 /* Transform x * -1 into -x. Make sure to do the negation 10904 on the original operand with conversions not stripped 10905 because we can only strip non-sign-changing conversions. */ 10906 if (integer_all_onesp (arg1)) 10907 return fold_convert_loc (loc, type, negate_expr (op0)); 10908 /* Transform x * -C into -x * C if x is easily negatable. */ 10909 if (TREE_CODE (arg1) == INTEGER_CST 10910 && tree_int_cst_sgn (arg1) == -1 10911 && negate_expr_p (arg0) 10912 && (tem = negate_expr (arg1)) != arg1 10913 && !TREE_OVERFLOW (tem)) 10914 return fold_build2_loc (loc, MULT_EXPR, type, 10915 fold_convert_loc (loc, type, 10916 negate_expr (arg0)), 10917 tem); 10918 10919 /* (a * (1 << b)) is (a << b) */ 10920 if (TREE_CODE (arg1) == LSHIFT_EXPR 10921 && integer_onep (TREE_OPERAND (arg1, 0))) 10922 return fold_build2_loc (loc, LSHIFT_EXPR, type, op0, 10923 TREE_OPERAND (arg1, 1)); 10924 if (TREE_CODE (arg0) == LSHIFT_EXPR 10925 && integer_onep (TREE_OPERAND (arg0, 0))) 10926 return fold_build2_loc (loc, LSHIFT_EXPR, type, op1, 10927 TREE_OPERAND (arg0, 1)); 10928 10929 /* (A + A) * C -> A * 2 * C */ 10930 if (TREE_CODE (arg0) == PLUS_EXPR 10931 && TREE_CODE (arg1) == INTEGER_CST 10932 && operand_equal_p (TREE_OPERAND (arg0, 0), 10933 TREE_OPERAND (arg0, 1), 0)) 10934 return fold_build2_loc (loc, MULT_EXPR, type, 10935 omit_one_operand_loc (loc, type, 10936 TREE_OPERAND (arg0, 0), 10937 TREE_OPERAND (arg0, 1)), 10938 fold_build2_loc (loc, MULT_EXPR, type, 10939 build_int_cst (type, 2) , arg1)); 10940 10941 /* ((T) (X /[ex] C)) * C cancels out if the conversion is 10942 sign-changing only. */ 10943 if (TREE_CODE (arg1) == INTEGER_CST 10944 && TREE_CODE (arg0) == EXACT_DIV_EXPR 10945 && operand_equal_p (arg1, TREE_OPERAND (arg0, 1), 0)) 10946 return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 10947 10948 strict_overflow_p = false; 10949 if (TREE_CODE (arg1) == INTEGER_CST 10950 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE, 10951 &strict_overflow_p))) 10952 { 10953 if (strict_overflow_p) 10954 fold_overflow_warning (("assuming signed overflow does not " 10955 "occur when simplifying " 10956 "multiplication"), 10957 WARN_STRICT_OVERFLOW_MISC); 10958 return fold_convert_loc (loc, type, tem); 10959 } 10960 10961 /* Optimize z * conj(z) for integer complex numbers. */ 10962 if (TREE_CODE (arg0) == CONJ_EXPR 10963 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 10964 return fold_mult_zconjz (loc, type, arg1); 10965 if (TREE_CODE (arg1) == CONJ_EXPR 10966 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 10967 return fold_mult_zconjz (loc, type, arg0); 10968 } 10969 else 10970 { 10971 /* Maybe fold x * 0 to 0. The expressions aren't the same 10972 when x is NaN, since x * 0 is also NaN. Nor are they the 10973 same in modes with signed zeros, since multiplying a 10974 negative value by 0 gives -0, not +0. */ 10975 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) 10976 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 10977 && real_zerop (arg1)) 10978 return omit_one_operand_loc (loc, type, arg1, arg0); 10979 /* In IEEE floating point, x*1 is not equivalent to x for snans. 10980 Likewise for complex arithmetic with signed zeros. */ 10981 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 10982 && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 10983 || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))) 10984 && real_onep (arg1)) 10985 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 10986 10987 /* Transform x * -1.0 into -x. */ 10988 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 10989 && (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 10990 || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))) 10991 && real_minus_onep (arg1)) 10992 return fold_convert_loc (loc, type, negate_expr (arg0)); 10993 10994 /* Convert (C1/X)*C2 into (C1*C2)/X. This transformation may change 10995 the result for floating point types due to rounding so it is applied 10996 only if -fassociative-math was specify. */ 10997 if (flag_associative_math 10998 && TREE_CODE (arg0) == RDIV_EXPR 10999 && TREE_CODE (arg1) == REAL_CST 11000 && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST) 11001 { 11002 tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0), 11003 arg1); 11004 if (tem) 11005 return fold_build2_loc (loc, RDIV_EXPR, type, tem, 11006 TREE_OPERAND (arg0, 1)); 11007 } 11008 11009 /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y. */ 11010 if (operand_equal_p (arg0, arg1, 0)) 11011 { 11012 tree tem = fold_strip_sign_ops (arg0); 11013 if (tem != NULL_TREE) 11014 { 11015 tem = fold_convert_loc (loc, type, tem); 11016 return fold_build2_loc (loc, MULT_EXPR, type, tem, tem); 11017 } 11018 } 11019 11020 /* Fold z * +-I to __complex__ (-+__imag z, +-__real z). 11021 This is not the same for NaNs or if signed zeros are 11022 involved. */ 11023 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) 11024 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))) 11025 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)) 11026 && TREE_CODE (arg1) == COMPLEX_CST 11027 && real_zerop (TREE_REALPART (arg1))) 11028 { 11029 tree rtype = TREE_TYPE (TREE_TYPE (arg0)); 11030 if (real_onep (TREE_IMAGPART (arg1))) 11031 return 11032 fold_build2_loc (loc, COMPLEX_EXPR, type, 11033 negate_expr (fold_build1_loc (loc, IMAGPART_EXPR, 11034 rtype, arg0)), 11035 fold_build1_loc (loc, REALPART_EXPR, rtype, arg0)); 11036 else if (real_minus_onep (TREE_IMAGPART (arg1))) 11037 return 11038 fold_build2_loc (loc, COMPLEX_EXPR, type, 11039 fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0), 11040 negate_expr (fold_build1_loc (loc, REALPART_EXPR, 11041 rtype, arg0))); 11042 } 11043 11044 /* Optimize z * conj(z) for floating point complex numbers. 11045 Guarded by flag_unsafe_math_optimizations as non-finite 11046 imaginary components don't produce scalar results. */ 11047 if (flag_unsafe_math_optimizations 11048 && TREE_CODE (arg0) == CONJ_EXPR 11049 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 11050 return fold_mult_zconjz (loc, type, arg1); 11051 if (flag_unsafe_math_optimizations 11052 && TREE_CODE (arg1) == CONJ_EXPR 11053 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11054 return fold_mult_zconjz (loc, type, arg0); 11055 11056 if (flag_unsafe_math_optimizations) 11057 { 11058 enum built_in_function fcode0 = builtin_mathfn_code (arg0); 11059 enum built_in_function fcode1 = builtin_mathfn_code (arg1); 11060 11061 /* Optimizations of root(...)*root(...). */ 11062 if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0)) 11063 { 11064 tree rootfn, arg; 11065 tree arg00 = CALL_EXPR_ARG (arg0, 0); 11066 tree arg10 = CALL_EXPR_ARG (arg1, 0); 11067 11068 /* Optimize sqrt(x)*sqrt(x) as x. */ 11069 if (BUILTIN_SQRT_P (fcode0) 11070 && operand_equal_p (arg00, arg10, 0) 11071 && ! HONOR_SNANS (TYPE_MODE (type))) 11072 return arg00; 11073 11074 /* Optimize root(x)*root(y) as root(x*y). */ 11075 rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 11076 arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10); 11077 return build_call_expr_loc (loc, rootfn, 1, arg); 11078 } 11079 11080 /* Optimize expN(x)*expN(y) as expN(x+y). */ 11081 if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0)) 11082 { 11083 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 11084 tree arg = fold_build2_loc (loc, PLUS_EXPR, type, 11085 CALL_EXPR_ARG (arg0, 0), 11086 CALL_EXPR_ARG (arg1, 0)); 11087 return build_call_expr_loc (loc, expfn, 1, arg); 11088 } 11089 11090 /* Optimizations of pow(...)*pow(...). */ 11091 if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW) 11092 || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF) 11093 || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL)) 11094 { 11095 tree arg00 = CALL_EXPR_ARG (arg0, 0); 11096 tree arg01 = CALL_EXPR_ARG (arg0, 1); 11097 tree arg10 = CALL_EXPR_ARG (arg1, 0); 11098 tree arg11 = CALL_EXPR_ARG (arg1, 1); 11099 11100 /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y). */ 11101 if (operand_equal_p (arg01, arg11, 0)) 11102 { 11103 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 11104 tree arg = fold_build2_loc (loc, MULT_EXPR, type, 11105 arg00, arg10); 11106 return build_call_expr_loc (loc, powfn, 2, arg, arg01); 11107 } 11108 11109 /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z). */ 11110 if (operand_equal_p (arg00, arg10, 0)) 11111 { 11112 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 11113 tree arg = fold_build2_loc (loc, PLUS_EXPR, type, 11114 arg01, arg11); 11115 return build_call_expr_loc (loc, powfn, 2, arg00, arg); 11116 } 11117 } 11118 11119 /* Optimize tan(x)*cos(x) as sin(x). */ 11120 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS) 11121 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF) 11122 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL) 11123 || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN) 11124 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF) 11125 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL)) 11126 && operand_equal_p (CALL_EXPR_ARG (arg0, 0), 11127 CALL_EXPR_ARG (arg1, 0), 0)) 11128 { 11129 tree sinfn = mathfn_built_in (type, BUILT_IN_SIN); 11130 11131 if (sinfn != NULL_TREE) 11132 return build_call_expr_loc (loc, sinfn, 1, 11133 CALL_EXPR_ARG (arg0, 0)); 11134 } 11135 11136 /* Optimize x*pow(x,c) as pow(x,c+1). */ 11137 if (fcode1 == BUILT_IN_POW 11138 || fcode1 == BUILT_IN_POWF 11139 || fcode1 == BUILT_IN_POWL) 11140 { 11141 tree arg10 = CALL_EXPR_ARG (arg1, 0); 11142 tree arg11 = CALL_EXPR_ARG (arg1, 1); 11143 if (TREE_CODE (arg11) == REAL_CST 11144 && !TREE_OVERFLOW (arg11) 11145 && operand_equal_p (arg0, arg10, 0)) 11146 { 11147 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0); 11148 REAL_VALUE_TYPE c; 11149 tree arg; 11150 11151 c = TREE_REAL_CST (arg11); 11152 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1); 11153 arg = build_real (type, c); 11154 return build_call_expr_loc (loc, powfn, 2, arg0, arg); 11155 } 11156 } 11157 11158 /* Optimize pow(x,c)*x as pow(x,c+1). */ 11159 if (fcode0 == BUILT_IN_POW 11160 || fcode0 == BUILT_IN_POWF 11161 || fcode0 == BUILT_IN_POWL) 11162 { 11163 tree arg00 = CALL_EXPR_ARG (arg0, 0); 11164 tree arg01 = CALL_EXPR_ARG (arg0, 1); 11165 if (TREE_CODE (arg01) == REAL_CST 11166 && !TREE_OVERFLOW (arg01) 11167 && operand_equal_p (arg1, arg00, 0)) 11168 { 11169 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 11170 REAL_VALUE_TYPE c; 11171 tree arg; 11172 11173 c = TREE_REAL_CST (arg01); 11174 real_arithmetic (&c, PLUS_EXPR, &c, &dconst1); 11175 arg = build_real (type, c); 11176 return build_call_expr_loc (loc, powfn, 2, arg1, arg); 11177 } 11178 } 11179 11180 /* Canonicalize x*x as pow(x,2.0), which is expanded as x*x. */ 11181 if (!in_gimple_form 11182 && optimize 11183 && operand_equal_p (arg0, arg1, 0)) 11184 { 11185 tree powfn = mathfn_built_in (type, BUILT_IN_POW); 11186 11187 if (powfn) 11188 { 11189 tree arg = build_real (type, dconst2); 11190 return build_call_expr_loc (loc, powfn, 2, arg0, arg); 11191 } 11192 } 11193 } 11194 } 11195 goto associate; 11196 11197 case BIT_IOR_EXPR: 11198 bit_ior: 11199 if (integer_all_onesp (arg1)) 11200 return omit_one_operand_loc (loc, type, arg1, arg0); 11201 if (integer_zerop (arg1)) 11202 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11203 if (operand_equal_p (arg0, arg1, 0)) 11204 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11205 11206 /* ~X | X is -1. */ 11207 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11208 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 11209 { 11210 t1 = build_zero_cst (type); 11211 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1); 11212 return omit_one_operand_loc (loc, type, t1, arg1); 11213 } 11214 11215 /* X | ~X is -1. */ 11216 if (TREE_CODE (arg1) == BIT_NOT_EXPR 11217 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11218 { 11219 t1 = build_zero_cst (type); 11220 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1); 11221 return omit_one_operand_loc (loc, type, t1, arg0); 11222 } 11223 11224 /* Canonicalize (X & C1) | C2. */ 11225 if (TREE_CODE (arg0) == BIT_AND_EXPR 11226 && TREE_CODE (arg1) == INTEGER_CST 11227 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 11228 { 11229 double_int c1, c2, c3, msk; 11230 int width = TYPE_PRECISION (type), w; 11231 11232 c1 = tree_to_double_int (TREE_OPERAND (arg0, 1)); 11233 c2 = tree_to_double_int (arg1); 11234 11235 /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2). */ 11236 if ((c1 & c2) == c1) 11237 return omit_one_operand_loc (loc, type, arg1, 11238 TREE_OPERAND (arg0, 0)); 11239 11240 msk = double_int::mask (width); 11241 11242 /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */ 11243 if (msk.and_not (c1 | c2).is_zero ()) 11244 return fold_build2_loc (loc, BIT_IOR_EXPR, type, 11245 TREE_OPERAND (arg0, 0), arg1); 11246 11247 /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2, 11248 unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some 11249 mode which allows further optimizations. */ 11250 c1 &= msk; 11251 c2 &= msk; 11252 c3 = c1.and_not (c2); 11253 for (w = BITS_PER_UNIT; 11254 w <= width && w <= HOST_BITS_PER_WIDE_INT; 11255 w <<= 1) 11256 { 11257 unsigned HOST_WIDE_INT mask 11258 = (unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - w); 11259 if (((c1.low | c2.low) & mask) == mask 11260 && (c1.low & ~mask) == 0 && c1.high == 0) 11261 { 11262 c3 = double_int::from_uhwi (mask); 11263 break; 11264 } 11265 } 11266 11267 if (c3 != c1) 11268 return fold_build2_loc (loc, BIT_IOR_EXPR, type, 11269 fold_build2_loc (loc, BIT_AND_EXPR, type, 11270 TREE_OPERAND (arg0, 0), 11271 double_int_to_tree (type, 11272 c3)), 11273 arg1); 11274 } 11275 11276 /* (X & Y) | Y is (X, Y). */ 11277 if (TREE_CODE (arg0) == BIT_AND_EXPR 11278 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 11279 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0)); 11280 /* (X & Y) | X is (Y, X). */ 11281 if (TREE_CODE (arg0) == BIT_AND_EXPR 11282 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 11283 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) 11284 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1)); 11285 /* X | (X & Y) is (Y, X). */ 11286 if (TREE_CODE (arg1) == BIT_AND_EXPR 11287 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0) 11288 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1))) 11289 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1)); 11290 /* X | (Y & X) is (Y, X). */ 11291 if (TREE_CODE (arg1) == BIT_AND_EXPR 11292 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) 11293 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) 11294 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0)); 11295 11296 /* (X & ~Y) | (~X & Y) is X ^ Y */ 11297 if (TREE_CODE (arg0) == BIT_AND_EXPR 11298 && TREE_CODE (arg1) == BIT_AND_EXPR) 11299 { 11300 tree a0, a1, l0, l1, n0, n1; 11301 11302 a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0)); 11303 a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1)); 11304 11305 l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 11306 l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 11307 11308 n0 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l0); 11309 n1 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l1); 11310 11311 if ((operand_equal_p (n0, a0, 0) 11312 && operand_equal_p (n1, a1, 0)) 11313 || (operand_equal_p (n0, a1, 0) 11314 && operand_equal_p (n1, a0, 0))) 11315 return fold_build2_loc (loc, BIT_XOR_EXPR, type, l0, n1); 11316 } 11317 11318 t1 = distribute_bit_expr (loc, code, type, arg0, arg1); 11319 if (t1 != NULL_TREE) 11320 return t1; 11321 11322 /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))). 11323 11324 This results in more efficient code for machines without a NAND 11325 instruction. Combine will canonicalize to the first form 11326 which will allow use of NAND instructions provided by the 11327 backend if they exist. */ 11328 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11329 && TREE_CODE (arg1) == BIT_NOT_EXPR) 11330 { 11331 return 11332 fold_build1_loc (loc, BIT_NOT_EXPR, type, 11333 build2 (BIT_AND_EXPR, type, 11334 fold_convert_loc (loc, type, 11335 TREE_OPERAND (arg0, 0)), 11336 fold_convert_loc (loc, type, 11337 TREE_OPERAND (arg1, 0)))); 11338 } 11339 11340 /* See if this can be simplified into a rotate first. If that 11341 is unsuccessful continue in the association code. */ 11342 goto bit_rotate; 11343 11344 case BIT_XOR_EXPR: 11345 if (integer_zerop (arg1)) 11346 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11347 if (integer_all_onesp (arg1)) 11348 return fold_build1_loc (loc, BIT_NOT_EXPR, type, op0); 11349 if (operand_equal_p (arg0, arg1, 0)) 11350 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 11351 11352 /* ~X ^ X is -1. */ 11353 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11354 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 11355 { 11356 t1 = build_zero_cst (type); 11357 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1); 11358 return omit_one_operand_loc (loc, type, t1, arg1); 11359 } 11360 11361 /* X ^ ~X is -1. */ 11362 if (TREE_CODE (arg1) == BIT_NOT_EXPR 11363 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11364 { 11365 t1 = build_zero_cst (type); 11366 t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1); 11367 return omit_one_operand_loc (loc, type, t1, arg0); 11368 } 11369 11370 /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing 11371 with a constant, and the two constants have no bits in common, 11372 we should treat this as a BIT_IOR_EXPR since this may produce more 11373 simplifications. */ 11374 if (TREE_CODE (arg0) == BIT_AND_EXPR 11375 && TREE_CODE (arg1) == BIT_AND_EXPR 11376 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 11377 && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST 11378 && integer_zerop (const_binop (BIT_AND_EXPR, 11379 TREE_OPERAND (arg0, 1), 11380 TREE_OPERAND (arg1, 1)))) 11381 { 11382 code = BIT_IOR_EXPR; 11383 goto bit_ior; 11384 } 11385 11386 /* (X | Y) ^ X -> Y & ~ X*/ 11387 if (TREE_CODE (arg0) == BIT_IOR_EXPR 11388 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 11389 { 11390 tree t2 = TREE_OPERAND (arg0, 1); 11391 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), 11392 arg1); 11393 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type, 11394 fold_convert_loc (loc, type, t2), 11395 fold_convert_loc (loc, type, t1)); 11396 return t1; 11397 } 11398 11399 /* (Y | X) ^ X -> Y & ~ X*/ 11400 if (TREE_CODE (arg0) == BIT_IOR_EXPR 11401 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 11402 { 11403 tree t2 = TREE_OPERAND (arg0, 0); 11404 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), 11405 arg1); 11406 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type, 11407 fold_convert_loc (loc, type, t2), 11408 fold_convert_loc (loc, type, t1)); 11409 return t1; 11410 } 11411 11412 /* X ^ (X | Y) -> Y & ~ X*/ 11413 if (TREE_CODE (arg1) == BIT_IOR_EXPR 11414 && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0)) 11415 { 11416 tree t2 = TREE_OPERAND (arg1, 1); 11417 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0), 11418 arg0); 11419 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type, 11420 fold_convert_loc (loc, type, t2), 11421 fold_convert_loc (loc, type, t1)); 11422 return t1; 11423 } 11424 11425 /* X ^ (Y | X) -> Y & ~ X*/ 11426 if (TREE_CODE (arg1) == BIT_IOR_EXPR 11427 && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0)) 11428 { 11429 tree t2 = TREE_OPERAND (arg1, 0); 11430 t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0), 11431 arg0); 11432 t1 = fold_build2_loc (loc, BIT_AND_EXPR, type, 11433 fold_convert_loc (loc, type, t2), 11434 fold_convert_loc (loc, type, t1)); 11435 return t1; 11436 } 11437 11438 /* Convert ~X ^ ~Y to X ^ Y. */ 11439 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11440 && TREE_CODE (arg1) == BIT_NOT_EXPR) 11441 return fold_build2_loc (loc, code, type, 11442 fold_convert_loc (loc, type, 11443 TREE_OPERAND (arg0, 0)), 11444 fold_convert_loc (loc, type, 11445 TREE_OPERAND (arg1, 0))); 11446 11447 /* Convert ~X ^ C to X ^ ~C. */ 11448 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11449 && TREE_CODE (arg1) == INTEGER_CST) 11450 return fold_build2_loc (loc, code, type, 11451 fold_convert_loc (loc, type, 11452 TREE_OPERAND (arg0, 0)), 11453 fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1)); 11454 11455 /* Fold (X & 1) ^ 1 as (X & 1) == 0. */ 11456 if (TREE_CODE (arg0) == BIT_AND_EXPR 11457 && integer_onep (TREE_OPERAND (arg0, 1)) 11458 && integer_onep (arg1)) 11459 return fold_build2_loc (loc, EQ_EXPR, type, arg0, 11460 build_zero_cst (TREE_TYPE (arg0))); 11461 11462 /* Fold (X & Y) ^ Y as ~X & Y. */ 11463 if (TREE_CODE (arg0) == BIT_AND_EXPR 11464 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 11465 { 11466 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 11467 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11468 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11469 fold_convert_loc (loc, type, arg1)); 11470 } 11471 /* Fold (X & Y) ^ X as ~Y & X. */ 11472 if (TREE_CODE (arg0) == BIT_AND_EXPR 11473 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 11474 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) 11475 { 11476 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 11477 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11478 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11479 fold_convert_loc (loc, type, arg1)); 11480 } 11481 /* Fold X ^ (X & Y) as X & ~Y. */ 11482 if (TREE_CODE (arg1) == BIT_AND_EXPR 11483 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11484 { 11485 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1)); 11486 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11487 fold_convert_loc (loc, type, arg0), 11488 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem)); 11489 } 11490 /* Fold X ^ (Y & X) as ~Y & X. */ 11491 if (TREE_CODE (arg1) == BIT_AND_EXPR 11492 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) 11493 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) 11494 { 11495 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0)); 11496 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11497 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11498 fold_convert_loc (loc, type, arg0)); 11499 } 11500 11501 /* See if this can be simplified into a rotate first. If that 11502 is unsuccessful continue in the association code. */ 11503 goto bit_rotate; 11504 11505 case BIT_AND_EXPR: 11506 if (integer_all_onesp (arg1)) 11507 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11508 if (integer_zerop (arg1)) 11509 return omit_one_operand_loc (loc, type, arg1, arg0); 11510 if (operand_equal_p (arg0, arg1, 0)) 11511 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11512 11513 /* ~X & X, (X == 0) & X, and !X & X are always zero. */ 11514 if ((TREE_CODE (arg0) == BIT_NOT_EXPR 11515 || TREE_CODE (arg0) == TRUTH_NOT_EXPR 11516 || (TREE_CODE (arg0) == EQ_EXPR 11517 && integer_zerop (TREE_OPERAND (arg0, 1)))) 11518 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 11519 return omit_one_operand_loc (loc, type, integer_zero_node, arg1); 11520 11521 /* X & ~X , X & (X == 0), and X & !X are always zero. */ 11522 if ((TREE_CODE (arg1) == BIT_NOT_EXPR 11523 || TREE_CODE (arg1) == TRUTH_NOT_EXPR 11524 || (TREE_CODE (arg1) == EQ_EXPR 11525 && integer_zerop (TREE_OPERAND (arg1, 1)))) 11526 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11527 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 11528 11529 /* Canonicalize (X | C1) & C2 as (X & C2) | (C1 & C2). */ 11530 if (TREE_CODE (arg0) == BIT_IOR_EXPR 11531 && TREE_CODE (arg1) == INTEGER_CST 11532 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 11533 { 11534 tree tmp1 = fold_convert_loc (loc, type, arg1); 11535 tree tmp2 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 11536 tree tmp3 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 11537 tmp2 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp2, tmp1); 11538 tmp3 = fold_build2_loc (loc, BIT_AND_EXPR, type, tmp3, tmp1); 11539 return 11540 fold_convert_loc (loc, type, 11541 fold_build2_loc (loc, BIT_IOR_EXPR, 11542 type, tmp2, tmp3)); 11543 } 11544 11545 /* (X | Y) & Y is (X, Y). */ 11546 if (TREE_CODE (arg0) == BIT_IOR_EXPR 11547 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 11548 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 0)); 11549 /* (X | Y) & X is (Y, X). */ 11550 if (TREE_CODE (arg0) == BIT_IOR_EXPR 11551 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 11552 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) 11553 return omit_one_operand_loc (loc, type, arg1, TREE_OPERAND (arg0, 1)); 11554 /* X & (X | Y) is (Y, X). */ 11555 if (TREE_CODE (arg1) == BIT_IOR_EXPR 11556 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0) 11557 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 1))) 11558 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 1)); 11559 /* X & (Y | X) is (Y, X). */ 11560 if (TREE_CODE (arg1) == BIT_IOR_EXPR 11561 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) 11562 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) 11563 return omit_one_operand_loc (loc, type, arg0, TREE_OPERAND (arg1, 0)); 11564 11565 /* Fold (X ^ 1) & 1 as (X & 1) == 0. */ 11566 if (TREE_CODE (arg0) == BIT_XOR_EXPR 11567 && integer_onep (TREE_OPERAND (arg0, 1)) 11568 && integer_onep (arg1)) 11569 { 11570 tree tem2; 11571 tem = TREE_OPERAND (arg0, 0); 11572 tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1); 11573 tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), 11574 tem, tem2); 11575 return fold_build2_loc (loc, EQ_EXPR, type, tem2, 11576 build_zero_cst (TREE_TYPE (tem))); 11577 } 11578 /* Fold ~X & 1 as (X & 1) == 0. */ 11579 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11580 && integer_onep (arg1)) 11581 { 11582 tree tem2; 11583 tem = TREE_OPERAND (arg0, 0); 11584 tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1); 11585 tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), 11586 tem, tem2); 11587 return fold_build2_loc (loc, EQ_EXPR, type, tem2, 11588 build_zero_cst (TREE_TYPE (tem))); 11589 } 11590 /* Fold !X & 1 as X == 0. */ 11591 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR 11592 && integer_onep (arg1)) 11593 { 11594 tem = TREE_OPERAND (arg0, 0); 11595 return fold_build2_loc (loc, EQ_EXPR, type, tem, 11596 build_zero_cst (TREE_TYPE (tem))); 11597 } 11598 11599 /* Fold (X ^ Y) & Y as ~X & Y. */ 11600 if (TREE_CODE (arg0) == BIT_XOR_EXPR 11601 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 11602 { 11603 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 11604 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11605 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11606 fold_convert_loc (loc, type, arg1)); 11607 } 11608 /* Fold (X ^ Y) & X as ~Y & X. */ 11609 if (TREE_CODE (arg0) == BIT_XOR_EXPR 11610 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 11611 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) 11612 { 11613 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 11614 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11615 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11616 fold_convert_loc (loc, type, arg1)); 11617 } 11618 /* Fold X & (X ^ Y) as X & ~Y. */ 11619 if (TREE_CODE (arg1) == BIT_XOR_EXPR 11620 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 11621 { 11622 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1)); 11623 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11624 fold_convert_loc (loc, type, arg0), 11625 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem)); 11626 } 11627 /* Fold X & (Y ^ X) as ~Y & X. */ 11628 if (TREE_CODE (arg1) == BIT_XOR_EXPR 11629 && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0) 11630 && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0))) 11631 { 11632 tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0)); 11633 return fold_build2_loc (loc, BIT_AND_EXPR, type, 11634 fold_build1_loc (loc, BIT_NOT_EXPR, type, tem), 11635 fold_convert_loc (loc, type, arg0)); 11636 } 11637 11638 /* Fold (X * Y) & -(1 << CST) to X * Y if Y is a constant 11639 multiple of 1 << CST. */ 11640 if (TREE_CODE (arg1) == INTEGER_CST) 11641 { 11642 double_int cst1 = tree_to_double_int (arg1); 11643 double_int ncst1 = (-cst1).ext(TYPE_PRECISION (TREE_TYPE (arg1)), 11644 TYPE_UNSIGNED (TREE_TYPE (arg1))); 11645 if ((cst1 & ncst1) == ncst1 11646 && multiple_of_p (type, arg0, 11647 double_int_to_tree (TREE_TYPE (arg1), ncst1))) 11648 return fold_convert_loc (loc, type, arg0); 11649 } 11650 11651 /* Fold (X * CST1) & CST2 to zero if we can, or drop known zero 11652 bits from CST2. */ 11653 if (TREE_CODE (arg1) == INTEGER_CST 11654 && TREE_CODE (arg0) == MULT_EXPR 11655 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 11656 { 11657 double_int darg1 = tree_to_double_int (arg1); 11658 double_int masked 11659 = mask_with_tz (type, darg1, 11660 tree_to_double_int (TREE_OPERAND (arg0, 1))); 11661 11662 if (masked.is_zero ()) 11663 return omit_two_operands_loc (loc, type, build_zero_cst (type), 11664 arg0, arg1); 11665 else if (masked != darg1) 11666 { 11667 /* Avoid the transform if arg1 is a mask of some 11668 mode which allows further optimizations. */ 11669 int pop = darg1.popcount (); 11670 if (!(pop >= BITS_PER_UNIT 11671 && exact_log2 (pop) != -1 11672 && double_int::mask (pop) == darg1)) 11673 return fold_build2_loc (loc, code, type, op0, 11674 double_int_to_tree (type, masked)); 11675 } 11676 } 11677 11678 /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M, 11679 ((A & N) + B) & M -> (A + B) & M 11680 Similarly if (N & M) == 0, 11681 ((A | N) + B) & M -> (A + B) & M 11682 and for - instead of + (or unary - instead of +) 11683 and/or ^ instead of |. 11684 If B is constant and (B & M) == 0, fold into A & M. */ 11685 if (host_integerp (arg1, 1)) 11686 { 11687 unsigned HOST_WIDE_INT cst1 = tree_low_cst (arg1, 1); 11688 if (~cst1 && (cst1 & (cst1 + 1)) == 0 11689 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)) 11690 && (TREE_CODE (arg0) == PLUS_EXPR 11691 || TREE_CODE (arg0) == MINUS_EXPR 11692 || TREE_CODE (arg0) == NEGATE_EXPR) 11693 && (TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)) 11694 || TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE)) 11695 { 11696 tree pmop[2]; 11697 int which = 0; 11698 unsigned HOST_WIDE_INT cst0; 11699 11700 /* Now we know that arg0 is (C + D) or (C - D) or 11701 -C and arg1 (M) is == (1LL << cst) - 1. 11702 Store C into PMOP[0] and D into PMOP[1]. */ 11703 pmop[0] = TREE_OPERAND (arg0, 0); 11704 pmop[1] = NULL; 11705 if (TREE_CODE (arg0) != NEGATE_EXPR) 11706 { 11707 pmop[1] = TREE_OPERAND (arg0, 1); 11708 which = 1; 11709 } 11710 11711 if (!host_integerp (TYPE_MAX_VALUE (TREE_TYPE (arg0)), 1) 11712 || (tree_low_cst (TYPE_MAX_VALUE (TREE_TYPE (arg0)), 1) 11713 & cst1) != cst1) 11714 which = -1; 11715 11716 for (; which >= 0; which--) 11717 switch (TREE_CODE (pmop[which])) 11718 { 11719 case BIT_AND_EXPR: 11720 case BIT_IOR_EXPR: 11721 case BIT_XOR_EXPR: 11722 if (TREE_CODE (TREE_OPERAND (pmop[which], 1)) 11723 != INTEGER_CST) 11724 break; 11725 /* tree_low_cst not used, because we don't care about 11726 the upper bits. */ 11727 cst0 = TREE_INT_CST_LOW (TREE_OPERAND (pmop[which], 1)); 11728 cst0 &= cst1; 11729 if (TREE_CODE (pmop[which]) == BIT_AND_EXPR) 11730 { 11731 if (cst0 != cst1) 11732 break; 11733 } 11734 else if (cst0 != 0) 11735 break; 11736 /* If C or D is of the form (A & N) where 11737 (N & M) == M, or of the form (A | N) or 11738 (A ^ N) where (N & M) == 0, replace it with A. */ 11739 pmop[which] = TREE_OPERAND (pmop[which], 0); 11740 break; 11741 case INTEGER_CST: 11742 /* If C or D is a N where (N & M) == 0, it can be 11743 omitted (assumed 0). */ 11744 if ((TREE_CODE (arg0) == PLUS_EXPR 11745 || (TREE_CODE (arg0) == MINUS_EXPR && which == 0)) 11746 && (TREE_INT_CST_LOW (pmop[which]) & cst1) == 0) 11747 pmop[which] = NULL; 11748 break; 11749 default: 11750 break; 11751 } 11752 11753 /* Only build anything new if we optimized one or both arguments 11754 above. */ 11755 if (pmop[0] != TREE_OPERAND (arg0, 0) 11756 || (TREE_CODE (arg0) != NEGATE_EXPR 11757 && pmop[1] != TREE_OPERAND (arg0, 1))) 11758 { 11759 tree utype = TREE_TYPE (arg0); 11760 if (! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))) 11761 { 11762 /* Perform the operations in a type that has defined 11763 overflow behavior. */ 11764 utype = unsigned_type_for (TREE_TYPE (arg0)); 11765 if (pmop[0] != NULL) 11766 pmop[0] = fold_convert_loc (loc, utype, pmop[0]); 11767 if (pmop[1] != NULL) 11768 pmop[1] = fold_convert_loc (loc, utype, pmop[1]); 11769 } 11770 11771 if (TREE_CODE (arg0) == NEGATE_EXPR) 11772 tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[0]); 11773 else if (TREE_CODE (arg0) == PLUS_EXPR) 11774 { 11775 if (pmop[0] != NULL && pmop[1] != NULL) 11776 tem = fold_build2_loc (loc, PLUS_EXPR, utype, 11777 pmop[0], pmop[1]); 11778 else if (pmop[0] != NULL) 11779 tem = pmop[0]; 11780 else if (pmop[1] != NULL) 11781 tem = pmop[1]; 11782 else 11783 return build_int_cst (type, 0); 11784 } 11785 else if (pmop[0] == NULL) 11786 tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[1]); 11787 else 11788 tem = fold_build2_loc (loc, MINUS_EXPR, utype, 11789 pmop[0], pmop[1]); 11790 /* TEM is now the new binary +, - or unary - replacement. */ 11791 tem = fold_build2_loc (loc, BIT_AND_EXPR, utype, tem, 11792 fold_convert_loc (loc, utype, arg1)); 11793 return fold_convert_loc (loc, type, tem); 11794 } 11795 } 11796 } 11797 11798 t1 = distribute_bit_expr (loc, code, type, arg0, arg1); 11799 if (t1 != NULL_TREE) 11800 return t1; 11801 /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */ 11802 if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR 11803 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0)))) 11804 { 11805 unsigned int prec 11806 = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0))); 11807 11808 if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT 11809 && (~TREE_INT_CST_LOW (arg1) 11810 & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0) 11811 return 11812 fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 11813 } 11814 11815 /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))). 11816 11817 This results in more efficient code for machines without a NOR 11818 instruction. Combine will canonicalize to the first form 11819 which will allow use of NOR instructions provided by the 11820 backend if they exist. */ 11821 if (TREE_CODE (arg0) == BIT_NOT_EXPR 11822 && TREE_CODE (arg1) == BIT_NOT_EXPR) 11823 { 11824 return fold_build1_loc (loc, BIT_NOT_EXPR, type, 11825 build2 (BIT_IOR_EXPR, type, 11826 fold_convert_loc (loc, type, 11827 TREE_OPERAND (arg0, 0)), 11828 fold_convert_loc (loc, type, 11829 TREE_OPERAND (arg1, 0)))); 11830 } 11831 11832 /* If arg0 is derived from the address of an object or function, we may 11833 be able to fold this expression using the object or function's 11834 alignment. */ 11835 if (POINTER_TYPE_P (TREE_TYPE (arg0)) && host_integerp (arg1, 1)) 11836 { 11837 unsigned HOST_WIDE_INT modulus, residue; 11838 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1); 11839 11840 modulus = get_pointer_modulus_and_residue (arg0, &residue, 11841 integer_onep (arg1)); 11842 11843 /* This works because modulus is a power of 2. If this weren't the 11844 case, we'd have to replace it by its greatest power-of-2 11845 divisor: modulus & -modulus. */ 11846 if (low < modulus) 11847 return build_int_cst (type, residue & low); 11848 } 11849 11850 /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1)) 11851 (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1)) 11852 if the new mask might be further optimized. */ 11853 if ((TREE_CODE (arg0) == LSHIFT_EXPR 11854 || TREE_CODE (arg0) == RSHIFT_EXPR) 11855 && host_integerp (TREE_OPERAND (arg0, 1), 1) 11856 && host_integerp (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1))) 11857 && tree_low_cst (TREE_OPERAND (arg0, 1), 1) 11858 < TYPE_PRECISION (TREE_TYPE (arg0)) 11859 && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT 11860 && tree_low_cst (TREE_OPERAND (arg0, 1), 1) > 0) 11861 { 11862 unsigned int shiftc = tree_low_cst (TREE_OPERAND (arg0, 1), 1); 11863 unsigned HOST_WIDE_INT mask 11864 = tree_low_cst (arg1, TYPE_UNSIGNED (TREE_TYPE (arg1))); 11865 unsigned HOST_WIDE_INT newmask, zerobits = 0; 11866 tree shift_type = TREE_TYPE (arg0); 11867 11868 if (TREE_CODE (arg0) == LSHIFT_EXPR) 11869 zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1); 11870 else if (TREE_CODE (arg0) == RSHIFT_EXPR 11871 && TYPE_PRECISION (TREE_TYPE (arg0)) 11872 == GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (arg0)))) 11873 { 11874 unsigned int prec = TYPE_PRECISION (TREE_TYPE (arg0)); 11875 tree arg00 = TREE_OPERAND (arg0, 0); 11876 /* See if more bits can be proven as zero because of 11877 zero extension. */ 11878 if (TREE_CODE (arg00) == NOP_EXPR 11879 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0)))) 11880 { 11881 tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0)); 11882 if (TYPE_PRECISION (inner_type) 11883 == GET_MODE_BITSIZE (TYPE_MODE (inner_type)) 11884 && TYPE_PRECISION (inner_type) < prec) 11885 { 11886 prec = TYPE_PRECISION (inner_type); 11887 /* See if we can shorten the right shift. */ 11888 if (shiftc < prec) 11889 shift_type = inner_type; 11890 } 11891 } 11892 zerobits = ~(unsigned HOST_WIDE_INT) 0; 11893 zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc; 11894 zerobits <<= prec - shiftc; 11895 /* For arithmetic shift if sign bit could be set, zerobits 11896 can contain actually sign bits, so no transformation is 11897 possible, unless MASK masks them all away. In that 11898 case the shift needs to be converted into logical shift. */ 11899 if (!TYPE_UNSIGNED (TREE_TYPE (arg0)) 11900 && prec == TYPE_PRECISION (TREE_TYPE (arg0))) 11901 { 11902 if ((mask & zerobits) == 0) 11903 shift_type = unsigned_type_for (TREE_TYPE (arg0)); 11904 else 11905 zerobits = 0; 11906 } 11907 } 11908 11909 /* ((X << 16) & 0xff00) is (X, 0). */ 11910 if ((mask & zerobits) == mask) 11911 return omit_one_operand_loc (loc, type, 11912 build_int_cst (type, 0), arg0); 11913 11914 newmask = mask | zerobits; 11915 if (newmask != mask && (newmask & (newmask + 1)) == 0) 11916 { 11917 unsigned int prec; 11918 11919 /* Only do the transformation if NEWMASK is some integer 11920 mode's mask. */ 11921 for (prec = BITS_PER_UNIT; 11922 prec < HOST_BITS_PER_WIDE_INT; prec <<= 1) 11923 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1) 11924 break; 11925 if (prec < HOST_BITS_PER_WIDE_INT 11926 || newmask == ~(unsigned HOST_WIDE_INT) 0) 11927 { 11928 tree newmaskt; 11929 11930 if (shift_type != TREE_TYPE (arg0)) 11931 { 11932 tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type, 11933 fold_convert_loc (loc, shift_type, 11934 TREE_OPERAND (arg0, 0)), 11935 TREE_OPERAND (arg0, 1)); 11936 tem = fold_convert_loc (loc, type, tem); 11937 } 11938 else 11939 tem = op0; 11940 newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask); 11941 if (!tree_int_cst_equal (newmaskt, arg1)) 11942 return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt); 11943 } 11944 } 11945 } 11946 11947 goto associate; 11948 11949 case RDIV_EXPR: 11950 /* Don't touch a floating-point divide by zero unless the mode 11951 of the constant can represent infinity. */ 11952 if (TREE_CODE (arg1) == REAL_CST 11953 && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))) 11954 && real_zerop (arg1)) 11955 return NULL_TREE; 11956 11957 /* Optimize A / A to 1.0 if we don't care about 11958 NaNs or Infinities. Skip the transformation 11959 for non-real operands. */ 11960 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg0)) 11961 && ! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) 11962 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg0))) 11963 && operand_equal_p (arg0, arg1, 0)) 11964 { 11965 tree r = build_real (TREE_TYPE (arg0), dconst1); 11966 11967 return omit_two_operands_loc (loc, type, r, arg0, arg1); 11968 } 11969 11970 /* The complex version of the above A / A optimization. */ 11971 if (COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)) 11972 && operand_equal_p (arg0, arg1, 0)) 11973 { 11974 tree elem_type = TREE_TYPE (TREE_TYPE (arg0)); 11975 if (! HONOR_NANS (TYPE_MODE (elem_type)) 11976 && ! HONOR_INFINITIES (TYPE_MODE (elem_type))) 11977 { 11978 tree r = build_real (elem_type, dconst1); 11979 /* omit_two_operands will call fold_convert for us. */ 11980 return omit_two_operands_loc (loc, type, r, arg0, arg1); 11981 } 11982 } 11983 11984 /* (-A) / (-B) -> A / B */ 11985 if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1)) 11986 return fold_build2_loc (loc, RDIV_EXPR, type, 11987 TREE_OPERAND (arg0, 0), 11988 negate_expr (arg1)); 11989 if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0)) 11990 return fold_build2_loc (loc, RDIV_EXPR, type, 11991 negate_expr (arg0), 11992 TREE_OPERAND (arg1, 0)); 11993 11994 /* In IEEE floating point, x/1 is not equivalent to x for snans. */ 11995 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 11996 && real_onep (arg1)) 11997 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 11998 11999 /* In IEEE floating point, x/-1 is not equivalent to -x for snans. */ 12000 if (!HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))) 12001 && real_minus_onep (arg1)) 12002 return non_lvalue_loc (loc, fold_convert_loc (loc, type, 12003 negate_expr (arg0))); 12004 12005 /* If ARG1 is a constant, we can convert this to a multiply by the 12006 reciprocal. This does not have the same rounding properties, 12007 so only do this if -freciprocal-math. We can actually 12008 always safely do it if ARG1 is a power of two, but it's hard to 12009 tell if it is or not in a portable manner. */ 12010 if (optimize 12011 && (TREE_CODE (arg1) == REAL_CST 12012 || (TREE_CODE (arg1) == COMPLEX_CST 12013 && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg1))) 12014 || (TREE_CODE (arg1) == VECTOR_CST 12015 && VECTOR_FLOAT_TYPE_P (TREE_TYPE (arg1))))) 12016 { 12017 if (flag_reciprocal_math 12018 && 0 != (tem = const_binop (code, build_one_cst (type), arg1))) 12019 return fold_build2_loc (loc, MULT_EXPR, type, arg0, tem); 12020 /* Find the reciprocal if optimizing and the result is exact. 12021 TODO: Complex reciprocal not implemented. */ 12022 if (TREE_CODE (arg1) != COMPLEX_CST) 12023 { 12024 tree inverse = exact_inverse (TREE_TYPE (arg0), arg1); 12025 12026 if (inverse) 12027 return fold_build2_loc (loc, MULT_EXPR, type, arg0, inverse); 12028 } 12029 } 12030 /* Convert A/B/C to A/(B*C). */ 12031 if (flag_reciprocal_math 12032 && TREE_CODE (arg0) == RDIV_EXPR) 12033 return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0), 12034 fold_build2_loc (loc, MULT_EXPR, type, 12035 TREE_OPERAND (arg0, 1), arg1)); 12036 12037 /* Convert A/(B/C) to (A/B)*C. */ 12038 if (flag_reciprocal_math 12039 && TREE_CODE (arg1) == RDIV_EXPR) 12040 return fold_build2_loc (loc, MULT_EXPR, type, 12041 fold_build2_loc (loc, RDIV_EXPR, type, arg0, 12042 TREE_OPERAND (arg1, 0)), 12043 TREE_OPERAND (arg1, 1)); 12044 12045 /* Convert C1/(X*C2) into (C1/C2)/X. */ 12046 if (flag_reciprocal_math 12047 && TREE_CODE (arg1) == MULT_EXPR 12048 && TREE_CODE (arg0) == REAL_CST 12049 && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST) 12050 { 12051 tree tem = const_binop (RDIV_EXPR, arg0, 12052 TREE_OPERAND (arg1, 1)); 12053 if (tem) 12054 return fold_build2_loc (loc, RDIV_EXPR, type, tem, 12055 TREE_OPERAND (arg1, 0)); 12056 } 12057 12058 if (flag_unsafe_math_optimizations) 12059 { 12060 enum built_in_function fcode0 = builtin_mathfn_code (arg0); 12061 enum built_in_function fcode1 = builtin_mathfn_code (arg1); 12062 12063 /* Optimize sin(x)/cos(x) as tan(x). */ 12064 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS) 12065 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF) 12066 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL)) 12067 && operand_equal_p (CALL_EXPR_ARG (arg0, 0), 12068 CALL_EXPR_ARG (arg1, 0), 0)) 12069 { 12070 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN); 12071 12072 if (tanfn != NULL_TREE) 12073 return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0)); 12074 } 12075 12076 /* Optimize cos(x)/sin(x) as 1.0/tan(x). */ 12077 if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN) 12078 || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF) 12079 || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL)) 12080 && operand_equal_p (CALL_EXPR_ARG (arg0, 0), 12081 CALL_EXPR_ARG (arg1, 0), 0)) 12082 { 12083 tree tanfn = mathfn_built_in (type, BUILT_IN_TAN); 12084 12085 if (tanfn != NULL_TREE) 12086 { 12087 tree tmp = build_call_expr_loc (loc, tanfn, 1, 12088 CALL_EXPR_ARG (arg0, 0)); 12089 return fold_build2_loc (loc, RDIV_EXPR, type, 12090 build_real (type, dconst1), tmp); 12091 } 12092 } 12093 12094 /* Optimize sin(x)/tan(x) as cos(x) if we don't care about 12095 NaNs or Infinities. */ 12096 if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN) 12097 || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF) 12098 || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL))) 12099 { 12100 tree arg00 = CALL_EXPR_ARG (arg0, 0); 12101 tree arg01 = CALL_EXPR_ARG (arg1, 0); 12102 12103 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00))) 12104 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00))) 12105 && operand_equal_p (arg00, arg01, 0)) 12106 { 12107 tree cosfn = mathfn_built_in (type, BUILT_IN_COS); 12108 12109 if (cosfn != NULL_TREE) 12110 return build_call_expr_loc (loc, cosfn, 1, arg00); 12111 } 12112 } 12113 12114 /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about 12115 NaNs or Infinities. */ 12116 if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN) 12117 || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF) 12118 || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL))) 12119 { 12120 tree arg00 = CALL_EXPR_ARG (arg0, 0); 12121 tree arg01 = CALL_EXPR_ARG (arg1, 0); 12122 12123 if (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg00))) 12124 && ! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg00))) 12125 && operand_equal_p (arg00, arg01, 0)) 12126 { 12127 tree cosfn = mathfn_built_in (type, BUILT_IN_COS); 12128 12129 if (cosfn != NULL_TREE) 12130 { 12131 tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00); 12132 return fold_build2_loc (loc, RDIV_EXPR, type, 12133 build_real (type, dconst1), 12134 tmp); 12135 } 12136 } 12137 } 12138 12139 /* Optimize pow(x,c)/x as pow(x,c-1). */ 12140 if (fcode0 == BUILT_IN_POW 12141 || fcode0 == BUILT_IN_POWF 12142 || fcode0 == BUILT_IN_POWL) 12143 { 12144 tree arg00 = CALL_EXPR_ARG (arg0, 0); 12145 tree arg01 = CALL_EXPR_ARG (arg0, 1); 12146 if (TREE_CODE (arg01) == REAL_CST 12147 && !TREE_OVERFLOW (arg01) 12148 && operand_equal_p (arg1, arg00, 0)) 12149 { 12150 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0); 12151 REAL_VALUE_TYPE c; 12152 tree arg; 12153 12154 c = TREE_REAL_CST (arg01); 12155 real_arithmetic (&c, MINUS_EXPR, &c, &dconst1); 12156 arg = build_real (type, c); 12157 return build_call_expr_loc (loc, powfn, 2, arg1, arg); 12158 } 12159 } 12160 12161 /* Optimize a/root(b/c) into a*root(c/b). */ 12162 if (BUILTIN_ROOT_P (fcode1)) 12163 { 12164 tree rootarg = CALL_EXPR_ARG (arg1, 0); 12165 12166 if (TREE_CODE (rootarg) == RDIV_EXPR) 12167 { 12168 tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0); 12169 tree b = TREE_OPERAND (rootarg, 0); 12170 tree c = TREE_OPERAND (rootarg, 1); 12171 12172 tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b); 12173 12174 tmp = build_call_expr_loc (loc, rootfn, 1, tmp); 12175 return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp); 12176 } 12177 } 12178 12179 /* Optimize x/expN(y) into x*expN(-y). */ 12180 if (BUILTIN_EXPONENT_P (fcode1)) 12181 { 12182 tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0); 12183 tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0)); 12184 arg1 = build_call_expr_loc (loc, 12185 expfn, 1, 12186 fold_convert_loc (loc, type, arg)); 12187 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1); 12188 } 12189 12190 /* Optimize x/pow(y,z) into x*pow(y,-z). */ 12191 if (fcode1 == BUILT_IN_POW 12192 || fcode1 == BUILT_IN_POWF 12193 || fcode1 == BUILT_IN_POWL) 12194 { 12195 tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0); 12196 tree arg10 = CALL_EXPR_ARG (arg1, 0); 12197 tree arg11 = CALL_EXPR_ARG (arg1, 1); 12198 tree neg11 = fold_convert_loc (loc, type, 12199 negate_expr (arg11)); 12200 arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11); 12201 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1); 12202 } 12203 } 12204 return NULL_TREE; 12205 12206 case TRUNC_DIV_EXPR: 12207 /* Optimize (X & (-A)) / A where A is a power of 2, 12208 to X >> log2(A) */ 12209 if (TREE_CODE (arg0) == BIT_AND_EXPR 12210 && !TYPE_UNSIGNED (type) && TREE_CODE (arg1) == INTEGER_CST 12211 && integer_pow2p (arg1) && tree_int_cst_sgn (arg1) > 0) 12212 { 12213 tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (arg1), 12214 arg1, TREE_OPERAND (arg0, 1)); 12215 if (sum && integer_zerop (sum)) { 12216 unsigned long pow2; 12217 12218 if (TREE_INT_CST_LOW (arg1)) 12219 pow2 = exact_log2 (TREE_INT_CST_LOW (arg1)); 12220 else 12221 pow2 = exact_log2 (TREE_INT_CST_HIGH (arg1)) 12222 + HOST_BITS_PER_WIDE_INT; 12223 12224 return fold_build2_loc (loc, RSHIFT_EXPR, type, 12225 TREE_OPERAND (arg0, 0), 12226 build_int_cst (integer_type_node, pow2)); 12227 } 12228 } 12229 12230 /* Fall through */ 12231 12232 case FLOOR_DIV_EXPR: 12233 /* Simplify A / (B << N) where A and B are positive and B is 12234 a power of 2, to A >> (N + log2(B)). */ 12235 strict_overflow_p = false; 12236 if (TREE_CODE (arg1) == LSHIFT_EXPR 12237 && (TYPE_UNSIGNED (type) 12238 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p))) 12239 { 12240 tree sval = TREE_OPERAND (arg1, 0); 12241 if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0) 12242 { 12243 tree sh_cnt = TREE_OPERAND (arg1, 1); 12244 unsigned long pow2; 12245 12246 if (TREE_INT_CST_LOW (sval)) 12247 pow2 = exact_log2 (TREE_INT_CST_LOW (sval)); 12248 else 12249 pow2 = exact_log2 (TREE_INT_CST_HIGH (sval)) 12250 + HOST_BITS_PER_WIDE_INT; 12251 12252 if (strict_overflow_p) 12253 fold_overflow_warning (("assuming signed overflow does not " 12254 "occur when simplifying A / (B << N)"), 12255 WARN_STRICT_OVERFLOW_MISC); 12256 12257 sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt), 12258 sh_cnt, 12259 build_int_cst (TREE_TYPE (sh_cnt), 12260 pow2)); 12261 return fold_build2_loc (loc, RSHIFT_EXPR, type, 12262 fold_convert_loc (loc, type, arg0), sh_cnt); 12263 } 12264 } 12265 12266 /* For unsigned integral types, FLOOR_DIV_EXPR is the same as 12267 TRUNC_DIV_EXPR. Rewrite into the latter in this case. */ 12268 if (INTEGRAL_TYPE_P (type) 12269 && TYPE_UNSIGNED (type) 12270 && code == FLOOR_DIV_EXPR) 12271 return fold_build2_loc (loc, TRUNC_DIV_EXPR, type, op0, op1); 12272 12273 /* Fall through */ 12274 12275 case ROUND_DIV_EXPR: 12276 case CEIL_DIV_EXPR: 12277 case EXACT_DIV_EXPR: 12278 if (integer_onep (arg1)) 12279 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12280 if (integer_zerop (arg1)) 12281 return NULL_TREE; 12282 /* X / -1 is -X. */ 12283 if (!TYPE_UNSIGNED (type) 12284 && TREE_CODE (arg1) == INTEGER_CST 12285 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1 12286 && TREE_INT_CST_HIGH (arg1) == -1) 12287 return fold_convert_loc (loc, type, negate_expr (arg0)); 12288 12289 /* Convert -A / -B to A / B when the type is signed and overflow is 12290 undefined. */ 12291 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) 12292 && TREE_CODE (arg0) == NEGATE_EXPR 12293 && negate_expr_p (arg1)) 12294 { 12295 if (INTEGRAL_TYPE_P (type)) 12296 fold_overflow_warning (("assuming signed overflow does not occur " 12297 "when distributing negation across " 12298 "division"), 12299 WARN_STRICT_OVERFLOW_MISC); 12300 return fold_build2_loc (loc, code, type, 12301 fold_convert_loc (loc, type, 12302 TREE_OPERAND (arg0, 0)), 12303 fold_convert_loc (loc, type, 12304 negate_expr (arg1))); 12305 } 12306 if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) 12307 && TREE_CODE (arg1) == NEGATE_EXPR 12308 && negate_expr_p (arg0)) 12309 { 12310 if (INTEGRAL_TYPE_P (type)) 12311 fold_overflow_warning (("assuming signed overflow does not occur " 12312 "when distributing negation across " 12313 "division"), 12314 WARN_STRICT_OVERFLOW_MISC); 12315 return fold_build2_loc (loc, code, type, 12316 fold_convert_loc (loc, type, 12317 negate_expr (arg0)), 12318 fold_convert_loc (loc, type, 12319 TREE_OPERAND (arg1, 0))); 12320 } 12321 12322 /* If arg0 is a multiple of arg1, then rewrite to the fastest div 12323 operation, EXACT_DIV_EXPR. 12324 12325 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now. 12326 At one time others generated faster code, it's not clear if they do 12327 after the last round to changes to the DIV code in expmed.c. */ 12328 if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR) 12329 && multiple_of_p (type, arg0, arg1)) 12330 return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1); 12331 12332 strict_overflow_p = false; 12333 if (TREE_CODE (arg1) == INTEGER_CST 12334 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE, 12335 &strict_overflow_p))) 12336 { 12337 if (strict_overflow_p) 12338 fold_overflow_warning (("assuming signed overflow does not occur " 12339 "when simplifying division"), 12340 WARN_STRICT_OVERFLOW_MISC); 12341 return fold_convert_loc (loc, type, tem); 12342 } 12343 12344 return NULL_TREE; 12345 12346 case CEIL_MOD_EXPR: 12347 case FLOOR_MOD_EXPR: 12348 case ROUND_MOD_EXPR: 12349 case TRUNC_MOD_EXPR: 12350 /* X % 1 is always zero, but be sure to preserve any side 12351 effects in X. */ 12352 if (integer_onep (arg1)) 12353 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 12354 12355 /* X % 0, return X % 0 unchanged so that we can get the 12356 proper warnings and errors. */ 12357 if (integer_zerop (arg1)) 12358 return NULL_TREE; 12359 12360 /* 0 % X is always zero, but be sure to preserve any side 12361 effects in X. Place this after checking for X == 0. */ 12362 if (integer_zerop (arg0)) 12363 return omit_one_operand_loc (loc, type, integer_zero_node, arg1); 12364 12365 /* X % -1 is zero. */ 12366 if (!TYPE_UNSIGNED (type) 12367 && TREE_CODE (arg1) == INTEGER_CST 12368 && TREE_INT_CST_LOW (arg1) == (unsigned HOST_WIDE_INT) -1 12369 && TREE_INT_CST_HIGH (arg1) == -1) 12370 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 12371 12372 /* X % -C is the same as X % C. */ 12373 if (code == TRUNC_MOD_EXPR 12374 && !TYPE_UNSIGNED (type) 12375 && TREE_CODE (arg1) == INTEGER_CST 12376 && !TREE_OVERFLOW (arg1) 12377 && TREE_INT_CST_HIGH (arg1) < 0 12378 && !TYPE_OVERFLOW_TRAPS (type) 12379 /* Avoid this transformation if C is INT_MIN, i.e. C == -C. */ 12380 && !sign_bit_p (arg1, arg1)) 12381 return fold_build2_loc (loc, code, type, 12382 fold_convert_loc (loc, type, arg0), 12383 fold_convert_loc (loc, type, 12384 negate_expr (arg1))); 12385 12386 /* X % -Y is the same as X % Y. */ 12387 if (code == TRUNC_MOD_EXPR 12388 && !TYPE_UNSIGNED (type) 12389 && TREE_CODE (arg1) == NEGATE_EXPR 12390 && !TYPE_OVERFLOW_TRAPS (type)) 12391 return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0), 12392 fold_convert_loc (loc, type, 12393 TREE_OPERAND (arg1, 0))); 12394 12395 strict_overflow_p = false; 12396 if (TREE_CODE (arg1) == INTEGER_CST 12397 && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE, 12398 &strict_overflow_p))) 12399 { 12400 if (strict_overflow_p) 12401 fold_overflow_warning (("assuming signed overflow does not occur " 12402 "when simplifying modulus"), 12403 WARN_STRICT_OVERFLOW_MISC); 12404 return fold_convert_loc (loc, type, tem); 12405 } 12406 12407 /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR, 12408 i.e. "X % C" into "X & (C - 1)", if X and C are positive. */ 12409 if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR) 12410 && (TYPE_UNSIGNED (type) 12411 || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p))) 12412 { 12413 tree c = arg1; 12414 /* Also optimize A % (C << N) where C is a power of 2, 12415 to A & ((C << N) - 1). */ 12416 if (TREE_CODE (arg1) == LSHIFT_EXPR) 12417 c = TREE_OPERAND (arg1, 0); 12418 12419 if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0) 12420 { 12421 tree mask 12422 = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1, 12423 build_int_cst (TREE_TYPE (arg1), 1)); 12424 if (strict_overflow_p) 12425 fold_overflow_warning (("assuming signed overflow does not " 12426 "occur when simplifying " 12427 "X % (power of two)"), 12428 WARN_STRICT_OVERFLOW_MISC); 12429 return fold_build2_loc (loc, BIT_AND_EXPR, type, 12430 fold_convert_loc (loc, type, arg0), 12431 fold_convert_loc (loc, type, mask)); 12432 } 12433 } 12434 12435 return NULL_TREE; 12436 12437 case LROTATE_EXPR: 12438 case RROTATE_EXPR: 12439 if (integer_all_onesp (arg0)) 12440 return omit_one_operand_loc (loc, type, arg0, arg1); 12441 goto shift; 12442 12443 case RSHIFT_EXPR: 12444 /* Optimize -1 >> x for arithmetic right shifts. */ 12445 if (integer_all_onesp (arg0) && !TYPE_UNSIGNED (type) 12446 && tree_expr_nonnegative_p (arg1)) 12447 return omit_one_operand_loc (loc, type, arg0, arg1); 12448 /* ... fall through ... */ 12449 12450 case LSHIFT_EXPR: 12451 shift: 12452 if (integer_zerop (arg1)) 12453 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12454 if (integer_zerop (arg0)) 12455 return omit_one_operand_loc (loc, type, arg0, arg1); 12456 12457 /* Since negative shift count is not well-defined, 12458 don't try to compute it in the compiler. */ 12459 if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0) 12460 return NULL_TREE; 12461 12462 /* Turn (a OP c1) OP c2 into a OP (c1+c2). */ 12463 if (TREE_CODE (op0) == code && host_integerp (arg1, false) 12464 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type) 12465 && host_integerp (TREE_OPERAND (arg0, 1), false) 12466 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type)) 12467 { 12468 HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) 12469 + TREE_INT_CST_LOW (arg1)); 12470 12471 /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2 12472 being well defined. */ 12473 if (low >= TYPE_PRECISION (type)) 12474 { 12475 if (code == LROTATE_EXPR || code == RROTATE_EXPR) 12476 low = low % TYPE_PRECISION (type); 12477 else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR) 12478 return omit_one_operand_loc (loc, type, build_int_cst (type, 0), 12479 TREE_OPERAND (arg0, 0)); 12480 else 12481 low = TYPE_PRECISION (type) - 1; 12482 } 12483 12484 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), 12485 build_int_cst (type, low)); 12486 } 12487 12488 /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c 12489 into x & ((unsigned)-1 >> c) for unsigned types. */ 12490 if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR) 12491 || (TYPE_UNSIGNED (type) 12492 && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR)) 12493 && host_integerp (arg1, false) 12494 && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type) 12495 && host_integerp (TREE_OPERAND (arg0, 1), false) 12496 && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type)) 12497 { 12498 HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)); 12499 HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1); 12500 tree lshift; 12501 tree arg00; 12502 12503 if (low0 == low1) 12504 { 12505 arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 12506 12507 lshift = build_int_cst (type, -1); 12508 lshift = int_const_binop (code, lshift, arg1); 12509 12510 return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift); 12511 } 12512 } 12513 12514 /* Rewrite an LROTATE_EXPR by a constant into an 12515 RROTATE_EXPR by a new constant. */ 12516 if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST) 12517 { 12518 tree tem = build_int_cst (TREE_TYPE (arg1), 12519 TYPE_PRECISION (type)); 12520 tem = const_binop (MINUS_EXPR, tem, arg1); 12521 return fold_build2_loc (loc, RROTATE_EXPR, type, op0, tem); 12522 } 12523 12524 /* If we have a rotate of a bit operation with the rotate count and 12525 the second operand of the bit operation both constant, 12526 permute the two operations. */ 12527 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST 12528 && (TREE_CODE (arg0) == BIT_AND_EXPR 12529 || TREE_CODE (arg0) == BIT_IOR_EXPR 12530 || TREE_CODE (arg0) == BIT_XOR_EXPR) 12531 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 12532 return fold_build2_loc (loc, TREE_CODE (arg0), type, 12533 fold_build2_loc (loc, code, type, 12534 TREE_OPERAND (arg0, 0), arg1), 12535 fold_build2_loc (loc, code, type, 12536 TREE_OPERAND (arg0, 1), arg1)); 12537 12538 /* Two consecutive rotates adding up to the precision of the 12539 type can be ignored. */ 12540 if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST 12541 && TREE_CODE (arg0) == RROTATE_EXPR 12542 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 12543 && TREE_INT_CST_HIGH (arg1) == 0 12544 && TREE_INT_CST_HIGH (TREE_OPERAND (arg0, 1)) == 0 12545 && ((TREE_INT_CST_LOW (arg1) 12546 + TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))) 12547 == (unsigned int) TYPE_PRECISION (type))) 12548 return TREE_OPERAND (arg0, 0); 12549 12550 /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1) 12551 (X & C2) >> C1 into (X >> C1) & (C2 >> C1) 12552 if the latter can be further optimized. */ 12553 if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR) 12554 && TREE_CODE (arg0) == BIT_AND_EXPR 12555 && TREE_CODE (arg1) == INTEGER_CST 12556 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 12557 { 12558 tree mask = fold_build2_loc (loc, code, type, 12559 fold_convert_loc (loc, type, 12560 TREE_OPERAND (arg0, 1)), 12561 arg1); 12562 tree shift = fold_build2_loc (loc, code, type, 12563 fold_convert_loc (loc, type, 12564 TREE_OPERAND (arg0, 0)), 12565 arg1); 12566 tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask); 12567 if (tem) 12568 return tem; 12569 } 12570 12571 return NULL_TREE; 12572 12573 case MIN_EXPR: 12574 if (operand_equal_p (arg0, arg1, 0)) 12575 return omit_one_operand_loc (loc, type, arg0, arg1); 12576 if (INTEGRAL_TYPE_P (type) 12577 && operand_equal_p (arg1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST)) 12578 return omit_one_operand_loc (loc, type, arg1, arg0); 12579 tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1); 12580 if (tem) 12581 return tem; 12582 goto associate; 12583 12584 case MAX_EXPR: 12585 if (operand_equal_p (arg0, arg1, 0)) 12586 return omit_one_operand_loc (loc, type, arg0, arg1); 12587 if (INTEGRAL_TYPE_P (type) 12588 && TYPE_MAX_VALUE (type) 12589 && operand_equal_p (arg1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST)) 12590 return omit_one_operand_loc (loc, type, arg1, arg0); 12591 tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1); 12592 if (tem) 12593 return tem; 12594 goto associate; 12595 12596 case TRUTH_ANDIF_EXPR: 12597 /* Note that the operands of this must be ints 12598 and their values must be 0 or 1. 12599 ("true" is a fixed value perhaps depending on the language.) */ 12600 /* If first arg is constant zero, return it. */ 12601 if (integer_zerop (arg0)) 12602 return fold_convert_loc (loc, type, arg0); 12603 case TRUTH_AND_EXPR: 12604 /* If either arg is constant true, drop it. */ 12605 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0)) 12606 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 12607 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1) 12608 /* Preserve sequence points. */ 12609 && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0))) 12610 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12611 /* If second arg is constant zero, result is zero, but first arg 12612 must be evaluated. */ 12613 if (integer_zerop (arg1)) 12614 return omit_one_operand_loc (loc, type, arg1, arg0); 12615 /* Likewise for first arg, but note that only the TRUTH_AND_EXPR 12616 case will be handled here. */ 12617 if (integer_zerop (arg0)) 12618 return omit_one_operand_loc (loc, type, arg0, arg1); 12619 12620 /* !X && X is always false. */ 12621 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR 12622 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 12623 return omit_one_operand_loc (loc, type, integer_zero_node, arg1); 12624 /* X && !X is always false. */ 12625 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR 12626 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 12627 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 12628 12629 /* A < X && A + 1 > Y ==> A < X && A >= Y. Normally A + 1 > Y 12630 means A >= Y && A != MAX, but in this case we know that 12631 A < X <= MAX. */ 12632 12633 if (!TREE_SIDE_EFFECTS (arg0) 12634 && !TREE_SIDE_EFFECTS (arg1)) 12635 { 12636 tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1); 12637 if (tem && !operand_equal_p (tem, arg0, 0)) 12638 return fold_build2_loc (loc, code, type, tem, arg1); 12639 12640 tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0); 12641 if (tem && !operand_equal_p (tem, arg1, 0)) 12642 return fold_build2_loc (loc, code, type, arg0, tem); 12643 } 12644 12645 if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1)) 12646 != NULL_TREE) 12647 return tem; 12648 12649 return NULL_TREE; 12650 12651 case TRUTH_ORIF_EXPR: 12652 /* Note that the operands of this must be ints 12653 and their values must be 0 or true. 12654 ("true" is a fixed value perhaps depending on the language.) */ 12655 /* If first arg is constant true, return it. */ 12656 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0)) 12657 return fold_convert_loc (loc, type, arg0); 12658 case TRUTH_OR_EXPR: 12659 /* If either arg is constant zero, drop it. */ 12660 if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0)) 12661 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1)); 12662 if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1) 12663 /* Preserve sequence points. */ 12664 && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0))) 12665 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12666 /* If second arg is constant true, result is true, but we must 12667 evaluate first arg. */ 12668 if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)) 12669 return omit_one_operand_loc (loc, type, arg1, arg0); 12670 /* Likewise for first arg, but note this only occurs here for 12671 TRUTH_OR_EXPR. */ 12672 if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0)) 12673 return omit_one_operand_loc (loc, type, arg0, arg1); 12674 12675 /* !X || X is always true. */ 12676 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR 12677 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 12678 return omit_one_operand_loc (loc, type, integer_one_node, arg1); 12679 /* X || !X is always true. */ 12680 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR 12681 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 12682 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 12683 12684 /* (X && !Y) || (!X && Y) is X ^ Y */ 12685 if (TREE_CODE (arg0) == TRUTH_AND_EXPR 12686 && TREE_CODE (arg1) == TRUTH_AND_EXPR) 12687 { 12688 tree a0, a1, l0, l1, n0, n1; 12689 12690 a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0)); 12691 a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1)); 12692 12693 l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); 12694 l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1)); 12695 12696 n0 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l0); 12697 n1 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l1); 12698 12699 if ((operand_equal_p (n0, a0, 0) 12700 && operand_equal_p (n1, a1, 0)) 12701 || (operand_equal_p (n0, a1, 0) 12702 && operand_equal_p (n1, a0, 0))) 12703 return fold_build2_loc (loc, TRUTH_XOR_EXPR, type, l0, n1); 12704 } 12705 12706 if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1)) 12707 != NULL_TREE) 12708 return tem; 12709 12710 return NULL_TREE; 12711 12712 case TRUTH_XOR_EXPR: 12713 /* If the second arg is constant zero, drop it. */ 12714 if (integer_zerop (arg1)) 12715 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12716 /* If the second arg is constant true, this is a logical inversion. */ 12717 if (integer_onep (arg1)) 12718 { 12719 /* Only call invert_truthvalue if operand is a truth value. */ 12720 if (TREE_CODE (TREE_TYPE (arg0)) != BOOLEAN_TYPE) 12721 tem = fold_build1_loc (loc, TRUTH_NOT_EXPR, TREE_TYPE (arg0), arg0); 12722 else 12723 tem = invert_truthvalue_loc (loc, arg0); 12724 return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem)); 12725 } 12726 /* Identical arguments cancel to zero. */ 12727 if (operand_equal_p (arg0, arg1, 0)) 12728 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 12729 12730 /* !X ^ X is always true. */ 12731 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR 12732 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) 12733 return omit_one_operand_loc (loc, type, integer_one_node, arg1); 12734 12735 /* X ^ !X is always true. */ 12736 if (TREE_CODE (arg1) == TRUTH_NOT_EXPR 12737 && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) 12738 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 12739 12740 return NULL_TREE; 12741 12742 case EQ_EXPR: 12743 case NE_EXPR: 12744 STRIP_NOPS (arg0); 12745 STRIP_NOPS (arg1); 12746 12747 tem = fold_comparison (loc, code, type, op0, op1); 12748 if (tem != NULL_TREE) 12749 return tem; 12750 12751 /* bool_var != 0 becomes bool_var. */ 12752 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1) 12753 && code == NE_EXPR) 12754 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12755 12756 /* bool_var == 1 becomes bool_var. */ 12757 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1) 12758 && code == EQ_EXPR) 12759 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12760 12761 /* bool_var != 1 becomes !bool_var. */ 12762 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1) 12763 && code == NE_EXPR) 12764 return fold_convert_loc (loc, type, 12765 fold_build1_loc (loc, TRUTH_NOT_EXPR, 12766 TREE_TYPE (arg0), arg0)); 12767 12768 /* bool_var == 0 becomes !bool_var. */ 12769 if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1) 12770 && code == EQ_EXPR) 12771 return fold_convert_loc (loc, type, 12772 fold_build1_loc (loc, TRUTH_NOT_EXPR, 12773 TREE_TYPE (arg0), arg0)); 12774 12775 /* !exp != 0 becomes !exp */ 12776 if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1) 12777 && code == NE_EXPR) 12778 return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); 12779 12780 /* If this is an equality comparison of the address of two non-weak, 12781 unaliased symbols neither of which are extern (since we do not 12782 have access to attributes for externs), then we know the result. */ 12783 if (TREE_CODE (arg0) == ADDR_EXPR 12784 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg0, 0)) 12785 && ! DECL_WEAK (TREE_OPERAND (arg0, 0)) 12786 && ! lookup_attribute ("alias", 12787 DECL_ATTRIBUTES (TREE_OPERAND (arg0, 0))) 12788 && ! DECL_EXTERNAL (TREE_OPERAND (arg0, 0)) 12789 && TREE_CODE (arg1) == ADDR_EXPR 12790 && VAR_OR_FUNCTION_DECL_P (TREE_OPERAND (arg1, 0)) 12791 && ! DECL_WEAK (TREE_OPERAND (arg1, 0)) 12792 && ! lookup_attribute ("alias", 12793 DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0))) 12794 && ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0))) 12795 { 12796 /* We know that we're looking at the address of two 12797 non-weak, unaliased, static _DECL nodes. 12798 12799 It is both wasteful and incorrect to call operand_equal_p 12800 to compare the two ADDR_EXPR nodes. It is wasteful in that 12801 all we need to do is test pointer equality for the arguments 12802 to the two ADDR_EXPR nodes. It is incorrect to use 12803 operand_equal_p as that function is NOT equivalent to a 12804 C equality test. It can in fact return false for two 12805 objects which would test as equal using the C equality 12806 operator. */ 12807 bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0); 12808 return constant_boolean_node (equal 12809 ? code == EQ_EXPR : code != EQ_EXPR, 12810 type); 12811 } 12812 12813 /* If this is an EQ or NE comparison of a constant with a PLUS_EXPR or 12814 a MINUS_EXPR of a constant, we can convert it into a comparison with 12815 a revised constant as long as no overflow occurs. */ 12816 if (TREE_CODE (arg1) == INTEGER_CST 12817 && (TREE_CODE (arg0) == PLUS_EXPR 12818 || TREE_CODE (arg0) == MINUS_EXPR) 12819 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 12820 && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR 12821 ? MINUS_EXPR : PLUS_EXPR, 12822 fold_convert_loc (loc, TREE_TYPE (arg0), 12823 arg1), 12824 TREE_OPERAND (arg0, 1))) 12825 && !TREE_OVERFLOW (tem)) 12826 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); 12827 12828 /* Similarly for a NEGATE_EXPR. */ 12829 if (TREE_CODE (arg0) == NEGATE_EXPR 12830 && TREE_CODE (arg1) == INTEGER_CST 12831 && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0), 12832 arg1))) 12833 && TREE_CODE (tem) == INTEGER_CST 12834 && !TREE_OVERFLOW (tem)) 12835 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); 12836 12837 /* Similarly for a BIT_XOR_EXPR; X ^ C1 == C2 is X == (C1 ^ C2). */ 12838 if (TREE_CODE (arg0) == BIT_XOR_EXPR 12839 && TREE_CODE (arg1) == INTEGER_CST 12840 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 12841 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), 12842 fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0), 12843 fold_convert_loc (loc, 12844 TREE_TYPE (arg0), 12845 arg1), 12846 TREE_OPERAND (arg0, 1))); 12847 12848 /* Transform comparisons of the form X +- Y CMP X to Y CMP 0. */ 12849 if ((TREE_CODE (arg0) == PLUS_EXPR 12850 || TREE_CODE (arg0) == POINTER_PLUS_EXPR 12851 || TREE_CODE (arg0) == MINUS_EXPR) 12852 && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0, 12853 0)), 12854 arg1, 0) 12855 && (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) 12856 || POINTER_TYPE_P (TREE_TYPE (arg0)))) 12857 { 12858 tree val = TREE_OPERAND (arg0, 1); 12859 return omit_two_operands_loc (loc, type, 12860 fold_build2_loc (loc, code, type, 12861 val, 12862 build_int_cst (TREE_TYPE (val), 12863 0)), 12864 TREE_OPERAND (arg0, 0), arg1); 12865 } 12866 12867 /* Transform comparisons of the form C - X CMP X if C % 2 == 1. */ 12868 if (TREE_CODE (arg0) == MINUS_EXPR 12869 && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST 12870 && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0, 12871 1)), 12872 arg1, 0) 12873 && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1) 12874 { 12875 return omit_two_operands_loc (loc, type, 12876 code == NE_EXPR 12877 ? boolean_true_node : boolean_false_node, 12878 TREE_OPERAND (arg0, 1), arg1); 12879 } 12880 12881 /* If we have X - Y == 0, we can convert that to X == Y and similarly 12882 for !=. Don't do this for ordered comparisons due to overflow. */ 12883 if (TREE_CODE (arg0) == MINUS_EXPR 12884 && integer_zerop (arg1)) 12885 return fold_build2_loc (loc, code, type, 12886 TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1)); 12887 12888 /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */ 12889 if (TREE_CODE (arg0) == ABS_EXPR 12890 && (integer_zerop (arg1) || real_zerop (arg1))) 12891 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1); 12892 12893 /* If this is an EQ or NE comparison with zero and ARG0 is 12894 (1 << foo) & bar, convert it to (bar >> foo) & 1. Both require 12895 two operations, but the latter can be done in one less insn 12896 on machines that have only two-operand insns or on which a 12897 constant cannot be the first operand. */ 12898 if (TREE_CODE (arg0) == BIT_AND_EXPR 12899 && integer_zerop (arg1)) 12900 { 12901 tree arg00 = TREE_OPERAND (arg0, 0); 12902 tree arg01 = TREE_OPERAND (arg0, 1); 12903 if (TREE_CODE (arg00) == LSHIFT_EXPR 12904 && integer_onep (TREE_OPERAND (arg00, 0))) 12905 { 12906 tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00), 12907 arg01, TREE_OPERAND (arg00, 1)); 12908 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem, 12909 build_int_cst (TREE_TYPE (arg0), 1)); 12910 return fold_build2_loc (loc, code, type, 12911 fold_convert_loc (loc, TREE_TYPE (arg1), tem), 12912 arg1); 12913 } 12914 else if (TREE_CODE (arg01) == LSHIFT_EXPR 12915 && integer_onep (TREE_OPERAND (arg01, 0))) 12916 { 12917 tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01), 12918 arg00, TREE_OPERAND (arg01, 1)); 12919 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem, 12920 build_int_cst (TREE_TYPE (arg0), 1)); 12921 return fold_build2_loc (loc, code, type, 12922 fold_convert_loc (loc, TREE_TYPE (arg1), tem), 12923 arg1); 12924 } 12925 } 12926 12927 /* If this is an NE or EQ comparison of zero against the result of a 12928 signed MOD operation whose second operand is a power of 2, make 12929 the MOD operation unsigned since it is simpler and equivalent. */ 12930 if (integer_zerop (arg1) 12931 && !TYPE_UNSIGNED (TREE_TYPE (arg0)) 12932 && (TREE_CODE (arg0) == TRUNC_MOD_EXPR 12933 || TREE_CODE (arg0) == CEIL_MOD_EXPR 12934 || TREE_CODE (arg0) == FLOOR_MOD_EXPR 12935 || TREE_CODE (arg0) == ROUND_MOD_EXPR) 12936 && integer_pow2p (TREE_OPERAND (arg0, 1))) 12937 { 12938 tree newtype = unsigned_type_for (TREE_TYPE (arg0)); 12939 tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype, 12940 fold_convert_loc (loc, newtype, 12941 TREE_OPERAND (arg0, 0)), 12942 fold_convert_loc (loc, newtype, 12943 TREE_OPERAND (arg0, 1))); 12944 12945 return fold_build2_loc (loc, code, type, newmod, 12946 fold_convert_loc (loc, newtype, arg1)); 12947 } 12948 12949 /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where 12950 C1 is a valid shift constant, and C2 is a power of two, i.e. 12951 a single bit. */ 12952 if (TREE_CODE (arg0) == BIT_AND_EXPR 12953 && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR 12954 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)) 12955 == INTEGER_CST 12956 && integer_pow2p (TREE_OPERAND (arg0, 1)) 12957 && integer_zerop (arg1)) 12958 { 12959 tree itype = TREE_TYPE (arg0); 12960 unsigned HOST_WIDE_INT prec = TYPE_PRECISION (itype); 12961 tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1); 12962 12963 /* Check for a valid shift count. */ 12964 if (TREE_INT_CST_HIGH (arg001) == 0 12965 && TREE_INT_CST_LOW (arg001) < prec) 12966 { 12967 tree arg01 = TREE_OPERAND (arg0, 1); 12968 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0); 12969 unsigned HOST_WIDE_INT log2 = tree_log2 (arg01); 12970 /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0 12971 can be rewritten as (X & (C2 << C1)) != 0. */ 12972 if ((log2 + TREE_INT_CST_LOW (arg001)) < prec) 12973 { 12974 tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001); 12975 tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem); 12976 return fold_build2_loc (loc, code, type, tem, 12977 fold_convert_loc (loc, itype, arg1)); 12978 } 12979 /* Otherwise, for signed (arithmetic) shifts, 12980 ((X >> C1) & C2) != 0 is rewritten as X < 0, and 12981 ((X >> C1) & C2) == 0 is rewritten as X >= 0. */ 12982 else if (!TYPE_UNSIGNED (itype)) 12983 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type, 12984 arg000, build_int_cst (itype, 0)); 12985 /* Otherwise, of unsigned (logical) shifts, 12986 ((X >> C1) & C2) != 0 is rewritten as (X,false), and 12987 ((X >> C1) & C2) == 0 is rewritten as (X,true). */ 12988 else 12989 return omit_one_operand_loc (loc, type, 12990 code == EQ_EXPR ? integer_one_node 12991 : integer_zero_node, 12992 arg000); 12993 } 12994 } 12995 12996 /* If we have (A & C) == C where C is a power of 2, convert this into 12997 (A & C) != 0. Similarly for NE_EXPR. */ 12998 if (TREE_CODE (arg0) == BIT_AND_EXPR 12999 && integer_pow2p (TREE_OPERAND (arg0, 1)) 13000 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 13001 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type, 13002 arg0, fold_convert_loc (loc, TREE_TYPE (arg0), 13003 integer_zero_node)); 13004 13005 /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign 13006 bit, then fold the expression into A < 0 or A >= 0. */ 13007 tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type); 13008 if (tem) 13009 return tem; 13010 13011 /* If we have (A & C) == D where D & ~C != 0, convert this into 0. 13012 Similarly for NE_EXPR. */ 13013 if (TREE_CODE (arg0) == BIT_AND_EXPR 13014 && TREE_CODE (arg1) == INTEGER_CST 13015 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 13016 { 13017 tree notc = fold_build1_loc (loc, BIT_NOT_EXPR, 13018 TREE_TYPE (TREE_OPERAND (arg0, 1)), 13019 TREE_OPERAND (arg0, 1)); 13020 tree dandnotc 13021 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), 13022 fold_convert_loc (loc, TREE_TYPE (arg0), arg1), 13023 notc); 13024 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node; 13025 if (integer_nonzerop (dandnotc)) 13026 return omit_one_operand_loc (loc, type, rslt, arg0); 13027 } 13028 13029 /* If we have (A | C) == D where C & ~D != 0, convert this into 0. 13030 Similarly for NE_EXPR. */ 13031 if (TREE_CODE (arg0) == BIT_IOR_EXPR 13032 && TREE_CODE (arg1) == INTEGER_CST 13033 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 13034 { 13035 tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1); 13036 tree candnotd 13037 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), 13038 TREE_OPERAND (arg0, 1), 13039 fold_convert_loc (loc, TREE_TYPE (arg0), notd)); 13040 tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node; 13041 if (integer_nonzerop (candnotd)) 13042 return omit_one_operand_loc (loc, type, rslt, arg0); 13043 } 13044 13045 /* If this is a comparison of a field, we may be able to simplify it. */ 13046 if ((TREE_CODE (arg0) == COMPONENT_REF 13047 || TREE_CODE (arg0) == BIT_FIELD_REF) 13048 /* Handle the constant case even without -O 13049 to make sure the warnings are given. */ 13050 && (optimize || TREE_CODE (arg1) == INTEGER_CST)) 13051 { 13052 t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1); 13053 if (t1) 13054 return t1; 13055 } 13056 13057 /* Optimize comparisons of strlen vs zero to a compare of the 13058 first character of the string vs zero. To wit, 13059 strlen(ptr) == 0 => *ptr == 0 13060 strlen(ptr) != 0 => *ptr != 0 13061 Other cases should reduce to one of these two (or a constant) 13062 due to the return value of strlen being unsigned. */ 13063 if (TREE_CODE (arg0) == CALL_EXPR 13064 && integer_zerop (arg1)) 13065 { 13066 tree fndecl = get_callee_fndecl (arg0); 13067 13068 if (fndecl 13069 && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL 13070 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN 13071 && call_expr_nargs (arg0) == 1 13072 && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE) 13073 { 13074 tree iref = build_fold_indirect_ref_loc (loc, 13075 CALL_EXPR_ARG (arg0, 0)); 13076 return fold_build2_loc (loc, code, type, iref, 13077 build_int_cst (TREE_TYPE (iref), 0)); 13078 } 13079 } 13080 13081 /* Fold (X >> C) != 0 into X < 0 if C is one less than the width 13082 of X. Similarly fold (X >> C) == 0 into X >= 0. */ 13083 if (TREE_CODE (arg0) == RSHIFT_EXPR 13084 && integer_zerop (arg1) 13085 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 13086 { 13087 tree arg00 = TREE_OPERAND (arg0, 0); 13088 tree arg01 = TREE_OPERAND (arg0, 1); 13089 tree itype = TREE_TYPE (arg00); 13090 if (TREE_INT_CST_HIGH (arg01) == 0 13091 && !(TREE_CODE (itype) == COMPLEX_TYPE 13092 || TREE_CODE (itype) == VECTOR_TYPE) 13093 && TREE_INT_CST_LOW (arg01) 13094 == (unsigned HOST_WIDE_INT) (TYPE_PRECISION (itype) - 1)) 13095 { 13096 if (TYPE_UNSIGNED (itype)) 13097 { 13098 itype = signed_type_for (itype); 13099 arg00 = fold_convert_loc (loc, itype, arg00); 13100 } 13101 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, 13102 type, arg00, build_zero_cst (itype)); 13103 } 13104 } 13105 13106 /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y. */ 13107 if (integer_zerop (arg1) 13108 && TREE_CODE (arg0) == BIT_XOR_EXPR) 13109 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), 13110 TREE_OPERAND (arg0, 1)); 13111 13112 /* (X ^ Y) == Y becomes X == 0. We know that Y has no side-effects. */ 13113 if (TREE_CODE (arg0) == BIT_XOR_EXPR 13114 && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) 13115 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), 13116 build_zero_cst (TREE_TYPE (arg0))); 13117 /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */ 13118 if (TREE_CODE (arg0) == BIT_XOR_EXPR 13119 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 13120 && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) 13121 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1), 13122 build_zero_cst (TREE_TYPE (arg0))); 13123 13124 /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */ 13125 if (TREE_CODE (arg0) == BIT_XOR_EXPR 13126 && TREE_CODE (arg1) == INTEGER_CST 13127 && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) 13128 return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), 13129 fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1), 13130 TREE_OPERAND (arg0, 1), arg1)); 13131 13132 /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into 13133 (X & C) == 0 when C is a single bit. */ 13134 if (TREE_CODE (arg0) == BIT_AND_EXPR 13135 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR 13136 && integer_zerop (arg1) 13137 && integer_pow2p (TREE_OPERAND (arg0, 1))) 13138 { 13139 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), 13140 TREE_OPERAND (TREE_OPERAND (arg0, 0), 0), 13141 TREE_OPERAND (arg0, 1)); 13142 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, 13143 type, tem, 13144 fold_convert_loc (loc, TREE_TYPE (arg0), 13145 arg1)); 13146 } 13147 13148 /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the 13149 constant C is a power of two, i.e. a single bit. */ 13150 if (TREE_CODE (arg0) == BIT_XOR_EXPR 13151 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR 13152 && integer_zerop (arg1) 13153 && integer_pow2p (TREE_OPERAND (arg0, 1)) 13154 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1), 13155 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST)) 13156 { 13157 tree arg00 = TREE_OPERAND (arg0, 0); 13158 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type, 13159 arg00, build_int_cst (TREE_TYPE (arg00), 0)); 13160 } 13161 13162 /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0, 13163 when is C is a power of two, i.e. a single bit. */ 13164 if (TREE_CODE (arg0) == BIT_AND_EXPR 13165 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR 13166 && integer_zerop (arg1) 13167 && integer_pow2p (TREE_OPERAND (arg0, 1)) 13168 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1), 13169 TREE_OPERAND (arg0, 1), OEP_ONLY_CONST)) 13170 { 13171 tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0); 13172 tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000), 13173 arg000, TREE_OPERAND (arg0, 1)); 13174 return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type, 13175 tem, build_int_cst (TREE_TYPE (tem), 0)); 13176 } 13177 13178 if (integer_zerop (arg1) 13179 && tree_expr_nonzero_p (arg0)) 13180 { 13181 tree res = constant_boolean_node (code==NE_EXPR, type); 13182 return omit_one_operand_loc (loc, type, res, arg0); 13183 } 13184 13185 /* Fold -X op -Y as X op Y, where op is eq/ne. */ 13186 if (TREE_CODE (arg0) == NEGATE_EXPR 13187 && TREE_CODE (arg1) == NEGATE_EXPR) 13188 return fold_build2_loc (loc, code, type, 13189 TREE_OPERAND (arg0, 0), 13190 fold_convert_loc (loc, TREE_TYPE (arg0), 13191 TREE_OPERAND (arg1, 0))); 13192 13193 /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries. */ 13194 if (TREE_CODE (arg0) == BIT_AND_EXPR 13195 && TREE_CODE (arg1) == BIT_AND_EXPR) 13196 { 13197 tree arg00 = TREE_OPERAND (arg0, 0); 13198 tree arg01 = TREE_OPERAND (arg0, 1); 13199 tree arg10 = TREE_OPERAND (arg1, 0); 13200 tree arg11 = TREE_OPERAND (arg1, 1); 13201 tree itype = TREE_TYPE (arg0); 13202 13203 if (operand_equal_p (arg01, arg11, 0)) 13204 return fold_build2_loc (loc, code, type, 13205 fold_build2_loc (loc, BIT_AND_EXPR, itype, 13206 fold_build2_loc (loc, 13207 BIT_XOR_EXPR, itype, 13208 arg00, arg10), 13209 arg01), 13210 build_zero_cst (itype)); 13211 13212 if (operand_equal_p (arg01, arg10, 0)) 13213 return fold_build2_loc (loc, code, type, 13214 fold_build2_loc (loc, BIT_AND_EXPR, itype, 13215 fold_build2_loc (loc, 13216 BIT_XOR_EXPR, itype, 13217 arg00, arg11), 13218 arg01), 13219 build_zero_cst (itype)); 13220 13221 if (operand_equal_p (arg00, arg11, 0)) 13222 return fold_build2_loc (loc, code, type, 13223 fold_build2_loc (loc, BIT_AND_EXPR, itype, 13224 fold_build2_loc (loc, 13225 BIT_XOR_EXPR, itype, 13226 arg01, arg10), 13227 arg00), 13228 build_zero_cst (itype)); 13229 13230 if (operand_equal_p (arg00, arg10, 0)) 13231 return fold_build2_loc (loc, code, type, 13232 fold_build2_loc (loc, BIT_AND_EXPR, itype, 13233 fold_build2_loc (loc, 13234 BIT_XOR_EXPR, itype, 13235 arg01, arg11), 13236 arg00), 13237 build_zero_cst (itype)); 13238 } 13239 13240 if (TREE_CODE (arg0) == BIT_XOR_EXPR 13241 && TREE_CODE (arg1) == BIT_XOR_EXPR) 13242 { 13243 tree arg00 = TREE_OPERAND (arg0, 0); 13244 tree arg01 = TREE_OPERAND (arg0, 1); 13245 tree arg10 = TREE_OPERAND (arg1, 0); 13246 tree arg11 = TREE_OPERAND (arg1, 1); 13247 tree itype = TREE_TYPE (arg0); 13248 13249 /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries. 13250 operand_equal_p guarantees no side-effects so we don't need 13251 to use omit_one_operand on Z. */ 13252 if (operand_equal_p (arg01, arg11, 0)) 13253 return fold_build2_loc (loc, code, type, arg00, 13254 fold_convert_loc (loc, TREE_TYPE (arg00), 13255 arg10)); 13256 if (operand_equal_p (arg01, arg10, 0)) 13257 return fold_build2_loc (loc, code, type, arg00, 13258 fold_convert_loc (loc, TREE_TYPE (arg00), 13259 arg11)); 13260 if (operand_equal_p (arg00, arg11, 0)) 13261 return fold_build2_loc (loc, code, type, arg01, 13262 fold_convert_loc (loc, TREE_TYPE (arg01), 13263 arg10)); 13264 if (operand_equal_p (arg00, arg10, 0)) 13265 return fold_build2_loc (loc, code, type, arg01, 13266 fold_convert_loc (loc, TREE_TYPE (arg01), 13267 arg11)); 13268 13269 /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y. */ 13270 if (TREE_CODE (arg01) == INTEGER_CST 13271 && TREE_CODE (arg11) == INTEGER_CST) 13272 { 13273 tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg01, 13274 fold_convert_loc (loc, itype, arg11)); 13275 tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00, tem); 13276 return fold_build2_loc (loc, code, type, tem, 13277 fold_convert_loc (loc, itype, arg10)); 13278 } 13279 } 13280 13281 /* Attempt to simplify equality/inequality comparisons of complex 13282 values. Only lower the comparison if the result is known or 13283 can be simplified to a single scalar comparison. */ 13284 if ((TREE_CODE (arg0) == COMPLEX_EXPR 13285 || TREE_CODE (arg0) == COMPLEX_CST) 13286 && (TREE_CODE (arg1) == COMPLEX_EXPR 13287 || TREE_CODE (arg1) == COMPLEX_CST)) 13288 { 13289 tree real0, imag0, real1, imag1; 13290 tree rcond, icond; 13291 13292 if (TREE_CODE (arg0) == COMPLEX_EXPR) 13293 { 13294 real0 = TREE_OPERAND (arg0, 0); 13295 imag0 = TREE_OPERAND (arg0, 1); 13296 } 13297 else 13298 { 13299 real0 = TREE_REALPART (arg0); 13300 imag0 = TREE_IMAGPART (arg0); 13301 } 13302 13303 if (TREE_CODE (arg1) == COMPLEX_EXPR) 13304 { 13305 real1 = TREE_OPERAND (arg1, 0); 13306 imag1 = TREE_OPERAND (arg1, 1); 13307 } 13308 else 13309 { 13310 real1 = TREE_REALPART (arg1); 13311 imag1 = TREE_IMAGPART (arg1); 13312 } 13313 13314 rcond = fold_binary_loc (loc, code, type, real0, real1); 13315 if (rcond && TREE_CODE (rcond) == INTEGER_CST) 13316 { 13317 if (integer_zerop (rcond)) 13318 { 13319 if (code == EQ_EXPR) 13320 return omit_two_operands_loc (loc, type, boolean_false_node, 13321 imag0, imag1); 13322 return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1); 13323 } 13324 else 13325 { 13326 if (code == NE_EXPR) 13327 return omit_two_operands_loc (loc, type, boolean_true_node, 13328 imag0, imag1); 13329 return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1); 13330 } 13331 } 13332 13333 icond = fold_binary_loc (loc, code, type, imag0, imag1); 13334 if (icond && TREE_CODE (icond) == INTEGER_CST) 13335 { 13336 if (integer_zerop (icond)) 13337 { 13338 if (code == EQ_EXPR) 13339 return omit_two_operands_loc (loc, type, boolean_false_node, 13340 real0, real1); 13341 return fold_build2_loc (loc, NE_EXPR, type, real0, real1); 13342 } 13343 else 13344 { 13345 if (code == NE_EXPR) 13346 return omit_two_operands_loc (loc, type, boolean_true_node, 13347 real0, real1); 13348 return fold_build2_loc (loc, EQ_EXPR, type, real0, real1); 13349 } 13350 } 13351 } 13352 13353 return NULL_TREE; 13354 13355 case LT_EXPR: 13356 case GT_EXPR: 13357 case LE_EXPR: 13358 case GE_EXPR: 13359 tem = fold_comparison (loc, code, type, op0, op1); 13360 if (tem != NULL_TREE) 13361 return tem; 13362 13363 /* Transform comparisons of the form X +- C CMP X. */ 13364 if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) 13365 && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) 13366 && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST 13367 && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))) 13368 || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST 13369 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))))) 13370 { 13371 tree arg01 = TREE_OPERAND (arg0, 1); 13372 enum tree_code code0 = TREE_CODE (arg0); 13373 int is_positive; 13374 13375 if (TREE_CODE (arg01) == REAL_CST) 13376 is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1; 13377 else 13378 is_positive = tree_int_cst_sgn (arg01); 13379 13380 /* (X - c) > X becomes false. */ 13381 if (code == GT_EXPR 13382 && ((code0 == MINUS_EXPR && is_positive >= 0) 13383 || (code0 == PLUS_EXPR && is_positive <= 0))) 13384 { 13385 if (TREE_CODE (arg01) == INTEGER_CST 13386 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13387 fold_overflow_warning (("assuming signed overflow does not " 13388 "occur when assuming that (X - c) > X " 13389 "is always false"), 13390 WARN_STRICT_OVERFLOW_ALL); 13391 return constant_boolean_node (0, type); 13392 } 13393 13394 /* Likewise (X + c) < X becomes false. */ 13395 if (code == LT_EXPR 13396 && ((code0 == PLUS_EXPR && is_positive >= 0) 13397 || (code0 == MINUS_EXPR && is_positive <= 0))) 13398 { 13399 if (TREE_CODE (arg01) == INTEGER_CST 13400 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13401 fold_overflow_warning (("assuming signed overflow does not " 13402 "occur when assuming that " 13403 "(X + c) < X is always false"), 13404 WARN_STRICT_OVERFLOW_ALL); 13405 return constant_boolean_node (0, type); 13406 } 13407 13408 /* Convert (X - c) <= X to true. */ 13409 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))) 13410 && code == LE_EXPR 13411 && ((code0 == MINUS_EXPR && is_positive >= 0) 13412 || (code0 == PLUS_EXPR && is_positive <= 0))) 13413 { 13414 if (TREE_CODE (arg01) == INTEGER_CST 13415 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13416 fold_overflow_warning (("assuming signed overflow does not " 13417 "occur when assuming that " 13418 "(X - c) <= X is always true"), 13419 WARN_STRICT_OVERFLOW_ALL); 13420 return constant_boolean_node (1, type); 13421 } 13422 13423 /* Convert (X + c) >= X to true. */ 13424 if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1))) 13425 && code == GE_EXPR 13426 && ((code0 == PLUS_EXPR && is_positive >= 0) 13427 || (code0 == MINUS_EXPR && is_positive <= 0))) 13428 { 13429 if (TREE_CODE (arg01) == INTEGER_CST 13430 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13431 fold_overflow_warning (("assuming signed overflow does not " 13432 "occur when assuming that " 13433 "(X + c) >= X is always true"), 13434 WARN_STRICT_OVERFLOW_ALL); 13435 return constant_boolean_node (1, type); 13436 } 13437 13438 if (TREE_CODE (arg01) == INTEGER_CST) 13439 { 13440 /* Convert X + c > X and X - c < X to true for integers. */ 13441 if (code == GT_EXPR 13442 && ((code0 == PLUS_EXPR && is_positive > 0) 13443 || (code0 == MINUS_EXPR && is_positive < 0))) 13444 { 13445 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13446 fold_overflow_warning (("assuming signed overflow does " 13447 "not occur when assuming that " 13448 "(X + c) > X is always true"), 13449 WARN_STRICT_OVERFLOW_ALL); 13450 return constant_boolean_node (1, type); 13451 } 13452 13453 if (code == LT_EXPR 13454 && ((code0 == MINUS_EXPR && is_positive > 0) 13455 || (code0 == PLUS_EXPR && is_positive < 0))) 13456 { 13457 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13458 fold_overflow_warning (("assuming signed overflow does " 13459 "not occur when assuming that " 13460 "(X - c) < X is always true"), 13461 WARN_STRICT_OVERFLOW_ALL); 13462 return constant_boolean_node (1, type); 13463 } 13464 13465 /* Convert X + c <= X and X - c >= X to false for integers. */ 13466 if (code == LE_EXPR 13467 && ((code0 == PLUS_EXPR && is_positive > 0) 13468 || (code0 == MINUS_EXPR && is_positive < 0))) 13469 { 13470 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13471 fold_overflow_warning (("assuming signed overflow does " 13472 "not occur when assuming that " 13473 "(X + c) <= X is always false"), 13474 WARN_STRICT_OVERFLOW_ALL); 13475 return constant_boolean_node (0, type); 13476 } 13477 13478 if (code == GE_EXPR 13479 && ((code0 == MINUS_EXPR && is_positive > 0) 13480 || (code0 == PLUS_EXPR && is_positive < 0))) 13481 { 13482 if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1))) 13483 fold_overflow_warning (("assuming signed overflow does " 13484 "not occur when assuming that " 13485 "(X - c) >= X is always false"), 13486 WARN_STRICT_OVERFLOW_ALL); 13487 return constant_boolean_node (0, type); 13488 } 13489 } 13490 } 13491 13492 /* Comparisons with the highest or lowest possible integer of 13493 the specified precision will have known values. */ 13494 { 13495 tree arg1_type = TREE_TYPE (arg1); 13496 unsigned int width = TYPE_PRECISION (arg1_type); 13497 13498 if (TREE_CODE (arg1) == INTEGER_CST 13499 && width <= HOST_BITS_PER_DOUBLE_INT 13500 && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type))) 13501 { 13502 HOST_WIDE_INT signed_max_hi; 13503 unsigned HOST_WIDE_INT signed_max_lo; 13504 unsigned HOST_WIDE_INT max_hi, max_lo, min_hi, min_lo; 13505 13506 if (width <= HOST_BITS_PER_WIDE_INT) 13507 { 13508 signed_max_lo = ((unsigned HOST_WIDE_INT) 1 << (width - 1)) 13509 - 1; 13510 signed_max_hi = 0; 13511 max_hi = 0; 13512 13513 if (TYPE_UNSIGNED (arg1_type)) 13514 { 13515 max_lo = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1; 13516 min_lo = 0; 13517 min_hi = 0; 13518 } 13519 else 13520 { 13521 max_lo = signed_max_lo; 13522 min_lo = ((unsigned HOST_WIDE_INT) -1 << (width - 1)); 13523 min_hi = -1; 13524 } 13525 } 13526 else 13527 { 13528 width -= HOST_BITS_PER_WIDE_INT; 13529 signed_max_lo = -1; 13530 signed_max_hi = ((unsigned HOST_WIDE_INT) 1 << (width - 1)) 13531 - 1; 13532 max_lo = -1; 13533 min_lo = 0; 13534 13535 if (TYPE_UNSIGNED (arg1_type)) 13536 { 13537 max_hi = ((unsigned HOST_WIDE_INT) 2 << (width - 1)) - 1; 13538 min_hi = 0; 13539 } 13540 else 13541 { 13542 max_hi = signed_max_hi; 13543 min_hi = ((unsigned HOST_WIDE_INT) -1 << (width - 1)); 13544 } 13545 } 13546 13547 if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) == max_hi 13548 && TREE_INT_CST_LOW (arg1) == max_lo) 13549 switch (code) 13550 { 13551 case GT_EXPR: 13552 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 13553 13554 case GE_EXPR: 13555 return fold_build2_loc (loc, EQ_EXPR, type, op0, op1); 13556 13557 case LE_EXPR: 13558 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 13559 13560 case LT_EXPR: 13561 return fold_build2_loc (loc, NE_EXPR, type, op0, op1); 13562 13563 /* The GE_EXPR and LT_EXPR cases above are not normally 13564 reached because of previous transformations. */ 13565 13566 default: 13567 break; 13568 } 13569 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) 13570 == max_hi 13571 && TREE_INT_CST_LOW (arg1) == max_lo - 1) 13572 switch (code) 13573 { 13574 case GT_EXPR: 13575 arg1 = const_binop (PLUS_EXPR, arg1, 13576 build_int_cst (TREE_TYPE (arg1), 1)); 13577 return fold_build2_loc (loc, EQ_EXPR, type, 13578 fold_convert_loc (loc, 13579 TREE_TYPE (arg1), arg0), 13580 arg1); 13581 case LE_EXPR: 13582 arg1 = const_binop (PLUS_EXPR, arg1, 13583 build_int_cst (TREE_TYPE (arg1), 1)); 13584 return fold_build2_loc (loc, NE_EXPR, type, 13585 fold_convert_loc (loc, TREE_TYPE (arg1), 13586 arg0), 13587 arg1); 13588 default: 13589 break; 13590 } 13591 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) 13592 == min_hi 13593 && TREE_INT_CST_LOW (arg1) == min_lo) 13594 switch (code) 13595 { 13596 case LT_EXPR: 13597 return omit_one_operand_loc (loc, type, integer_zero_node, arg0); 13598 13599 case LE_EXPR: 13600 return fold_build2_loc (loc, EQ_EXPR, type, op0, op1); 13601 13602 case GE_EXPR: 13603 return omit_one_operand_loc (loc, type, integer_one_node, arg0); 13604 13605 case GT_EXPR: 13606 return fold_build2_loc (loc, NE_EXPR, type, op0, op1); 13607 13608 default: 13609 break; 13610 } 13611 else if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (arg1) 13612 == min_hi 13613 && TREE_INT_CST_LOW (arg1) == min_lo + 1) 13614 switch (code) 13615 { 13616 case GE_EXPR: 13617 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node); 13618 return fold_build2_loc (loc, NE_EXPR, type, 13619 fold_convert_loc (loc, 13620 TREE_TYPE (arg1), arg0), 13621 arg1); 13622 case LT_EXPR: 13623 arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node); 13624 return fold_build2_loc (loc, EQ_EXPR, type, 13625 fold_convert_loc (loc, TREE_TYPE (arg1), 13626 arg0), 13627 arg1); 13628 default: 13629 break; 13630 } 13631 13632 else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi 13633 && TREE_INT_CST_LOW (arg1) == signed_max_lo 13634 && TYPE_UNSIGNED (arg1_type) 13635 /* We will flip the signedness of the comparison operator 13636 associated with the mode of arg1, so the sign bit is 13637 specified by this mode. Check that arg1 is the signed 13638 max associated with this sign bit. */ 13639 && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type)) 13640 /* signed_type does not work on pointer types. */ 13641 && INTEGRAL_TYPE_P (arg1_type)) 13642 { 13643 /* The following case also applies to X < signed_max+1 13644 and X >= signed_max+1 because previous transformations. */ 13645 if (code == LE_EXPR || code == GT_EXPR) 13646 { 13647 tree st; 13648 st = signed_type_for (TREE_TYPE (arg1)); 13649 return fold_build2_loc (loc, 13650 code == LE_EXPR ? GE_EXPR : LT_EXPR, 13651 type, fold_convert_loc (loc, st, arg0), 13652 build_int_cst (st, 0)); 13653 } 13654 } 13655 } 13656 } 13657 13658 /* If we are comparing an ABS_EXPR with a constant, we can 13659 convert all the cases into explicit comparisons, but they may 13660 well not be faster than doing the ABS and one comparison. 13661 But ABS (X) <= C is a range comparison, which becomes a subtraction 13662 and a comparison, and is probably faster. */ 13663 if (code == LE_EXPR 13664 && TREE_CODE (arg1) == INTEGER_CST 13665 && TREE_CODE (arg0) == ABS_EXPR 13666 && ! TREE_SIDE_EFFECTS (arg0) 13667 && (0 != (tem = negate_expr (arg1))) 13668 && TREE_CODE (tem) == INTEGER_CST 13669 && !TREE_OVERFLOW (tem)) 13670 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type, 13671 build2 (GE_EXPR, type, 13672 TREE_OPERAND (arg0, 0), tem), 13673 build2 (LE_EXPR, type, 13674 TREE_OPERAND (arg0, 0), arg1)); 13675 13676 /* Convert ABS_EXPR<x> >= 0 to true. */ 13677 strict_overflow_p = false; 13678 if (code == GE_EXPR 13679 && (integer_zerop (arg1) 13680 || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) 13681 && real_zerop (arg1))) 13682 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)) 13683 { 13684 if (strict_overflow_p) 13685 fold_overflow_warning (("assuming signed overflow does not occur " 13686 "when simplifying comparison of " 13687 "absolute value and zero"), 13688 WARN_STRICT_OVERFLOW_CONDITIONAL); 13689 return omit_one_operand_loc (loc, type, 13690 constant_boolean_node (true, type), 13691 arg0); 13692 } 13693 13694 /* Convert ABS_EXPR<x> < 0 to false. */ 13695 strict_overflow_p = false; 13696 if (code == LT_EXPR 13697 && (integer_zerop (arg1) || real_zerop (arg1)) 13698 && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)) 13699 { 13700 if (strict_overflow_p) 13701 fold_overflow_warning (("assuming signed overflow does not occur " 13702 "when simplifying comparison of " 13703 "absolute value and zero"), 13704 WARN_STRICT_OVERFLOW_CONDITIONAL); 13705 return omit_one_operand_loc (loc, type, 13706 constant_boolean_node (false, type), 13707 arg0); 13708 } 13709 13710 /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0 13711 and similarly for >= into !=. */ 13712 if ((code == LT_EXPR || code == GE_EXPR) 13713 && TYPE_UNSIGNED (TREE_TYPE (arg0)) 13714 && TREE_CODE (arg1) == LSHIFT_EXPR 13715 && integer_onep (TREE_OPERAND (arg1, 0))) 13716 return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, 13717 build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, 13718 TREE_OPERAND (arg1, 1)), 13719 build_zero_cst (TREE_TYPE (arg0))); 13720 13721 /* Similarly for X < (cast) (1 << Y). But cast can't be narrowing, 13722 otherwise Y might be >= # of bits in X's type and thus e.g. 13723 (unsigned char) (1 << Y) for Y 15 might be 0. 13724 If the cast is widening, then 1 << Y should have unsigned type, 13725 otherwise if Y is number of bits in the signed shift type minus 1, 13726 we can't optimize this. E.g. (unsigned long long) (1 << Y) for Y 13727 31 might be 0xffffffff80000000. */ 13728 if ((code == LT_EXPR || code == GE_EXPR) 13729 && TYPE_UNSIGNED (TREE_TYPE (arg0)) 13730 && CONVERT_EXPR_P (arg1) 13731 && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR 13732 && (TYPE_PRECISION (TREE_TYPE (arg1)) 13733 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0)))) 13734 && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0))) 13735 || (TYPE_PRECISION (TREE_TYPE (arg1)) 13736 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0))))) 13737 && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0))) 13738 { 13739 tem = build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, 13740 TREE_OPERAND (TREE_OPERAND (arg1, 0), 1)); 13741 return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, 13742 fold_convert_loc (loc, TREE_TYPE (arg0), tem), 13743 build_zero_cst (TREE_TYPE (arg0))); 13744 } 13745 13746 return NULL_TREE; 13747 13748 case UNORDERED_EXPR: 13749 case ORDERED_EXPR: 13750 case UNLT_EXPR: 13751 case UNLE_EXPR: 13752 case UNGT_EXPR: 13753 case UNGE_EXPR: 13754 case UNEQ_EXPR: 13755 case LTGT_EXPR: 13756 if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST) 13757 { 13758 t1 = fold_relational_const (code, type, arg0, arg1); 13759 if (t1 != NULL_TREE) 13760 return t1; 13761 } 13762 13763 /* If the first operand is NaN, the result is constant. */ 13764 if (TREE_CODE (arg0) == REAL_CST 13765 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0)) 13766 && (code != LTGT_EXPR || ! flag_trapping_math)) 13767 { 13768 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR) 13769 ? integer_zero_node 13770 : integer_one_node; 13771 return omit_one_operand_loc (loc, type, t1, arg1); 13772 } 13773 13774 /* If the second operand is NaN, the result is constant. */ 13775 if (TREE_CODE (arg1) == REAL_CST 13776 && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)) 13777 && (code != LTGT_EXPR || ! flag_trapping_math)) 13778 { 13779 t1 = (code == ORDERED_EXPR || code == LTGT_EXPR) 13780 ? integer_zero_node 13781 : integer_one_node; 13782 return omit_one_operand_loc (loc, type, t1, arg0); 13783 } 13784 13785 /* Simplify unordered comparison of something with itself. */ 13786 if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR) 13787 && operand_equal_p (arg0, arg1, 0)) 13788 return constant_boolean_node (1, type); 13789 13790 if (code == LTGT_EXPR 13791 && !flag_trapping_math 13792 && operand_equal_p (arg0, arg1, 0)) 13793 return constant_boolean_node (0, type); 13794 13795 /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */ 13796 { 13797 tree targ0 = strip_float_extensions (arg0); 13798 tree targ1 = strip_float_extensions (arg1); 13799 tree newtype = TREE_TYPE (targ0); 13800 13801 if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype)) 13802 newtype = TREE_TYPE (targ1); 13803 13804 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0))) 13805 return fold_build2_loc (loc, code, type, 13806 fold_convert_loc (loc, newtype, targ0), 13807 fold_convert_loc (loc, newtype, targ1)); 13808 } 13809 13810 return NULL_TREE; 13811 13812 case COMPOUND_EXPR: 13813 /* When pedantic, a compound expression can be neither an lvalue 13814 nor an integer constant expression. */ 13815 if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1)) 13816 return NULL_TREE; 13817 /* Don't let (0, 0) be null pointer constant. */ 13818 tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1) 13819 : fold_convert_loc (loc, type, arg1); 13820 return pedantic_non_lvalue_loc (loc, tem); 13821 13822 case COMPLEX_EXPR: 13823 if ((TREE_CODE (arg0) == REAL_CST 13824 && TREE_CODE (arg1) == REAL_CST) 13825 || (TREE_CODE (arg0) == INTEGER_CST 13826 && TREE_CODE (arg1) == INTEGER_CST)) 13827 return build_complex (type, arg0, arg1); 13828 if (TREE_CODE (arg0) == REALPART_EXPR 13829 && TREE_CODE (arg1) == IMAGPART_EXPR 13830 && TREE_TYPE (TREE_OPERAND (arg0, 0)) == type 13831 && operand_equal_p (TREE_OPERAND (arg0, 0), 13832 TREE_OPERAND (arg1, 0), 0)) 13833 return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0), 13834 TREE_OPERAND (arg1, 0)); 13835 return NULL_TREE; 13836 13837 case ASSERT_EXPR: 13838 /* An ASSERT_EXPR should never be passed to fold_binary. */ 13839 gcc_unreachable (); 13840 13841 case VEC_PACK_TRUNC_EXPR: 13842 case VEC_PACK_FIX_TRUNC_EXPR: 13843 { 13844 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i; 13845 tree *elts; 13846 13847 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts / 2 13848 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts / 2); 13849 if (TREE_CODE (arg0) != VECTOR_CST || TREE_CODE (arg1) != VECTOR_CST) 13850 return NULL_TREE; 13851 13852 elts = XALLOCAVEC (tree, nelts); 13853 if (!vec_cst_ctor_to_array (arg0, elts) 13854 || !vec_cst_ctor_to_array (arg1, elts + nelts / 2)) 13855 return NULL_TREE; 13856 13857 for (i = 0; i < nelts; i++) 13858 { 13859 elts[i] = fold_convert_const (code == VEC_PACK_TRUNC_EXPR 13860 ? NOP_EXPR : FIX_TRUNC_EXPR, 13861 TREE_TYPE (type), elts[i]); 13862 if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i])) 13863 return NULL_TREE; 13864 } 13865 13866 return build_vector (type, elts); 13867 } 13868 13869 case VEC_WIDEN_MULT_LO_EXPR: 13870 case VEC_WIDEN_MULT_HI_EXPR: 13871 case VEC_WIDEN_MULT_EVEN_EXPR: 13872 case VEC_WIDEN_MULT_ODD_EXPR: 13873 { 13874 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type); 13875 unsigned int out, ofs, scale; 13876 tree *elts; 13877 13878 gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2 13879 && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts * 2); 13880 if (TREE_CODE (arg0) != VECTOR_CST || TREE_CODE (arg1) != VECTOR_CST) 13881 return NULL_TREE; 13882 13883 elts = XALLOCAVEC (tree, nelts * 4); 13884 if (!vec_cst_ctor_to_array (arg0, elts) 13885 || !vec_cst_ctor_to_array (arg1, elts + nelts * 2)) 13886 return NULL_TREE; 13887 13888 if (code == VEC_WIDEN_MULT_LO_EXPR) 13889 scale = 0, ofs = BYTES_BIG_ENDIAN ? nelts : 0; 13890 else if (code == VEC_WIDEN_MULT_HI_EXPR) 13891 scale = 0, ofs = BYTES_BIG_ENDIAN ? 0 : nelts; 13892 else if (code == VEC_WIDEN_MULT_EVEN_EXPR) 13893 scale = 1, ofs = 0; 13894 else /* if (code == VEC_WIDEN_MULT_ODD_EXPR) */ 13895 scale = 1, ofs = 1; 13896 13897 for (out = 0; out < nelts; out++) 13898 { 13899 unsigned int in1 = (out << scale) + ofs; 13900 unsigned int in2 = in1 + nelts * 2; 13901 tree t1, t2; 13902 13903 t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in1]); 13904 t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in2]); 13905 13906 if (t1 == NULL_TREE || t2 == NULL_TREE) 13907 return NULL_TREE; 13908 elts[out] = const_binop (MULT_EXPR, t1, t2); 13909 if (elts[out] == NULL_TREE || !CONSTANT_CLASS_P (elts[out])) 13910 return NULL_TREE; 13911 } 13912 13913 return build_vector (type, elts); 13914 } 13915 13916 default: 13917 return NULL_TREE; 13918 } /* switch (code) */ 13919} 13920 13921/* Callback for walk_tree, looking for LABEL_EXPR. Return *TP if it is 13922 a LABEL_EXPR; otherwise return NULL_TREE. Do not check the subtrees 13923 of GOTO_EXPR. */ 13924 13925static tree 13926contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) 13927{ 13928 switch (TREE_CODE (*tp)) 13929 { 13930 case LABEL_EXPR: 13931 return *tp; 13932 13933 case GOTO_EXPR: 13934 *walk_subtrees = 0; 13935 13936 /* ... fall through ... */ 13937 13938 default: 13939 return NULL_TREE; 13940 } 13941} 13942 13943/* Return whether the sub-tree ST contains a label which is accessible from 13944 outside the sub-tree. */ 13945 13946static bool 13947contains_label_p (tree st) 13948{ 13949 return 13950 (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE); 13951} 13952 13953/* Fold a ternary expression of code CODE and type TYPE with operands 13954 OP0, OP1, and OP2. Return the folded expression if folding is 13955 successful. Otherwise, return NULL_TREE. */ 13956 13957tree 13958fold_ternary_loc (location_t loc, enum tree_code code, tree type, 13959 tree op0, tree op1, tree op2) 13960{ 13961 tree tem; 13962 tree arg0 = NULL_TREE, arg1 = NULL_TREE, arg2 = NULL_TREE; 13963 enum tree_code_class kind = TREE_CODE_CLASS (code); 13964 13965 gcc_assert (IS_EXPR_CODE_CLASS (kind) 13966 && TREE_CODE_LENGTH (code) == 3); 13967 13968 /* Strip any conversions that don't change the mode. This is safe 13969 for every expression, except for a comparison expression because 13970 its signedness is derived from its operands. So, in the latter 13971 case, only strip conversions that don't change the signedness. 13972 13973 Note that this is done as an internal manipulation within the 13974 constant folder, in order to find the simplest representation of 13975 the arguments so that their form can be studied. In any cases, 13976 the appropriate type conversions should be put back in the tree 13977 that will get out of the constant folder. */ 13978 if (op0) 13979 { 13980 arg0 = op0; 13981 STRIP_NOPS (arg0); 13982 } 13983 13984 if (op1) 13985 { 13986 arg1 = op1; 13987 STRIP_NOPS (arg1); 13988 } 13989 13990 if (op2) 13991 { 13992 arg2 = op2; 13993 STRIP_NOPS (arg2); 13994 } 13995 13996 switch (code) 13997 { 13998 case COMPONENT_REF: 13999 if (TREE_CODE (arg0) == CONSTRUCTOR 14000 && ! type_contains_placeholder_p (TREE_TYPE (arg0))) 14001 { 14002 unsigned HOST_WIDE_INT idx; 14003 tree field, value; 14004 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value) 14005 if (field == arg1) 14006 return value; 14007 } 14008 return NULL_TREE; 14009 14010 case COND_EXPR: 14011 /* Pedantic ANSI C says that a conditional expression is never an lvalue, 14012 so all simple results must be passed through pedantic_non_lvalue. */ 14013 if (TREE_CODE (arg0) == INTEGER_CST) 14014 { 14015 tree unused_op = integer_zerop (arg0) ? op1 : op2; 14016 tem = integer_zerop (arg0) ? op2 : op1; 14017 /* Only optimize constant conditions when the selected branch 14018 has the same type as the COND_EXPR. This avoids optimizing 14019 away "c ? x : throw", where the throw has a void type. 14020 Avoid throwing away that operand which contains label. */ 14021 if ((!TREE_SIDE_EFFECTS (unused_op) 14022 || !contains_label_p (unused_op)) 14023 && (! VOID_TYPE_P (TREE_TYPE (tem)) 14024 || VOID_TYPE_P (type))) 14025 return pedantic_non_lvalue_loc (loc, tem); 14026 return NULL_TREE; 14027 } 14028 if (operand_equal_p (arg1, op2, 0)) 14029 return pedantic_omit_one_operand_loc (loc, type, arg1, arg0); 14030 14031 /* If we have A op B ? A : C, we may be able to convert this to a 14032 simpler expression, depending on the operation and the values 14033 of B and C. Signed zeros prevent all of these transformations, 14034 for reasons given above each one. 14035 14036 Also try swapping the arguments and inverting the conditional. */ 14037 if (COMPARISON_CLASS_P (arg0) 14038 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0), 14039 arg1, TREE_OPERAND (arg0, 1)) 14040 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1)))) 14041 { 14042 tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2); 14043 if (tem) 14044 return tem; 14045 } 14046 14047 if (COMPARISON_CLASS_P (arg0) 14048 && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0), 14049 op2, 14050 TREE_OPERAND (arg0, 1)) 14051 && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2)))) 14052 { 14053 location_t loc0 = expr_location_or (arg0, loc); 14054 tem = fold_truth_not_expr (loc0, arg0); 14055 if (tem && COMPARISON_CLASS_P (tem)) 14056 { 14057 tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1); 14058 if (tem) 14059 return tem; 14060 } 14061 } 14062 14063 /* If the second operand is simpler than the third, swap them 14064 since that produces better jump optimization results. */ 14065 if (truth_value_p (TREE_CODE (arg0)) 14066 && tree_swap_operands_p (op1, op2, false)) 14067 { 14068 location_t loc0 = expr_location_or (arg0, loc); 14069 /* See if this can be inverted. If it can't, possibly because 14070 it was a floating-point inequality comparison, don't do 14071 anything. */ 14072 tem = fold_truth_not_expr (loc0, arg0); 14073 if (tem) 14074 return fold_build3_loc (loc, code, type, tem, op2, op1); 14075 } 14076 14077 /* Convert A ? 1 : 0 to simply A. */ 14078 if (integer_onep (op1) 14079 && integer_zerop (op2) 14080 /* If we try to convert OP0 to our type, the 14081 call to fold will try to move the conversion inside 14082 a COND, which will recurse. In that case, the COND_EXPR 14083 is probably the best choice, so leave it alone. */ 14084 && type == TREE_TYPE (arg0)) 14085 return pedantic_non_lvalue_loc (loc, arg0); 14086 14087 /* Convert A ? 0 : 1 to !A. This prefers the use of NOT_EXPR 14088 over COND_EXPR in cases such as floating point comparisons. */ 14089 if (integer_zerop (op1) 14090 && integer_onep (op2) 14091 && truth_value_p (TREE_CODE (arg0))) 14092 return pedantic_non_lvalue_loc (loc, 14093 fold_convert_loc (loc, type, 14094 invert_truthvalue_loc (loc, 14095 arg0))); 14096 14097 /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>). */ 14098 if (TREE_CODE (arg0) == LT_EXPR 14099 && integer_zerop (TREE_OPERAND (arg0, 1)) 14100 && integer_zerop (op2) 14101 && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1))) 14102 { 14103 /* sign_bit_p looks through both zero and sign extensions, 14104 but for this optimization only sign extensions are 14105 usable. */ 14106 tree tem2 = TREE_OPERAND (arg0, 0); 14107 while (tem != tem2) 14108 { 14109 if (TREE_CODE (tem2) != NOP_EXPR 14110 || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0)))) 14111 { 14112 tem = NULL_TREE; 14113 break; 14114 } 14115 tem2 = TREE_OPERAND (tem2, 0); 14116 } 14117 /* sign_bit_p only checks ARG1 bits within A's precision. 14118 If <sign bit of A> has wider type than A, bits outside 14119 of A's precision in <sign bit of A> need to be checked. 14120 If they are all 0, this optimization needs to be done 14121 in unsigned A's type, if they are all 1 in signed A's type, 14122 otherwise this can't be done. */ 14123 if (tem 14124 && TYPE_PRECISION (TREE_TYPE (tem)) 14125 < TYPE_PRECISION (TREE_TYPE (arg1)) 14126 && TYPE_PRECISION (TREE_TYPE (tem)) 14127 < TYPE_PRECISION (type)) 14128 { 14129 unsigned HOST_WIDE_INT mask_lo; 14130 HOST_WIDE_INT mask_hi; 14131 int inner_width, outer_width; 14132 tree tem_type; 14133 14134 inner_width = TYPE_PRECISION (TREE_TYPE (tem)); 14135 outer_width = TYPE_PRECISION (TREE_TYPE (arg1)); 14136 if (outer_width > TYPE_PRECISION (type)) 14137 outer_width = TYPE_PRECISION (type); 14138 14139 if (outer_width > HOST_BITS_PER_WIDE_INT) 14140 { 14141 mask_hi = ((unsigned HOST_WIDE_INT) -1 14142 >> (HOST_BITS_PER_DOUBLE_INT - outer_width)); 14143 mask_lo = -1; 14144 } 14145 else 14146 { 14147 mask_hi = 0; 14148 mask_lo = ((unsigned HOST_WIDE_INT) -1 14149 >> (HOST_BITS_PER_WIDE_INT - outer_width)); 14150 } 14151 if (inner_width > HOST_BITS_PER_WIDE_INT) 14152 { 14153 mask_hi &= ~((unsigned HOST_WIDE_INT) -1 14154 >> (HOST_BITS_PER_WIDE_INT - inner_width)); 14155 mask_lo = 0; 14156 } 14157 else 14158 mask_lo &= ~((unsigned HOST_WIDE_INT) -1 14159 >> (HOST_BITS_PER_WIDE_INT - inner_width)); 14160 14161 if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == mask_hi 14162 && (TREE_INT_CST_LOW (arg1) & mask_lo) == mask_lo) 14163 { 14164 tem_type = signed_type_for (TREE_TYPE (tem)); 14165 tem = fold_convert_loc (loc, tem_type, tem); 14166 } 14167 else if ((TREE_INT_CST_HIGH (arg1) & mask_hi) == 0 14168 && (TREE_INT_CST_LOW (arg1) & mask_lo) == 0) 14169 { 14170 tem_type = unsigned_type_for (TREE_TYPE (tem)); 14171 tem = fold_convert_loc (loc, tem_type, tem); 14172 } 14173 else 14174 tem = NULL; 14175 } 14176 14177 if (tem) 14178 return 14179 fold_convert_loc (loc, type, 14180 fold_build2_loc (loc, BIT_AND_EXPR, 14181 TREE_TYPE (tem), tem, 14182 fold_convert_loc (loc, 14183 TREE_TYPE (tem), 14184 arg1))); 14185 } 14186 14187 /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N). A & 1 was 14188 already handled above. */ 14189 if (TREE_CODE (arg0) == BIT_AND_EXPR 14190 && integer_onep (TREE_OPERAND (arg0, 1)) 14191 && integer_zerop (op2) 14192 && integer_pow2p (arg1)) 14193 { 14194 tree tem = TREE_OPERAND (arg0, 0); 14195 STRIP_NOPS (tem); 14196 if (TREE_CODE (tem) == RSHIFT_EXPR 14197 && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST 14198 && (unsigned HOST_WIDE_INT) tree_log2 (arg1) == 14199 TREE_INT_CST_LOW (TREE_OPERAND (tem, 1))) 14200 return fold_build2_loc (loc, BIT_AND_EXPR, type, 14201 TREE_OPERAND (tem, 0), arg1); 14202 } 14203 14204 /* A & N ? N : 0 is simply A & N if N is a power of two. This 14205 is probably obsolete because the first operand should be a 14206 truth value (that's why we have the two cases above), but let's 14207 leave it in until we can confirm this for all front-ends. */ 14208 if (integer_zerop (op2) 14209 && TREE_CODE (arg0) == NE_EXPR 14210 && integer_zerop (TREE_OPERAND (arg0, 1)) 14211 && integer_pow2p (arg1) 14212 && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR 14213 && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1), 14214 arg1, OEP_ONLY_CONST)) 14215 return pedantic_non_lvalue_loc (loc, 14216 fold_convert_loc (loc, type, 14217 TREE_OPERAND (arg0, 0))); 14218 14219 /* Convert A ? B : 0 into A && B if A and B are truth values. */ 14220 if (integer_zerop (op2) 14221 && truth_value_p (TREE_CODE (arg0)) 14222 && truth_value_p (TREE_CODE (arg1))) 14223 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type, 14224 fold_convert_loc (loc, type, arg0), 14225 arg1); 14226 14227 /* Convert A ? B : 1 into !A || B if A and B are truth values. */ 14228 if (integer_onep (op2) 14229 && truth_value_p (TREE_CODE (arg0)) 14230 && truth_value_p (TREE_CODE (arg1))) 14231 { 14232 location_t loc0 = expr_location_or (arg0, loc); 14233 /* Only perform transformation if ARG0 is easily inverted. */ 14234 tem = fold_truth_not_expr (loc0, arg0); 14235 if (tem) 14236 return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type, 14237 fold_convert_loc (loc, type, tem), 14238 arg1); 14239 } 14240 14241 /* Convert A ? 0 : B into !A && B if A and B are truth values. */ 14242 if (integer_zerop (arg1) 14243 && truth_value_p (TREE_CODE (arg0)) 14244 && truth_value_p (TREE_CODE (op2))) 14245 { 14246 location_t loc0 = expr_location_or (arg0, loc); 14247 /* Only perform transformation if ARG0 is easily inverted. */ 14248 tem = fold_truth_not_expr (loc0, arg0); 14249 if (tem) 14250 return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type, 14251 fold_convert_loc (loc, type, tem), 14252 op2); 14253 } 14254 14255 /* Convert A ? 1 : B into A || B if A and B are truth values. */ 14256 if (integer_onep (arg1) 14257 && truth_value_p (TREE_CODE (arg0)) 14258 && truth_value_p (TREE_CODE (op2))) 14259 return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type, 14260 fold_convert_loc (loc, type, arg0), 14261 op2); 14262 14263 return NULL_TREE; 14264 14265 case VEC_COND_EXPR: 14266 if (TREE_CODE (arg0) == VECTOR_CST) 14267 { 14268 if (integer_all_onesp (arg0) && !TREE_SIDE_EFFECTS (op2)) 14269 return pedantic_non_lvalue_loc (loc, op1); 14270 if (integer_zerop (arg0) && !TREE_SIDE_EFFECTS (op1)) 14271 return pedantic_non_lvalue_loc (loc, op2); 14272 } 14273 return NULL_TREE; 14274 14275 case CALL_EXPR: 14276 /* CALL_EXPRs used to be ternary exprs. Catch any mistaken uses 14277 of fold_ternary on them. */ 14278 gcc_unreachable (); 14279 14280 case BIT_FIELD_REF: 14281 if ((TREE_CODE (arg0) == VECTOR_CST 14282 || (TREE_CODE (arg0) == CONSTRUCTOR 14283 && TREE_CODE (TREE_TYPE (arg0)) == VECTOR_TYPE)) 14284 && (type == TREE_TYPE (TREE_TYPE (arg0)) 14285 || (TREE_CODE (type) == VECTOR_TYPE 14286 && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0))))) 14287 { 14288 tree eltype = TREE_TYPE (TREE_TYPE (arg0)); 14289 unsigned HOST_WIDE_INT width = tree_low_cst (TYPE_SIZE (eltype), 1); 14290 unsigned HOST_WIDE_INT n = tree_low_cst (arg1, 1); 14291 unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1); 14292 14293 if (n != 0 14294 && (idx % width) == 0 14295 && (n % width) == 0 14296 && ((idx + n) / width) <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0))) 14297 { 14298 idx = idx / width; 14299 n = n / width; 14300 14301 if (TREE_CODE (arg0) == VECTOR_CST) 14302 { 14303 if (n == 1) 14304 return VECTOR_CST_ELT (arg0, idx); 14305 14306 tree *vals = XALLOCAVEC (tree, n); 14307 for (unsigned i = 0; i < n; ++i) 14308 vals[i] = VECTOR_CST_ELT (arg0, idx + i); 14309 return build_vector (type, vals); 14310 } 14311 14312 /* Constructor elements can be subvectors. */ 14313 unsigned HOST_WIDE_INT k = 1; 14314 if (CONSTRUCTOR_NELTS (arg0) != 0) 14315 { 14316 tree cons_elem = TREE_TYPE (CONSTRUCTOR_ELT (arg0, 0)->value); 14317 if (TREE_CODE (cons_elem) == VECTOR_TYPE) 14318 k = TYPE_VECTOR_SUBPARTS (cons_elem); 14319 } 14320 14321 /* We keep an exact subset of the constructor elements. */ 14322 if ((idx % k) == 0 && (n % k) == 0) 14323 { 14324 if (CONSTRUCTOR_NELTS (arg0) == 0) 14325 return build_constructor (type, NULL); 14326 idx /= k; 14327 n /= k; 14328 if (n == 1) 14329 { 14330 if (idx < CONSTRUCTOR_NELTS (arg0)) 14331 return CONSTRUCTOR_ELT (arg0, idx)->value; 14332 return build_zero_cst (type); 14333 } 14334 14335 vec<constructor_elt, va_gc> *vals; 14336 vec_alloc (vals, n); 14337 for (unsigned i = 0; 14338 i < n && idx + i < CONSTRUCTOR_NELTS (arg0); 14339 ++i) 14340 CONSTRUCTOR_APPEND_ELT (vals, NULL_TREE, 14341 CONSTRUCTOR_ELT 14342 (arg0, idx + i)->value); 14343 return build_constructor (type, vals); 14344 } 14345 /* The bitfield references a single constructor element. */ 14346 else if (idx + n <= (idx / k + 1) * k) 14347 { 14348 if (CONSTRUCTOR_NELTS (arg0) <= idx / k) 14349 return build_zero_cst (type); 14350 else if (n == k) 14351 return CONSTRUCTOR_ELT (arg0, idx / k)->value; 14352 else 14353 return fold_build3_loc (loc, code, type, 14354 CONSTRUCTOR_ELT (arg0, idx / k)->value, op1, 14355 build_int_cst (TREE_TYPE (op2), (idx % k) * width)); 14356 } 14357 } 14358 } 14359 14360 /* A bit-field-ref that referenced the full argument can be stripped. */ 14361 if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) 14362 && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_low_cst (arg1, 1) 14363 && integer_zerop (op2)) 14364 return fold_convert_loc (loc, type, arg0); 14365 14366 /* On constants we can use native encode/interpret to constant 14367 fold (nearly) all BIT_FIELD_REFs. */ 14368 if (CONSTANT_CLASS_P (arg0) 14369 && can_native_interpret_type_p (type) 14370 && host_integerp (TYPE_SIZE_UNIT (TREE_TYPE (arg0)), 1) 14371 /* This limitation should not be necessary, we just need to 14372 round this up to mode size. */ 14373 && tree_low_cst (op1, 1) % BITS_PER_UNIT == 0 14374 /* Need bit-shifting of the buffer to relax the following. */ 14375 && tree_low_cst (op2, 1) % BITS_PER_UNIT == 0) 14376 { 14377 unsigned HOST_WIDE_INT bitpos = tree_low_cst (op2, 1); 14378 unsigned HOST_WIDE_INT bitsize = tree_low_cst (op1, 1); 14379 unsigned HOST_WIDE_INT clen; 14380 clen = tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (arg0)), 1); 14381 /* ??? We cannot tell native_encode_expr to start at 14382 some random byte only. So limit us to a reasonable amount 14383 of work. */ 14384 if (clen <= 4096) 14385 { 14386 unsigned char *b = XALLOCAVEC (unsigned char, clen); 14387 unsigned HOST_WIDE_INT len = native_encode_expr (arg0, b, clen); 14388 if (len > 0 14389 && len * BITS_PER_UNIT >= bitpos + bitsize) 14390 { 14391 tree v = native_interpret_expr (type, 14392 b + bitpos / BITS_PER_UNIT, 14393 bitsize / BITS_PER_UNIT); 14394 if (v) 14395 return v; 14396 } 14397 } 14398 } 14399 14400 return NULL_TREE; 14401 14402 case FMA_EXPR: 14403 /* For integers we can decompose the FMA if possible. */ 14404 if (TREE_CODE (arg0) == INTEGER_CST 14405 && TREE_CODE (arg1) == INTEGER_CST) 14406 return fold_build2_loc (loc, PLUS_EXPR, type, 14407 const_binop (MULT_EXPR, arg0, arg1), arg2); 14408 if (integer_zerop (arg2)) 14409 return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1); 14410 14411 return fold_fma (loc, type, arg0, arg1, arg2); 14412 14413 case VEC_PERM_EXPR: 14414 if (TREE_CODE (arg2) == VECTOR_CST) 14415 { 14416 unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i, mask; 14417 unsigned char *sel = XALLOCAVEC (unsigned char, nelts); 14418 tree t; 14419 bool need_mask_canon = false; 14420 bool all_in_vec0 = true; 14421 bool all_in_vec1 = true; 14422 bool maybe_identity = true; 14423 bool single_arg = (op0 == op1); 14424 bool changed = false; 14425 14426 mask = single_arg ? (nelts - 1) : (2 * nelts - 1); 14427 gcc_assert (nelts == VECTOR_CST_NELTS (arg2)); 14428 for (i = 0; i < nelts; i++) 14429 { 14430 tree val = VECTOR_CST_ELT (arg2, i); 14431 if (TREE_CODE (val) != INTEGER_CST) 14432 return NULL_TREE; 14433 14434 sel[i] = TREE_INT_CST_LOW (val) & mask; 14435 if (TREE_INT_CST_HIGH (val) 14436 || ((unsigned HOST_WIDE_INT) 14437 TREE_INT_CST_LOW (val) != sel[i])) 14438 need_mask_canon = true; 14439 14440 if (sel[i] < nelts) 14441 all_in_vec1 = false; 14442 else 14443 all_in_vec0 = false; 14444 14445 if ((sel[i] & (nelts-1)) != i) 14446 maybe_identity = false; 14447 } 14448 14449 if (maybe_identity) 14450 { 14451 if (all_in_vec0) 14452 return op0; 14453 if (all_in_vec1) 14454 return op1; 14455 } 14456 14457 if (all_in_vec0) 14458 op1 = op0; 14459 else if (all_in_vec1) 14460 { 14461 op0 = op1; 14462 for (i = 0; i < nelts; i++) 14463 sel[i] -= nelts; 14464 need_mask_canon = true; 14465 } 14466 14467 if ((TREE_CODE (op0) == VECTOR_CST 14468 || TREE_CODE (op0) == CONSTRUCTOR) 14469 && (TREE_CODE (op1) == VECTOR_CST 14470 || TREE_CODE (op1) == CONSTRUCTOR)) 14471 { 14472 t = fold_vec_perm (type, op0, op1, sel); 14473 if (t != NULL_TREE) 14474 return t; 14475 } 14476 14477 if (op0 == op1 && !single_arg) 14478 changed = true; 14479 14480 if (need_mask_canon && arg2 == op2) 14481 { 14482 tree *tsel = XALLOCAVEC (tree, nelts); 14483 tree eltype = TREE_TYPE (TREE_TYPE (arg2)); 14484 for (i = 0; i < nelts; i++) 14485 tsel[i] = build_int_cst (eltype, sel[i]); 14486 op2 = build_vector (TREE_TYPE (arg2), tsel); 14487 changed = true; 14488 } 14489 14490 if (changed) 14491 return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, op2); 14492 } 14493 return NULL_TREE; 14494 14495 default: 14496 return NULL_TREE; 14497 } /* switch (code) */ 14498} 14499 14500/* Perform constant folding and related simplification of EXPR. 14501 The related simplifications include x*1 => x, x*0 => 0, etc., 14502 and application of the associative law. 14503 NOP_EXPR conversions may be removed freely (as long as we 14504 are careful not to change the type of the overall expression). 14505 We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR, 14506 but we can constant-fold them if they have constant operands. */ 14507 14508#ifdef ENABLE_FOLD_CHECKING 14509# define fold(x) fold_1 (x) 14510static tree fold_1 (tree); 14511static 14512#endif 14513tree 14514fold (tree expr) 14515{ 14516 const tree t = expr; 14517 enum tree_code code = TREE_CODE (t); 14518 enum tree_code_class kind = TREE_CODE_CLASS (code); 14519 tree tem; 14520 location_t loc = EXPR_LOCATION (expr); 14521 14522 /* Return right away if a constant. */ 14523 if (kind == tcc_constant) 14524 return t; 14525 14526 /* CALL_EXPR-like objects with variable numbers of operands are 14527 treated specially. */ 14528 if (kind == tcc_vl_exp) 14529 { 14530 if (code == CALL_EXPR) 14531 { 14532 tem = fold_call_expr (loc, expr, false); 14533 return tem ? tem : expr; 14534 } 14535 return expr; 14536 } 14537 14538 if (IS_EXPR_CODE_CLASS (kind)) 14539 { 14540 tree type = TREE_TYPE (t); 14541 tree op0, op1, op2; 14542 14543 switch (TREE_CODE_LENGTH (code)) 14544 { 14545 case 1: 14546 op0 = TREE_OPERAND (t, 0); 14547 tem = fold_unary_loc (loc, code, type, op0); 14548 return tem ? tem : expr; 14549 case 2: 14550 op0 = TREE_OPERAND (t, 0); 14551 op1 = TREE_OPERAND (t, 1); 14552 tem = fold_binary_loc (loc, code, type, op0, op1); 14553 return tem ? tem : expr; 14554 case 3: 14555 op0 = TREE_OPERAND (t, 0); 14556 op1 = TREE_OPERAND (t, 1); 14557 op2 = TREE_OPERAND (t, 2); 14558 tem = fold_ternary_loc (loc, code, type, op0, op1, op2); 14559 return tem ? tem : expr; 14560 default: 14561 break; 14562 } 14563 } 14564 14565 switch (code) 14566 { 14567 case ARRAY_REF: 14568 { 14569 tree op0 = TREE_OPERAND (t, 0); 14570 tree op1 = TREE_OPERAND (t, 1); 14571 14572 if (TREE_CODE (op1) == INTEGER_CST 14573 && TREE_CODE (op0) == CONSTRUCTOR 14574 && ! type_contains_placeholder_p (TREE_TYPE (op0))) 14575 { 14576 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (op0); 14577 unsigned HOST_WIDE_INT end = vec_safe_length (elts); 14578 unsigned HOST_WIDE_INT begin = 0; 14579 14580 /* Find a matching index by means of a binary search. */ 14581 while (begin != end) 14582 { 14583 unsigned HOST_WIDE_INT middle = (begin + end) / 2; 14584 tree index = (*elts)[middle].index; 14585 14586 if (TREE_CODE (index) == INTEGER_CST 14587 && tree_int_cst_lt (index, op1)) 14588 begin = middle + 1; 14589 else if (TREE_CODE (index) == INTEGER_CST 14590 && tree_int_cst_lt (op1, index)) 14591 end = middle; 14592 else if (TREE_CODE (index) == RANGE_EXPR 14593 && tree_int_cst_lt (TREE_OPERAND (index, 1), op1)) 14594 begin = middle + 1; 14595 else if (TREE_CODE (index) == RANGE_EXPR 14596 && tree_int_cst_lt (op1, TREE_OPERAND (index, 0))) 14597 end = middle; 14598 else 14599 return (*elts)[middle].value; 14600 } 14601 } 14602 14603 return t; 14604 } 14605 14606 /* Return a VECTOR_CST if possible. */ 14607 case CONSTRUCTOR: 14608 { 14609 tree type = TREE_TYPE (t); 14610 if (TREE_CODE (type) != VECTOR_TYPE) 14611 return t; 14612 14613 tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type)); 14614 unsigned HOST_WIDE_INT idx, pos = 0; 14615 tree value; 14616 14617 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value) 14618 { 14619 if (!CONSTANT_CLASS_P (value)) 14620 return t; 14621 if (TREE_CODE (value) == VECTOR_CST) 14622 { 14623 for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i) 14624 vec[pos++] = VECTOR_CST_ELT (value, i); 14625 } 14626 else 14627 vec[pos++] = value; 14628 } 14629 for (; pos < TYPE_VECTOR_SUBPARTS (type); ++pos) 14630 vec[pos] = build_zero_cst (TREE_TYPE (type)); 14631 14632 return build_vector (type, vec); 14633 } 14634 14635 case CONST_DECL: 14636 return fold (DECL_INITIAL (t)); 14637 14638 default: 14639 return t; 14640 } /* switch (code) */ 14641} 14642 14643#ifdef ENABLE_FOLD_CHECKING 14644#undef fold 14645 14646static void fold_checksum_tree (const_tree, struct md5_ctx *, 14647 hash_table <pointer_hash <tree_node> >); 14648static void fold_check_failed (const_tree, const_tree); 14649void print_fold_checksum (const_tree); 14650 14651/* When --enable-checking=fold, compute a digest of expr before 14652 and after actual fold call to see if fold did not accidentally 14653 change original expr. */ 14654 14655tree 14656fold (tree expr) 14657{ 14658 tree ret; 14659 struct md5_ctx ctx; 14660 unsigned char checksum_before[16], checksum_after[16]; 14661 hash_table <pointer_hash <tree_node> > ht; 14662 14663 ht.create (32); 14664 md5_init_ctx (&ctx); 14665 fold_checksum_tree (expr, &ctx, ht); 14666 md5_finish_ctx (&ctx, checksum_before); 14667 ht.empty (); 14668 14669 ret = fold_1 (expr); 14670 14671 md5_init_ctx (&ctx); 14672 fold_checksum_tree (expr, &ctx, ht); 14673 md5_finish_ctx (&ctx, checksum_after); 14674 ht.dispose (); 14675 14676 if (memcmp (checksum_before, checksum_after, 16)) 14677 fold_check_failed (expr, ret); 14678 14679 return ret; 14680} 14681 14682void 14683print_fold_checksum (const_tree expr) 14684{ 14685 struct md5_ctx ctx; 14686 unsigned char checksum[16], cnt; 14687 hash_table <pointer_hash <tree_node> > ht; 14688 14689 ht.create (32); 14690 md5_init_ctx (&ctx); 14691 fold_checksum_tree (expr, &ctx, ht); 14692 md5_finish_ctx (&ctx, checksum); 14693 ht.dispose (); 14694 for (cnt = 0; cnt < 16; ++cnt) 14695 fprintf (stderr, "%02x", checksum[cnt]); 14696 putc ('\n', stderr); 14697} 14698 14699static void 14700fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED) 14701{ 14702 internal_error ("fold check: original tree changed by fold"); 14703} 14704 14705static void 14706fold_checksum_tree (const_tree expr, struct md5_ctx *ctx, 14707 hash_table <pointer_hash <tree_node> > ht) 14708{ 14709 tree_node **slot; 14710 enum tree_code code; 14711 union tree_node buf; 14712 int i, len; 14713 14714 recursive_label: 14715 if (expr == NULL) 14716 return; 14717 slot = ht.find_slot (expr, INSERT); 14718 if (*slot != NULL) 14719 return; 14720 *slot = CONST_CAST_TREE (expr); 14721 code = TREE_CODE (expr); 14722 if (TREE_CODE_CLASS (code) == tcc_declaration 14723 && DECL_ASSEMBLER_NAME_SET_P (expr)) 14724 { 14725 /* Allow DECL_ASSEMBLER_NAME to be modified. */ 14726 memcpy ((char *) &buf, expr, tree_size (expr)); 14727 SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL); 14728 expr = (tree) &buf; 14729 } 14730 else if (TREE_CODE_CLASS (code) == tcc_type 14731 && (TYPE_POINTER_TO (expr) 14732 || TYPE_REFERENCE_TO (expr) 14733 || TYPE_CACHED_VALUES_P (expr) 14734 || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) 14735 || TYPE_NEXT_VARIANT (expr))) 14736 { 14737 /* Allow these fields to be modified. */ 14738 tree tmp; 14739 memcpy ((char *) &buf, expr, tree_size (expr)); 14740 expr = tmp = (tree) &buf; 14741 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0; 14742 TYPE_POINTER_TO (tmp) = NULL; 14743 TYPE_REFERENCE_TO (tmp) = NULL; 14744 TYPE_NEXT_VARIANT (tmp) = NULL; 14745 if (TYPE_CACHED_VALUES_P (tmp)) 14746 { 14747 TYPE_CACHED_VALUES_P (tmp) = 0; 14748 TYPE_CACHED_VALUES (tmp) = NULL; 14749 } 14750 } 14751 md5_process_bytes (expr, tree_size (expr), ctx); 14752 if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 14753 fold_checksum_tree (TREE_TYPE (expr), ctx, ht); 14754 if (TREE_CODE_CLASS (code) != tcc_type 14755 && TREE_CODE_CLASS (code) != tcc_declaration 14756 && code != TREE_LIST 14757 && code != SSA_NAME 14758 && CODE_CONTAINS_STRUCT (code, TS_COMMON)) 14759 fold_checksum_tree (TREE_CHAIN (expr), ctx, ht); 14760 switch (TREE_CODE_CLASS (code)) 14761 { 14762 case tcc_constant: 14763 switch (code) 14764 { 14765 case STRING_CST: 14766 md5_process_bytes (TREE_STRING_POINTER (expr), 14767 TREE_STRING_LENGTH (expr), ctx); 14768 break; 14769 case COMPLEX_CST: 14770 fold_checksum_tree (TREE_REALPART (expr), ctx, ht); 14771 fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht); 14772 break; 14773 case VECTOR_CST: 14774 for (i = 0; i < (int) VECTOR_CST_NELTS (expr); ++i) 14775 fold_checksum_tree (VECTOR_CST_ELT (expr, i), ctx, ht); 14776 break; 14777 default: 14778 break; 14779 } 14780 break; 14781 case tcc_exceptional: 14782 switch (code) 14783 { 14784 case TREE_LIST: 14785 fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht); 14786 fold_checksum_tree (TREE_VALUE (expr), ctx, ht); 14787 expr = TREE_CHAIN (expr); 14788 goto recursive_label; 14789 break; 14790 case TREE_VEC: 14791 for (i = 0; i < TREE_VEC_LENGTH (expr); ++i) 14792 fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht); 14793 break; 14794 default: 14795 break; 14796 } 14797 break; 14798 case tcc_expression: 14799 case tcc_reference: 14800 case tcc_comparison: 14801 case tcc_unary: 14802 case tcc_binary: 14803 case tcc_statement: 14804 case tcc_vl_exp: 14805 len = TREE_OPERAND_LENGTH (expr); 14806 for (i = 0; i < len; ++i) 14807 fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht); 14808 break; 14809 case tcc_declaration: 14810 fold_checksum_tree (DECL_NAME (expr), ctx, ht); 14811 fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht); 14812 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON)) 14813 { 14814 fold_checksum_tree (DECL_SIZE (expr), ctx, ht); 14815 fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht); 14816 fold_checksum_tree (DECL_INITIAL (expr), ctx, ht); 14817 fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht); 14818 fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht); 14819 } 14820 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_WITH_VIS)) 14821 fold_checksum_tree (DECL_SECTION_NAME (expr), ctx, ht); 14822 14823 if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON)) 14824 { 14825 fold_checksum_tree (DECL_VINDEX (expr), ctx, ht); 14826 fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht); 14827 fold_checksum_tree (DECL_ARGUMENT_FLD (expr), ctx, ht); 14828 } 14829 break; 14830 case tcc_type: 14831 if (TREE_CODE (expr) == ENUMERAL_TYPE) 14832 fold_checksum_tree (TYPE_VALUES (expr), ctx, ht); 14833 fold_checksum_tree (TYPE_SIZE (expr), ctx, ht); 14834 fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht); 14835 fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht); 14836 fold_checksum_tree (TYPE_NAME (expr), ctx, ht); 14837 if (INTEGRAL_TYPE_P (expr) 14838 || SCALAR_FLOAT_TYPE_P (expr)) 14839 { 14840 fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht); 14841 fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht); 14842 } 14843 fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht); 14844 if (TREE_CODE (expr) == RECORD_TYPE 14845 || TREE_CODE (expr) == UNION_TYPE 14846 || TREE_CODE (expr) == QUAL_UNION_TYPE) 14847 fold_checksum_tree (TYPE_BINFO (expr), ctx, ht); 14848 fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht); 14849 break; 14850 default: 14851 break; 14852 } 14853} 14854 14855/* Helper function for outputting the checksum of a tree T. When 14856 debugging with gdb, you can "define mynext" to be "next" followed 14857 by "call debug_fold_checksum (op0)", then just trace down till the 14858 outputs differ. */ 14859 14860DEBUG_FUNCTION void 14861debug_fold_checksum (const_tree t) 14862{ 14863 int i; 14864 unsigned char checksum[16]; 14865 struct md5_ctx ctx; 14866 hash_table <pointer_hash <tree_node> > ht; 14867 ht.create (32); 14868 14869 md5_init_ctx (&ctx); 14870 fold_checksum_tree (t, &ctx, ht); 14871 md5_finish_ctx (&ctx, checksum); 14872 ht.empty (); 14873 14874 for (i = 0; i < 16; i++) 14875 fprintf (stderr, "%d ", checksum[i]); 14876 14877 fprintf (stderr, "\n"); 14878} 14879 14880#endif 14881 14882/* Fold a unary tree expression with code CODE of type TYPE with an 14883 operand OP0. LOC is the location of the resulting expression. 14884 Return a folded expression if successful. Otherwise, return a tree 14885 expression with code CODE of type TYPE with an operand OP0. */ 14886 14887tree 14888fold_build1_stat_loc (location_t loc, 14889 enum tree_code code, tree type, tree op0 MEM_STAT_DECL) 14890{ 14891 tree tem; 14892#ifdef ENABLE_FOLD_CHECKING 14893 unsigned char checksum_before[16], checksum_after[16]; 14894 struct md5_ctx ctx; 14895 hash_table <pointer_hash <tree_node> > ht; 14896 14897 ht.create (32); 14898 md5_init_ctx (&ctx); 14899 fold_checksum_tree (op0, &ctx, ht); 14900 md5_finish_ctx (&ctx, checksum_before); 14901 ht.empty (); 14902#endif 14903 14904 tem = fold_unary_loc (loc, code, type, op0); 14905 if (!tem) 14906 tem = build1_stat_loc (loc, code, type, op0 PASS_MEM_STAT); 14907 14908#ifdef ENABLE_FOLD_CHECKING 14909 md5_init_ctx (&ctx); 14910 fold_checksum_tree (op0, &ctx, ht); 14911 md5_finish_ctx (&ctx, checksum_after); 14912 ht.dispose (); 14913 14914 if (memcmp (checksum_before, checksum_after, 16)) 14915 fold_check_failed (op0, tem); 14916#endif 14917 return tem; 14918} 14919 14920/* Fold a binary tree expression with code CODE of type TYPE with 14921 operands OP0 and OP1. LOC is the location of the resulting 14922 expression. Return a folded expression if successful. Otherwise, 14923 return a tree expression with code CODE of type TYPE with operands 14924 OP0 and OP1. */ 14925 14926tree 14927fold_build2_stat_loc (location_t loc, 14928 enum tree_code code, tree type, tree op0, tree op1 14929 MEM_STAT_DECL) 14930{ 14931 tree tem; 14932#ifdef ENABLE_FOLD_CHECKING 14933 unsigned char checksum_before_op0[16], 14934 checksum_before_op1[16], 14935 checksum_after_op0[16], 14936 checksum_after_op1[16]; 14937 struct md5_ctx ctx; 14938 hash_table <pointer_hash <tree_node> > ht; 14939 14940 ht.create (32); 14941 md5_init_ctx (&ctx); 14942 fold_checksum_tree (op0, &ctx, ht); 14943 md5_finish_ctx (&ctx, checksum_before_op0); 14944 ht.empty (); 14945 14946 md5_init_ctx (&ctx); 14947 fold_checksum_tree (op1, &ctx, ht); 14948 md5_finish_ctx (&ctx, checksum_before_op1); 14949 ht.empty (); 14950#endif 14951 14952 tem = fold_binary_loc (loc, code, type, op0, op1); 14953 if (!tem) 14954 tem = build2_stat_loc (loc, code, type, op0, op1 PASS_MEM_STAT); 14955 14956#ifdef ENABLE_FOLD_CHECKING 14957 md5_init_ctx (&ctx); 14958 fold_checksum_tree (op0, &ctx, ht); 14959 md5_finish_ctx (&ctx, checksum_after_op0); 14960 ht.empty (); 14961 14962 if (memcmp (checksum_before_op0, checksum_after_op0, 16)) 14963 fold_check_failed (op0, tem); 14964 14965 md5_init_ctx (&ctx); 14966 fold_checksum_tree (op1, &ctx, ht); 14967 md5_finish_ctx (&ctx, checksum_after_op1); 14968 ht.dispose (); 14969 14970 if (memcmp (checksum_before_op1, checksum_after_op1, 16)) 14971 fold_check_failed (op1, tem); 14972#endif 14973 return tem; 14974} 14975 14976/* Fold a ternary tree expression with code CODE of type TYPE with 14977 operands OP0, OP1, and OP2. Return a folded expression if 14978 successful. Otherwise, return a tree expression with code CODE of 14979 type TYPE with operands OP0, OP1, and OP2. */ 14980 14981tree 14982fold_build3_stat_loc (location_t loc, enum tree_code code, tree type, 14983 tree op0, tree op1, tree op2 MEM_STAT_DECL) 14984{ 14985 tree tem; 14986#ifdef ENABLE_FOLD_CHECKING 14987 unsigned char checksum_before_op0[16], 14988 checksum_before_op1[16], 14989 checksum_before_op2[16], 14990 checksum_after_op0[16], 14991 checksum_after_op1[16], 14992 checksum_after_op2[16]; 14993 struct md5_ctx ctx; 14994 hash_table <pointer_hash <tree_node> > ht; 14995 14996 ht.create (32); 14997 md5_init_ctx (&ctx); 14998 fold_checksum_tree (op0, &ctx, ht); 14999 md5_finish_ctx (&ctx, checksum_before_op0); 15000 ht.empty (); 15001 15002 md5_init_ctx (&ctx); 15003 fold_checksum_tree (op1, &ctx, ht); 15004 md5_finish_ctx (&ctx, checksum_before_op1); 15005 ht.empty (); 15006 15007 md5_init_ctx (&ctx); 15008 fold_checksum_tree (op2, &ctx, ht); 15009 md5_finish_ctx (&ctx, checksum_before_op2); 15010 ht.empty (); 15011#endif 15012 15013 gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp); 15014 tem = fold_ternary_loc (loc, code, type, op0, op1, op2); 15015 if (!tem) 15016 tem = build3_stat_loc (loc, code, type, op0, op1, op2 PASS_MEM_STAT); 15017 15018#ifdef ENABLE_FOLD_CHECKING 15019 md5_init_ctx (&ctx); 15020 fold_checksum_tree (op0, &ctx, ht); 15021 md5_finish_ctx (&ctx, checksum_after_op0); 15022 ht.empty (); 15023 15024 if (memcmp (checksum_before_op0, checksum_after_op0, 16)) 15025 fold_check_failed (op0, tem); 15026 15027 md5_init_ctx (&ctx); 15028 fold_checksum_tree (op1, &ctx, ht); 15029 md5_finish_ctx (&ctx, checksum_after_op1); 15030 ht.empty (); 15031 15032 if (memcmp (checksum_before_op1, checksum_after_op1, 16)) 15033 fold_check_failed (op1, tem); 15034 15035 md5_init_ctx (&ctx); 15036 fold_checksum_tree (op2, &ctx, ht); 15037 md5_finish_ctx (&ctx, checksum_after_op2); 15038 ht.dispose (); 15039 15040 if (memcmp (checksum_before_op2, checksum_after_op2, 16)) 15041 fold_check_failed (op2, tem); 15042#endif 15043 return tem; 15044} 15045 15046/* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS 15047 arguments in ARGARRAY, and a null static chain. 15048 Return a folded expression if successful. Otherwise, return a CALL_EXPR 15049 of type TYPE from the given operands as constructed by build_call_array. */ 15050 15051tree 15052fold_build_call_array_loc (location_t loc, tree type, tree fn, 15053 int nargs, tree *argarray) 15054{ 15055 tree tem; 15056#ifdef ENABLE_FOLD_CHECKING 15057 unsigned char checksum_before_fn[16], 15058 checksum_before_arglist[16], 15059 checksum_after_fn[16], 15060 checksum_after_arglist[16]; 15061 struct md5_ctx ctx; 15062 hash_table <pointer_hash <tree_node> > ht; 15063 int i; 15064 15065 ht.create (32); 15066 md5_init_ctx (&ctx); 15067 fold_checksum_tree (fn, &ctx, ht); 15068 md5_finish_ctx (&ctx, checksum_before_fn); 15069 ht.empty (); 15070 15071 md5_init_ctx (&ctx); 15072 for (i = 0; i < nargs; i++) 15073 fold_checksum_tree (argarray[i], &ctx, ht); 15074 md5_finish_ctx (&ctx, checksum_before_arglist); 15075 ht.empty (); 15076#endif 15077 15078 tem = fold_builtin_call_array (loc, type, fn, nargs, argarray); 15079 15080#ifdef ENABLE_FOLD_CHECKING 15081 md5_init_ctx (&ctx); 15082 fold_checksum_tree (fn, &ctx, ht); 15083 md5_finish_ctx (&ctx, checksum_after_fn); 15084 ht.empty (); 15085 15086 if (memcmp (checksum_before_fn, checksum_after_fn, 16)) 15087 fold_check_failed (fn, tem); 15088 15089 md5_init_ctx (&ctx); 15090 for (i = 0; i < nargs; i++) 15091 fold_checksum_tree (argarray[i], &ctx, ht); 15092 md5_finish_ctx (&ctx, checksum_after_arglist); 15093 ht.dispose (); 15094 15095 if (memcmp (checksum_before_arglist, checksum_after_arglist, 16)) 15096 fold_check_failed (NULL_TREE, tem); 15097#endif 15098 return tem; 15099} 15100 15101/* Perform constant folding and related simplification of initializer 15102 expression EXPR. These behave identically to "fold_buildN" but ignore 15103 potential run-time traps and exceptions that fold must preserve. */ 15104 15105#define START_FOLD_INIT \ 15106 int saved_signaling_nans = flag_signaling_nans;\ 15107 int saved_trapping_math = flag_trapping_math;\ 15108 int saved_rounding_math = flag_rounding_math;\ 15109 int saved_trapv = flag_trapv;\ 15110 int saved_folding_initializer = folding_initializer;\ 15111 flag_signaling_nans = 0;\ 15112 flag_trapping_math = 0;\ 15113 flag_rounding_math = 0;\ 15114 flag_trapv = 0;\ 15115 folding_initializer = 1; 15116 15117#define END_FOLD_INIT \ 15118 flag_signaling_nans = saved_signaling_nans;\ 15119 flag_trapping_math = saved_trapping_math;\ 15120 flag_rounding_math = saved_rounding_math;\ 15121 flag_trapv = saved_trapv;\ 15122 folding_initializer = saved_folding_initializer; 15123 15124tree 15125fold_build1_initializer_loc (location_t loc, enum tree_code code, 15126 tree type, tree op) 15127{ 15128 tree result; 15129 START_FOLD_INIT; 15130 15131 result = fold_build1_loc (loc, code, type, op); 15132 15133 END_FOLD_INIT; 15134 return result; 15135} 15136 15137tree 15138fold_build2_initializer_loc (location_t loc, enum tree_code code, 15139 tree type, tree op0, tree op1) 15140{ 15141 tree result; 15142 START_FOLD_INIT; 15143 15144 result = fold_build2_loc (loc, code, type, op0, op1); 15145 15146 END_FOLD_INIT; 15147 return result; 15148} 15149 15150tree 15151fold_build3_initializer_loc (location_t loc, enum tree_code code, 15152 tree type, tree op0, tree op1, tree op2) 15153{ 15154 tree result; 15155 START_FOLD_INIT; 15156 15157 result = fold_build3_loc (loc, code, type, op0, op1, op2); 15158 15159 END_FOLD_INIT; 15160 return result; 15161} 15162 15163tree 15164fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn, 15165 int nargs, tree *argarray) 15166{ 15167 tree result; 15168 START_FOLD_INIT; 15169 15170 result = fold_build_call_array_loc (loc, type, fn, nargs, argarray); 15171 15172 END_FOLD_INIT; 15173 return result; 15174} 15175 15176#undef START_FOLD_INIT 15177#undef END_FOLD_INIT 15178 15179/* Determine if first argument is a multiple of second argument. Return 0 if 15180 it is not, or we cannot easily determined it to be. 15181 15182 An example of the sort of thing we care about (at this point; this routine 15183 could surely be made more general, and expanded to do what the *_DIV_EXPR's 15184 fold cases do now) is discovering that 15185 15186 SAVE_EXPR (I) * SAVE_EXPR (J * 8) 15187 15188 is a multiple of 15189 15190 SAVE_EXPR (J * 8) 15191 15192 when we know that the two SAVE_EXPR (J * 8) nodes are the same node. 15193 15194 This code also handles discovering that 15195 15196 SAVE_EXPR (I) * SAVE_EXPR (J * 8) 15197 15198 is a multiple of 8 so we don't have to worry about dealing with a 15199 possible remainder. 15200 15201 Note that we *look* inside a SAVE_EXPR only to determine how it was 15202 calculated; it is not safe for fold to do much of anything else with the 15203 internals of a SAVE_EXPR, since it cannot know when it will be evaluated 15204 at run time. For example, the latter example above *cannot* be implemented 15205 as SAVE_EXPR (I) * J or any variant thereof, since the value of J at 15206 evaluation time of the original SAVE_EXPR is not necessarily the same at 15207 the time the new expression is evaluated. The only optimization of this 15208 sort that would be valid is changing 15209 15210 SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8) 15211 15212 divided by 8 to 15213 15214 SAVE_EXPR (I) * SAVE_EXPR (J) 15215 15216 (where the same SAVE_EXPR (J) is used in the original and the 15217 transformed version). */ 15218 15219int 15220multiple_of_p (tree type, const_tree top, const_tree bottom) 15221{ 15222 if (operand_equal_p (top, bottom, 0)) 15223 return 1; 15224 15225 if (TREE_CODE (type) != INTEGER_TYPE) 15226 return 0; 15227 15228 switch (TREE_CODE (top)) 15229 { 15230 case BIT_AND_EXPR: 15231 /* Bitwise and provides a power of two multiple. If the mask is 15232 a multiple of BOTTOM then TOP is a multiple of BOTTOM. */ 15233 if (!integer_pow2p (bottom)) 15234 return 0; 15235 /* FALLTHRU */ 15236 15237 case MULT_EXPR: 15238 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom) 15239 || multiple_of_p (type, TREE_OPERAND (top, 1), bottom)); 15240 15241 case PLUS_EXPR: 15242 case MINUS_EXPR: 15243 return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom) 15244 && multiple_of_p (type, TREE_OPERAND (top, 1), bottom)); 15245 15246 case LSHIFT_EXPR: 15247 if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST) 15248 { 15249 tree op1, t1; 15250 15251 op1 = TREE_OPERAND (top, 1); 15252 /* const_binop may not detect overflow correctly, 15253 so check for it explicitly here. */ 15254 if (TYPE_PRECISION (TREE_TYPE (size_one_node)) 15255 > TREE_INT_CST_LOW (op1) 15256 && TREE_INT_CST_HIGH (op1) == 0 15257 && 0 != (t1 = fold_convert (type, 15258 const_binop (LSHIFT_EXPR, 15259 size_one_node, 15260 op1))) 15261 && !TREE_OVERFLOW (t1)) 15262 return multiple_of_p (type, t1, bottom); 15263 } 15264 return 0; 15265 15266 case NOP_EXPR: 15267 /* Can't handle conversions from non-integral or wider integral type. */ 15268 if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE) 15269 || (TYPE_PRECISION (type) 15270 < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0))))) 15271 return 0; 15272 15273 /* .. fall through ... */ 15274 15275 case SAVE_EXPR: 15276 return multiple_of_p (type, TREE_OPERAND (top, 0), bottom); 15277 15278 case COND_EXPR: 15279 return (multiple_of_p (type, TREE_OPERAND (top, 1), bottom) 15280 && multiple_of_p (type, TREE_OPERAND (top, 2), bottom)); 15281 15282 case INTEGER_CST: 15283 if (TREE_CODE (bottom) != INTEGER_CST 15284 || integer_zerop (bottom) 15285 || (TYPE_UNSIGNED (type) 15286 && (tree_int_cst_sgn (top) < 0 15287 || tree_int_cst_sgn (bottom) < 0))) 15288 return 0; 15289 return integer_zerop (int_const_binop (TRUNC_MOD_EXPR, 15290 top, bottom)); 15291 15292 default: 15293 return 0; 15294 } 15295} 15296 15297/* Return true if CODE or TYPE is known to be non-negative. */ 15298 15299static bool 15300tree_simple_nonnegative_warnv_p (enum tree_code code, tree type) 15301{ 15302 if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type)) 15303 && truth_value_p (code)) 15304 /* Truth values evaluate to 0 or 1, which is nonnegative unless we 15305 have a signed:1 type (where the value is -1 and 0). */ 15306 return true; 15307 return false; 15308} 15309 15310/* Return true if (CODE OP0) is known to be non-negative. If the return 15311 value is based on the assumption that signed overflow is undefined, 15312 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15313 *STRICT_OVERFLOW_P. */ 15314 15315bool 15316tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0, 15317 bool *strict_overflow_p) 15318{ 15319 if (TYPE_UNSIGNED (type)) 15320 return true; 15321 15322 switch (code) 15323 { 15324 case ABS_EXPR: 15325 /* We can't return 1 if flag_wrapv is set because 15326 ABS_EXPR<INT_MIN> = INT_MIN. */ 15327 if (!INTEGRAL_TYPE_P (type)) 15328 return true; 15329 if (TYPE_OVERFLOW_UNDEFINED (type)) 15330 { 15331 *strict_overflow_p = true; 15332 return true; 15333 } 15334 break; 15335 15336 case NON_LVALUE_EXPR: 15337 case FLOAT_EXPR: 15338 case FIX_TRUNC_EXPR: 15339 return tree_expr_nonnegative_warnv_p (op0, 15340 strict_overflow_p); 15341 15342 case NOP_EXPR: 15343 { 15344 tree inner_type = TREE_TYPE (op0); 15345 tree outer_type = type; 15346 15347 if (TREE_CODE (outer_type) == REAL_TYPE) 15348 { 15349 if (TREE_CODE (inner_type) == REAL_TYPE) 15350 return tree_expr_nonnegative_warnv_p (op0, 15351 strict_overflow_p); 15352 if (TREE_CODE (inner_type) == INTEGER_TYPE) 15353 { 15354 if (TYPE_UNSIGNED (inner_type)) 15355 return true; 15356 return tree_expr_nonnegative_warnv_p (op0, 15357 strict_overflow_p); 15358 } 15359 } 15360 else if (TREE_CODE (outer_type) == INTEGER_TYPE) 15361 { 15362 if (TREE_CODE (inner_type) == REAL_TYPE) 15363 return tree_expr_nonnegative_warnv_p (op0, 15364 strict_overflow_p); 15365 if (TREE_CODE (inner_type) == INTEGER_TYPE) 15366 return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type) 15367 && TYPE_UNSIGNED (inner_type); 15368 } 15369 } 15370 break; 15371 15372 default: 15373 return tree_simple_nonnegative_warnv_p (code, type); 15374 } 15375 15376 /* We don't know sign of `t', so be conservative and return false. */ 15377 return false; 15378} 15379 15380/* Return true if (CODE OP0 OP1) is known to be non-negative. If the return 15381 value is based on the assumption that signed overflow is undefined, 15382 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15383 *STRICT_OVERFLOW_P. */ 15384 15385bool 15386tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0, 15387 tree op1, bool *strict_overflow_p) 15388{ 15389 if (TYPE_UNSIGNED (type)) 15390 return true; 15391 15392 switch (code) 15393 { 15394 case POINTER_PLUS_EXPR: 15395 case PLUS_EXPR: 15396 if (FLOAT_TYPE_P (type)) 15397 return (tree_expr_nonnegative_warnv_p (op0, 15398 strict_overflow_p) 15399 && tree_expr_nonnegative_warnv_p (op1, 15400 strict_overflow_p)); 15401 15402 /* zero_extend(x) + zero_extend(y) is non-negative if x and y are 15403 both unsigned and at least 2 bits shorter than the result. */ 15404 if (TREE_CODE (type) == INTEGER_TYPE 15405 && TREE_CODE (op0) == NOP_EXPR 15406 && TREE_CODE (op1) == NOP_EXPR) 15407 { 15408 tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0)); 15409 tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0)); 15410 if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1) 15411 && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2)) 15412 { 15413 unsigned int prec = MAX (TYPE_PRECISION (inner1), 15414 TYPE_PRECISION (inner2)) + 1; 15415 return prec < TYPE_PRECISION (type); 15416 } 15417 } 15418 break; 15419 15420 case MULT_EXPR: 15421 if (FLOAT_TYPE_P (type)) 15422 { 15423 /* x * x for floating point x is always non-negative. */ 15424 if (operand_equal_p (op0, op1, 0)) 15425 return true; 15426 return (tree_expr_nonnegative_warnv_p (op0, 15427 strict_overflow_p) 15428 && tree_expr_nonnegative_warnv_p (op1, 15429 strict_overflow_p)); 15430 } 15431 15432 /* zero_extend(x) * zero_extend(y) is non-negative if x and y are 15433 both unsigned and their total bits is shorter than the result. */ 15434 if (TREE_CODE (type) == INTEGER_TYPE 15435 && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST) 15436 && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST)) 15437 { 15438 tree inner0 = (TREE_CODE (op0) == NOP_EXPR) 15439 ? TREE_TYPE (TREE_OPERAND (op0, 0)) 15440 : TREE_TYPE (op0); 15441 tree inner1 = (TREE_CODE (op1) == NOP_EXPR) 15442 ? TREE_TYPE (TREE_OPERAND (op1, 0)) 15443 : TREE_TYPE (op1); 15444 15445 bool unsigned0 = TYPE_UNSIGNED (inner0); 15446 bool unsigned1 = TYPE_UNSIGNED (inner1); 15447 15448 if (TREE_CODE (op0) == INTEGER_CST) 15449 unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0; 15450 15451 if (TREE_CODE (op1) == INTEGER_CST) 15452 unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0; 15453 15454 if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0 15455 && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1) 15456 { 15457 unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST) 15458 ? tree_int_cst_min_precision (op0, /*unsignedp=*/true) 15459 : TYPE_PRECISION (inner0); 15460 15461 unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST) 15462 ? tree_int_cst_min_precision (op1, /*unsignedp=*/true) 15463 : TYPE_PRECISION (inner1); 15464 15465 return precision0 + precision1 < TYPE_PRECISION (type); 15466 } 15467 } 15468 return false; 15469 15470 case BIT_AND_EXPR: 15471 case MAX_EXPR: 15472 return (tree_expr_nonnegative_warnv_p (op0, 15473 strict_overflow_p) 15474 || tree_expr_nonnegative_warnv_p (op1, 15475 strict_overflow_p)); 15476 15477 case BIT_IOR_EXPR: 15478 case BIT_XOR_EXPR: 15479 case MIN_EXPR: 15480 case RDIV_EXPR: 15481 case TRUNC_DIV_EXPR: 15482 case CEIL_DIV_EXPR: 15483 case FLOOR_DIV_EXPR: 15484 case ROUND_DIV_EXPR: 15485 return (tree_expr_nonnegative_warnv_p (op0, 15486 strict_overflow_p) 15487 && tree_expr_nonnegative_warnv_p (op1, 15488 strict_overflow_p)); 15489 15490 case TRUNC_MOD_EXPR: 15491 case CEIL_MOD_EXPR: 15492 case FLOOR_MOD_EXPR: 15493 case ROUND_MOD_EXPR: 15494 return tree_expr_nonnegative_warnv_p (op0, 15495 strict_overflow_p); 15496 default: 15497 return tree_simple_nonnegative_warnv_p (code, type); 15498 } 15499 15500 /* We don't know sign of `t', so be conservative and return false. */ 15501 return false; 15502} 15503 15504/* Return true if T is known to be non-negative. If the return 15505 value is based on the assumption that signed overflow is undefined, 15506 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15507 *STRICT_OVERFLOW_P. */ 15508 15509bool 15510tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p) 15511{ 15512 if (TYPE_UNSIGNED (TREE_TYPE (t))) 15513 return true; 15514 15515 switch (TREE_CODE (t)) 15516 { 15517 case INTEGER_CST: 15518 return tree_int_cst_sgn (t) >= 0; 15519 15520 case REAL_CST: 15521 return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t)); 15522 15523 case FIXED_CST: 15524 return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t)); 15525 15526 case COND_EXPR: 15527 return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1), 15528 strict_overflow_p) 15529 && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2), 15530 strict_overflow_p)); 15531 default: 15532 return tree_simple_nonnegative_warnv_p (TREE_CODE (t), 15533 TREE_TYPE (t)); 15534 } 15535 /* We don't know sign of `t', so be conservative and return false. */ 15536 return false; 15537} 15538 15539/* Return true if T is known to be non-negative. If the return 15540 value is based on the assumption that signed overflow is undefined, 15541 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15542 *STRICT_OVERFLOW_P. */ 15543 15544bool 15545tree_call_nonnegative_warnv_p (tree type, tree fndecl, 15546 tree arg0, tree arg1, bool *strict_overflow_p) 15547{ 15548 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) 15549 switch (DECL_FUNCTION_CODE (fndecl)) 15550 { 15551 CASE_FLT_FN (BUILT_IN_ACOS): 15552 CASE_FLT_FN (BUILT_IN_ACOSH): 15553 CASE_FLT_FN (BUILT_IN_CABS): 15554 CASE_FLT_FN (BUILT_IN_COSH): 15555 CASE_FLT_FN (BUILT_IN_ERFC): 15556 CASE_FLT_FN (BUILT_IN_EXP): 15557 CASE_FLT_FN (BUILT_IN_EXP10): 15558 CASE_FLT_FN (BUILT_IN_EXP2): 15559 CASE_FLT_FN (BUILT_IN_FABS): 15560 CASE_FLT_FN (BUILT_IN_FDIM): 15561 CASE_FLT_FN (BUILT_IN_HYPOT): 15562 CASE_FLT_FN (BUILT_IN_POW10): 15563 CASE_INT_FN (BUILT_IN_FFS): 15564 CASE_INT_FN (BUILT_IN_PARITY): 15565 CASE_INT_FN (BUILT_IN_POPCOUNT): 15566 case BUILT_IN_BSWAP32: 15567 case BUILT_IN_BSWAP64: 15568 /* Always true. */ 15569 return true; 15570 15571 CASE_FLT_FN (BUILT_IN_SQRT): 15572 /* sqrt(-0.0) is -0.0. */ 15573 if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))) 15574 return true; 15575 return tree_expr_nonnegative_warnv_p (arg0, 15576 strict_overflow_p); 15577 15578 CASE_FLT_FN (BUILT_IN_ASINH): 15579 CASE_FLT_FN (BUILT_IN_ATAN): 15580 CASE_FLT_FN (BUILT_IN_ATANH): 15581 CASE_FLT_FN (BUILT_IN_CBRT): 15582 CASE_FLT_FN (BUILT_IN_CEIL): 15583 CASE_FLT_FN (BUILT_IN_ERF): 15584 CASE_FLT_FN (BUILT_IN_EXPM1): 15585 CASE_FLT_FN (BUILT_IN_FLOOR): 15586 CASE_FLT_FN (BUILT_IN_FMOD): 15587 CASE_FLT_FN (BUILT_IN_FREXP): 15588 CASE_FLT_FN (BUILT_IN_ICEIL): 15589 CASE_FLT_FN (BUILT_IN_IFLOOR): 15590 CASE_FLT_FN (BUILT_IN_IRINT): 15591 CASE_FLT_FN (BUILT_IN_IROUND): 15592 CASE_FLT_FN (BUILT_IN_LCEIL): 15593 CASE_FLT_FN (BUILT_IN_LDEXP): 15594 CASE_FLT_FN (BUILT_IN_LFLOOR): 15595 CASE_FLT_FN (BUILT_IN_LLCEIL): 15596 CASE_FLT_FN (BUILT_IN_LLFLOOR): 15597 CASE_FLT_FN (BUILT_IN_LLRINT): 15598 CASE_FLT_FN (BUILT_IN_LLROUND): 15599 CASE_FLT_FN (BUILT_IN_LRINT): 15600 CASE_FLT_FN (BUILT_IN_LROUND): 15601 CASE_FLT_FN (BUILT_IN_MODF): 15602 CASE_FLT_FN (BUILT_IN_NEARBYINT): 15603 CASE_FLT_FN (BUILT_IN_RINT): 15604 CASE_FLT_FN (BUILT_IN_ROUND): 15605 CASE_FLT_FN (BUILT_IN_SCALB): 15606 CASE_FLT_FN (BUILT_IN_SCALBLN): 15607 CASE_FLT_FN (BUILT_IN_SCALBN): 15608 CASE_FLT_FN (BUILT_IN_SIGNBIT): 15609 CASE_FLT_FN (BUILT_IN_SIGNIFICAND): 15610 CASE_FLT_FN (BUILT_IN_SINH): 15611 CASE_FLT_FN (BUILT_IN_TANH): 15612 CASE_FLT_FN (BUILT_IN_TRUNC): 15613 /* True if the 1st argument is nonnegative. */ 15614 return tree_expr_nonnegative_warnv_p (arg0, 15615 strict_overflow_p); 15616 15617 CASE_FLT_FN (BUILT_IN_FMAX): 15618 /* True if the 1st OR 2nd arguments are nonnegative. */ 15619 return (tree_expr_nonnegative_warnv_p (arg0, 15620 strict_overflow_p) 15621 || (tree_expr_nonnegative_warnv_p (arg1, 15622 strict_overflow_p))); 15623 15624 CASE_FLT_FN (BUILT_IN_FMIN): 15625 /* True if the 1st AND 2nd arguments are nonnegative. */ 15626 return (tree_expr_nonnegative_warnv_p (arg0, 15627 strict_overflow_p) 15628 && (tree_expr_nonnegative_warnv_p (arg1, 15629 strict_overflow_p))); 15630 15631 CASE_FLT_FN (BUILT_IN_COPYSIGN): 15632 /* True if the 2nd argument is nonnegative. */ 15633 return tree_expr_nonnegative_warnv_p (arg1, 15634 strict_overflow_p); 15635 15636 CASE_FLT_FN (BUILT_IN_POWI): 15637 /* True if the 1st argument is nonnegative or the second 15638 argument is an even integer. */ 15639 if (TREE_CODE (arg1) == INTEGER_CST 15640 && (TREE_INT_CST_LOW (arg1) & 1) == 0) 15641 return true; 15642 return tree_expr_nonnegative_warnv_p (arg0, 15643 strict_overflow_p); 15644 15645 CASE_FLT_FN (BUILT_IN_POW): 15646 /* True if the 1st argument is nonnegative or the second 15647 argument is an even integer valued real. */ 15648 if (TREE_CODE (arg1) == REAL_CST) 15649 { 15650 REAL_VALUE_TYPE c; 15651 HOST_WIDE_INT n; 15652 15653 c = TREE_REAL_CST (arg1); 15654 n = real_to_integer (&c); 15655 if ((n & 1) == 0) 15656 { 15657 REAL_VALUE_TYPE cint; 15658 real_from_integer (&cint, VOIDmode, n, 15659 n < 0 ? -1 : 0, 0); 15660 if (real_identical (&c, &cint)) 15661 return true; 15662 } 15663 } 15664 return tree_expr_nonnegative_warnv_p (arg0, 15665 strict_overflow_p); 15666 15667 default: 15668 break; 15669 } 15670 return tree_simple_nonnegative_warnv_p (CALL_EXPR, 15671 type); 15672} 15673 15674/* Return true if T is known to be non-negative. If the return 15675 value is based on the assumption that signed overflow is undefined, 15676 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15677 *STRICT_OVERFLOW_P. */ 15678 15679bool 15680tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p) 15681{ 15682 enum tree_code code = TREE_CODE (t); 15683 if (TYPE_UNSIGNED (TREE_TYPE (t))) 15684 return true; 15685 15686 switch (code) 15687 { 15688 case TARGET_EXPR: 15689 { 15690 tree temp = TARGET_EXPR_SLOT (t); 15691 t = TARGET_EXPR_INITIAL (t); 15692 15693 /* If the initializer is non-void, then it's a normal expression 15694 that will be assigned to the slot. */ 15695 if (!VOID_TYPE_P (t)) 15696 return tree_expr_nonnegative_warnv_p (t, strict_overflow_p); 15697 15698 /* Otherwise, the initializer sets the slot in some way. One common 15699 way is an assignment statement at the end of the initializer. */ 15700 while (1) 15701 { 15702 if (TREE_CODE (t) == BIND_EXPR) 15703 t = expr_last (BIND_EXPR_BODY (t)); 15704 else if (TREE_CODE (t) == TRY_FINALLY_EXPR 15705 || TREE_CODE (t) == TRY_CATCH_EXPR) 15706 t = expr_last (TREE_OPERAND (t, 0)); 15707 else if (TREE_CODE (t) == STATEMENT_LIST) 15708 t = expr_last (t); 15709 else 15710 break; 15711 } 15712 if (TREE_CODE (t) == MODIFY_EXPR 15713 && TREE_OPERAND (t, 0) == temp) 15714 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1), 15715 strict_overflow_p); 15716 15717 return false; 15718 } 15719 15720 case CALL_EXPR: 15721 { 15722 tree arg0 = call_expr_nargs (t) > 0 ? CALL_EXPR_ARG (t, 0) : NULL_TREE; 15723 tree arg1 = call_expr_nargs (t) > 1 ? CALL_EXPR_ARG (t, 1) : NULL_TREE; 15724 15725 return tree_call_nonnegative_warnv_p (TREE_TYPE (t), 15726 get_callee_fndecl (t), 15727 arg0, 15728 arg1, 15729 strict_overflow_p); 15730 } 15731 case COMPOUND_EXPR: 15732 case MODIFY_EXPR: 15733 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1), 15734 strict_overflow_p); 15735 case BIND_EXPR: 15736 return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)), 15737 strict_overflow_p); 15738 case SAVE_EXPR: 15739 return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0), 15740 strict_overflow_p); 15741 15742 default: 15743 return tree_simple_nonnegative_warnv_p (TREE_CODE (t), 15744 TREE_TYPE (t)); 15745 } 15746 15747 /* We don't know sign of `t', so be conservative and return false. */ 15748 return false; 15749} 15750 15751/* Return true if T is known to be non-negative. If the return 15752 value is based on the assumption that signed overflow is undefined, 15753 set *STRICT_OVERFLOW_P to true; otherwise, don't change 15754 *STRICT_OVERFLOW_P. */ 15755 15756bool 15757tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p) 15758{ 15759 enum tree_code code; 15760 if (t == error_mark_node) 15761 return false; 15762 15763 code = TREE_CODE (t); 15764 switch (TREE_CODE_CLASS (code)) 15765 { 15766 case tcc_binary: 15767 case tcc_comparison: 15768 return tree_binary_nonnegative_warnv_p (TREE_CODE (t), 15769 TREE_TYPE (t), 15770 TREE_OPERAND (t, 0), 15771 TREE_OPERAND (t, 1), 15772 strict_overflow_p); 15773 15774 case tcc_unary: 15775 return tree_unary_nonnegative_warnv_p (TREE_CODE (t), 15776 TREE_TYPE (t), 15777 TREE_OPERAND (t, 0), 15778 strict_overflow_p); 15779 15780 case tcc_constant: 15781 case tcc_declaration: 15782 case tcc_reference: 15783 return tree_single_nonnegative_warnv_p (t, strict_overflow_p); 15784 15785 default: 15786 break; 15787 } 15788 15789 switch (code) 15790 { 15791 case TRUTH_AND_EXPR: 15792 case TRUTH_OR_EXPR: 15793 case TRUTH_XOR_EXPR: 15794 return tree_binary_nonnegative_warnv_p (TREE_CODE (t), 15795 TREE_TYPE (t), 15796 TREE_OPERAND (t, 0), 15797 TREE_OPERAND (t, 1), 15798 strict_overflow_p); 15799 case TRUTH_NOT_EXPR: 15800 return tree_unary_nonnegative_warnv_p (TREE_CODE (t), 15801 TREE_TYPE (t), 15802 TREE_OPERAND (t, 0), 15803 strict_overflow_p); 15804 15805 case COND_EXPR: 15806 case CONSTRUCTOR: 15807 case OBJ_TYPE_REF: 15808 case ASSERT_EXPR: 15809 case ADDR_EXPR: 15810 case WITH_SIZE_EXPR: 15811 case SSA_NAME: 15812 return tree_single_nonnegative_warnv_p (t, strict_overflow_p); 15813 15814 default: 15815 return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p); 15816 } 15817} 15818 15819/* Return true if `t' is known to be non-negative. Handle warnings 15820 about undefined signed overflow. */ 15821 15822bool 15823tree_expr_nonnegative_p (tree t) 15824{ 15825 bool ret, strict_overflow_p; 15826 15827 strict_overflow_p = false; 15828 ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p); 15829 if (strict_overflow_p) 15830 fold_overflow_warning (("assuming signed overflow does not occur when " 15831 "determining that expression is always " 15832 "non-negative"), 15833 WARN_STRICT_OVERFLOW_MISC); 15834 return ret; 15835} 15836 15837 15838/* Return true when (CODE OP0) is an address and is known to be nonzero. 15839 For floating point we further ensure that T is not denormal. 15840 Similar logic is present in nonzero_address in rtlanal.h. 15841 15842 If the return value is based on the assumption that signed overflow 15843 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't 15844 change *STRICT_OVERFLOW_P. */ 15845 15846bool 15847tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0, 15848 bool *strict_overflow_p) 15849{ 15850 switch (code) 15851 { 15852 case ABS_EXPR: 15853 return tree_expr_nonzero_warnv_p (op0, 15854 strict_overflow_p); 15855 15856 case NOP_EXPR: 15857 { 15858 tree inner_type = TREE_TYPE (op0); 15859 tree outer_type = type; 15860 15861 return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type) 15862 && tree_expr_nonzero_warnv_p (op0, 15863 strict_overflow_p)); 15864 } 15865 break; 15866 15867 case NON_LVALUE_EXPR: 15868 return tree_expr_nonzero_warnv_p (op0, 15869 strict_overflow_p); 15870 15871 default: 15872 break; 15873 } 15874 15875 return false; 15876} 15877 15878/* Return true when (CODE OP0 OP1) is an address and is known to be nonzero. 15879 For floating point we further ensure that T is not denormal. 15880 Similar logic is present in nonzero_address in rtlanal.h. 15881 15882 If the return value is based on the assumption that signed overflow 15883 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't 15884 change *STRICT_OVERFLOW_P. */ 15885 15886bool 15887tree_binary_nonzero_warnv_p (enum tree_code code, 15888 tree type, 15889 tree op0, 15890 tree op1, bool *strict_overflow_p) 15891{ 15892 bool sub_strict_overflow_p; 15893 switch (code) 15894 { 15895 case POINTER_PLUS_EXPR: 15896 case PLUS_EXPR: 15897 if (TYPE_OVERFLOW_UNDEFINED (type)) 15898 { 15899 /* With the presence of negative values it is hard 15900 to say something. */ 15901 sub_strict_overflow_p = false; 15902 if (!tree_expr_nonnegative_warnv_p (op0, 15903 &sub_strict_overflow_p) 15904 || !tree_expr_nonnegative_warnv_p (op1, 15905 &sub_strict_overflow_p)) 15906 return false; 15907 /* One of operands must be positive and the other non-negative. */ 15908 /* We don't set *STRICT_OVERFLOW_P here: even if this value 15909 overflows, on a twos-complement machine the sum of two 15910 nonnegative numbers can never be zero. */ 15911 return (tree_expr_nonzero_warnv_p (op0, 15912 strict_overflow_p) 15913 || tree_expr_nonzero_warnv_p (op1, 15914 strict_overflow_p)); 15915 } 15916 break; 15917 15918 case MULT_EXPR: 15919 if (TYPE_OVERFLOW_UNDEFINED (type)) 15920 { 15921 if (tree_expr_nonzero_warnv_p (op0, 15922 strict_overflow_p) 15923 && tree_expr_nonzero_warnv_p (op1, 15924 strict_overflow_p)) 15925 { 15926 *strict_overflow_p = true; 15927 return true; 15928 } 15929 } 15930 break; 15931 15932 case MIN_EXPR: 15933 sub_strict_overflow_p = false; 15934 if (tree_expr_nonzero_warnv_p (op0, 15935 &sub_strict_overflow_p) 15936 && tree_expr_nonzero_warnv_p (op1, 15937 &sub_strict_overflow_p)) 15938 { 15939 if (sub_strict_overflow_p) 15940 *strict_overflow_p = true; 15941 } 15942 break; 15943 15944 case MAX_EXPR: 15945 sub_strict_overflow_p = false; 15946 if (tree_expr_nonzero_warnv_p (op0, 15947 &sub_strict_overflow_p)) 15948 { 15949 if (sub_strict_overflow_p) 15950 *strict_overflow_p = true; 15951 15952 /* When both operands are nonzero, then MAX must be too. */ 15953 if (tree_expr_nonzero_warnv_p (op1, 15954 strict_overflow_p)) 15955 return true; 15956 15957 /* MAX where operand 0 is positive is positive. */ 15958 return tree_expr_nonnegative_warnv_p (op0, 15959 strict_overflow_p); 15960 } 15961 /* MAX where operand 1 is positive is positive. */ 15962 else if (tree_expr_nonzero_warnv_p (op1, 15963 &sub_strict_overflow_p) 15964 && tree_expr_nonnegative_warnv_p (op1, 15965 &sub_strict_overflow_p)) 15966 { 15967 if (sub_strict_overflow_p) 15968 *strict_overflow_p = true; 15969 return true; 15970 } 15971 break; 15972 15973 case BIT_IOR_EXPR: 15974 return (tree_expr_nonzero_warnv_p (op1, 15975 strict_overflow_p) 15976 || tree_expr_nonzero_warnv_p (op0, 15977 strict_overflow_p)); 15978 15979 default: 15980 break; 15981 } 15982 15983 return false; 15984} 15985 15986/* Return true when T is an address and is known to be nonzero. 15987 For floating point we further ensure that T is not denormal. 15988 Similar logic is present in nonzero_address in rtlanal.h. 15989 15990 If the return value is based on the assumption that signed overflow 15991 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't 15992 change *STRICT_OVERFLOW_P. */ 15993 15994bool 15995tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p) 15996{ 15997 bool sub_strict_overflow_p; 15998 switch (TREE_CODE (t)) 15999 { 16000 case INTEGER_CST: 16001 return !integer_zerop (t); 16002 16003 case ADDR_EXPR: 16004 { 16005 tree base = TREE_OPERAND (t, 0); 16006 if (!DECL_P (base)) 16007 base = get_base_address (base); 16008 16009 if (!base) 16010 return false; 16011 16012 /* Weak declarations may link to NULL. Other things may also be NULL 16013 so protect with -fdelete-null-pointer-checks; but not variables 16014 allocated on the stack. */ 16015 if (DECL_P (base) 16016 && (flag_delete_null_pointer_checks 16017 || (DECL_CONTEXT (base) 16018 && TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL 16019 && auto_var_in_fn_p (base, DECL_CONTEXT (base))))) 16020 return !VAR_OR_FUNCTION_DECL_P (base) || !DECL_WEAK (base); 16021 16022 /* Constants are never weak. */ 16023 if (CONSTANT_CLASS_P (base)) 16024 return true; 16025 16026 return false; 16027 } 16028 16029 case COND_EXPR: 16030 sub_strict_overflow_p = false; 16031 if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1), 16032 &sub_strict_overflow_p) 16033 && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2), 16034 &sub_strict_overflow_p)) 16035 { 16036 if (sub_strict_overflow_p) 16037 *strict_overflow_p = true; 16038 return true; 16039 } 16040 break; 16041 16042 default: 16043 break; 16044 } 16045 return false; 16046} 16047 16048/* Return true when T is an address and is known to be nonzero. 16049 For floating point we further ensure that T is not denormal. 16050 Similar logic is present in nonzero_address in rtlanal.h. 16051 16052 If the return value is based on the assumption that signed overflow 16053 is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't 16054 change *STRICT_OVERFLOW_P. */ 16055 16056bool 16057tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p) 16058{ 16059 tree type = TREE_TYPE (t); 16060 enum tree_code code; 16061 16062 /* Doing something useful for floating point would need more work. */ 16063 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type)) 16064 return false; 16065 16066 code = TREE_CODE (t); 16067 switch (TREE_CODE_CLASS (code)) 16068 { 16069 case tcc_unary: 16070 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0), 16071 strict_overflow_p); 16072 case tcc_binary: 16073 case tcc_comparison: 16074 return tree_binary_nonzero_warnv_p (code, type, 16075 TREE_OPERAND (t, 0), 16076 TREE_OPERAND (t, 1), 16077 strict_overflow_p); 16078 case tcc_constant: 16079 case tcc_declaration: 16080 case tcc_reference: 16081 return tree_single_nonzero_warnv_p (t, strict_overflow_p); 16082 16083 default: 16084 break; 16085 } 16086 16087 switch (code) 16088 { 16089 case TRUTH_NOT_EXPR: 16090 return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0), 16091 strict_overflow_p); 16092 16093 case TRUTH_AND_EXPR: 16094 case TRUTH_OR_EXPR: 16095 case TRUTH_XOR_EXPR: 16096 return tree_binary_nonzero_warnv_p (code, type, 16097 TREE_OPERAND (t, 0), 16098 TREE_OPERAND (t, 1), 16099 strict_overflow_p); 16100 16101 case COND_EXPR: 16102 case CONSTRUCTOR: 16103 case OBJ_TYPE_REF: 16104 case ASSERT_EXPR: 16105 case ADDR_EXPR: 16106 case WITH_SIZE_EXPR: 16107 case SSA_NAME: 16108 return tree_single_nonzero_warnv_p (t, strict_overflow_p); 16109 16110 case COMPOUND_EXPR: 16111 case MODIFY_EXPR: 16112 case BIND_EXPR: 16113 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1), 16114 strict_overflow_p); 16115 16116 case SAVE_EXPR: 16117 return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0), 16118 strict_overflow_p); 16119 16120 case CALL_EXPR: 16121 return alloca_call_p (t); 16122 16123 default: 16124 break; 16125 } 16126 return false; 16127} 16128 16129/* Return true when T is an address and is known to be nonzero. 16130 Handle warnings about undefined signed overflow. */ 16131 16132bool 16133tree_expr_nonzero_p (tree t) 16134{ 16135 bool ret, strict_overflow_p; 16136 16137 strict_overflow_p = false; 16138 ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p); 16139 if (strict_overflow_p) 16140 fold_overflow_warning (("assuming signed overflow does not occur when " 16141 "determining that expression is always " 16142 "non-zero"), 16143 WARN_STRICT_OVERFLOW_MISC); 16144 return ret; 16145} 16146 16147/* Given the components of a binary expression CODE, TYPE, OP0 and OP1, 16148 attempt to fold the expression to a constant without modifying TYPE, 16149 OP0 or OP1. 16150 16151 If the expression could be simplified to a constant, then return 16152 the constant. If the expression would not be simplified to a 16153 constant, then return NULL_TREE. */ 16154 16155tree 16156fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1) 16157{ 16158 tree tem = fold_binary (code, type, op0, op1); 16159 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE; 16160} 16161 16162/* Given the components of a unary expression CODE, TYPE and OP0, 16163 attempt to fold the expression to a constant without modifying 16164 TYPE or OP0. 16165 16166 If the expression could be simplified to a constant, then return 16167 the constant. If the expression would not be simplified to a 16168 constant, then return NULL_TREE. */ 16169 16170tree 16171fold_unary_to_constant (enum tree_code code, tree type, tree op0) 16172{ 16173 tree tem = fold_unary (code, type, op0); 16174 return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE; 16175} 16176 16177/* If EXP represents referencing an element in a constant string 16178 (either via pointer arithmetic or array indexing), return the 16179 tree representing the value accessed, otherwise return NULL. */ 16180 16181tree 16182fold_read_from_constant_string (tree exp) 16183{ 16184 if ((TREE_CODE (exp) == INDIRECT_REF 16185 || TREE_CODE (exp) == ARRAY_REF) 16186 && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE) 16187 { 16188 tree exp1 = TREE_OPERAND (exp, 0); 16189 tree index; 16190 tree string; 16191 location_t loc = EXPR_LOCATION (exp); 16192 16193 if (TREE_CODE (exp) == INDIRECT_REF) 16194 string = string_constant (exp1, &index); 16195 else 16196 { 16197 tree low_bound = array_ref_low_bound (exp); 16198 index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1)); 16199 16200 /* Optimize the special-case of a zero lower bound. 16201 16202 We convert the low_bound to sizetype to avoid some problems 16203 with constant folding. (E.g. suppose the lower bound is 1, 16204 and its mode is QI. Without the conversion,l (ARRAY 16205 +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1)) 16206 +INDEX), which becomes (ARRAY+255+INDEX). Oops!) */ 16207 if (! integer_zerop (low_bound)) 16208 index = size_diffop_loc (loc, index, 16209 fold_convert_loc (loc, sizetype, low_bound)); 16210 16211 string = exp1; 16212 } 16213 16214 if (string 16215 && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string))) 16216 && TREE_CODE (string) == STRING_CST 16217 && TREE_CODE (index) == INTEGER_CST 16218 && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0 16219 && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) 16220 == MODE_INT) 16221 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1)) 16222 return build_int_cst_type (TREE_TYPE (exp), 16223 (TREE_STRING_POINTER (string) 16224 [TREE_INT_CST_LOW (index)])); 16225 } 16226 return NULL; 16227} 16228 16229/* Return the tree for neg (ARG0) when ARG0 is known to be either 16230 an integer constant, real, or fixed-point constant. 16231 16232 TYPE is the type of the result. */ 16233 16234static tree 16235fold_negate_const (tree arg0, tree type) 16236{ 16237 tree t = NULL_TREE; 16238 16239 switch (TREE_CODE (arg0)) 16240 { 16241 case INTEGER_CST: 16242 { 16243 double_int val = tree_to_double_int (arg0); 16244 bool overflow; 16245 val = val.neg_with_overflow (&overflow); 16246 t = force_fit_type_double (type, val, 1, 16247 (overflow | TREE_OVERFLOW (arg0)) 16248 && !TYPE_UNSIGNED (type)); 16249 break; 16250 } 16251 16252 case REAL_CST: 16253 t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0))); 16254 break; 16255 16256 case FIXED_CST: 16257 { 16258 FIXED_VALUE_TYPE f; 16259 bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR, 16260 &(TREE_FIXED_CST (arg0)), NULL, 16261 TYPE_SATURATING (type)); 16262 t = build_fixed (type, f); 16263 /* Propagate overflow flags. */ 16264 if (overflow_p | TREE_OVERFLOW (arg0)) 16265 TREE_OVERFLOW (t) = 1; 16266 break; 16267 } 16268 16269 default: 16270 gcc_unreachable (); 16271 } 16272 16273 return t; 16274} 16275 16276/* Return the tree for abs (ARG0) when ARG0 is known to be either 16277 an integer constant or real constant. 16278 16279 TYPE is the type of the result. */ 16280 16281tree 16282fold_abs_const (tree arg0, tree type) 16283{ 16284 tree t = NULL_TREE; 16285 16286 switch (TREE_CODE (arg0)) 16287 { 16288 case INTEGER_CST: 16289 { 16290 double_int val = tree_to_double_int (arg0); 16291 16292 /* If the value is unsigned or non-negative, then the absolute value 16293 is the same as the ordinary value. */ 16294 if (TYPE_UNSIGNED (type) 16295 || !val.is_negative ()) 16296 t = arg0; 16297 16298 /* If the value is negative, then the absolute value is 16299 its negation. */ 16300 else 16301 { 16302 bool overflow; 16303 val = val.neg_with_overflow (&overflow); 16304 t = force_fit_type_double (type, val, -1, 16305 overflow | TREE_OVERFLOW (arg0)); 16306 } 16307 } 16308 break; 16309 16310 case REAL_CST: 16311 if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0))) 16312 t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0))); 16313 else 16314 t = arg0; 16315 break; 16316 16317 default: 16318 gcc_unreachable (); 16319 } 16320 16321 return t; 16322} 16323 16324/* Return the tree for not (ARG0) when ARG0 is known to be an integer 16325 constant. TYPE is the type of the result. */ 16326 16327static tree 16328fold_not_const (const_tree arg0, tree type) 16329{ 16330 double_int val; 16331 16332 gcc_assert (TREE_CODE (arg0) == INTEGER_CST); 16333 16334 val = ~tree_to_double_int (arg0); 16335 return force_fit_type_double (type, val, 0, TREE_OVERFLOW (arg0)); 16336} 16337 16338/* Given CODE, a relational operator, the target type, TYPE and two 16339 constant operands OP0 and OP1, return the result of the 16340 relational operation. If the result is not a compile time 16341 constant, then return NULL_TREE. */ 16342 16343static tree 16344fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) 16345{ 16346 int result, invert; 16347 16348 /* From here on, the only cases we handle are when the result is 16349 known to be a constant. */ 16350 16351 if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST) 16352 { 16353 const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0); 16354 const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1); 16355 16356 /* Handle the cases where either operand is a NaN. */ 16357 if (real_isnan (c0) || real_isnan (c1)) 16358 { 16359 switch (code) 16360 { 16361 case EQ_EXPR: 16362 case ORDERED_EXPR: 16363 result = 0; 16364 break; 16365 16366 case NE_EXPR: 16367 case UNORDERED_EXPR: 16368 case UNLT_EXPR: 16369 case UNLE_EXPR: 16370 case UNGT_EXPR: 16371 case UNGE_EXPR: 16372 case UNEQ_EXPR: 16373 result = 1; 16374 break; 16375 16376 case LT_EXPR: 16377 case LE_EXPR: 16378 case GT_EXPR: 16379 case GE_EXPR: 16380 case LTGT_EXPR: 16381 if (flag_trapping_math) 16382 return NULL_TREE; 16383 result = 0; 16384 break; 16385 16386 default: 16387 gcc_unreachable (); 16388 } 16389 16390 return constant_boolean_node (result, type); 16391 } 16392 16393 return constant_boolean_node (real_compare (code, c0, c1), type); 16394 } 16395 16396 if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST) 16397 { 16398 const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0); 16399 const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1); 16400 return constant_boolean_node (fixed_compare (code, c0, c1), type); 16401 } 16402 16403 /* Handle equality/inequality of complex constants. */ 16404 if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST) 16405 { 16406 tree rcond = fold_relational_const (code, type, 16407 TREE_REALPART (op0), 16408 TREE_REALPART (op1)); 16409 tree icond = fold_relational_const (code, type, 16410 TREE_IMAGPART (op0), 16411 TREE_IMAGPART (op1)); 16412 if (code == EQ_EXPR) 16413 return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond); 16414 else if (code == NE_EXPR) 16415 return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond); 16416 else 16417 return NULL_TREE; 16418 } 16419 16420 if (TREE_CODE (op0) == VECTOR_CST && TREE_CODE (op1) == VECTOR_CST) 16421 { 16422 unsigned count = VECTOR_CST_NELTS (op0); 16423 tree *elts = XALLOCAVEC (tree, count); 16424 gcc_assert (VECTOR_CST_NELTS (op1) == count 16425 && TYPE_VECTOR_SUBPARTS (type) == count); 16426 16427 for (unsigned i = 0; i < count; i++) 16428 { 16429 tree elem_type = TREE_TYPE (type); 16430 tree elem0 = VECTOR_CST_ELT (op0, i); 16431 tree elem1 = VECTOR_CST_ELT (op1, i); 16432 16433 tree tem = fold_relational_const (code, elem_type, 16434 elem0, elem1); 16435 16436 if (tem == NULL_TREE) 16437 return NULL_TREE; 16438 16439 elts[i] = build_int_cst (elem_type, integer_zerop (tem) ? 0 : -1); 16440 } 16441 16442 return build_vector (type, elts); 16443 } 16444 16445 /* From here on we only handle LT, LE, GT, GE, EQ and NE. 16446 16447 To compute GT, swap the arguments and do LT. 16448 To compute GE, do LT and invert the result. 16449 To compute LE, swap the arguments, do LT and invert the result. 16450 To compute NE, do EQ and invert the result. 16451 16452 Therefore, the code below must handle only EQ and LT. */ 16453 16454 if (code == LE_EXPR || code == GT_EXPR) 16455 { 16456 tree tem = op0; 16457 op0 = op1; 16458 op1 = tem; 16459 code = swap_tree_comparison (code); 16460 } 16461 16462 /* Note that it is safe to invert for real values here because we 16463 have already handled the one case that it matters. */ 16464 16465 invert = 0; 16466 if (code == NE_EXPR || code == GE_EXPR) 16467 { 16468 invert = 1; 16469 code = invert_tree_comparison (code, false); 16470 } 16471 16472 /* Compute a result for LT or EQ if args permit; 16473 Otherwise return T. */ 16474 if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST) 16475 { 16476 if (code == EQ_EXPR) 16477 result = tree_int_cst_equal (op0, op1); 16478 else if (TYPE_UNSIGNED (TREE_TYPE (op0))) 16479 result = INT_CST_LT_UNSIGNED (op0, op1); 16480 else 16481 result = INT_CST_LT (op0, op1); 16482 } 16483 else 16484 return NULL_TREE; 16485 16486 if (invert) 16487 result ^= 1; 16488 return constant_boolean_node (result, type); 16489} 16490 16491/* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the 16492 indicated TYPE. If no CLEANUP_POINT_EXPR is necessary, return EXPR 16493 itself. */ 16494 16495tree 16496fold_build_cleanup_point_expr (tree type, tree expr) 16497{ 16498 /* If the expression does not have side effects then we don't have to wrap 16499 it with a cleanup point expression. */ 16500 if (!TREE_SIDE_EFFECTS (expr)) 16501 return expr; 16502 16503 /* If the expression is a return, check to see if the expression inside the 16504 return has no side effects or the right hand side of the modify expression 16505 inside the return. If either don't have side effects set we don't need to 16506 wrap the expression in a cleanup point expression. Note we don't check the 16507 left hand side of the modify because it should always be a return decl. */ 16508 if (TREE_CODE (expr) == RETURN_EXPR) 16509 { 16510 tree op = TREE_OPERAND (expr, 0); 16511 if (!op || !TREE_SIDE_EFFECTS (op)) 16512 return expr; 16513 op = TREE_OPERAND (op, 1); 16514 if (!TREE_SIDE_EFFECTS (op)) 16515 return expr; 16516 } 16517 16518 return build1 (CLEANUP_POINT_EXPR, type, expr); 16519} 16520 16521/* Given a pointer value OP0 and a type TYPE, return a simplified version 16522 of an indirection through OP0, or NULL_TREE if no simplification is 16523 possible. */ 16524 16525tree 16526fold_indirect_ref_1 (location_t loc, tree type, tree op0) 16527{ 16528 tree sub = op0; 16529 tree subtype; 16530 16531 STRIP_NOPS (sub); 16532 subtype = TREE_TYPE (sub); 16533 if (!POINTER_TYPE_P (subtype)) 16534 return NULL_TREE; 16535 16536 if (TREE_CODE (sub) == ADDR_EXPR) 16537 { 16538 tree op = TREE_OPERAND (sub, 0); 16539 tree optype = TREE_TYPE (op); 16540 /* *&CONST_DECL -> to the value of the const decl. */ 16541 if (TREE_CODE (op) == CONST_DECL) 16542 return DECL_INITIAL (op); 16543 /* *&p => p; make sure to handle *&"str"[cst] here. */ 16544 if (type == optype) 16545 { 16546 tree fop = fold_read_from_constant_string (op); 16547 if (fop) 16548 return fop; 16549 else 16550 return op; 16551 } 16552 /* *(foo *)&fooarray => fooarray[0] */ 16553 else if (TREE_CODE (optype) == ARRAY_TYPE 16554 && type == TREE_TYPE (optype) 16555 && (!in_gimple_form 16556 || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)) 16557 { 16558 tree type_domain = TYPE_DOMAIN (optype); 16559 tree min_val = size_zero_node; 16560 if (type_domain && TYPE_MIN_VALUE (type_domain)) 16561 min_val = TYPE_MIN_VALUE (type_domain); 16562 if (in_gimple_form 16563 && TREE_CODE (min_val) != INTEGER_CST) 16564 return NULL_TREE; 16565 return build4_loc (loc, ARRAY_REF, type, op, min_val, 16566 NULL_TREE, NULL_TREE); 16567 } 16568 /* *(foo *)&complexfoo => __real__ complexfoo */ 16569 else if (TREE_CODE (optype) == COMPLEX_TYPE 16570 && type == TREE_TYPE (optype)) 16571 return fold_build1_loc (loc, REALPART_EXPR, type, op); 16572 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */ 16573 else if (TREE_CODE (optype) == VECTOR_TYPE 16574 && type == TREE_TYPE (optype)) 16575 { 16576 tree part_width = TYPE_SIZE (type); 16577 tree index = bitsize_int (0); 16578 return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index); 16579 } 16580 } 16581 16582 if (TREE_CODE (sub) == POINTER_PLUS_EXPR 16583 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST) 16584 { 16585 tree op00 = TREE_OPERAND (sub, 0); 16586 tree op01 = TREE_OPERAND (sub, 1); 16587 16588 STRIP_NOPS (op00); 16589 if (TREE_CODE (op00) == ADDR_EXPR) 16590 { 16591 tree op00type; 16592 op00 = TREE_OPERAND (op00, 0); 16593 op00type = TREE_TYPE (op00); 16594 16595 /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */ 16596 if (TREE_CODE (op00type) == VECTOR_TYPE 16597 && type == TREE_TYPE (op00type)) 16598 { 16599 HOST_WIDE_INT offset = tree_low_cst (op01, 0); 16600 tree part_width = TYPE_SIZE (type); 16601 unsigned HOST_WIDE_INT part_widthi = tree_low_cst (part_width, 0)/BITS_PER_UNIT; 16602 unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT; 16603 tree index = bitsize_int (indexi); 16604 16605 if (offset / part_widthi < TYPE_VECTOR_SUBPARTS (op00type)) 16606 return fold_build3_loc (loc, 16607 BIT_FIELD_REF, type, op00, 16608 part_width, index); 16609 16610 } 16611 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */ 16612 else if (TREE_CODE (op00type) == COMPLEX_TYPE 16613 && type == TREE_TYPE (op00type)) 16614 { 16615 tree size = TYPE_SIZE_UNIT (type); 16616 if (tree_int_cst_equal (size, op01)) 16617 return fold_build1_loc (loc, IMAGPART_EXPR, type, op00); 16618 } 16619 /* ((foo *)&fooarray)[1] => fooarray[1] */ 16620 else if (TREE_CODE (op00type) == ARRAY_TYPE 16621 && type == TREE_TYPE (op00type)) 16622 { 16623 tree type_domain = TYPE_DOMAIN (op00type); 16624 tree min_val = size_zero_node; 16625 if (type_domain && TYPE_MIN_VALUE (type_domain)) 16626 min_val = TYPE_MIN_VALUE (type_domain); 16627 op01 = size_binop_loc (loc, EXACT_DIV_EXPR, op01, 16628 TYPE_SIZE_UNIT (type)); 16629 op01 = size_binop_loc (loc, PLUS_EXPR, op01, min_val); 16630 return build4_loc (loc, ARRAY_REF, type, op00, op01, 16631 NULL_TREE, NULL_TREE); 16632 } 16633 } 16634 } 16635 16636 /* *(foo *)fooarrptr => (*fooarrptr)[0] */ 16637 if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE 16638 && type == TREE_TYPE (TREE_TYPE (subtype)) 16639 && (!in_gimple_form 16640 || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)) 16641 { 16642 tree type_domain; 16643 tree min_val = size_zero_node; 16644 sub = build_fold_indirect_ref_loc (loc, sub); 16645 type_domain = TYPE_DOMAIN (TREE_TYPE (sub)); 16646 if (type_domain && TYPE_MIN_VALUE (type_domain)) 16647 min_val = TYPE_MIN_VALUE (type_domain); 16648 if (in_gimple_form 16649 && TREE_CODE (min_val) != INTEGER_CST) 16650 return NULL_TREE; 16651 return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE, 16652 NULL_TREE); 16653 } 16654 16655 return NULL_TREE; 16656} 16657 16658/* Builds an expression for an indirection through T, simplifying some 16659 cases. */ 16660 16661tree 16662build_fold_indirect_ref_loc (location_t loc, tree t) 16663{ 16664 tree type = TREE_TYPE (TREE_TYPE (t)); 16665 tree sub = fold_indirect_ref_1 (loc, type, t); 16666 16667 if (sub) 16668 return sub; 16669 16670 return build1_loc (loc, INDIRECT_REF, type, t); 16671} 16672 16673/* Given an INDIRECT_REF T, return either T or a simplified version. */ 16674 16675tree 16676fold_indirect_ref_loc (location_t loc, tree t) 16677{ 16678 tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0)); 16679 16680 if (sub) 16681 return sub; 16682 else 16683 return t; 16684} 16685 16686/* Strip non-trapping, non-side-effecting tree nodes from an expression 16687 whose result is ignored. The type of the returned tree need not be 16688 the same as the original expression. */ 16689 16690tree 16691fold_ignored_result (tree t) 16692{ 16693 if (!TREE_SIDE_EFFECTS (t)) 16694 return integer_zero_node; 16695 16696 for (;;) 16697 switch (TREE_CODE_CLASS (TREE_CODE (t))) 16698 { 16699 case tcc_unary: 16700 t = TREE_OPERAND (t, 0); 16701 break; 16702 16703 case tcc_binary: 16704 case tcc_comparison: 16705 if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))) 16706 t = TREE_OPERAND (t, 0); 16707 else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0))) 16708 t = TREE_OPERAND (t, 1); 16709 else 16710 return t; 16711 break; 16712 16713 case tcc_expression: 16714 switch (TREE_CODE (t)) 16715 { 16716 case COMPOUND_EXPR: 16717 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))) 16718 return t; 16719 t = TREE_OPERAND (t, 0); 16720 break; 16721 16722 case COND_EXPR: 16723 if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)) 16724 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2))) 16725 return t; 16726 t = TREE_OPERAND (t, 0); 16727 break; 16728 16729 default: 16730 return t; 16731 } 16732 break; 16733 16734 default: 16735 return t; 16736 } 16737} 16738 16739/* Return the value of VALUE, rounded up to a multiple of DIVISOR. 16740 This can only be applied to objects of a sizetype. */ 16741 16742tree 16743round_up_loc (location_t loc, tree value, int divisor) 16744{ 16745 tree div = NULL_TREE; 16746 16747 gcc_assert (divisor > 0); 16748 if (divisor == 1) 16749 return value; 16750 16751 /* See if VALUE is already a multiple of DIVISOR. If so, we don't 16752 have to do anything. Only do this when we are not given a const, 16753 because in that case, this check is more expensive than just 16754 doing it. */ 16755 if (TREE_CODE (value) != INTEGER_CST) 16756 { 16757 div = build_int_cst (TREE_TYPE (value), divisor); 16758 16759 if (multiple_of_p (TREE_TYPE (value), value, div)) 16760 return value; 16761 } 16762 16763 /* If divisor is a power of two, simplify this to bit manipulation. */ 16764 if (divisor == (divisor & -divisor)) 16765 { 16766 if (TREE_CODE (value) == INTEGER_CST) 16767 { 16768 double_int val = tree_to_double_int (value); 16769 bool overflow_p; 16770 16771 if ((val.low & (divisor - 1)) == 0) 16772 return value; 16773 16774 overflow_p = TREE_OVERFLOW (value); 16775 val.low &= ~(divisor - 1); 16776 val.low += divisor; 16777 if (val.low == 0) 16778 { 16779 val.high++; 16780 if (val.high == 0) 16781 overflow_p = true; 16782 } 16783 16784 return force_fit_type_double (TREE_TYPE (value), val, 16785 -1, overflow_p); 16786 } 16787 else 16788 { 16789 tree t; 16790 16791 t = build_int_cst (TREE_TYPE (value), divisor - 1); 16792 value = size_binop_loc (loc, PLUS_EXPR, value, t); 16793 t = build_int_cst (TREE_TYPE (value), -divisor); 16794 value = size_binop_loc (loc, BIT_AND_EXPR, value, t); 16795 } 16796 } 16797 else 16798 { 16799 if (!div) 16800 div = build_int_cst (TREE_TYPE (value), divisor); 16801 value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div); 16802 value = size_binop_loc (loc, MULT_EXPR, value, div); 16803 } 16804 16805 return value; 16806} 16807 16808/* Likewise, but round down. */ 16809 16810tree 16811round_down_loc (location_t loc, tree value, int divisor) 16812{ 16813 tree div = NULL_TREE; 16814 16815 gcc_assert (divisor > 0); 16816 if (divisor == 1) 16817 return value; 16818 16819 /* See if VALUE is already a multiple of DIVISOR. If so, we don't 16820 have to do anything. Only do this when we are not given a const, 16821 because in that case, this check is more expensive than just 16822 doing it. */ 16823 if (TREE_CODE (value) != INTEGER_CST) 16824 { 16825 div = build_int_cst (TREE_TYPE (value), divisor); 16826 16827 if (multiple_of_p (TREE_TYPE (value), value, div)) 16828 return value; 16829 } 16830 16831 /* If divisor is a power of two, simplify this to bit manipulation. */ 16832 if (divisor == (divisor & -divisor)) 16833 { 16834 tree t; 16835 16836 t = build_int_cst (TREE_TYPE (value), -divisor); 16837 value = size_binop_loc (loc, BIT_AND_EXPR, value, t); 16838 } 16839 else 16840 { 16841 if (!div) 16842 div = build_int_cst (TREE_TYPE (value), divisor); 16843 value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div); 16844 value = size_binop_loc (loc, MULT_EXPR, value, div); 16845 } 16846 16847 return value; 16848} 16849 16850/* Returns the pointer to the base of the object addressed by EXP and 16851 extracts the information about the offset of the access, storing it 16852 to PBITPOS and POFFSET. */ 16853 16854static tree 16855split_address_to_core_and_offset (tree exp, 16856 HOST_WIDE_INT *pbitpos, tree *poffset) 16857{ 16858 tree core; 16859 enum machine_mode mode; 16860 int unsignedp, volatilep; 16861 HOST_WIDE_INT bitsize; 16862 location_t loc = EXPR_LOCATION (exp); 16863 16864 if (TREE_CODE (exp) == ADDR_EXPR) 16865 { 16866 core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos, 16867 poffset, &mode, &unsignedp, &volatilep, 16868 false); 16869 core = build_fold_addr_expr_loc (loc, core); 16870 } 16871 else 16872 { 16873 core = exp; 16874 *pbitpos = 0; 16875 *poffset = NULL_TREE; 16876 } 16877 16878 return core; 16879} 16880 16881/* Returns true if addresses of E1 and E2 differ by a constant, false 16882 otherwise. If they do, E1 - E2 is stored in *DIFF. */ 16883 16884bool 16885ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff) 16886{ 16887 tree core1, core2; 16888 HOST_WIDE_INT bitpos1, bitpos2; 16889 tree toffset1, toffset2, tdiff, type; 16890 16891 core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1); 16892 core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2); 16893 16894 if (bitpos1 % BITS_PER_UNIT != 0 16895 || bitpos2 % BITS_PER_UNIT != 0 16896 || !operand_equal_p (core1, core2, 0)) 16897 return false; 16898 16899 if (toffset1 && toffset2) 16900 { 16901 type = TREE_TYPE (toffset1); 16902 if (type != TREE_TYPE (toffset2)) 16903 toffset2 = fold_convert (type, toffset2); 16904 16905 tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2); 16906 if (!cst_and_fits_in_hwi (tdiff)) 16907 return false; 16908 16909 *diff = int_cst_value (tdiff); 16910 } 16911 else if (toffset1 || toffset2) 16912 { 16913 /* If only one of the offsets is non-constant, the difference cannot 16914 be a constant. */ 16915 return false; 16916 } 16917 else 16918 *diff = 0; 16919 16920 *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT; 16921 return true; 16922} 16923 16924/* Simplify the floating point expression EXP when the sign of the 16925 result is not significant. Return NULL_TREE if no simplification 16926 is possible. */ 16927 16928tree 16929fold_strip_sign_ops (tree exp) 16930{ 16931 tree arg0, arg1; 16932 location_t loc = EXPR_LOCATION (exp); 16933 16934 switch (TREE_CODE (exp)) 16935 { 16936 case ABS_EXPR: 16937 case NEGATE_EXPR: 16938 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0)); 16939 return arg0 ? arg0 : TREE_OPERAND (exp, 0); 16940 16941 case MULT_EXPR: 16942 case RDIV_EXPR: 16943 if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (TREE_TYPE (exp)))) 16944 return NULL_TREE; 16945 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0)); 16946 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); 16947 if (arg0 != NULL_TREE || arg1 != NULL_TREE) 16948 return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp), 16949 arg0 ? arg0 : TREE_OPERAND (exp, 0), 16950 arg1 ? arg1 : TREE_OPERAND (exp, 1)); 16951 break; 16952 16953 case COMPOUND_EXPR: 16954 arg0 = TREE_OPERAND (exp, 0); 16955 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); 16956 if (arg1) 16957 return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1); 16958 break; 16959 16960 case COND_EXPR: 16961 arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); 16962 arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2)); 16963 if (arg0 || arg1) 16964 return fold_build3_loc (loc, 16965 COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0), 16966 arg0 ? arg0 : TREE_OPERAND (exp, 1), 16967 arg1 ? arg1 : TREE_OPERAND (exp, 2)); 16968 break; 16969 16970 case CALL_EXPR: 16971 { 16972 const enum built_in_function fcode = builtin_mathfn_code (exp); 16973 switch (fcode) 16974 { 16975 CASE_FLT_FN (BUILT_IN_COPYSIGN): 16976 /* Strip copysign function call, return the 1st argument. */ 16977 arg0 = CALL_EXPR_ARG (exp, 0); 16978 arg1 = CALL_EXPR_ARG (exp, 1); 16979 return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1); 16980 16981 default: 16982 /* Strip sign ops from the argument of "odd" math functions. */ 16983 if (negate_mathfn_p (fcode)) 16984 { 16985 arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0)); 16986 if (arg0) 16987 return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0); 16988 } 16989 break; 16990 } 16991 } 16992 break; 16993 16994 default: 16995 break; 16996 } 16997 return NULL_TREE; 16998} 16999