http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56110
Bug #: 56110
Summary: Sub-optimal code: unnecessary CMP after AND
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: [email protected]
ReportedBy: [email protected]
Target: arm
Compiling this code
unsigned f1 (unsigned x, unsigned m)
{
if (m & 0x008080)
x >>= 8;
return x;
}
with gcc 4.7.2 gives this code for ARMv5:
$ armv5tel-softfloat-linux-gnueabi-gcc -O2 -S -o- f1.c
[...]
ldr r3, .L6
and r3, r1, r3 @ XXX
cmp r3, #0 @ XXX
movne r0, r0, lsr #8
bx lr
[...]
AFAICS we could get rid of the CMP if we used ANDS instead of AND:
ldr r3, .L6
ands r3, r1, r3
movne r0, r0, lsr #8
bx lr