I think instcombine should unconditionally do this xform.
authorChris Lattner <sabre@nondot.org>
Tue, 16 Jun 2009 06:11:35 +0000 (06:11 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 16 Jun 2009 06:11:35 +0000 (06:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73471 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index 3796aac57cb53055995a931e5784ecdcb58f0890..767771f082a6d59955248b5e7eb344ccfb88691b 100644 (file)
@@ -1858,8 +1858,23 @@ Ideal output:
        setne   %al
        ret
 
-We could do this transformation in instcombine, but it's only clearly
-beneficial on platforms with a test instruction.
+This should definitely be done in instcombine, canonicalizing the range
+condition into a != condition.  We get this IR:
+
+define i32 @a(i32 %x) nounwind readnone {
+entry:
+       %0 = and i32 %x, 127            ; <i32> [#uses=1]
+       %1 = icmp ugt i32 %0, 31                ; <i1> [#uses=1]
+       %2 = zext i1 %1 to i32          ; <i32> [#uses=1]
+       ret i32 %2
+}
+
+Instcombine prefers to strength reduce relational comparisons to equality
+comparisons when possible, this should be another case of that.  This could
+be handled pretty easily in InstCombiner::visitICmpInstWithInstAndIntCst, but it
+looks like InstCombiner::visitICmpInstWithInstAndIntCst should really already
+be redesigned to use ComputeMaskedBits and friends.
+
 
 //===---------------------------------------------------------------------===//
 Testcase: