aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-11-25 14:21:25 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-11-25 14:21:25 +0000
commit7dd663f547b9b69755ba9b3bcadcc96f82e830e4 (patch)
treed9ddc59b42ea01fae75000cf1c225f2de9467eb5 /gcc/fold-const.c
parent5ab662d507d1576731e25013c7134c670daf40eb (diff)
downloadgcc-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.c55
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