diff options
author | Richard Biener <rguenther@suse.de> | 2019-01-30 12:41:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-01-30 12:41:13 +0000 |
commit | 79977c82ff9ef0a79229a57277feac3cbcc17a83 (patch) | |
tree | 689724d088ee83d8265fbd0cf2e7dce51105eeeb /gcc | |
parent | 8c11f2693e3f55d7fbf37642c3e75d03a9e58013 (diff) | |
download | gcc-79977c82ff9ef0a79229a57277feac3cbcc17a83.zip gcc-79977c82ff9ef0a79229a57277feac3cbcc17a83.tar.gz gcc-79977c82ff9ef0a79229a57277feac3cbcc17a83.tar.bz2 |
re PR tree-optimization/89111 (wrong code at -O1 and above on x86_64-linux-gnu)
2019-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/89111
* tree-ssa-loop-im.c (gather_mem_refs_stmt): Restrict
canonicalization to appropriately sized access types.
* gcc.dg/torture/pr89111.c: New testcase.
From-SVN: r268388
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr89111.c | 30 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 5 |
4 files changed, 46 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e6f49e..4962f47 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-30 Richard Biener <rguenther@suse.de> + + PR tree-optimization/89111 + * tree-ssa-loop-im.c (gather_mem_refs_stmt): Restrict + canonicalization to appropriately sized access types. + 2019-01-30 Jakub Jelinek <jakub@redhat.com> PR c++/89105 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e41b4e2..3488fdd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,11 @@ +2019-01-30 Richard Biener <rguenther@suse.de> + + PR tree-optimization/89111 + * gcc.dg/torture/pr89111.c: New testcase. + 2019-01-30 Andrew Stubbs <ams@codesourcery.com> PR testsuite/88920 - * lib/target-supports.exp: Cache result. 2019-01-30 Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/testsuite/gcc.dg/torture/pr89111.c b/gcc/testsuite/gcc.dg/torture/pr89111.c new file mode 100644 index 0000000..3f1d6d9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr89111.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int32plus } */ + +struct __attribute__((packed)) A { int b : 24; } c[243], f; + +int d, e, g, j; + +__attribute__((noipa)) int +foo (int x) +{ + if (x != 0) + __builtin_abort (); + return 2; +} + +int +main () +{ + struct A h = f; + h.b = 0; + while (e++ < 3) + { + while (d++ < 3) + c[46].b ^= 9890739; + f = c[46] = h; + } + while (g++ < 9) + j = foo (c[g * 9 + j].b); + return 0; +} diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index d8a8440..631dd90 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -1472,6 +1472,11 @@ gather_mem_refs_stmt (struct loop *loop, gimple *stmt) && aor.max_size.is_constant (&max_size) && size == max_size && (size % BITS_PER_UNIT) == 0 + /* We're canonicalizing to a MEM where TYPE_SIZE specifies the + size. Make sure this is consistent with the extraction. */ + && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (*mem))) + && known_eq (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (*mem))), + aor.size) && (mem_base = get_addr_base_and_unit_offset (aor.ref, &mem_off))) { hash = iterative_hash_expr (ao_ref_base (&aor), 0); |