On Thu, Jun 01, 2017 at 11:54:33PM +0000, Michael Collison wrote:
> This patch improves code generation for relational compares against zero that
> are not merged into a subtract instruction. This patch improves the >= and <
> cases.
> 
> An example of the '<' case:
> 
> int lt (int x, int y)
> {
>   if ((x - y) < 0)
>     return 10;
> 
>   return 0;
> }
> 
> Trunk generates:
> 
> lt:
>       sub     w1, w0, w1
>       mov     w0, 10
>       cmp     w1, 0
>       csel    w0, w0, wzr, lt
>       ret
> 
> With the patch we can eliminate the redundant subtract and now generate:
> 
> lt:
>       cmp     w0, w1
>       mov     w0, 10
>       csel    w0, w0, wzr, mi
>       ret

I'm not up to speed on the way we use CC register modes in the AArch64
Backend. On the one hand looking at patterns like *sub<mode>3_compare0, this
patch looks correct. Those too generate subs instructions, and only set the
CC_NZ CC register. But on the other hand cmp<mode> sets the full CC
register. As cmp is an alias for subs, should they not set the same
CC register mode? Certainly the instruction sets more than just N and Z.

As I say, I don't understand this area, and I'm not sure if my objection
is reasonable. Hopefully someone who knows CC modes better could help me
understand why this is correct.

Thanks,
James

> 
> Bootstrapped and tested on aarch64-linux-gnu. Okay for trunk?
> 
> 2017-06-01  Michael Collison  <michael.colli...@arm.com>
> 
>       * config/aarch64/aarch64-simd.md(aarch64_sub<mode>_compare0):
>       New pattern.
>       * testsuite/gcc.target/aarch64/cmp-2.c: New testcase.


Reply via email to