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

Reply via email to