aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-01-30 12:41:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-01-30 12:41:13 +0000
commit79977c82ff9ef0a79229a57277feac3cbcc17a83 (patch)
tree689724d088ee83d8265fbd0cf2e7dce51105eeeb /gcc
parent8c11f2693e3f55d7fbf37642c3e75d03a9e58013 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr89111.c30
-rw-r--r--gcc/tree-ssa-loop-im.c5
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);