aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ExpandVectorPredication.cpp
diff options
context:
space:
mode:
authorliqin.weng <liqin.weng@spacemit.com>2023-09-11 20:49:18 +0800
committerliqin.weng <liqin.weng@spacemit.com>2023-09-11 21:14:37 +0800
commit28e74e61801a0c01b57d08b100644a1cac4b3c7c (patch)
treeb4509d2068a3ac89130a5b5811d794688112cb13 /llvm/lib/CodeGen/ExpandVectorPredication.cpp
parent706afc9778827dfd8064192c26acd0bc1c421e48 (diff)
downloadllvm-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.cpp34
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: