This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH PR82439][simplify-rtx] Simplify (x | y) == x -> (y & ~x) == 0


Hi Jeff

On 04/01/18 18:30, Jeff Law wrote:
On 01/03/2018 06:57 AM, Sudakshina Das wrote:
Hi

This patch add support for the missing transformation of (x | y) == x ->
(y & ~x) == 0.
The transformation for (x & y) == x case already exists in
simplify-rtx.c since 2014 as of r218503 and this patch only adds a
couple of extra patterns for the IOR case.

Citing the example given in PR82439 :

Simple testcase (f1 should generate the same as f2):

int f1(int x, int y) { return (x | y) == x; }
int f2(int x, int y) { return (y & ~x) == 0; }

f1:
     orr    w1, w0, w1
     cmp    w1, w0
     cset    w0, eq
     ret
f2:
     bics    wzr, w1, w0
     cset    w0, eq
     ret

This benefits targets that have the BICS instruction to generate better
code. Wilco helped me in showing that even in targets that do not have
the BICS instruction, this is no worse and gives out 2 instructions.
For example in x86:

0000000000000000 <f1>:
    0:    09 fe                    or     %edi,%esi
    2:    31 c0                    xor    %eax,%eax
    4:    39 fe                    cmp    %edi,%esi
    6:    0f 94 c0                 sete   %al
    9:    c3                       retq

0000000000000010 <f2>:
   10:    f7 d7                    not    %edi
   12:    31 c0                    xor    %eax,%eax
   14:    85 f7                    test   %esi,%edi
   16:    0f 94 c0                 sete   %al
   19:    c3                       retq

Testing done: Checked for regressions on bootstrapped
aarch64-none-linux-gnu and arm-none-linux-gnueabihf and added new test
cases.
Is this ok for trunk?

Sudi

ChangeLog Entries:

*** gcc/ChangeLog ***

2017-01-03  Sudakshina Das  <sudi.das@arm.com>

     PR target/82439
     * simplify-rtx.c (simplify_relational_operation_1): Add
     simplifications of (x|y) == x for BICS pattern.

*** gcc/testsuite/ChangeLog ***

2017-01-03  Sudakshina Das  <sudi.das@arm.com>

     PR target/82439
     * gcc.target/aarch64/bics_5.c: New test.
     * gcc.target/arm/bics_5.c: Likewise.
OK.

Thanks! Committed as r256275.

Sudi

jeff



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]