re PR tree-optimization/89111 (wrong code at -O1 and above on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Wed, 30 Jan 2019 12:41:13 +0000 (12:41 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 30 Jan 2019 12:41:13 +0000 (12:41 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr89111.c [new file with mode: 0644]
gcc/tree-ssa-loop-im.c

index 2e6f49e..4962f47 100644 (file)
@@ -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
index e41b4e2..3488fdd 100644 (file)
@@ -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 (file)
index 0000000..3f1d6d9
--- /dev/null
@@ -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;
+}
index d8a8440..631dd90 100644 (file)
@@ -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);