re PR tree-optimization/53501 (scev introduces signed overflow)

PR middle-end/53501
	* fold-const.c (fold_binary_loc): Refine previous change.
testsuite/
	* c-c++-common/restrict-2.c: Revert previous change.

From-SVN: r188119
This commit is contained in:
Eric Botcazou 2012-06-01 17:03:19 +00:00 committed by Eric Botcazou
parent 265113703b
commit fd7b741b7e
4 changed files with 28 additions and 13 deletions

View File

@ -1,3 +1,8 @@
2012-06-01 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/53501
* fold-const.c (fold_binary_loc): Refine previous change.
2012-06-01 Oleg Endo <olegendo@gcc.gnu.org>
Backport from mainline

View File

@ -10022,15 +10022,18 @@ fold_binary_loc (location_t loc,
}
}
/* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
same or one. Make sure type is not saturating.
fold_plusminus_mult_expr will re-associate. */
if ((TREE_CODE (op0) == MULT_EXPR
|| TREE_CODE (op1) == MULT_EXPR)
/* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
one. Make sure the type is not saturating and has the signedness of
the stripped operands, as fold_plusminus_mult_expr will re-associate.
??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
if ((TREE_CODE (arg0) == MULT_EXPR
|| TREE_CODE (arg1) == MULT_EXPR)
&& !TYPE_SATURATING (type)
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
&& (!FLOAT_TYPE_P (type) || flag_associative_math))
{
tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1);
tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
if (tem)
return tem;
}
@ -10634,15 +10637,18 @@ fold_binary_loc (location_t loc,
&& (tem = distribute_real_division (loc, code, type, arg0, arg1)))
return tem;
/* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the
same or one. Make sure type is not saturating.
fold_plusminus_mult_expr will re-associate. */
if ((TREE_CODE (op0) == MULT_EXPR
|| TREE_CODE (op1) == MULT_EXPR)
/* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
one. Make sure the type is not saturating and has the signedness of
the stripped operands, as fold_plusminus_mult_expr will re-associate.
??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
if ((TREE_CODE (arg0) == MULT_EXPR
|| TREE_CODE (arg1) == MULT_EXPR)
&& !TYPE_SATURATING (type)
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
&& (!FLOAT_TYPE_P (type) || flag_associative_math))
{
tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1);
tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
if (tem)
return tem;
}

View File

@ -1,3 +1,7 @@
2012-06-01 Eric Botcazou <ebotcazou@adacore.com>
* c-c++-common/restrict-2.c: Revert previous change.
2012-06-01 Eric Botcazou <ebotcazou@adacore.com>
PR ada/53517

View File

@ -10,5 +10,5 @@ void foo (float * __restrict__ a, float * __restrict__ b, int n, int j)
/* We should move the RHS of the store out of the loop. */
/* { dg-final { scan-tree-dump-times "Moving statement" 10 "lim1" } } */
/* { dg-final { scan-tree-dump-times "Moving statement" 11 "lim1" } } */
/* { dg-final { cleanup-tree-dump "lim1" } } */