> On Jul 10, 2015, at 1:34 AM, Kyrill Tkachov <kyrylo.tkac...@arm.com> wrote:
> 
> Hi all,
> 
> Currently when evaluating expressions like (a ? 24 : 25) we will move 24 and 
> 25 into
> registers and perform a csel on them.  This misses the opportunity to instead 
> move just 24
> into a register and then perform a csinc, saving us an instruction and a 
> register use.
> Similarly for csneg and csinv.
> 
> This patch implements that idea by allowing such pairs of immediates in 
> *cmov<mode>_insn
> and adding an early splitter that performs the necessary transformation.
> 
> The testcase included in the patch demonstrates the kind of opportunities 
> that are now picked up.
> 
> With this patch I see about 9.6% more csinc instructions being generated for 
> SPEC2006
> and the generated code looks objectively better (i.e. fewer mov-immediates 
> and slightly
> lower register pressure).
> 
> Bootstrapped and tested on aarch64.
> 
> Ok for trunk?

I think this is the wrong place for this optimization. It should happen in 
expr.c and we should produce cond_expr on the gimple level. 

I have patches to do both but I have not got around to cleaning them up. If 
anyone wants them, I can send a link to my current gcc 5.1 sources with them 
included. 

Thanks,
Andrew

> 
> Thanks,
> Kyrill
> 
> 2015-07-10  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
> 
>    * config/aarch64/aarch64.md (*cmov<mode>_insn): Move stricter
>    check for operands 3 and 4 to pattern predicate.  Allow immediates
>    that can be expressed as csinc/csneg/csinv.  New define_split.
>    (*csinv3<mode>_insn): Rename to...
>    (csinv3<mode>_insn): ... This.
>    * config/aarch64/aarch64.h (AARCH64_IMMS_OK_FOR_CSNEG): New macro.
>    (AARCH64_IMMS_OK_FOR_CSINC): Likewise.
>    (AARCH64_IMMS_OK_FOR_CSINV): Likewise.
>    * config/aarch64/aarch64.c (aarch64_imms_ok_for_cond_op_1):
>    New function.
>    (aarch64_imms_ok_for_cond_op): Likewise.
>    * config/aarch64/aarch64-protos.h (aarch64_imms_ok_for_cond_op_1):
>    Declare prototype.
>    (aarch64_imms_ok_for_cond_op): Likewise.
> 
> 2015-07-10  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
> 
>    * gcc.target/aarch64/cond-op-imm_1.c: New test.
> <aarch64-csinc-imms.patch>

Reply via email to