Skip to content

Commit 0575161

Browse files
committed
[InstCombine] Simplify max(min(abs()))
Remove smax from smax(smin(abs(x), y), 0) if y >= 0
1 parent 8e049fa commit 0575161

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,6 +1770,14 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
17701770
}
17711771
}
17721772

1773+
// smax(smin(abs(x), y), 0) -> smin(abs(x), y) where y >= 0
1774+
if (IID == Intrinsic::smax &&
1775+
match(I0, m_SMin(m_c_Intrinsic<Intrinsic::abs>(m_Value(), m_Value()),
1776+
m_NonNegative())) &&
1777+
match(I1, m_Zero())) {
1778+
return replaceInstUsesWith(*II, I0);
1779+
}
1780+
17731781
// umin(i1 X, i1 Y) -> and i1 X, Y
17741782
// smax(i1 X, i1 Y) -> and i1 X, Y
17751783
if ((IID == Intrinsic::umin || IID == Intrinsic::smax) &&

llvm/test/Transforms/InstCombine/abs-intrinsic.ll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,3 +847,25 @@ cond.end:
847847
%r = phi i32 [ %0, %cond.true ], [ 0, %entry ]
848848
ret i32 %r
849849
}
850+
851+
define i32 @test_abs_min_max_nonneg(i32 %0) {
852+
; CHECK-LABEL: @test_abs_min_max_nonneg(
853+
; CHECK-NEXT: call i32 @llvm.abs.i32
854+
; CHECK-NEXT: call i32 @llvm.smin.i32
855+
; CHECK-NOT: call i32 @llvm.smax.i32
856+
%2 = call i32 @llvm.abs.i32(i32 %0, i1 false)
857+
%3 = call i32 @llvm.smin.i32(i32 %2, i32 5)
858+
%4 = call i32 @llvm.smax.i32(i32 %3, i32 0)
859+
ret i32 %4
860+
}
861+
862+
define i32 @test_abs_min_max_unknown(i32 %0, i32 %1) {
863+
; CHECK-LABEL: @test_abs_min_max_unknown(
864+
; CHECK-NEXT: call i32 @llvm.abs.i32
865+
; CHECK-NEXT: call i32 @llvm.smin.i32
866+
; CHECK-NEXT: call i32 @llvm.smax.i32
867+
%3 = call i32 @llvm.abs.i32(i32 %0, i1 false)
868+
%4 = call i32 @llvm.smin.i32(i32 %3, i32 %1)
869+
%5 = call i32 @llvm.smax.i32(i32 %4, i32 0)
870+
ret i32 %5
871+
}

0 commit comments

Comments
 (0)