On Fri, Sep 16, 2016 at 10:40 AM, Kyrill Tkachov <kyrylo.tkac...@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.tkac...@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.tkac...@arm.com> > > * gcc.target/aarch64/gtu_to_ltu_cmp_1.c: New test.