From 4c3643a559980f84e5749f470c35badadc1c570e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 2 Jan 2019 12:19:10 +0000 Subject: [PATCH] re PR tree-optimization/88621 (wrong code at -O1 and above on x86_64-linux-gnu in 64-bit mode (not in 32-bit mode)) 2019-01-02 Richard Biener PR tree-optimization/88621 * tree-ssa-loop-im.c (gather_mem_refs_stmt): Fix pastos, avoid bitfields when canoncalizing. * gcc.dg/torture/pr88621.c: New testcase. From-SVN: r267510 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr88621.c | 25 +++++++++++++++++++++++++ gcc/tree-ssa-loop-im.c | 5 +++-- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr88621.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37c318da6a0..1c86e22a777 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-02 Richard Biener + + PR tree-optimization/88621 + * tree-ssa-loop-im.c (gather_mem_refs_stmt): Fix pastos, avoid + bitfields when canoncalizing. + 2019-01-02 Richard Biener PR target/87545 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dfb1c97b61e..51ecc5380a6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-02 Richard Biener + + PR tree-optimization/88621 + * gcc.dg/torture/pr88621.c: New testcase. + 2019-01-02 Jakub Jelinek PR ipa/88561 diff --git a/gcc/testsuite/gcc.dg/torture/pr88621.c b/gcc/testsuite/gcc.dg/torture/pr88621.c new file mode 100644 index 00000000000..78492a34dd7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr88621.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ + +struct S +{ + int b:4; + int c; +} e = { -1, 0 }; + +int d, f; + +int main () +{ + while (f) + { + struct S g = { 0, 0 }; + e = g; + } +L: + while (e.b > 0) + ; + e.b = 0; + if (d) + goto L; + return 0; +} diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 58da79d0545..0919931cec3 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -1468,9 +1468,10 @@ gather_mem_refs_stmt (struct loop *loop, gimple *stmt) tree mem_base; if (aor.max_size_known_p () && aor.offset.is_constant (&offset) - && aor.offset.is_constant (&size) - && aor.offset.is_constant (&max_size) + && aor.size.is_constant (&size) + && aor.max_size.is_constant (&max_size) && size == max_size + && (size % BITS_PER_UNIT) == 0 && (mem_base = get_addr_base_and_unit_offset (aor.ref, &mem_off))) { hash = iterative_hash_expr (ao_ref_base (&aor), 0); -- 2.30.2