diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 60505ac208c2c..9e4c5873e4ff8 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -1538,6 +1538,19 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, {F->getReturnType()}); return true; } + } else if (F->arg_size() == 2) { + Intrinsic::ID IID = + StringSwitch(Name) + .Cases({"max.s", "max.i", "max.ll"}, Intrinsic::smax) + .Cases({"min.s", "min.i", "min.ll"}, Intrinsic::smin) + .Cases({"max.us", "max.ui", "max.ull"}, Intrinsic::umax) + .Cases({"min.us", "min.ui", "min.ull"}, Intrinsic::umin) + .Default(Intrinsic::not_intrinsic); + if (IID != Intrinsic::not_intrinsic) { + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID, + {F->getReturnType()}); + return true; + } } // Check for nvvm intrinsics that need a return type adjustment. @@ -1581,10 +1594,6 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, // nvvm.ex2.approx.{f,ftz.f,d,f16x2} Expand = Name == "f" || Name == "ftz.f" || Name == "d" || Name == "f16x2"; - else if (Name.consume_front("max.") || Name.consume_front("min.")) - // nvvm.{min,max}.{i,ii,ui,ull} - Expand = Name == "s" || Name == "i" || Name == "ll" || Name == "us" || - Name == "ui" || Name == "ull"; else if (Name.consume_front("atomic.load.")) // nvvm.atomic.load.add.{f32,f64}.p // nvvm.atomic.load.{inc,dec}.32.p @@ -2649,24 +2658,6 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, : AtomicRMWInst::UDecWrap; Rep = Builder.CreateAtomicRMW(Op, Ptr, Val, MaybeAlign(), AtomicOrdering::SequentiallyConsistent); - } else if (Name.consume_front("max.") && - (Name == "s" || Name == "i" || Name == "ll" || Name == "us" || - Name == "ui" || Name == "ull")) { - Value *Arg0 = CI->getArgOperand(0); - Value *Arg1 = CI->getArgOperand(1); - Value *Cmp = Name.starts_with("u") - ? Builder.CreateICmpUGE(Arg0, Arg1, "max.cond") - : Builder.CreateICmpSGE(Arg0, Arg1, "max.cond"); - Rep = Builder.CreateSelect(Cmp, Arg0, Arg1, "max"); - } else if (Name.consume_front("min.") && - (Name == "s" || Name == "i" || Name == "ll" || Name == "us" || - Name == "ui" || Name == "ull")) { - Value *Arg0 = CI->getArgOperand(0); - Value *Arg1 = CI->getArgOperand(1); - Value *Cmp = Name.starts_with("u") - ? Builder.CreateICmpULE(Arg0, Arg1, "min.cond") - : Builder.CreateICmpSLE(Arg0, Arg1, "min.cond"); - Rep = Builder.CreateSelect(Cmp, Arg0, Arg1, "min"); } else if (Name == "clz.ll") { // llvm.nvvm.clz.ll returns an i32, but llvm.ctlz.i64 returns an i64. Value *Arg = CI->getArgOperand(0); diff --git a/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll b/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll index 0f749cf81f39b..4f07946e503c4 100644 --- a/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll +++ b/llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll @@ -158,52 +158,40 @@ define void @tanh(float %a) { ; CHECK-LABEL: @min_max define void @min_max(i16 %a1, i16 %a2, i32 %b1, i32 %b2, i64 %c1, i64 %c2) { -; CHECK: [[maxs:%[a-zA-Z0-9.]+]] = icmp sge i16 %a1, %a2 -; CHECK: select i1 [[maxs]], i16 %a1, i16 %a2 +; CHECK: %r1 = call i16 @llvm.smax.i16(i16 %a1, i16 %a2) %r1 = call i16 @llvm.nvvm.max.s(i16 %a1, i16 %a2) -; CHECK: [[maxi:%[a-zA-Z0-9.]+]] = icmp sge i32 %b1, %b2 -; CHECK: select i1 [[maxi]], i32 %b1, i32 %b2 +; CHECK: %r2 = call i32 @llvm.smax.i32(i32 %b1, i32 %b2) %r2 = call i32 @llvm.nvvm.max.i(i32 %b1, i32 %b2) -; CHECK: [[maxll:%[a-zA-Z0-9.]+]] = icmp sge i64 %c1, %c2 -; CHECK: select i1 [[maxll]], i64 %c1, i64 %c2 +; CHECK: %r3 = call i64 @llvm.smax.i64(i64 %c1, i64 %c2) %r3 = call i64 @llvm.nvvm.max.ll(i64 %c1, i64 %c2) -; CHECK: [[maxus:%[a-zA-Z0-9.]+]] = icmp uge i16 %a1, %a2 -; CHECK: select i1 [[maxus]], i16 %a1, i16 %a2 +; CHECK: %r4 = call i16 @llvm.umax.i16(i16 %a1, i16 %a2) %r4 = call i16 @llvm.nvvm.max.us(i16 %a1, i16 %a2) -; CHECK: [[maxui:%[a-zA-Z0-9.]+]] = icmp uge i32 %b1, %b2 -; CHECK: select i1 [[maxui]], i32 %b1, i32 %b2 +; CHECK: %r5 = call i32 @llvm.umax.i32(i32 %b1, i32 %b2) %r5 = call i32 @llvm.nvvm.max.ui(i32 %b1, i32 %b2) -; CHECK: [[maxull:%[a-zA-Z0-9.]+]] = icmp uge i64 %c1, %c2 -; CHECK: select i1 [[maxull]], i64 %c1, i64 %c2 +; CHECK: %r6 = call i64 @llvm.umax.i64(i64 %c1, i64 %c2) %r6 = call i64 @llvm.nvvm.max.ull(i64 %c1, i64 %c2) -; CHECK: [[mins:%[a-zA-Z0-9.]+]] = icmp sle i16 %a1, %a2 -; CHECK: select i1 [[mins]], i16 %a1, i16 %a2 +; CHECK: %r7 = call i16 @llvm.smin.i16(i16 %a1, i16 %a2) %r7 = call i16 @llvm.nvvm.min.s(i16 %a1, i16 %a2) -; CHECK: [[mini:%[a-zA-Z0-9.]+]] = icmp sle i32 %b1, %b2 -; CHECK: select i1 [[mini]], i32 %b1, i32 %b2 +; CHECK: %r8 = call i32 @llvm.smin.i32(i32 %b1, i32 %b2) %r8 = call i32 @llvm.nvvm.min.i(i32 %b1, i32 %b2) -; CHECK: [[minll:%[a-zA-Z0-9.]+]] = icmp sle i64 %c1, %c2 -; CHECK: select i1 [[minll]], i64 %c1, i64 %c2 +; CHECK: %r9 = call i64 @llvm.smin.i64(i64 %c1, i64 %c2) %r9 = call i64 @llvm.nvvm.min.ll(i64 %c1, i64 %c2) -; CHECK: [[minus:%[a-zA-Z0-9.]+]] = icmp ule i16 %a1, %a2 -; CHECK: select i1 [[minus]], i16 %a1, i16 %a2 +; CHECK: %r10 = call i16 @llvm.umin.i16(i16 %a1, i16 %a2) %r10 = call i16 @llvm.nvvm.min.us(i16 %a1, i16 %a2) -; CHECK: [[minui:%[a-zA-Z0-9.]+]] = icmp ule i32 %b1, %b2 -; CHECK: select i1 [[minui]], i32 %b1, i32 %b2 +; CHECK: %r11 = call i32 @llvm.umin.i32(i32 %b1, i32 %b2) %r11 = call i32 @llvm.nvvm.min.ui(i32 %b1, i32 %b2) -; CHECK: [[minull:%[a-zA-Z0-9.]+]] = icmp ule i64 %c1, %c2 -; CHECK: select i1 [[minull]], i64 %c1, i64 %c2 +; CHECK: %r12 = call i64 @llvm.umin.i64(i64 %c1, i64 %c2) %r12 = call i64 @llvm.nvvm.min.ull(i64 %c1, i64 %c2) ret void