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: r188118
This commit is contained in:
Eric Botcazou 2012-06-01 17:01:17 +00:00 committed by Eric Botcazou
parent 3dfaf1d7db
commit 4efa926130
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 Olivier Hainque <hainque@adacore.com> 2012-06-01 Olivier Hainque <hainque@adacore.com>
* config/rs6000/vxworks.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Restore * config/rs6000/vxworks.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Restore

View File

@ -10042,15 +10042,18 @@ fold_binary_loc (location_t loc,
} }
} }
/* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
same or one. Make sure type is not saturating. one. Make sure the type is not saturating and has the signedness of
fold_plusminus_mult_expr will re-associate. */ the stripped operands, as fold_plusminus_mult_expr will re-associate.
if ((TREE_CODE (op0) == MULT_EXPR ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
|| TREE_CODE (op1) == MULT_EXPR) if ((TREE_CODE (arg0) == MULT_EXPR
|| TREE_CODE (arg1) == MULT_EXPR)
&& !TYPE_SATURATING (type) && !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)) && (!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) if (tem)
return tem; return tem;
} }
@ -10665,15 +10668,18 @@ fold_binary_loc (location_t loc,
&& (tem = distribute_real_division (loc, code, type, arg0, arg1))) && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
return tem; return tem;
/* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
same or one. Make sure type is not saturating. one. Make sure the type is not saturating and has the signedness of
fold_plusminus_mult_expr will re-associate. */ the stripped operands, as fold_plusminus_mult_expr will re-associate.
if ((TREE_CODE (op0) == MULT_EXPR ??? The latter condition should use TYPE_OVERFLOW_* flags instead. */
|| TREE_CODE (op1) == MULT_EXPR) if ((TREE_CODE (arg0) == MULT_EXPR
|| TREE_CODE (arg1) == MULT_EXPR)
&& !TYPE_SATURATING (type) && !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)) && (!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) if (tem)
return 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 Jason Merrill <jason@redhat.com> 2012-06-01 Jason Merrill <jason@redhat.com>
PR c++/53137 PR c++/53137

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. */ /* 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" } } */ /* { dg-final { cleanup-tree-dump "lim1" } } */