diff options
author | liqin.weng <liqin.weng@spacemit.com> | 2023-09-11 20:49:18 +0800 |
---|---|---|
committer | liqin.weng <liqin.weng@spacemit.com> | 2023-09-11 21:14:37 +0800 |
commit | 28e74e61801a0c01b57d08b100644a1cac4b3c7c (patch) | |
tree | b4509d2068a3ac89130a5b5811d794688112cb13 /llvm/lib/CodeGen/ExpandVectorPredication.cpp | |
parent | 706afc9778827dfd8064192c26acd0bc1c421e48 (diff) | |
download | llvm-28e74e61801a0c01b57d08b100644a1cac4b3c7c.zip llvm-28e74e61801a0c01b57d08b100644a1cac4b3c7c.tar.gz llvm-28e74e61801a0c01b57d08b100644a1cac4b3c7c.tar.bz2 |
[VP] IR expansion for abs/smax/smin/umax/umin
Reviewed By: RKSimon
Differential Revision: https://reviews.llvm.org/D159495
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ExpandVectorPredication.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
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: |