diff options
author | Richard Biener <rguenther@suse.de> | 2015-11-25 14:21:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-11-25 14:21:25 +0000 |
commit | 7dd663f547b9b69755ba9b3bcadcc96f82e830e4 (patch) | |
tree | d9ddc59b42ea01fae75000cf1c225f2de9467eb5 /gcc/fold-const.c | |
parent | 5ab662d507d1576731e25013c7134c670daf40eb (diff) | |
download | gcc-7dd663f547b9b69755ba9b3bcadcc96f82e830e4.zip gcc-7dd663f547b9b69755ba9b3bcadcc96f82e830e4.tar.gz gcc-7dd663f547b9b69755ba9b3bcadcc96f82e830e4.tar.bz2 |
re PR middle-end/68528 ([5 Only] Wrong constant folding)
2015-11-25 Richard Biener <rguenther@suse.de>
PR middle-end/68528
* fold-const.c (fold_binary_loc): Do not call negate_expr_p
on stripped operands.
* gcc.dg/torture/pr68528.c: New testcase.
From-SVN: r230870
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 55 |
1 files changed, 25 insertions, 30 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 698062e..16bff5f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9681,13 +9681,12 @@ fold_binary_loc (location_t loc, case MINUS_EXPR: /* (-A) - B -> (-B) - A where B is easily negated and we can swap. */ if (TREE_CODE (arg0) == NEGATE_EXPR - && negate_expr_p (arg1) + && negate_expr_p (op1) && reorder_operands_p (arg0, arg1)) return fold_build2_loc (loc, MINUS_EXPR, type, - fold_convert_loc (loc, type, - negate_expr (arg1)), - fold_convert_loc (loc, type, - TREE_OPERAND (arg0, 0))); + negate_expr (op1), + fold_convert_loc (loc, type, + TREE_OPERAND (arg0, 0))); /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to __complex__ ( x, -y ). This is not the same for SNaNs or if @@ -9727,17 +9726,16 @@ fold_binary_loc (location_t loc, } /* A - B -> A + (-B) if B is easily negatable. */ - if (negate_expr_p (arg1) - && !TYPE_OVERFLOW_SANITIZED (type) + if (negate_expr_p (op1) + && ! TYPE_OVERFLOW_SANITIZED (type) && ((FLOAT_TYPE_P (type) /* Avoid this transformation if B is a positive REAL_CST. */ - && (TREE_CODE (arg1) != REAL_CST - || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))) + && (TREE_CODE (op1) != REAL_CST + || REAL_VALUE_NEGATIVE (TREE_REAL_CST (op1)))) || INTEGRAL_TYPE_P (type))) return fold_build2_loc (loc, PLUS_EXPR, type, - fold_convert_loc (loc, type, arg0), - fold_convert_loc (loc, type, - negate_expr (arg1))); + fold_convert_loc (loc, type, arg0), + negate_expr (op1)); /* Fold &a[i] - &a[j] to i-j. */ if (TREE_CODE (arg0) == ADDR_EXPR @@ -9781,15 +9779,14 @@ fold_binary_loc (location_t loc, if (! FLOAT_TYPE_P (type)) { /* Transform x * -C into -x * C if x is easily negatable. */ - if (TREE_CODE (arg1) == INTEGER_CST - && tree_int_cst_sgn (arg1) == -1 - && negate_expr_p (arg0) - && (tem = negate_expr (arg1)) != arg1 - && !TREE_OVERFLOW (tem)) + if (TREE_CODE (op1) == INTEGER_CST + && tree_int_cst_sgn (op1) == -1 + && negate_expr_p (op0) + && (tem = negate_expr (op1)) != op1 + && ! TREE_OVERFLOW (tem)) return fold_build2_loc (loc, MULT_EXPR, type, - fold_convert_loc (loc, type, - negate_expr (arg0)), - tem); + fold_convert_loc (loc, type, + negate_expr (op0)), tem); /* (A + A) * C -> A * 2 * C */ if (TREE_CODE (arg0) == PLUS_EXPR @@ -10259,7 +10256,7 @@ fold_binary_loc (location_t loc, undefined. */ if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) && TREE_CODE (arg0) == NEGATE_EXPR - && negate_expr_p (arg1)) + && negate_expr_p (op1)) { if (INTEGRAL_TYPE_P (type)) fold_overflow_warning (("assuming signed overflow does not occur " @@ -10267,14 +10264,13 @@ fold_binary_loc (location_t loc, "division"), WARN_STRICT_OVERFLOW_MISC); return fold_build2_loc (loc, code, type, - fold_convert_loc (loc, type, - TREE_OPERAND (arg0, 0)), - fold_convert_loc (loc, type, - negate_expr (arg1))); + fold_convert_loc (loc, type, + TREE_OPERAND (arg0, 0)), + negate_expr (op1)); } if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) && TREE_CODE (arg1) == NEGATE_EXPR - && negate_expr_p (arg0)) + && negate_expr_p (op0)) { if (INTEGRAL_TYPE_P (type)) fold_overflow_warning (("assuming signed overflow does not occur " @@ -10282,10 +10278,9 @@ fold_binary_loc (location_t loc, "division"), WARN_STRICT_OVERFLOW_MISC); return fold_build2_loc (loc, code, type, - fold_convert_loc (loc, type, - negate_expr (arg0)), - fold_convert_loc (loc, type, - TREE_OPERAND (arg1, 0))); + negate_expr (op0), + fold_convert_loc (loc, type, + TREE_OPERAND (arg1, 0))); } /* If arg0 is a multiple of arg1, then rewrite to the fastest div |