mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-30 16:34:03 +00:00
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
This commit is contained in:
parent
3dfd98744c
commit
b042f8e969
@ -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<ConstantInt>(LHSI->getOperand(1)))
|
||||
if (Instruction *Res = FoldICmpShrCst(ICI, cast<BinaryOperator>(LHSI),
|
||||
ShAmt))
|
||||
case Instruction::AShr: {
|
||||
// Handle equality comparisons of shift-by-constant.
|
||||
BinaryOperator *BO = cast<BinaryOperator>(LHSI);
|
||||
if (ConstantInt *ShAmt = dyn_cast<ConstantInt>(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:
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user