aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c12
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/c-c++-common/restrict-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr53501.c22
5 files changed, 41 insertions, 7 deletions
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 <rguenther@suse.de>
+
+ 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 <steven@gcc.gnu.org>
* 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 <rguenther@suse.de>
+
+ PR middle-end/53501
+ * gcc.dg/torture/pr53501.c: New testcase.
+ * c-c++-common/restrict-2.c: Adjust.
+
2012-05-30 Alan Modra <amodra@gmail.com>
* 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;
+}