(Resend this email since the previous one didn’t quote, I changed one setting 
in my mail client, hopefully that can fix this issue).

Hi, Martin,

Thank you for the review and comment.

> On Jul 8, 2021, at 8:29 AM, Martin Jambor <mjam...@suse.cz> wrote:
>> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
>> index c05d22f3e8f1..35051d7c6b96 100644
>> --- a/gcc/tree-sra.c
>> +++ b/gcc/tree-sra.c
>> @@ -384,6 +384,13 @@ static struct
>> 
>>   /* Numbber of components created when splitting aggregate parameters.  */
>>   int param_reductions_created;
>> +
>> +  /* Number of deferred_init calls that are modified.  */
>> +  int deferred_init;
>> +
>> +  /* Number of deferred_init calls that are created by
>> +     generate_subtree_deferred_init.  */
>> +  int subtree_deferred_init;
>> } sra_stats;
>> 
>> static void
>> @@ -4096,6 +4103,110 @@ get_repl_default_def_ssa_name (struct access *racc, 
>> tree reg_type)
>>   return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
>> }
>> 
>> +
>> +/* Generate statements to call .DEFERRED_INIT to initialize scalar 
>> replacements
>> +   of accesses within a subtree ACCESS; all its children, siblings and their
>> +   children are to be processed.
>> +   GSI is a statement iterator used to place the new statements.  */
>> +static void
>> +generate_subtree_deferred_init (struct access *access,
>> +                            tree init_type,
>> +                            tree is_vla,
>> +                            gimple_stmt_iterator *gsi,
>> +                            location_t loc)
>> +{
>> +  do
>> +    {
>> +      if (access->grp_to_be_replaced)
>> +    {
>> +      tree repl = get_access_replacement (access);
>> +      gimple *call
>> +        = gimple_build_call_internal (IFN_DEFERRED_INIT, 3,
>> +                                      TYPE_SIZE_UNIT (TREE_TYPE (repl)),
>> +                                      init_type, is_vla);
>> +      gimple_call_set_lhs (call, repl);
>> +      gsi_insert_before (gsi, call, GSI_SAME_STMT);
>> +      update_stmt (call);
>> +      gimple_set_location (call, loc);
>> +      sra_stats.subtree_deferred_init++;
>> +    }
>> +      else if (access->grp_to_be_debug_replaced)
>> +    {
>> +      tree drepl = get_access_replacement (access);
>> +      tree call = build_call_expr_internal_loc
>> +                 (UNKNOWN_LOCATION, IFN_DEFERRED_INIT,
>> +                  TREE_TYPE (drepl), 3,
>> +                  TYPE_SIZE_UNIT (TREE_TYPE (drepl)),
>> +                  init_type, is_vla);
>> +      gdebug *ds = gimple_build_debug_bind (drepl, call,
>> +                                            gsi_stmt (*gsi));
>> +      gsi_insert_before (gsi, ds, GSI_SAME_STMT);
> 
> Is handling of grp_to_be_debug_replaced accesses necessary here?  If so,
> why?  grp_to_be_debug_replaced accesses are there only to facilitate
> debug information about a part of an aggregate decl is that is likely
> going to be entirely removed - so that debuggers can sometimes show to
> users information about what they would contain had they not removed.
> It seems strange you need to mark them as uninitialized because they
> should not have any consumers.  (But perhaps it is also harmless.)

This part has been discussed during the 2nd version of the patch, but I think 
that more discussion might be necessary.

In the previous discussion, Richard Sandiford mentioned: 
(https://gcc.gnu.org/pipermail/gcc-patches/2021-April/568620.html):

=====

I guess the thing we need to decide here is whether -ftrivial-auto-var-init
should affect debug-only constructs too.  If it doesn't, exmaining removed
components in a debugger might show uninitialised values in cases where
the user was expecting initialised ones.  There would be no security
concern, but it might be surprising.

I think in principle the DRHS can contain a call to DEFERRED_INIT.
Doing that would probably require further handling elsewhere though.

=====

I am still not very confident now for this part of the change.

My questions:

1. If we don’t handle grp_to_be_debug_replaced at all, what will happen?  ( the 
user of the debugger will see uninitialized values in
the removed part of the aggregate?  Or something else?)
2. On the other hand, if we handle grp_to_be_debug_replaced as the current 
patch, what will the user of the debugger see?

> 
> On a related note, if the intent of the feature is for optimizers to
> behave (almost?) as if it was not taking place,

What’s you mean by “it” here?

> I believe you need to
> handle specially, and probably just ignore, calls to IFN_DEFERRED_INIT
> in scan_function in tree-sra.c.


Do you mean to let tree-sra phase ignore IFN_DEFERRED_INIT calls completely?

My major purpose of change tree-sra.c phase is:

Change:

tmp = .DEFERRED_INIT (24, 2, 0)

To

tmp1 = .DEFERRED_INIT (8, 2, 0);
tmp2 = .DEFERRED_INIT (8, 2, 0);
tmp3 = .DEFERRED_INIT (8, 2, 0);

Doing this is to reduce the stack usage.


>  Otherwise the generated SRA access
> structures will have extra write flags turned on in them and that will
> lead to different behavior of the pass.

Could you please explain this more?

Thanks.

Qing


> 
> Martin
> 
> 

Reply via email to