public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* RISC-V sign extension query
@ 2023-09-18 19:45 Vineet Gupta
  2023-09-18 20:10 ` Andrew Waterman
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Vineet Gupta @ 2023-09-18 19:45 UTC (permalink / raw)
  To: Jeff Law, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke

Hi Jeff, Andrew

I've been looking into redundant sign extension and while there are 
things to be improved in REE, there's something I wanted to confirm 
before heading off into the weeds.

Consider the test below:

int foo(int unused, int n, unsigned y, unsigned delta){
   int s = 0;
   unsigned int x = 0;    // if int, sext elided
   for (;x<n;x +=delta)
     s += x+y;
   return s;
}

-O2 -march=rv64gc_zba_zbb_zbs

foo2:
     sext.w    a6,a1            # 1
     beq    a1,zero,.L4
     li    a5,0
     li    a0,0
.L3:
     addw    a4,a2,a5
     addw    a5,a3,a5
     addw    a0,a4,a0
     bltu    a5,a6,.L3
     ret
.L4:
     li    a0,0
     ret

I believe the SEXT.W is not semantically needed as a1 is supposed to be 
sign extended already at call site as per psABI [1]. I quote

     "When passed in registers or on the stack, integer scalars narrower 
than XLEN bits are widened according to the sign of their type up to 32 
bits, then sign-extended to XLEN bits"

However currently RISC-V backend thinks otherwise: changing @x to int, 
causes the the sign extend to go away. I think both the cases should 
behave the same (and not generate SEXT.w) given the ABI clause above. 
Note that this manifests in initial RTL expand itself 
generating/or-not-generating the sign_extend so if it is unnecessary we 
can avoid late fixups in REE.

So the questions is for you to confirm if my conclusions above are correct.

For the cases which do require sign extends, but not being eliminated 
due to "missing definition(s)" I'm working on adapting Ajit's REE ABI 
interfaces work [2] to work for RISC-V as well.

Thx,
-Vineet

[1] 
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc
[2] https://gcc.gnu.org/pipermail/gcc-patches/2023-September/630713.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-18 19:45 RISC-V sign extension query Vineet Gupta
@ 2023-09-18 20:10 ` Andrew Waterman
  2023-09-18 20:18   ` Vineet Gupta
  2023-09-18 21:39 ` Jeff Law
  2023-09-19  2:41 ` Jeff Law
  2 siblings, 1 reply; 10+ messages in thread
From: Andrew Waterman @ 2023-09-18 20:10 UTC (permalink / raw)
  To: Vineet Gupta
  Cc: Jeff Law, Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke

Vineet,

Your understanding of the ABI is correct; both int and unsigned int
arguments must already be sign-extended.  The sext.w is semantically
unnecessary; the bltu could correctly reference a1 instead of a6.

Good luck eliminating it!

Andrew


On Mon, Sep 18, 2023 at 12:45 PM Vineet Gupta <vineetg@rivosinc.com> wrote:
>
> Hi Jeff, Andrew
>
> I've been looking into redundant sign extension and while there are
> things to be improved in REE, there's something I wanted to confirm
> before heading off into the weeds.
>
> Consider the test below:
>
> int foo(int unused, int n, unsigned y, unsigned delta){
>    int s = 0;
>    unsigned int x = 0;    // if int, sext elided
>    for (;x<n;x +=delta)
>      s += x+y;
>    return s;
> }
>
> -O2 -march=rv64gc_zba_zbb_zbs
>
> foo2:
>      sext.w    a6,a1            # 1
>      beq    a1,zero,.L4
>      li    a5,0
>      li    a0,0
> .L3:
>      addw    a4,a2,a5
>      addw    a5,a3,a5
>      addw    a0,a4,a0
>      bltu    a5,a6,.L3
>      ret
> .L4:
>      li    a0,0
>      ret
>
> I believe the SEXT.W is not semantically needed as a1 is supposed to be
> sign extended already at call site as per psABI [1]. I quote
>
>      "When passed in registers or on the stack, integer scalars narrower
> than XLEN bits are widened according to the sign of their type up to 32
> bits, then sign-extended to XLEN bits"
>
> However currently RISC-V backend thinks otherwise: changing @x to int,
> causes the the sign extend to go away. I think both the cases should
> behave the same (and not generate SEXT.w) given the ABI clause above.
> Note that this manifests in initial RTL expand itself
> generating/or-not-generating the sign_extend so if it is unnecessary we
> can avoid late fixups in REE.
>
> So the questions is for you to confirm if my conclusions above are correct.
>
> For the cases which do require sign extends, but not being eliminated
> due to "missing definition(s)" I'm working on adapting Ajit's REE ABI
> interfaces work [2] to work for RISC-V as well.
>
> Thx,
> -Vineet
>
> [1]
> https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc
> [2] https://gcc.gnu.org/pipermail/gcc-patches/2023-September/630713.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-18 20:10 ` Andrew Waterman
@ 2023-09-18 20:18   ` Vineet Gupta
  0 siblings, 0 replies; 10+ messages in thread
From: Vineet Gupta @ 2023-09-18 20:18 UTC (permalink / raw)
  To: Andrew Waterman
  Cc: Jeff Law, Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke

On 9/18/23 13:10, Andrew Waterman wrote:
> Vineet,
>
> Your understanding of the ABI is correct; both int and unsigned int
> arguments must already be sign-extended.  The sext.w is semantically
> unnecessary; the bltu could correctly reference a1 instead of a6.
>
> Good luck eliminating it!

Thanks for the quick response and confirmation !

-Vineet

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-18 19:45 RISC-V sign extension query Vineet Gupta
  2023-09-18 20:10 ` Andrew Waterman
@ 2023-09-18 21:39 ` Jeff Law
  2023-09-19  2:41 ` Jeff Law
  2 siblings, 0 replies; 10+ messages in thread
From: Jeff Law @ 2023-09-18 21:39 UTC (permalink / raw)
  To: Vineet Gupta, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke



On 9/18/23 13:45, Vineet Gupta wrote:
> Hi Jeff, Andrew
> 
> I've been looking into redundant sign extension and while there are 
> things to be improved in REE, there's something I wanted to confirm 
> before heading off into the weeds.
> 
> Consider the test below:
> 
> int foo(int unused, int n, unsigned y, unsigned delta){
>    int s = 0;
>    unsigned int x = 0;    // if int, sext elided
>    for (;x<n;x +=delta)
>      s += x+y;
>    return s;
> }
> 
> -O2 -march=rv64gc_zba_zbb_zbs
> 
> foo2:
>      sext.w    a6,a1            # 1
>      beq    a1,zero,.L4
>      li    a5,0
>      li    a0,0
> .L3:
>      addw    a4,a2,a5
>      addw    a5,a3,a5
>      addw    a0,a4,a0
>      bltu    a5,a6,.L3
>      ret
> .L4:
>      li    a0,0
>      ret
> 
> I believe the SEXT.W is not semantically needed as a1 is supposed to be 
> sign extended already at call site as per psABI [1]. I quote
> 
>      "When passed in registers or on the stack, integer scalars narrower 
> than XLEN bits are widened according to the sign of their type up to 32 
> bits, then sign-extended to XLEN bits"
That's my understanding.  We can (and should) assume that a sub-word 
argument has been properly sign extended to XLEN.

> 
> However currently RISC-V backend thinks otherwise: changing @x to int, 
> causes the the sign extend to go away. I think both the cases should 
> behave the same (and not generate SEXT.w) given the ABI clause above. 
> Note that this manifests in initial RTL expand itself 
> generating/or-not-generating the sign_extend so if it is unnecessary we 
> can avoid late fixups in REE.
So for parameters I think there are knobs that we can set in the target 
files to indicate they're extended/promoted.  TARGET_PROMOTE_PROTOTYPES 
would be a good search term I think.  I don't think it's a heavily used 
feature, so we may need to beat on it a little to get it to do what we want.



Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-18 19:45 RISC-V sign extension query Vineet Gupta
  2023-09-18 20:10 ` Andrew Waterman
  2023-09-18 21:39 ` Jeff Law
@ 2023-09-19  2:41 ` Jeff Law
  2023-09-19  3:19   ` PR 111/466 (was Re: RISC-V sign extension query) Vineet Gupta
  2023-09-19  3:37   ` RISC-V sign extension query Vineet Gupta
  2 siblings, 2 replies; 10+ messages in thread
From: Jeff Law @ 2023-09-19  2:41 UTC (permalink / raw)
  To: Vineet Gupta, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke



On 9/18/23 13:45, Vineet Gupta wrote:

> 
> For the cases which do require sign extends, but not being eliminated 
> due to "missing definition(s)" I'm working on adapting Ajit's REE ABI 
> interfaces work [2] to work for RISC-V as well.
I wonder if we could walk the DECL_ARGUMENTS for current_function_decl 
and create sign extensions for integer arguments smaller than XLEN at 
the start of the function.  Record them in a list.

Then we just let the rest of REE do its thing.  When REE is done we go 
back and delete those sign extensions we created.

Assuming that works, then we just need to conditionalize the code on ABI 
properties.



Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

* PR 111/466 (was Re: RISC-V sign extension query)
  2023-09-19  2:41 ` Jeff Law
@ 2023-09-19  3:19   ` Vineet Gupta
  2023-09-19  3:37   ` RISC-V sign extension query Vineet Gupta
  1 sibling, 0 replies; 10+ messages in thread
From: Vineet Gupta @ 2023-09-19  3:19 UTC (permalink / raw)
  To: Jeff Law, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke

On 9/18/23 19:41, Jeff Law wrote:
> On 9/18/23 13:45, Vineet Gupta wrote:
>>
>> For the cases which do require sign extends, but not being eliminated 
>> due to "missing definition(s)" I'm working on adapting Ajit's REE ABI 
>> interfaces work [2] to work for RISC-V as well.
> I wonder if we could walk the DECL_ARGUMENTS for current_function_decl 
> and create sign extensions for integer arguments smaller than XLEN at 
> the start of the function.  Record them in a list.
>
> Then we just let the rest of REE do its thing.  When REE is done we go 
> back and delete those sign extensions we created.

Umm, not sure I follow: the need for creating more sign extends.

At least for test in PR/111466 one's already present, at the entry for 
REE. And given these are hard regs, Ajit's code is able to identify them 
as functions args or return etc.

> Assuming that works, then we just need to conditionalize the code on 
> ABI properties.

Right, in the production version it could be a new target hook. For 
power it would be true for ZERO_EXTEND, for RISC-V true for sign_Extend etc.
As of now ive hacked Ajit's patch to check for both of them. It seems to 
be doing something.

However in my current approach I'm trying to not have to do this in ree 
at all if we can remove these at expand time.
RISC-V doesn't have TARGET_PROMOTE_PROTOTYPES, but per documentation it 
is needed for types smaller than int. This case already has int.
I'm trying to wrap my head around PROMOTE_MODE and 
TARGET_PROMOTE_FUNCTION_MODE.

Thx,
-Vineet

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-19  2:41 ` Jeff Law
  2023-09-19  3:19   ` PR 111/466 (was Re: RISC-V sign extension query) Vineet Gupta
@ 2023-09-19  3:37   ` Vineet Gupta
  2023-09-19 14:59     ` Jeff Law
  1 sibling, 1 reply; 10+ messages in thread
From: Vineet Gupta @ 2023-09-19  3:37 UTC (permalink / raw)
  To: Jeff Law, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke

On 9/18/23 19:41, Jeff Law wrote:
> On 9/18/23 13:45, Vineet Gupta wrote:
>
>>
>> For the cases which do require sign extends, but not being eliminated 
>> due to "missing definition(s)" I'm working on adapting Ajit's REE ABI 
>> interfaces work [2] to work for RISC-V as well.
> I wonder if we could walk the DECL_ARGUMENTS for current_function_decl 
> and create sign extensions for integer arguments smaller than XLEN at 
> the start of the function.  Record them in a list.
>
> Then we just let the rest of REE do its thing.  When REE is done we go 
> back and delete those sign extensions we created.

Forgot to add that even if we were to do this (and the test is doing 
this already), REE would fail anyways. It does DF use/def traversal - 
starting with use in an extension insn and finding the defs. If the def 
was implicit - as in a function arg, it bails out. This is essentially 
what Ajit is trying to fix by identifying the def as a potential 
function arg and not bailing.

Thx,
-Vineet

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-19  3:37   ` RISC-V sign extension query Vineet Gupta
@ 2023-09-19 14:59     ` Jeff Law
  2023-09-27  6:29       ` Vineet Gupta
  0 siblings, 1 reply; 10+ messages in thread
From: Jeff Law @ 2023-09-19 14:59 UTC (permalink / raw)
  To: Vineet Gupta, Andrew Waterman
  Cc: Kito Cheng, Palmer Dabbelt, Ajit Agarwal, GCC Patches,
	Jivan Hakobyan, gnu-toolchain, Joern Rennecke



On 9/18/23 21:37, Vineet Gupta wrote:
> On 9/18/23 19:41, Jeff Law wrote:
>> On 9/18/23 13:45, Vineet Gupta wrote:
>>
>>>
>>> For the cases which do require sign extends, but not being eliminated 
>>> due to "missing definition(s)" I'm working on adapting Ajit's REE ABI 
>>> interfaces work [2] to work for RISC-V as well.
>> I wonder if we could walk the DECL_ARGUMENTS for current_function_decl 
>> and create sign extensions for integer arguments smaller than XLEN at 
>> the start of the function.  Record them in a list.
>>
>> Then we just let the rest of REE do its thing.  When REE is done we go 
>> back and delete those sign extensions we created.
> 
> Forgot to add that even if we were to do this (and the test is doing 
> this already), REE would fail anyways. It does DF use/def traversal - 
> starting with use in an extension insn and finding the defs. If the def 
> was implicit - as in a function arg, it bails out. This is essentially 
> what Ajit is trying to fix by identifying the def as a potential 
> function arg and not bailing.
> 
Right.  What I'm suggesting is to create an explicit extension in the IL 
at the very beginning of REE for the appropriate arguments.  Put the 
extension in the entry block.

That would make extensions that were previously in the RTL redundant 
allowing REE to remove them.

Then we also remove the explicitly added extensions.

Think of the extensions we're adding as expressing the the extension 
that the caller would have done and would expose the redundant 
extensions in the callee.  We put them in the IL merely to make the 
existing REE algorithm happy.  Once they've served their purpose in 
exposing redundant extensions we remove the ones we added.

If you're familiar with DSE there's a lot of similarities with how we 
discover dead stores into the stack.  We pretend there's a store to each 
local frame slot in the epilogue, that in turn exposes stores into the 
local frame that would never be read because we're exiting the function.

Jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-19 14:59     ` Jeff Law
@ 2023-09-27  6:29       ` Vineet Gupta
  2023-09-27 21:11         ` Jeff Law
  0 siblings, 1 reply; 10+ messages in thread
From: Vineet Gupta @ 2023-09-27  6:29 UTC (permalink / raw)
  To: Jeff Law
  Cc: Kito Cheng, Palmer Dabbelt, GCC Patches, Jivan Hakobyan, gnu-toolchain

Hi Jeff,

On 9/19/23 07:59, Jeff Law wrote:
>
>
> On 9/18/23 21:37, Vineet Gupta wrote:
>> On 9/18/23 19:41, Jeff Law wrote:
>>> On 9/18/23 13:45, Vineet Gupta wrote:
>>>
>>>>
>>>> For the cases which do require sign extends, but not being 
>>>> eliminated due to "missing definition(s)" I'm working on adapting 
>>>> Ajit's REE ABI interfaces work [2] to work for RISC-V as well.
>>> I wonder if we could walk the DECL_ARGUMENTS for 
>>> current_function_decl and create sign extensions for integer 
>>> arguments smaller than XLEN at the start of the function. Record 
>>> them in a list.
>>>
>>> Then we just let the rest of REE do its thing.  When REE is done we 
>>> go back and delete those sign extensions we created.
>>
>> [..]
>>
> Right.  What I'm suggesting is to create an explicit extension in the 
> IL at the very beginning of REE for the appropriate arguments.  Put 
> the extension in the entry block.
>
> That would make extensions that were previously in the RTL redundant 
> allowing REE to remove them.
>
> Then we also remove the explicitly added extensions.
>
> Think of the extensions we're adding as expressing the the extension 
> that the caller would have done and would expose the redundant 
> extensions in the callee.  We put them in the IL merely to make the 
> existing REE algorithm happy.  Once they've served their purpose in 
> exposing redundant extensions we remove the ones we added.
>
> If you're familiar with DSE there's a lot of similarities with how we 
> discover dead stores into the stack.  We pretend there's a store to 
> each local frame slot in the epilogue, that in turn exposes stores 
> into the local frame that would never be read because we're exiting 
> the function.

We touched upon this in our airport "rendezvous". I'm curious if you 
have the wip bits lying around - (a) to get a feel for how this could be 
done and (b) to see why REE and/or similar construct in CSE don't work 
as expected.

Thx,
-Vineet

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RISC-V sign extension query
  2023-09-27  6:29       ` Vineet Gupta
@ 2023-09-27 21:11         ` Jeff Law
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Law @ 2023-09-27 21:11 UTC (permalink / raw)
  To: Vineet Gupta
  Cc: Kito Cheng, Palmer Dabbelt, GCC Patches, Jivan Hakobyan, gnu-toolchain



On 9/27/23 00:29, Vineet Gupta wrote:
> Hi Jeff,

> 
> We touched upon this in our airport "rendezvous". I'm curious if you 
> have the wip bits lying around - (a) to get a feel for how this could be 
> done and (b) to see why REE and/or similar construct in CSE don't work 
> as expected.
Not in any usable form.  Just several variants that didn't work ;-)

They don't work with REE because I'd forgotten a key point.  REE doesn't 
look for lexical redundancies like you'd see with CSE/PRE.  ie, given a 
pair of identical sign extensions in the IL, REE doesn't eliminate one.

Instead REE is focused on cases where we can transform an existing 
operation such as a load into an extending load to eliminate a 
subsequent extension.

This leads to a couple thoughts.

First, we ought to be able to use the same concept, but instead of 
putting something like this into the IL to express the extension done by 
the caller

(set (reg:DI a0) (sign_extend:DI (reg:SI a0)))

Instead we probably want to insert this as a dummy into the IL

(set (reg:SI a0) (mem:SI (sp))

If this is followed by a sign extension, then it'll get turned into

(set (reg:DI a0) (sign_extend:DI (mem:SI (sp)))

And the subsequent extension will get removed.  And since we've tracked 
the dummy, we can just eliminate the dummy as well.  I'm a bit worried 
about how this plays with the copy_needed bits in REE.

This should at least tell us how often there's an extension of an 
incoming argument that can be trivially eliminated.  I'm not sure it's 
the best place to eliminate the extensions though.  Leading to....



We should make sure that CSE/PRE are properly identifying and 
eliminating lexical redundancies.   I wouldn't be surprised if the class 
of problems we're chasing are better detected and optimized by CSE/PRE 
since those can work on an extended block or global basis respectively.

For CSE/PRE we'd want to insert something like

(set (reg:DI a0) (sign_extend:DI (reg:SI a0)))

Into the IL which should make any expressions like

(sign_extend:DI (reg:SI a0))

fully redundant in the IL, thus allowing CSE/PRE to eliminate them.

I've got a few things backed up from before the Cauldron, but expect to 
be able to poke at this some this week.

jeff

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-09-27 21:11 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-18 19:45 RISC-V sign extension query Vineet Gupta
2023-09-18 20:10 ` Andrew Waterman
2023-09-18 20:18   ` Vineet Gupta
2023-09-18 21:39 ` Jeff Law
2023-09-19  2:41 ` Jeff Law
2023-09-19  3:19   ` PR 111/466 (was Re: RISC-V sign extension query) Vineet Gupta
2023-09-19  3:37   ` RISC-V sign extension query Vineet Gupta
2023-09-19 14:59     ` Jeff Law
2023-09-27  6:29       ` Vineet Gupta
2023-09-27 21:11         ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).