Skip to content

Commit 914dd1f

Browse files
committed
address review comments
1 parent 93fd0c6 commit 914dd1f

File tree

2 files changed

+69
-15
lines changed

2 files changed

+69
-15
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,16 +1330,21 @@ Instruction *InstCombinerImpl::foldNextMultiply(ICmpInst &Cmp) {
13301330
CmpInst::Predicate Pred = Cmp.getPredicate();
13311331
const APInt *NegConst, *MaskConst, *NumCost;
13321332

1333-
if (Pred != ICmpInst::ICMP_EQ)
1333+
if (!ICmpInst::isEquality(Pred))
13341334
return nullptr;
13351335

13361336
// Match num + neg
1337-
if (!match(Op0, m_And(m_Value(Add), m_Value(Neg))))
1337+
if (!match(Op0, m_c_And(m_Value(Add), m_Value(Neg))))
13381338
return nullptr;
13391339

1340-
// Match num & mask
1341-
if (!match(Add, m_Add(m_Value(Num), m_Value(Mask))))
1342-
return nullptr;
1340+
// Match num & mask and handle commutative care
1341+
if (!match(Add, m_c_Add(m_Value(Num), m_Value(Mask)))) {
1342+
if (match(Neg, m_c_Add(m_Value(Num), m_Value(Mask)))) {
1343+
std::swap(Add, Neg);
1344+
} else {
1345+
return nullptr;
1346+
}
1347+
}
13431348

13441349
// Check the constant case
13451350
if (match(Neg, m_APInt(NegConst)) && match(Mask, m_APInt(MaskConst))) {
@@ -1355,10 +1360,14 @@ Instruction *InstCombinerImpl::foldNextMultiply(ICmpInst &Cmp) {
13551360
if (!match(Neg, m_Sub(m_Zero(), m_Value(Value))))
13561361
return nullptr;
13571362

1358-
// mask = %val - 1, which can be represented as sub %val, 1 or add %val, -1
1359-
if (!match(Mask, m_Add(m_Value(Value), m_AllOnes())) &&
1360-
!match(Mask, m_Sub(m_Value(Value), m_One())))
1361-
return nullptr;
1363+
// mask = add %val, -1. No commutative here, since it's canonical representation for sub %val, -1
1364+
if (!match(Mask, m_Add(m_Value(Value), m_AllOnes()))) {
1365+
if (match(Num, m_Add(m_Value(Value), m_AllOnes()))) {
1366+
std::swap(Mask, Num);
1367+
} else {
1368+
return nullptr;
1369+
}
1370+
}
13621371

13631372
// Value should be a known power-of-two.
13641373
if (!isKnownToBeAPowerOfTwo(Value, false, &Cmp))
@@ -1376,9 +1385,8 @@ Instruction *InstCombinerImpl::foldNextMultiply(ICmpInst &Cmp) {
13761385
// Create new icmp eq (num & (val - 1)), 0
13771386
auto NewAnd = Builder.CreateAnd(Num, Mask);
13781387
auto Zero = llvm::Constant::getNullValue(Num->getType());
1379-
auto ICmp = Builder.CreateICmp(CmpInst::ICMP_EQ, NewAnd, Zero);
13801388

1381-
return replaceInstUsesWith(Cmp, ICmp);
1389+
return new ICmpInst(Pred, NewAnd, Zero);
13821390
}
13831391

13841392
/// Fold icmp Pred X, C.

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

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3307,8 +3307,8 @@ define i1 @val_is_aligend_sub(i32 %num, i32 %val) {
33073307
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
33083308
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
33093309
; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3310-
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED:%.*]], [[NEG]]
3311-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], 0
3310+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM1:%.*]], [[NEG]]
3311+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
33123312
; CHECK-NEXT: ret i1 [[_0]]
33133313
;
33143314
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
@@ -3330,8 +3330,8 @@ define i1 @val_is_aligend_add(i32 %num, i32 %val) {
33303330
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
33313331
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
33323332
; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3333-
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED:%.*]], [[NEG]]
3334-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], 0
3333+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM1:%.*]], [[NEG]]
3334+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
33353335
; CHECK-NEXT: ret i1 [[_0]]
33363336
;
33373337
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
@@ -3347,6 +3347,52 @@ define i1 @val_is_aligend_add(i32 %num, i32 %val) {
33473347
ret i1 %_0
33483348
}
33493349

3350+
define i1 @val_is_aligend_add_commute_add(i32 %num, i32 %val) {
3351+
; CHECK-LABEL: @val_is_aligend_add_commute_add(
3352+
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3353+
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3354+
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3355+
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3356+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3357+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3358+
; CHECK-NEXT: ret i1 [[_0]]
3359+
;
3360+
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3361+
%pow = icmp eq i32 %1, 1
3362+
call void @llvm.assume(i1 %pow)
3363+
3364+
%mask = add i32 %val, -1
3365+
%neg = sub nsw i32 0, %val
3366+
3367+
%num.biased = add i32 %mask, %num
3368+
%_2.sroa.0.0 = and i32 %num.biased, %neg
3369+
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3370+
ret i1 %_0
3371+
}
3372+
3373+
define i1 @val_is_aligend_add_commute_and(i32 %num, i32 %val) {
3374+
; CHECK-LABEL: @val_is_aligend_add_commute_and(
3375+
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3376+
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3377+
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3378+
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3379+
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3380+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3381+
; CHECK-NEXT: ret i1 [[_0]]
3382+
;
3383+
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3384+
%pow = icmp eq i32 %1, 1
3385+
call void @llvm.assume(i1 %pow)
3386+
3387+
%mask = add i32 %val, -1
3388+
%neg = sub nsw i32 0, %val
3389+
3390+
%num.biased = add i32 %mask, %num
3391+
%_2.sroa.0.0 = and i32 %neg, %num.biased
3392+
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3393+
ret i1 %_0
3394+
}
3395+
33503396
define i1 @val_is_aligend_const_pow2(i32 %num) {
33513397
; CHECK-LABEL: @val_is_aligend_const_pow2(
33523398
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095

0 commit comments

Comments
 (0)