Skip to content

Commit fd6783e

Browse files
committed
[InstCombine] Fold icmp eq/ne (X and C), 0 when partial bits are known
1 parent 28da526 commit fd6783e

File tree

2 files changed

+8
-9
lines changed

2 files changed

+8
-9
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,11 +1771,14 @@ Instruction *InstCombinerImpl::foldICmpAndConstConst(ICmpInst &Cmp,
17711771
return new ICmpInst(NewPred, X, Zero);
17721772
}
17731773

1774-
APInt NewC2 = *C2;
17751774
KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
1775+
if (Know.One.intersects(*C2))
1776+
return replaceInstUsesWith(
1777+
Cmp, ConstantInt::getBool(Cmp.getType(), isICMP_NE));
1778+
17761779
// Set high zeros of C2 to allow matching negated power-of-2.
1777-
NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1778-
Know.countMinLeadingZeros());
1780+
APInt NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1781+
Know.countMinLeadingZeros());
17791782

17801783
// Restrict this fold only for single-use 'and' (PR10267).
17811784
// ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.

llvm/test/Transforms/InstCombine/icmp-dom.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,7 @@ define i1 @and_mask1_eq(i32 %conv) {
414414
; CHECK-NEXT: ret i1 false
415415
; CHECK: else:
416416
; CHECK-NEXT: call void @dummy()
417-
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[CONV]], 3
418-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[AND1]], 0
419-
; CHECK-NEXT: ret i1 [[CMP1]]
417+
; CHECK-NEXT: ret i1 false
420418
;
421419
entry:
422420
%and = and i32 %conv, 1
@@ -443,9 +441,7 @@ define i1 @and_mask1_ne(i32 %conv) {
443441
; CHECK-NEXT: ret i1 false
444442
; CHECK: else:
445443
; CHECK-NEXT: call void @dummy()
446-
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[CONV]], 3
447-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[AND1]], 0
448-
; CHECK-NEXT: ret i1 [[CMP1]]
444+
; CHECK-NEXT: ret i1 true
449445
;
450446
entry:
451447
%and = and i32 %conv, 1

0 commit comments

Comments
 (0)