From: Nick Lewycky Date: Mon, 28 Feb 2011 08:31:40 +0000 (+0000) Subject: Teach InstCombine to fold "(shr exact X, Y) == 0" --> X == 0, fixing #1 from X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b042f8e9699dd15d7ac48bb9b9475122b1673687;p=oota-llvm.git Teach InstCombine to fold "(shr exact X, Y) == 0" --> X == 0, fixing #1 from PR9343. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126643 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index 7c67bf61b6c..79c5d88c631 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1289,13 +1289,21 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI, } case Instruction::LShr: // (icmp pred (shr X, ShAmt), CI) - case Instruction::AShr: - // Only handle equality comparisons of shift-by-constant. - if (ConstantInt *ShAmt = dyn_cast(LHSI->getOperand(1))) - if (Instruction *Res = FoldICmpShrCst(ICI, cast(LHSI), - ShAmt)) + case Instruction::AShr: { + // Handle equality comparisons of shift-by-constant. + BinaryOperator *BO = cast(LHSI); + if (ConstantInt *ShAmt = dyn_cast(LHSI->getOperand(1))) { + if (Instruction *Res = FoldICmpShrCst(ICI, BO, ShAmt)) return Res; + } + + // Handle exact shr's. + if (ICI.isEquality() && BO->isExact() && BO->hasOneUse()) { + if (RHSV.isMinValue()) + return new ICmpInst(ICI.getPredicate(), BO->getOperand(0), RHS); + } break; + } case Instruction::SDiv: case Instruction::UDiv: diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index c11dea5b8fa..f6a18faeb33 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -387,3 +387,20 @@ define i1 @test39(i31 %X, i32 %Y) { %C = icmp slt i32 %B, 0 ret i1 %C } + +; PR9343 #1 +; CHECK: test40 +; CHECK %B = icmp eq i32 %X, 0 +define i1 @test40(i32 %X, i32 %Y) { + %A = ashr exact i32 %X, %Y + %B = icmp eq i32 %A, 0 + ret i1 %B +} + +; CHECK: test41 +; CHECK %B = icmp ne i32 %X, 0 +define i1 @test41(i32 %X, i32 %Y) { + %A = lshr exact i32 %X, %Y + %B = icmp ne i32 %A, 0 + ret i1 %B +}