From: Qing Zhao Date: Thu, 18 Sep 2025 15:50:38 +0000 (+0000) Subject: Fix SRA issue with -ftrivial-auto-var-init= [PR121894] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=r16-3956-gf613fdc6920c83;p=thirdparty%2Fgcc.git Fix SRA issue with -ftrivial-auto-var-init= [PR121894] 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. --- diff --git a/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C b/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C new file mode 100644 index 00000000000..b1e5a59ffe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/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); }