Skip to content

Commit 77bd90e

Browse files
committed
[InstCombine] Fold (add (add A, 1), (sext (icmp ne A, 0))) to call umax(A, 1)
1 parent 61f0c5e commit 77bd90e

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,15 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) {
17751775
}
17761776
}
17771777

1778+
// (add (add A, 1), (sext (icmp ne A, 0))) => call umax(A, 1)
1779+
if (match(LHS, m_OneUse(m_Add(m_Value(A), m_One()))) &&
1780+
match(RHS, m_OneUse(m_SExt(m_OneUse(m_SpecificICmp(
1781+
ICmpInst::ICMP_NE, m_Specific(A), m_ZeroInt())))))) {
1782+
Value *OneConst = ConstantInt::get(A->getType(), 1);
1783+
Value *UMax = Builder.CreateBinaryIntrinsic(Intrinsic::umax, A, OneConst);
1784+
return replaceInstUsesWith(I, UMax);
1785+
}
1786+
17781787
if (Instruction *Ashr = foldAddToAshr(I))
17791788
return Ashr;
17801789

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@
99
define i32 @add_sext_icmp(i32 %A) {
1010
; CHECK-LABEL: define i32 @add_sext_icmp(
1111
; CHECK-SAME: i32 [[A:%.*]]) {
12-
; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[A]], 1
13-
; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i32 [[A]], 0
14-
; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i32
15-
; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[ADD1]], [[SEXT]]
12+
; CHECK-NEXT: [[ADD2:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 1)
1613
; CHECK-NEXT: ret i32 [[ADD2]]
1714
;
1815
%add1 = add i32 %A, 1
@@ -25,10 +22,7 @@ define i32 @add_sext_icmp(i32 %A) {
2522
define i32 @add_sext_icmp_commutative(i32 %A) {
2623
; CHECK-LABEL: define i32 @add_sext_icmp_commutative(
2724
; CHECK-SAME: i32 [[A:%.*]]) {
28-
; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[A]], 1
29-
; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i32 [[A]], 0
30-
; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i32
31-
; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[ADD1]], [[SEXT]]
25+
; CHECK-NEXT: [[ADD2:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 1)
3226
; CHECK-NEXT: ret i32 [[ADD2]]
3327
;
3428
%add1 = add i32 %A, 1
@@ -77,10 +71,7 @@ define i32 @add_sext_icmp_negative_pred(i32 %A) {
7771
define i32 @add_sext_icmp_multi_use_add2(i32 %A) {
7872
; CHECK-LABEL: define i32 @add_sext_icmp_multi_use_add2(
7973
; CHECK-SAME: i32 [[A:%.*]]) {
80-
; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[A]], 1
81-
; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i32 [[A]], 0
82-
; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i32
83-
; CHECK-NEXT: [[ADD2:%.*]] = add i32 [[ADD1]], [[SEXT]]
74+
; CHECK-NEXT: [[ADD2:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 1)
8475
; CHECK-NEXT: call void @use(i32 [[ADD2]])
8576
; CHECK-NEXT: ret i32 [[ADD2]]
8677
;

0 commit comments

Comments
 (0)