aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2016-03-24 10:52:11 -0700
committerJeff Law <law@gcc.gnu.org>2016-03-24 11:52:11 -0600
commit8f085166f8aa480bd623ae49d17ec06915b74495 (patch)
tree330ca937fe5680cb7ffa15a318722e714a334e6d /gcc
parent011e5ec31c3a6124bd039a0e3f9c3e43d576f383 (diff)
downloadgcc-8f085166f8aa480bd623ae49d17ec06915b74495.zip
gcc-8f085166f8aa480bd623ae49d17ec06915b74495.tar.gz
gcc-8f085166f8aa480bd623ae49d17ec06915b74495.tar.bz2
re PR middle-end/69845 (Expression getting incorrectly optimized after being rewritten by compiler)
2016-03-24 Richard Henderson <rth@redhat.com> PR middle-end/69845 * fold-const.c (extract_muldiv_1): Correct test for multiplication overflow. PR middle-end/69845 * gcc.dg/tree-ssa/pr69845-1.c: New test. * gcc.dg/tree-ssa/pr69845-2.c: New test. From-SVN: r234462
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr69845-1.c19
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c20
5 files changed, 54 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 72c3d7d..4a87cda 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-24 Richard Henderson <rth@redhat.com>
+
+ PR middle-end/69845
+ * fold-const.c (extract_muldiv_1): Correct test for multiplication
+ overflow.
+
2016-03-24 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (*anddi3_doubleword): Generate AND insn
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9d861c6..44fe2a2 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -6116,11 +6116,9 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
{
tree tem = const_binop (code, fold_convert (ctype, t),
fold_convert (ctype, c));
- /* If the multiplication overflowed to INT_MIN then we lost sign
- information on it and a subsequent multiplication might
- spuriously overflow. See PR68142. */
- if (TREE_OVERFLOW (tem)
- && wi::eq_p (tem, wi::min_value (TYPE_PRECISION (ctype), SIGNED)))
+ /* If the multiplication overflowed, we lost information on it.
+ See PR68142 and PR69845. */
+ if (TREE_OVERFLOW (tem))
return NULL_TREE;
return tem;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 78d7ab8..8891090 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-24 Richard Henderson <rth@redhat.com>
+
+ PR middle-end/69845
+ * gcc.dg/tree-ssa/pr69845-1.c: New test.
+ * gcc.dg/tree-ssa/pr69845-2.c: New test.
+
2016-03-24 Tom de Vries <tom@codesourcery.com>
* gfortran.dg/goacc/host_data-tree.f95: Add missing initialization.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69845-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69845-1.c
new file mode 100644
index 0000000..92927ba
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69845-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32 } */
+/* { dg-options "-O -fdump-tree-gimple -fdump-tree-optimized" } */
+
+int
+main ()
+{
+ struct S { char s; } v;
+ v.s = 47;
+ int a = (int) v.s;
+ int b = (27005061 + (a + 680455));
+ int c = ((1207142401 * (((8 * b) + 9483541) - 230968044)) + 469069442);
+ if (c != 1676211843)
+ __builtin_abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "b \\\* 8" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c
new file mode 100644
index 0000000..e0b38e9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32 } */
+/* { dg-options "-O -fdump-tree-gimple -fdump-tree-optimized" } */
+
+int
+main ()
+{
+ struct S { char s; } v;
+ v.s = 47;
+ unsigned int a = (unsigned int) v.s;
+ unsigned int b = (27005061 + (a + 680455));
+ unsigned int c
+ = ((1207142401u * (((8u * b) + 9483541u) - 230968044u)) + 469069442u);
+ if (c != 1676211843u)
+ __builtin_abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "b \\\* 1067204616" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */