aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-iterator.h
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2021-11-04 17:32:09 +0000
committerTamar Christina <tamar.christina@arm.com>2021-11-04 17:32:09 +0000
commitd70720c2382e687e192a9d666e80acb41bfda856 (patch)
treeaf6adf8a4e4441b83b55e63e81b52026d4ca02ad /gcc/tree-iterator.h
parent004afb984beb6efbe25f44a5857b1c27ebc2ec82 (diff)
downloadgcc-d70720c2382e687e192a9d666e80acb41bfda856.zip
gcc-d70720c2382e687e192a9d666e80acb41bfda856.tar.gz
gcc-d70720c2382e687e192a9d666e80acb41bfda856.tar.bz2
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.
Diffstat (limited to 'gcc/tree-iterator.h')
0 files changed, 0 insertions, 0 deletions