[PATCH][AArch64] Handle -|x| case using a single csneg

pinskia@gmail.com pinskia@gmail.com
Tue Jul 14 11:04:00 GMT 2015





> On Jul 13, 2015, at 5:48 PM, Kyrill Tkachov <kyrylo.tkachov@arm.com> wrote:
> 
> Hi all,
> 
> For the testcase in the patch we were generating an extra neg instruction:
>        cmp     w0, wzr
>        csneg   w0, w0, w0, ge
>        neg     w0, w0
>        ret
> 
> instead of the optimal:
>        cmp     w0, wzr
>        csneg   w0, w0, w0, lt
>        ret
> 
> The reason is that combine tries to merge the operation into a negation of an abs.
> I considered teaching combine not to do that but it would require telling it that it shouldn't
> do it if there is a conditional negate instruction. There's no optab for that though :(
> Also, we already advertise that we have an abs optab, even though we expand to a compare and
> a csneg anyway. This patch was the cleanest way I could do this. We just match the neg of an abs
> and generate the same csneg sequence as for normal abs, just with the comparison condition inverted.
> 
> Bootstrapped and tested on aarch64.
> 
> Ok for trunk?
> Thanks,
> Kyrill
> 
> 2015-07-13  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
> 
>    * config/aarch64/aarch64.md (*absneg2<mode>_insn): New
>    define_and_split.

This pattern is incorrect as you need to say you are clobbering the flags register. Otherwise an optimization between combine and the splitter can move an instruction between it. Also it might be better to just have a define_split rather than a define_insn_and_split. Combine knows how to use define_split without being an insn. 

Thanks,
Andrew

> 
> 2015-07-13  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
> 
>    * gcc.target/aarch64/neg-abs_1.c: New test.
> <abs-neg.patch>



More information about the Gcc-patches mailing list