> On Sep 17, 2025, at 11:59, Martin Jambor <[email protected]> wrote:
> 
> Hi,
> 
> On Fri, Sep 12 2025, Qing Zhao wrote:
>> 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.
>> 
> 
> Thanks,
> 
> I cannot approve the change but I think it makes sense.

Thank you for the review, Martin.

Jakub, could you please also take a look at the change and let me know whether
It’s good for committing?

Thanks.

Qing
> 
> Martin
> 
> 
> 
>> 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