Skip to content

Commit e3ecb56

Browse files
committed
[InstCombine] use m_APInt to allow icmp (shr exact X, Y), 0 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279472 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 00a565c commit e3ecb56

File tree

2 files changed

+15
-18
lines changed

2 files changed

+15
-18
lines changed

lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,25 +2061,24 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp, Instruction *Shl,
20612061
return nullptr;
20622062
}
20632063

2064+
/// Fold icmp ({al}shr X, Y), C.
20642065
Instruction *InstCombiner::foldICmpShrConstant(ICmpInst &ICI, Instruction *LHSI,
20652066
const APInt *RHSV) {
2066-
// FIXME: This check restricts all folds under here to scalar types.
2067-
ConstantInt *RHS = dyn_cast<ConstantInt>(ICI.getOperand(1));
2068-
if (!RHS)
2069-
return nullptr;
2067+
// An exact shr only shifts out zero bits, so:
2068+
// icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2069+
CmpInst::Predicate Pred = ICI.getPredicate();
2070+
BinaryOperator *BO = cast<BinaryOperator>(LHSI);
2071+
if (ICI.isEquality() && BO->isExact() && BO->hasOneUse() && *RHSV == 0)
2072+
return new ICmpInst(Pred, BO->getOperand(0), ICI.getOperand(1));
20702073

2074+
// FIXME: This check restricts all folds under here to scalar types.
20712075
// Handle equality comparisons of shift-by-constant.
2072-
BinaryOperator *BO = cast<BinaryOperator>(LHSI);
2073-
if (ConstantInt *ShAmt = dyn_cast<ConstantInt>(LHSI->getOperand(1))) {
2074-
if (Instruction *Res = foldICmpShrConstConst(ICI, BO, ShAmt))
2075-
return Res;
2076-
}
2076+
ConstantInt *ShAmt = dyn_cast<ConstantInt>(LHSI->getOperand(1));
2077+
if (!ShAmt)
2078+
return nullptr;
20772079

2078-
// Handle exact shr's.
2079-
if (ICI.isEquality() && BO->isExact() && BO->hasOneUse()) {
2080-
if (RHSV->isMinValue())
2081-
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0), RHS);
2082-
}
2080+
if (Instruction *Res = foldICmpShrConstConst(ICI, BO, ShAmt))
2081+
return Res;
20832082

20842083
return nullptr;
20852084
}

test/Transforms/InstCombine/icmp.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,7 @@ define i1 @test39(i32 %X, i32 %Y) {
490490

491491
define <2 x i1> @test39vec(<2 x i32> %X, <2 x i32> %Y) {
492492
; CHECK-LABEL: @test39vec(
493-
; CHECK-NEXT: [[A:%.*]] = ashr exact <2 x i32> %X, %Y
494-
; CHECK-NEXT: [[B:%.*]] = icmp eq <2 x i32> [[A]], zeroinitializer
493+
; CHECK-NEXT: [[B:%.*]] = icmp eq <2 x i32> %X, zeroinitializer
495494
; CHECK-NEXT: ret <2 x i1> [[B]]
496495
;
497496
%A = ashr exact <2 x i32> %X, %Y
@@ -511,8 +510,7 @@ define i1 @test40(i32 %X, i32 %Y) {
511510

512511
define <2 x i1> @test40vec(<2 x i32> %X, <2 x i32> %Y) {
513512
; CHECK-LABEL: @test40vec(
514-
; CHECK-NEXT: [[A:%.*]] = lshr exact <2 x i32> %X, %Y
515-
; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i32> [[A]], zeroinitializer
513+
; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i32> %X, zeroinitializer
516514
; CHECK-NEXT: ret <2 x i1> [[B]]
517515
;
518516
%A = lshr exact <2 x i32> %X, %Y

0 commit comments

Comments
 (0)