]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR 69355] Correct hole detection when total_scalarization fails
authorMartin Jambor <mjambor@suse.cz>
Fri, 29 Jan 2016 23:01:54 +0000 (00:01 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 29 Jan 2016 23:01:54 +0000 (00:01 +0100)
2016-01-29  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.

From-SVN: r233001

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

index 8db15316a69b57f9d6eafb8105b05e292974fa95..290dea6469cdf8e0cf35a034884f3fedfbe53049 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-29  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/69355
+       * tree-sra.c (analyze_access_subtree): Correct hole detection when
+       total_scalarization fails.
+
 2016-01-29  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 017c33fea393517e8b17434fb2da6ec343141002..c1ebd328a29290146a0329e600a1a53cecdcf31e 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-29  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/69355
+       * gcc.dg/tree-ssa/pr69355.c: New test.
+
 2016-01-29  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
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 4f9e80629676f40309ab60f9646bb261c6eb1386..03209f4f2d03ce5db4e653a1542f89b9e686353e 100644 (file)
@@ -2295,7 +2295,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;
     }