Hi Richard,

Thanks a lot for your great comments!

Richard Biener <rguent...@suse.de> writes:

> On Tue, 29 Aug 2023, Jiufu Guo wrote:
>
>> 
>> Hi Richard,
>> 
>> Thanks a lot for your quick reply!
>> 
>> Richard Biener <rguent...@suse.de> writes:
>> 
>> > On Tue, 29 Aug 2023, Jiufu Guo wrote:
>> >
>> >> 
>> >> Hi All!
>> >> 
>> >> "rguenth at gcc dot gnu.org" <gcc-bugzi...@gcc.gnu.org> writes:
>> >> 
>> >> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111166
>> >> ...
>> >> >
>> >> >
>> >> > At RTL expansion time we store to D.2865 where it's DECL_RTL is r82:TI 
>> >> > so
>> >> > we can hardly fix it there.  Only a later pass could figure each of the
>> >> > insns fully define the reg.
>> >> >
>> >> > Jiufu Guo is working to improve what we choose for DECL_RTL, but for
>> >> > incoming params / outgoing return.  This is a case where we could,
>> >> > with -fno-tree-vectorize, improve DECL_RTL for an automatic var and
>> >> > choose not TImode but something like a (concat:TI reg:DI reg:DI).
>> >> 
>> >> Here is the patch about improving the parameters and returns in
>> >> registers.
>> >> https://gcc.gnu.org/pipermail/gcc-patches/2023-August/628213.html
>> >> 
>> >> I have a question about how to bind an RTL to a TREE expression.
>> >> In this patch, a map TREE->RTL is used. But it would be better if
>> >> there was a faster way.
>> >> 
>> >> We have DECL_RTL/INCOMING_RTL, but they can only be bound to
>> >> DECL(or PARM). In the above patch, the TREE can be an EXPR
>> >> (e.g. COMPONENT_REF/ARRAY_REF).
>> >> 
>> >> Is there a way to achieve this? Thanks for suggestions!
>> >
>> > No, but we don't need to bind RTL to COMPONENT_REF and friends,
>> > what we want to change is the DECL_RTL of the underlying DECL.
>> 
>> In the above patch, the scalarized rtx for the access of the
>> parameter/returns are computed at the time when parameters
>> are set up.  And record "scalarized rtx" and "access expression".
>> When expanding an expression, the patch queries the scalarized rtx.
>> 
>> +  rtx x = get_scalar_rtx_for_aggregate_expr (exp);
>> +  if (x)
>> +    return x;
>> 
>> I'm reading "don't need to bind RTL to COMPONENT_REF and friends"
>> and "change is the DECL_RTL of the underlying DECL."
>> This may be doable. The method would be:
>> 1. When the incoming/outgoing registers are determined, we can
>>   check if the parameter/return can be scalarized, **then bind
>>   the registers to DECL_RTL of the parm/ret**.
>> 2. When expanding the expression (e.g. COMPONENT_REF), compute the
>>   scalarized rtx from DECL_RTL of the param/return.
>>   In expand_expr_real_1:
>>   case COMPONENT_REF: ... case ARRAY_REF: if base is parm...
>> 
>> Is my understanding correct?
>
> Yes, that's how it works today.  The target computes DECL_RTL
> for the parameter (could be a BLKmode memory), expansion
> of references first expands the base and gets DECL_RTL
> and then extracts the piece as analyzed via extract_bit_field
> or more direct means.
I see.
>
> As said in the review attempt sent out just now the complication
> is allowing more "complex" DECL_RTL, say a set of possibly
> different sized pseudos rather than a single pseudo or MEM.

Right.  It seems PARALLEL can used for this purpose.
It can gather some pseudos with same/different sizes.

> There's support for CONCAT already (for _Complex), some
> rough support for PARALLEL (not sure what it actually supports).

"PARALLEL" is already used for incoming registers and return
registers.  So, it was also used in the light-sra patch.

BR,
Jeff (Jiufu Guo)

>
> Richard.
>
>> BR,
>> Jeff (Jiufu Guo)
>> 
>> >
>> > Richard.
>> 

Reply via email to