diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -6122,6 +6122,12 @@ m_Intrinsic(m_Value(), m_Specific(Op1)))) return IID == Intrinsic::umin ? Op0 : Op1; } + // smax(Abs(X, t/f), X) --> Abs(X, t/f) + // umin(Abs(X, t/f), X) --> Abs(X, t/f) + // smin(Abs(X, t/f), X) --> X + // umax(Abs(X, t/f), X) --> X + if (match(Op0, m_Intrinsic(m_Specific(Op1), m_Value()))) + return (IID == Intrinsic::smax || IID == Intrinsic::umin) ? Op0 : Op1; return nullptr; } diff --git a/llvm/test/Transforms/InstSimplify/minmax-intrin.ll b/llvm/test/Transforms/InstSimplify/minmax-intrin.ll --- a/llvm/test/Transforms/InstSimplify/minmax-intrin.ll +++ b/llvm/test/Transforms/InstSimplify/minmax-intrin.ll @@ -80,9 +80,7 @@ define i8 @umax_absT(i8 %x) { ; CHECK-LABEL: @umax_absT( -; CHECK-NEXT: [[XX:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 true) -; CHECK-NEXT: [[RET:%.*]] = call i8 @llvm.umax.i8(i8 [[XX]], i8 [[X]]) -; CHECK-NEXT: ret i8 [[RET]] +; CHECK-NEXT: ret i8 [[X:%.*]] ; %xx = call i8 @llvm.abs.i8(i8 %x, i1 true) %ret = call i8 @llvm.umax.i8(i8 %xx, i8 %x) @@ -103,8 +101,7 @@ define <2 x i8> @umin_absF(<2 x i8> %x) { ; CHECK-LABEL: @umin_absF( ; CHECK-NEXT: [[XX:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[X:%.*]], i1 false) -; CHECK-NEXT: [[RET:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X]], <2 x i8> [[XX]]) -; CHECK-NEXT: ret <2 x i8> [[RET]] +; CHECK-NEXT: ret <2 x i8> [[XX]] ; %xx = call <2 x i8> @llvm.abs.v2i8(<2 x i8> %x, i1 false) %ret = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %x, <2 x i8> %xx) @@ -114,8 +111,7 @@ define i8 @smax_absT(i8 %x) { ; CHECK-LABEL: @smax_absT( ; CHECK-NEXT: [[XX:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 true) -; CHECK-NEXT: [[RET:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[XX]]) -; CHECK-NEXT: ret i8 [[RET]] +; CHECK-NEXT: ret i8 [[XX]] ; %xx = call i8 @llvm.abs.i8(i8 %x, i1 true) %ret = call i8 @llvm.smax.i8(i8 %x, i8 %xx) @@ -124,9 +120,7 @@ define i8 @smin_absF(i8 %x) { ; CHECK-LABEL: @smin_absF( -; CHECK-NEXT: [[XX:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 false) -; CHECK-NEXT: [[RET:%.*]] = call i8 @llvm.smin.i8(i8 [[XX]], i8 [[X]]) -; CHECK-NEXT: ret i8 [[RET]] +; CHECK-NEXT: ret i8 [[X:%.*]] ; %xx = call i8 @llvm.abs.i8(i8 %x, i1 false) %ret = call i8 @llvm.smin.i8(i8 %xx, i8 %x)