This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH][simplify-rtx] (GTU (PLUS a C) (C - 1)) --> (LTU a -C)
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Kyrill Tkachov <kyrylo dot tkachov at foss dot arm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 16 Sep 2016 11:02:45 +0200
- Subject: Re: [PATCH][simplify-rtx] (GTU (PLUS a C) (C - 1)) --> (LTU a -C)
- Authentication-results: sourceware.org; auth=none
- References: <57DBB001.9070803@foss.arm.com>
On Fri, Sep 16, 2016 at 10:40 AM, Kyrill Tkachov
<kyrylo.tkachov@foss.arm.com> wrote:
> Hi all,
>
> Currently the functions:
> int f1(int x, int t)
> {
> if (x == -1 || x == -2)
> t = 1;
> return t;
> }
>
> int f2(int x, int t)
> {
> if (x == -1 || x == -2)
> return 1;
> return t;
> }
>
> generate different code on AArch64 even though they have identical
> functionality:
> f1:
> add w0, w0, 2
> cmp w0, 1
> csinc w0, w1, wzr, hi
> ret
>
> f2:
> cmn w0, #2
> csinc w0, w1, wzr, cc
> ret
>
> The problem is that f2 performs the comparison (LTU w0 -2)
> whereas f1 performs (GTU (PLUS w0 2) 1). I think it is possible to simplify
> the f1 form
> to the f2 form with the simplify-rtx.c rule added in this patch. With this
> patch the
> codegen for both f1 and f2 on aarch64 at -O2 is identical (CMN, CSINC).
>
> Bootstrapped and tested on arm-none-linux-gnueabihf, aarch64-none-linux-gnu,
> x86_64.
> What do you think? Is this a correct generalisation of this issue?
> If so, ok for trunk?
Do you see a difference on the GIMPLE level? If so, this kind of
transform looks
appropriate there, too.
Richard.
> Thanks,
> Kyrill
>
> 2016-09-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
>
> * simplify-rtx.c (simplify_relational_operation_1): Add transformation
> (GTU (PLUS a C) (C - 1)) --> (LTU a -C).
>
> 2016-09-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
>
> * gcc.target/aarch64/gtu_to_ltu_cmp_1.c: New test.