[llvm] 3c20ede - [InstSimplify] fold integer min/max intrinsic with same args
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 29 08:53:50 PDT 2020
Author: Sanjay Patel
Date: 2020-07-29T11:53:41-04:00
New Revision: 3c20ede18b85ba17557d7060d7d5ef2050ce77c0
URL: https://github.com/llvm/llvm-project/commit/3c20ede18b85ba17557d7060d7d5ef2050ce77c0
DIFF: https://github.com/llvm/llvm-project/commit/3c20ede18b85ba17557d7060d7d5ef2050ce77c0.diff
LOG: [InstSimplify] fold integer min/max intrinsic with same args
Added:
Modified:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 01b2eb14a5b4..0f45182788e4 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -5258,6 +5258,10 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1,
case Intrinsic::smin:
case Intrinsic::umax:
case Intrinsic::umin: {
+ // If the arguments are the same, this is a no-op.
+ if (Op0 == Op1)
+ return Op0;
+
// Canonicalize constant operand as Op1.
if (isa<Constant>(Op0))
std::swap(Op0, Op1);
diff --git a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
index 13c9f0ebd4ab..fee630f9f230 100644
--- a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
@@ -14,8 +14,7 @@ declare <2 x i8> @llvm.umin.v2i8(<2 x i8>, <2 x i8>)
define i81 @smax_sameval(i81 %x) {
; CHECK-LABEL: @smax_sameval(
-; CHECK-NEXT: [[R:%.*]] = call i81 @llvm.smax.i81(i81 [[X:%.*]], i81 [[X]])
-; CHECK-NEXT: ret i81 [[R]]
+; CHECK-NEXT: ret i81 [[X:%.*]]
;
%r = call i81 @llvm.smax.i81(i81 %x, i81 %x)
ret i81 %r
@@ -23,8 +22,7 @@ define i81 @smax_sameval(i81 %x) {
define i3 @smin_sameval(i3 %x) {
; CHECK-LABEL: @smin_sameval(
-; CHECK-NEXT: [[R:%.*]] = call i3 @llvm.smin.i3(i3 [[X:%.*]], i3 [[X]])
-; CHECK-NEXT: ret i3 [[R]]
+; CHECK-NEXT: ret i3 [[X:%.*]]
;
%r = call i3 @llvm.smin.i3(i3 %x, i3 %x)
ret i3 %r
@@ -32,8 +30,7 @@ define i3 @smin_sameval(i3 %x) {
define <2 x i8> @umax_sameval(<2 x i8> %x) {
; CHECK-LABEL: @umax_sameval(
-; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.umax.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[X]])
-; CHECK-NEXT: ret <2 x i8> [[R]]
+; CHECK-NEXT: ret <2 x i8> [[X:%.*]]
;
%r = call <2 x i8> @llvm.umax.v2i8(<2 x i8> %x, <2 x i8> %x)
ret <2 x i8> %r
@@ -41,8 +38,7 @@ define <2 x i8> @umax_sameval(<2 x i8> %x) {
define <2 x i8> @umin_sameval(<2 x i8> %x) {
; CHECK-LABEL: @umin_sameval(
-; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[X]])
-; CHECK-NEXT: ret <2 x i8> [[R]]
+; CHECK-NEXT: ret <2 x i8> [[X:%.*]]
;
%r = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %x, <2 x i8> %x)
ret <2 x i8> %r
More information about the llvm-commits
mailing list