[PR 69355] Correct hole detection when total_scalarization fails
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Jan 2016 14:51:17 +0000 (14:51 +0000)
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Jan 2016 14:51:17 +0000 (14:51 +0000)
2016-01-27  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/69355
* tree-sra.c (analyze_access_subtree): Correct hole detection when
total_scalarization fails.

testsuite/
* gcc.dg/tree-ssa/pr69355.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232877 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr69355.c [new file with mode: 0644]
gcc/tree-sra.c

index 2dbdd29..824c69c 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-27  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/69355
+       * tree-sra.c (analyze_access_subtree): Correct hole detection when
+       total_scalarization fails.
+
 2016-01-27  David Edelsohn  <dje.gcc@gmail.com>
 
        * config/rs6000/driver-rs6000.c (detect_processor_aix): Add
index 2ff4f7d..7dae86c 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-27  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/69355
+       * gcc.dg/tree-ssa/pr69355.c: New test.
+
 2016-01-27  Marek Polacek  <polacek@redhat.com>
 
        PR c++/69496
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69355.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69355.c
new file mode 100644 (file)
index 0000000..f515c21
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-options "-O -fno-strict-aliasing" } */
+
+struct S
+{
+  void *a;
+  long double b;
+};
+
+struct Z
+{
+  long long l;
+  short s;
+} __attribute__((packed));
+
+struct S __attribute__((noclone, noinline))
+foo (void *v, struct Z *z)
+{
+  struct S t;
+  t.a = v;
+  *(struct Z *) &t.b = *z;
+  return t;
+}
+
+struct Z gz;
+
+int
+main (int argc, char **argv)
+{
+  struct S s;
+
+  if (sizeof (long double) < sizeof (struct Z))
+    return 0;
+
+  gz.l = 0xbeef;
+  gz.s = 0xab;
+
+  s = foo ((void *) 0, &gz);
+
+  if ((((struct Z *) &s.b)->l != gz.l)
+      || (((struct Z *) &s.b)->s != gz.s))
+    __builtin_abort ();
+  return 0;
+}
index 30a8244..72157ed 100644 (file)
@@ -2421,7 +2421,7 @@ analyze_access_subtree (struct access *root, struct access *parent,
 
       if (covered_to < limit)
        hole = true;
-      if (scalar)
+      if (scalar || !allow_replacements)
        root->grp_total_scalarization = 0;
     }