Teach the codegen to turn [aez]ext (setcc) -> selectcc of 1/0, which often
authorChris Lattner <sabre@nondot.org>
Wed, 11 Apr 2007 05:32:27 +0000 (05:32 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 11 Apr 2007 05:32:27 +0000 (05:32 +0000)
commit20a35c3fa57ba9c3184d8848541d9a89b6c2b338
tree58962bc1cc25edc4cf4058ae4adfd78ecdc80dd0
parentcb42ba454cb5fdd81ab6727b452946bfcb424fcb
Teach the codegen to turn [aez]ext (setcc) -> selectcc of 1/0, which often
allows other simplifications.  For example, this compiles:
int isnegative(unsigned int X) {
   return !(X < 2147483648U);
}

Into this code:

x86:
        movl 4(%esp), %eax
        shrl $31, %eax
        ret
arm:
        mov r0, r0, lsr #31
        bx lr
thumb:
        lsr r0, r0, #31
        bx lr

instead of:

x86:
        cmpl $0, 4(%esp)
        sets %al
        movzbl %al, %eax
        ret

arm:
        mov r3, #0
        cmp r0, #0
        movlt r3, #1
        mov r0, r3
        bx lr

thumb:
        mov r2, #1
        mov r1, #0
        cmp r0, #0
        blt LBB1_2      @entry
LBB1_1: @entry
        cpy r2, r1
LBB1_2: @entry
        cpy r0, r2
        bx lr

Testcase here: test/CodeGen/Generic/ispositive.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35883 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp