From 28e74e61801a0c01b57d08b100644a1cac4b3c7c Mon Sep 17 00:00:00 2001 From: "liqin.weng" Date: Mon, 11 Sep 2023 20:49:18 +0800 Subject: [VP] IR expansion for abs/smax/smin/umax/umin Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D159495 --- llvm/lib/CodeGen/ExpandVectorPredication.cpp | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp') diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp index edddf8a..2e12f7b 100644 --- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp +++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp @@ -171,6 +171,10 @@ struct CachingVPExpander { Value *expandPredicationInBinaryOperator(IRBuilder<> &Builder, VPIntrinsic &PI); + /// Lower this VP int call to a unpredicated int call. + Value *expandPredicationToIntCall(IRBuilder<> &Builder, VPIntrinsic &PI, + unsigned UnpredicatedIntrinsicID); + /// Lower this VP fp call to a unpredicated fp call. Value *expandPredicationToFPCall(IRBuilder<> &Builder, VPIntrinsic &PI, unsigned UnpredicatedIntrinsicID); @@ -279,6 +283,26 @@ CachingVPExpander::expandPredicationInBinaryOperator(IRBuilder<> &Builder, return NewBinOp; } +Value *CachingVPExpander::expandPredicationToIntCall( + IRBuilder<> &Builder, VPIntrinsic &VPI, unsigned UnpredicatedIntrinsicID) { + switch (UnpredicatedIntrinsicID) { + case Intrinsic::abs: + case Intrinsic::smax: + case Intrinsic::smin: + case Intrinsic::umax: + case Intrinsic::umin: { + Value *Op0 = VPI.getOperand(0); + Value *Op1 = VPI.getOperand(1); + Function *Fn = Intrinsic::getDeclaration( + VPI.getModule(), UnpredicatedIntrinsicID, {VPI.getType()}); + Value *NewOp = Builder.CreateCall(Fn, {Op0, Op1}, VPI.getName()); + replaceOperation(*NewOp, VPI); + return NewOp; + } + } + return nullptr; +} + Value *CachingVPExpander::expandPredicationToFPCall( IRBuilder<> &Builder, VPIntrinsic &VPI, unsigned UnpredicatedIntrinsicID) { assert((maySpeculateLanes(VPI) || VPI.canIgnoreVectorLengthParam()) && @@ -635,6 +659,16 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) { replaceOperation(*NewNegOp, VPI); return NewNegOp; } + case Intrinsic::vp_abs: + return expandPredicationToIntCall(Builder, VPI, Intrinsic::abs); + case Intrinsic::vp_smax: + return expandPredicationToIntCall(Builder, VPI, Intrinsic::smax); + case Intrinsic::vp_smin: + return expandPredicationToIntCall(Builder, VPI, Intrinsic::smin); + case Intrinsic::vp_umax: + return expandPredicationToIntCall(Builder, VPI, Intrinsic::umax); + case Intrinsic::vp_umin: + return expandPredicationToIntCall(Builder, VPI, Intrinsic::umin); case Intrinsic::vp_fabs: return expandPredicationToFPCall(Builder, VPI, Intrinsic::fabs); case Intrinsic::vp_sqrt: -- cgit v1.1