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: unassig...@gcc.gnu.org ReportedBy: til...@code-monkey.de 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