From e40a96803c2deb2e9b0eb3dbc8fbcea4f3c02a30 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 30 May 2012 12:29:26 +0000 Subject: [PATCH] re PR tree-optimization/53501 (scev introduces signed overflow) 2012-05-30 Richard Guenther PR middle-end/53501 * fold-const.c (fold_binary_loc): Make sure to call fold_plusminus_mult_expr with the original sign of operands. * gcc.dg/torture/pr53501.c: New testcase. * c-c++-common/restrict-2.c: Adjust. From-SVN: r188009 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 12 ++++++------ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/c-c++-common/restrict-2.c | 2 +- gcc/testsuite/gcc.dg/torture/pr53501.c | 22 ++++++++++++++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr53501.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d38383f..df7d3e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-05-30 Richard Guenther + + PR middle-end/53501 + * fold-const.c (fold_binary_loc): Make sure to call + fold_plusminus_mult_expr with the original sign of operands. + 2012-05-30 Steven Bosscher * Makefile.in: Fix many dependencies. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 8a54810..64a0d7f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10045,12 +10045,12 @@ 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 (arg0) == MULT_EXPR - || TREE_CODE (arg1) == MULT_EXPR) + if ((TREE_CODE (op0) == MULT_EXPR + || TREE_CODE (op1) == MULT_EXPR) && !TYPE_SATURATING (type) && (!FLOAT_TYPE_P (type) || flag_associative_math)) { - tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1); + tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1); if (tem) return tem; } @@ -10668,12 +10668,12 @@ 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 (arg0) == MULT_EXPR - || TREE_CODE (arg1) == MULT_EXPR) + if ((TREE_CODE (op0) == MULT_EXPR + || TREE_CODE (op1) == MULT_EXPR) && !TYPE_SATURATING (type) && (!FLOAT_TYPE_P (type) || flag_associative_math)) { - tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1); + tree tem = fold_plusminus_mult_expr (loc, code, type, op0, op1); if (tem) return tem; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4e53d2f..49d88e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-05-30 Richard Guenther + + PR middle-end/53501 + * gcc.dg/torture/pr53501.c: New testcase. + * c-c++-common/restrict-2.c: Adjust. + 2012-05-30 Alan Modra * gcc.target/powerpc/powerpc.exp: Load torture-options.exp, call diff --git a/gcc/testsuite/c-c++-common/restrict-2.c b/gcc/testsuite/c-c++-common/restrict-2.c index 3f71b77..42ed398 100644 --- a/gcc/testsuite/c-c++-common/restrict-2.c +++ b/gcc/testsuite/c-c++-common/restrict-2.c @@ -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" 11 "lim1" } } */ +/* { dg-final { scan-tree-dump-times "Moving statement" 10 "lim1" } } */ /* { dg-final { cleanup-tree-dump "lim1" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pr53501.c b/gcc/testsuite/gcc.dg/torture/pr53501.c new file mode 100644 index 0000000..36e3ae6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53501.c @@ -0,0 +1,22 @@ +/* { dg-do run } */ + +extern void abort (void); + +int e[100], n, here; + +void __attribute__((noinline)) +foo(void) +{ + int i, k = 0; + for (i = 0; i < n; ++i) { e[k] = 10; ++k; e[k] = 10; ++k; } + for (i = 0; i < k; ++i) here = 1; + if (here != 1) + abort (); +} + +int main(void) +{ + n = 10; + foo(); + return 0; +} -- 2.7.4