]> git.ipfire.org Git - thirdparty/gcc.git/commit
middle-end: convert negate + right shift into compare greater.
authorTamar Christina <tamar.christina@arm.com>
Thu, 4 Nov 2021 17:32:09 +0000 (17:32 +0000)
committerTamar Christina <tamar.christina@arm.com>
Thu, 4 Nov 2021 17:32:09 +0000 (17:32 +0000)
commitd70720c2382e687e192a9d666e80acb41bfda856
treeaf6adf8a4e4441b83b55e63e81b52026d4ca02ad
parent004afb984beb6efbe25f44a5857b1c27ebc2ec82
middle-end: convert negate + right shift into compare greater.

This turns an inversion of the sign bit + arithmetic right shift into a
comparison with 0.

i.e.

void fun1(int32_t *x, int n)
{
    for (int i = 0; i < (n & -16); i++)
      x[i] = (-x[i]) >> 31;
}

now generates:

.L3:
        ldr     q0, [x0]
        cmgt    v0.4s, v0.4s, #0
        str     q0, [x0], 16
        cmp     x0, x1
        bne     .L3

instead of:

.L3:
        ldr     q0, [x0]
        neg     v0.4s, v0.4s
        sshr    v0.4s, v0.4s, 31
        str     q0, [x0], 16
        cmp     x0, x1
        bne     .L3

gcc/ChangeLog:

* match.pd: New negate+shift pattern.

gcc/testsuite/ChangeLog:

* gcc.dg/signbit-2.c: New test.
* gcc.dg/signbit-3.c: New test.
* gcc.dg/signbit-4.c: New test.
* gcc.dg/signbit-5.c: New test.
* gcc.dg/signbit-6.c: New test.
* gcc.target/aarch64/signbit-1.c: New test.
gcc/match.pd
gcc/testsuite/gcc.dg/signbit-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/signbit-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/signbit-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/signbit-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/signbit-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/signbit-1.c [new file with mode: 0644]