diff options
author | Richard Henderson <rth@redhat.com> | 2016-03-24 10:52:11 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2016-03-24 11:52:11 -0600 |
commit | 8f085166f8aa480bd623ae49d17ec06915b74495 (patch) | |
tree | 330ca937fe5680cb7ffa15a318722e714a334e6d /gcc | |
parent | 011e5ec31c3a6124bd039a0e3f9c3e43d576f383 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr69845-1.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr69845-2.c | 20 |
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" } } */ |