In tree-sra.cc, for the following stmt (initialization in source code):
s = {};

for the above lhs "s", the field "grp_assignment_write" of the created
struct access is 1;

however, for the following stmt (compiler added initialization):
s = .DEFERRED_INIT (size, init_type, &"s"[0]);

for the above lhs "s", the field "grp_assignment_write" of the created
struct access is 0;

Since the field "grp_assignment_write" of the struct access for the
corresponding LHS "s" is not set correctly when the RHS is .DEFERRED_INIT,
SRA phase didn't do a correct transformation for call to .DEFERRED_INIT.

To fix this issue, we should set the field "grp_assignment_write" correctly
for .DEFERRED_INIT.

        PR 121894

gcc/ChangeLog:

        * tree-sra.cc (scan_function): Set grp_assignment_write to 1 when
        specially handle call to .DEFERRED_INIT.

gcc/testsuite/ChangeLog:

        * g++.dg/auto-init-sra-pr121894.C: New test.

The patch is bootstrapping and regression testing on both x86 and aarch64,
Okay for committing if no issue?

Thanks.

Qing

---
 gcc/testsuite/g++.dg/auto-init-sra-pr121894.C | 22 +++++++++++++++++++
 gcc/tree-sra.cc                               |  8 ++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/auto-init-sra-pr121894.C

diff --git a/gcc/testsuite/g++.dg/auto-init-sra-pr121894.C 
b/gcc/testsuite/g++.dg/auto-init-sra-pr121894.C
new file mode 100644
index 00000000000..b1e5a59ffe7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/auto-init-sra-pr121894.C
@@ -0,0 +1,22 @@
+/* Verify that SRA total scalarization will not be confused by padding
+   and also not confused by auto initialization.  */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-esra -ftrivial-auto-var-init=pattern" } */
+
+struct S { int a, b, c, d; };
+void bar (int, int, int, int);
+
+void
+foo ()
+{
+  S s;
+  s.a = 1;
+  s.c = 2;
+  s.d = 3;
+  s.a++;
+  s.c++;
+  s.d++;
+  bar (s.a, s.b, s.c, s.d);
+}
+
+/* { dg-final { scan-tree-dump-times "DEFERRED_INIT" 4 "esra" } } */
diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
index 921664ef470..cb0f518ff03 100644
--- a/gcc/tree-sra.cc
+++ b/gcc/tree-sra.cc
@@ -1678,7 +1678,13 @@ scan_function (void)
                  /* If the STMT is a call to DEFERRED_INIT, avoid setting
                     cannot_scalarize_away_bitmap.  */
                  if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT))
-                   ret |= !!build_access_from_expr_1 (t, stmt, true);
+                   {
+                     struct access *access
+                       = build_access_from_expr_1 (t, stmt, true);
+                     if (access)
+                       access->grp_assignment_write = 1;
+                     ret |= access != NULL;
+                   }
                  else
                    ret |= build_access_from_expr (t, stmt, true);
                }
-- 
2.31.1

Reply via email to