[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