InstCombine: (icmp eq B, 0) | (icmp ult A, B) -> (icmp ule A, B-1)
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 5 Jul 2013 00:31:17 +0000 (00:31 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 5 Jul 2013 00:31:17 +0000 (00:31 +0000)
commitb1b738e03613e98f0ae367af1b5423221c5bd29d
tree27aa68ab66a8826500f01bff08624cbd6d1f3090
parent5679d7da014e415237a4a4f7d61a119a8c84cfd9
InstCombine: (icmp eq B, 0) | (icmp ult A, B) -> (icmp ule A, B-1)

This transform allows us to turn IR that looks like:
  %1 = icmp eq i64 %b, 0
  %2 = icmp ult i64 %a, %b
  %3 = or i1 %1, %2
  ret i1 %3

into:
  %0 = add i64 %b, -1
  %1 = icmp uge i64 %0, %a
  ret i1 %1

which means we go from lowering:
        cmpq    %rsi, %rdi
        setb    %cl
        testq   %rsi, %rsi
        sete    %al
        orb     %cl, %al
        ret

to lowering:
        decq    %rsi
        cmpq    %rdi, %rsi
        setae   %al
        ret

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185677 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
test/Transforms/InstCombine/icmp.ll