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 tree-optimization/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/opt/auto-init-sra-pr121894.C: New test.
--- /dev/null
+/* 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" } } */
/* 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);
}