[Patch] [Aarch64] PR rtl-optimization/87763 - this patch fixes gcc.target/aarch64/lsl_asr_sbfiz.c

Jeff Law law@redhat.com
Sat Apr 27 15:26:00 GMT 2019


On 4/26/19 5:59 PM, Segher Boessenkool wrote:
> On Fri, Apr 26, 2019 at 11:30:47PM +0100, Richard Earnshaw (lists) wrote:
>> A subreg on a reg is fine (which is what we'd have in this specific
>> case).  It's when the subreg gets left on something else (other than a
>> mem) when the problems start.
> 
> Yeah.  We typically push the subregs as far inward as we can.  I have a
> patch for one case where we explicitly pull a subreg to the left instead,
> and that destroys all of rs6000's insert patterns :-/
Richard, if you go back to Steve's patch and its discussion from Jan
you'll see that the subregs are not just on the register operand, but
also on the sign_extract:

Quoting from Steve's post:

> 
> (set (reg:SI 93)
>     (ashift:SI (subreg:SI (sign_extract:DI (subreg:DI (reg:SI 95) 0)
>                 (const_int 3 [0x3])
>                 (const_int 0 [0])) 0)
>         (const_int 19 [0x13])))
> 
> 
> The subreg's were not there before.  My proposed fix is to add an new
> instruction like *ashiftsi_extv_bfiz but with the subregs.  This fixes
> lsl_asr_sbfiz.c.  Does this seem like the right way to fix this?
> 


To fix this without having the two mode pattern I've proposed or a
pattern which matches the subreg mess above we'd need combine or
simplify-rtx to simplify the above into something like this (From Andrew P):

> Seems to me rather this should have been simplified to just:
>  (set (reg:SI 93)
>      (ashift:SI (sign_extract:SI (reg:SI 95)
>                  (const_int 3 [0x3])
>                  (const_int 0 [0]))
>          (const_int 19 [0x13])))
> 
> Because the two subreg cancel each other out.
> This would be a thing to add to simplify-rtx.c.

Jeff



More information about the Gcc-patches mailing list