Skip to content

Commit 0e9e8e7

Browse files
committed
drop non-constant path as it happens to be non-profitable
1 parent c72f7bb commit 0e9e8e7

File tree

2 files changed

+8
-163
lines changed

2 files changed

+8
-163
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,7 +1325,7 @@ Instruction *InstCombinerImpl::foldICmpWithZero(ICmpInst &Cmp) {
13251325
// icmp eq 0, (and num, val - 1)
13261326
// For value being power of two
13271327
Instruction *InstCombinerImpl::foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp) {
1328-
Value *Neg, *Num, *Mask, *Value;
1328+
Value *Neg, *Num, *Mask;
13291329
CmpPredicate Pred;
13301330
const APInt *NegConst, *MaskConst;
13311331

@@ -1338,30 +1338,14 @@ Instruction *InstCombinerImpl::foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp) {
13381338
if (!ICmpInst::isEquality(Pred))
13391339
return nullptr;
13401340

1341-
// Check the constant case
1342-
if (match(Neg, m_APInt(NegConst)) && match(Mask, m_LowBitMask(MaskConst))) {
1343-
// Neg = -(Mask + 1)
1344-
if (*NegConst != ~*MaskConst)
1345-
return nullptr;
1346-
} else {
1347-
// Match neg = sub 0, val
1348-
if (!match(Neg, m_Sub(m_Zero(), m_Value(Value))))
1349-
return nullptr;
1350-
1351-
// mask = add %val, -1. No commutative here, since it's canonical
1352-
// representation for sub %val, -1
1353-
if (!match(Mask, m_Add(m_Value(Value), m_AllOnes()))) {
1354-
if (match(Num, m_Add(m_Value(Value), m_AllOnes()))) {
1355-
std::swap(Mask, Num);
1356-
} else {
1357-
return nullptr;
1358-
}
1359-
}
1341+
// Check only constant case, since it's the only profitable.
1342+
// See https://github.com/dtcxzyw/llvm-opt-benchmark/pull/2657/
1343+
if (!match(Neg, m_APInt(NegConst)) || !match(Mask, m_LowBitMask(MaskConst)))
1344+
return nullptr;
13601345

1361-
// Value should be a known power-of-two.
1362-
if (!isKnownToBeAPowerOfTwo(Value, false, &Cmp))
1363-
return nullptr;
1364-
}
1346+
// Neg = -(Mask + 1)
1347+
if (*NegConst != ~*MaskConst)
1348+
return nullptr;
13651349

13661350
// Create new icmp eq (num & (val - 1)), 0
13671351
auto NewAnd = Builder.CreateAnd(Num, Mask);

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

Lines changed: 0 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -3303,98 +3303,6 @@ entry:
33033303

33043304
; PR 152851
33053305

3306-
define i1 @val_is_aligend_sub(i32 %num, i32 %val) {
3307-
; CHECK-LABEL: @val_is_aligend_sub(
3308-
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[NUM:%.*]])
3309-
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3310-
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3311-
; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3312-
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM1:%.*]], [[NEG]]
3313-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3314-
; CHECK-NEXT: ret i1 [[_0]]
3315-
;
3316-
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3317-
%pow = icmp eq i32 %1, 1
3318-
call void @llvm.assume(i1 %pow)
3319-
3320-
%mask = sub i32 %val, 1
3321-
%neg = sub nsw i32 0, %val
3322-
3323-
%num.biased = add i32 %num, %mask
3324-
%_2.sroa.0.0 = and i32 %num.biased, %neg
3325-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3326-
ret i1 %_0
3327-
}
3328-
3329-
define i1 @val_is_aligend_add(i32 %num, i32 %val) {
3330-
; CHECK-LABEL: @val_is_aligend_add(
3331-
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[NUM:%.*]])
3332-
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3333-
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3334-
; CHECK-NEXT: [[NEG:%.*]] = add i32 [[NUM]], -1
3335-
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM1:%.*]], [[NEG]]
3336-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3337-
; CHECK-NEXT: ret i1 [[_0]]
3338-
;
3339-
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3340-
%pow = icmp eq i32 %1, 1
3341-
call void @llvm.assume(i1 %pow)
3342-
3343-
%mask = add i32 %val, -1
3344-
%neg = sub nsw i32 0, %val
3345-
3346-
%num.biased = add i32 %num, %mask
3347-
%_2.sroa.0.0 = and i32 %num.biased, %neg
3348-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3349-
ret i1 %_0
3350-
}
3351-
3352-
define i1 @val_is_aligend_add_commute_add(i32 %num, i32 %val) {
3353-
; CHECK-LABEL: @val_is_aligend_add_commute_add(
3354-
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3355-
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3356-
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3357-
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3358-
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3359-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3360-
; CHECK-NEXT: ret i1 [[_0]]
3361-
;
3362-
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3363-
%pow = icmp eq i32 %1, 1
3364-
call void @llvm.assume(i1 %pow)
3365-
3366-
%mask = add i32 %val, -1
3367-
%neg = sub nsw i32 0, %val
3368-
3369-
%num.biased = add i32 %mask, %num
3370-
%_2.sroa.0.0 = and i32 %num.biased, %neg
3371-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3372-
ret i1 %_0
3373-
}
3374-
3375-
define i1 @val_is_aligend_add_commute_and(i32 %num, i32 %val) {
3376-
; CHECK-LABEL: @val_is_aligend_add_commute_and(
3377-
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3378-
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3379-
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3380-
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3381-
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[NUM:%.*]], [[MASK]]
3382-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP2]], 0
3383-
; CHECK-NEXT: ret i1 [[_0]]
3384-
;
3385-
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3386-
%pow = icmp eq i32 %1, 1
3387-
call void @llvm.assume(i1 %pow)
3388-
3389-
%mask = add i32 %val, -1
3390-
%neg = sub nsw i32 0, %val
3391-
3392-
%num.biased = add i32 %mask, %num
3393-
%_2.sroa.0.0 = and i32 %neg, %num.biased
3394-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3395-
ret i1 %_0
3396-
}
3397-
33983306
define i1 @val_is_aligend_const_pow2(i32 %num) {
33993307
; CHECK-LABEL: @val_is_aligend_const_pow2(
34003308
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM:%.*]], 4095
@@ -3421,24 +3329,6 @@ define i1 @val_is_aligend_const_non_pow2(i32 %num) {
34213329
ret i1 %_0
34223330
}
34233331

3424-
define i1 @val_is_aligend_non_pow(i32 %num, i32 %val) {
3425-
; CHECK-LABEL: @val_is_aligend_non_pow(
3426-
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL:%.*]], -1
3427-
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[VAL]]
3428-
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], [[MASK]]
3429-
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED]], [[NEG]]
3430-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], [[NUM]]
3431-
; CHECK-NEXT: ret i1 [[_0]]
3432-
;
3433-
%mask = add i32 %val, -1
3434-
%neg = sub nsw i32 0, %val
3435-
3436-
%num.biased = add i32 %num, %mask
3437-
%_2.sroa.0.0 = and i32 %num.biased, %neg
3438-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3439-
ret i1 %_0
3440-
}
3441-
34423332
define i1 @val_is_aligend_const_pow2_multiuse(i32 %num) {
34433333
; CHECK-LABEL: @val_is_aligend_const_pow2_multiuse(
34443334
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
@@ -3469,32 +3359,3 @@ define i1 @val_is_aligend_const_pow2_multiuse1(i32 %num) {
34693359
%_0 = icmp eq i32 %_2.sroa.0.0, %num
34703360
ret i1 %_0
34713361
}
3472-
3473-
define i1 @val_is_aligend_add_multiuse(i32 %num, i32 %val) {
3474-
; CHECK-LABEL: @val_is_aligend_add_multiuse(
3475-
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3476-
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3477-
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3478-
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3479-
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[VAL]]
3480-
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], [[MASK]]
3481-
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED]], [[NEG]]
3482-
; CHECK-NEXT: call void @use(i32 [[_2_SROA_0_0]])
3483-
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], [[NUM]]
3484-
; CHECK-NEXT: ret i1 [[_0]]
3485-
;
3486-
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3487-
%pow = icmp eq i32 %1, 1
3488-
call void @llvm.assume(i1 %pow)
3489-
3490-
%mask = add i32 %val, -1
3491-
%neg = sub nsw i32 0, %val
3492-
3493-
%num.biased = add i32 %num, %mask
3494-
%_2.sroa.0.0 = and i32 %num.biased, %neg
3495-
3496-
call void @use(i32 %_2.sroa.0.0)
3497-
3498-
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3499-
ret i1 %_0
3500-
}

0 commit comments

Comments
 (0)