]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR 69355] Correct hole detection when total_scalarization fails
authorMartin Jambor <mjambor@suse.cz>
Wed, 27 Jan 2016 14:51:17 +0000 (15:51 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Wed, 27 Jan 2016 14:51:17 +0000 (15:51 +0100)
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.

From-SVN: r232877

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

index 2dbdd29ab293d99061ccd6caeb30e16e509256f4..824c69c1859f6c4477986f06567b8370d85be2dd 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 2ff4f7d40435973cbbc002339655b9a9492f3ef6..7dae86c1fe05ba4bfa4ae86be0d19c2a6e261958 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 30a8244aa9e1bed7d4842caf82922a24a49091d1..72157edd02e3235e57b786bbf460c94b0c52b2c5 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;
     }