aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ExpandVectorPredication.cpp
diff options
context:
space:
mode:
authorFraser Cormack <fraser@codeplay.com>2022-03-14 11:22:52 +0000
committerFraser Cormack <fraser@codeplay.com>2022-10-05 08:07:39 +0100
commit3362e2d57fc04d801ad8742ffaaeb27461e1cb0b (patch)
tree80255c15e12c3b590a5821550e7c310644c9d145 /llvm/lib/CodeGen/ExpandVectorPredication.cpp
parent2d149d17f069e671e064a000cb038590f4fc5303 (diff)
downloadllvm-3362e2d57fc04d801ad8742ffaaeb27461e1cb0b.zip
llvm-3362e2d57fc04d801ad8742ffaaeb27461e1cb0b.tar.gz
llvm-3362e2d57fc04d801ad8742ffaaeb27461e1cb0b.tar.bz2
[VP] Add IR expansion for vp.icmp and vp.fcmp
These intrinsics are simply expanded to regular icmp/fcmp instructions. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D121594
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r--llvm/lib/CodeGen/ExpandVectorPredication.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
index a0029fb..ef8a580 100644
--- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp
+++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
@@ -179,6 +179,10 @@ struct CachingVPExpander {
Value *expandPredicationInMemoryIntrinsic(IRBuilder<> &Builder,
VPIntrinsic &VPI);
+ /// \brief Lower this VP comparison to a call to an unpredicated comparison.
+ Value *expandPredicationInComparison(IRBuilder<> &Builder,
+ VPCmpIntrinsic &PI);
+
/// \brief Query TTI and expand the vector predication in \p P accordingly.
Value *expandPredication(VPIntrinsic &PI);
@@ -462,6 +466,24 @@ CachingVPExpander::expandPredicationInMemoryIntrinsic(IRBuilder<> &Builder,
return NewMemoryInst;
}
+Value *CachingVPExpander::expandPredicationInComparison(IRBuilder<> &Builder,
+ VPCmpIntrinsic &VPI) {
+ assert((maySpeculateLanes(VPI) || VPI.canIgnoreVectorLengthParam()) &&
+ "Implicitly dropping %evl in non-speculatable operator!");
+
+ auto OC = *VPI.getFunctionalOpcode();
+ assert(OC == Instruction::ICmp || OC == Instruction::FCmp);
+
+ Value *Op0 = VPI.getOperand(0);
+ Value *Op1 = VPI.getOperand(1);
+ auto Pred = VPI.getPredicate();
+
+ auto *NewCmp = Builder.CreateCmp(Pred, Op0, Op1);
+
+ replaceOperation(*NewCmp, VPI);
+ return NewCmp;
+}
+
void CachingVPExpander::discardEVLParameter(VPIntrinsic &VPI) {
LLVM_DEBUG(dbgs() << "Discard EVL parameter in " << VPI << "\n");
@@ -538,6 +560,9 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
if (auto *VPRI = dyn_cast<VPReductionIntrinsic>(&VPI))
return expandPredicationInReduction(Builder, *VPRI);
+ if (auto *VPCmp = dyn_cast<VPCmpIntrinsic>(&VPI))
+ return expandPredicationInComparison(Builder, *VPCmp);
+
switch (VPI.getIntrinsicID()) {
default:
break;