Skip to content

Commit 25aec6b

Browse files
committed
review
1 parent fa89f88 commit 25aec6b

File tree

2 files changed

+72
-20
lines changed

2 files changed

+72
-20
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,26 +1325,18 @@ Instruction *InstCombinerImpl::foldICmpWithZero(ICmpInst &Cmp) {
13251325
// icmp eq 0, (and num, val - 1)
13261326
// For value being power of two
13271327
Instruction *InstCombinerImpl::foldNextMultiply(ICmpInst &Cmp) {
1328-
Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1328+
Value *Op0 = Cmp.getOperand(0);
13291329
Value *Neg, *Add, *Num, *Mask, *Value;
1330-
CmpInst::Predicate Pred = Cmp.getPredicate();
1331-
const APInt *NegConst, *MaskConst, *NumCost;
1332-
1333-
if (!ICmpInst::isEquality(Pred))
1334-
return nullptr;
1330+
CmpPredicate Pred;
1331+
const APInt *NegConst, *MaskConst;
13351332

13361333
// Match num + neg
1337-
if (!match(Op0, m_c_And(m_Value(Add), m_Value(Neg))))
1334+
if (!match(Op0, m_OneUse(m_c_And(m_Value(Add), m_Value(Neg)))))
13381335
return nullptr;
13391336

13401337
// 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-
}
1338+
if (!match(Op0, m_c_And(m_c_Add(m_Value(Num), m_Value(Mask)), m_Value(Neg))))
1339+
return nullptr;
13481340

13491341
// Check the constant case
13501342
if (match(Neg, m_APInt(NegConst)) && match(Mask, m_APInt(MaskConst))) {
@@ -1375,12 +1367,11 @@ Instruction *InstCombinerImpl::foldNextMultiply(ICmpInst &Cmp) {
13751367
return nullptr;
13761368
}
13771369

1378-
// Guard against weird special-case where Op1 gets optimized to constant.
1379-
// Leave it constant fonder.
1380-
if (match(Op1, m_APInt(NumCost)))
1370+
// Verify that Add and Num are connected by ICmp.
1371+
if (!match(&Cmp, m_c_ICmp(Pred, m_Value(Add), m_Specific(Num))))
13811372
return nullptr;
13821373

1383-
if (!match(Op1, m_Value(Num)))
1374+
if (!ICmpInst::isEquality(Pred))
13841375
return nullptr;
13851376

13861377
// Create new icmp eq (num & (val - 1)), 0

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

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3301,6 +3301,8 @@ entry:
33013301
ret i1 %cmp
33023302
}
33033303

3304+
; PR 152851
3305+
33043306
define i1 @val_is_aligend_sub(i32 %num, i32 %val) {
33053307
; CHECK-LABEL: @val_is_aligend_sub(
33063308
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[NUM:%.*]])
@@ -3406,8 +3408,8 @@ define i1 @val_is_aligend_const_pow2(i32 %num) {
34063408
}
34073409

34083410
; Should not work for non-power-of-two cases
3409-
define i1 @val_is_aligend_const_non-pow2(i32 %num) {
3410-
; CHECK-LABEL: @val_is_aligend_const_non-pow2(
3411+
define i1 @val_is_aligend_const_non_pow2(i32 %num) {
3412+
; CHECK-LABEL: @val_is_aligend_const_non_pow2(
34113413
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 6
34123414
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED]], -7
34133415
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], [[NUM]]
@@ -3436,3 +3438,62 @@ define i1 @val_is_aligend_non_pow(i32 %num, i32 %val) {
34363438
%_0 = icmp eq i32 %_2.sroa.0.0, %num
34373439
ret i1 %_0
34383440
}
3441+
3442+
define i1 @val_is_aligend_const_pow2_multiuse(i32 %num) {
3443+
; CHECK-LABEL: @val_is_aligend_const_pow2_multiuse(
3444+
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
3445+
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED]], -4096
3446+
; CHECK-NEXT: call void @use(i32 [[_2_SROA_0_0]])
3447+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], [[NUM]]
3448+
; CHECK-NEXT: ret i1 [[_0]]
3449+
;
3450+
%num.biased = add i32 %num, 4095
3451+
%_2.sroa.0.0 = and i32 %num.biased, -4096
3452+
call void @use(i32 %_2.sroa.0.0)
3453+
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3454+
ret i1 %_0
3455+
}
3456+
3457+
define i1 @val_is_aligend_const_pow2_multiuse1(i32 %num) {
3458+
; CHECK-LABEL: @val_is_aligend_const_pow2_multiuse1(
3459+
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], 4095
3460+
; CHECK-NEXT: call void @use(i32 [[NUM_BIASED]])
3461+
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[NUM]], 4095
3462+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[TMP1]], 0
3463+
; CHECK-NEXT: ret i1 [[_0]]
3464+
;
3465+
%num.biased = add i32 %num, 4095
3466+
call void @use(i32 %num.biased)
3467+
%_2.sroa.0.0 = and i32 %num.biased, -4096
3468+
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3469+
ret i1 %_0
3470+
}
3471+
3472+
define i1 @val_is_aligend_add_multiuse(i32 %num, i32 %val) {
3473+
; CHECK-LABEL: @val_is_aligend_add_multiuse(
3474+
; CHECK-NEXT: [[TMP1:%.*]] = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[VAL:%.*]])
3475+
; CHECK-NEXT: [[POW:%.*]] = icmp eq i32 [[TMP1]], 1
3476+
; CHECK-NEXT: call void @llvm.assume(i1 [[POW]])
3477+
; CHECK-NEXT: [[MASK:%.*]] = add i32 [[VAL]], -1
3478+
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[VAL]]
3479+
; CHECK-NEXT: [[NUM_BIASED:%.*]] = add i32 [[NUM:%.*]], [[MASK]]
3480+
; CHECK-NEXT: [[_2_SROA_0_0:%.*]] = and i32 [[NUM_BIASED]], [[NEG]]
3481+
; CHECK-NEXT: call void @use(i32 [[_2_SROA_0_0]])
3482+
; CHECK-NEXT: [[_0:%.*]] = icmp eq i32 [[_2_SROA_0_0]], [[NUM]]
3483+
; CHECK-NEXT: ret i1 [[_0]]
3484+
;
3485+
%1 = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %val)
3486+
%pow = icmp eq i32 %1, 1
3487+
call void @llvm.assume(i1 %pow)
3488+
3489+
%mask = add i32 %val, -1
3490+
%neg = sub nsw i32 0, %val
3491+
3492+
%num.biased = add i32 %num, %mask
3493+
%_2.sroa.0.0 = and i32 %num.biased, %neg
3494+
3495+
call void @use(i32 %_2.sroa.0.0)
3496+
3497+
%_0 = icmp eq i32 %_2.sroa.0.0, %num
3498+
ret i1 %_0
3499+
}

0 commit comments

Comments
 (0)