aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ExpandVectorPredication.cpp
diff options
context:
space:
mode:
authorliqin.weng <liqin.weng@spacemit.com>2023-09-09 15:34:46 +0800
committerliqin.weng <liqin.weng@spacemit.com>2023-09-09 15:34:46 +0800
commit1b622fff44cac855c79adad3ad78b1f4010a2b96 (patch)
tree6f6744998a275ac9db48d8ad7369706389f5d3c4 /llvm/lib/CodeGen/ExpandVectorPredication.cpp
parentc7b25faaac022c93ba32a7c97ebb675ed1b05f89 (diff)
downloadllvm-1b622fff44cac855c79adad3ad78b1f4010a2b96.zip
llvm-1b622fff44cac855c79adad3ad78b1f4010a2b96.tar.gz
llvm-1b622fff44cac855c79adad3ad78b1f4010a2b96.tar.bz2
[VP] IR expansion for inttoptr/ptrtoint
Add basic handling for VP ops that can expand to cast intrinsics Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D159478
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r--llvm/lib/CodeGen/ExpandVectorPredication.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
index 9807be0..edddf8a 100644
--- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp
+++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
@@ -179,6 +179,10 @@ struct CachingVPExpander {
Value *expandPredicationInReduction(IRBuilder<> &Builder,
VPReductionIntrinsic &PI);
+ /// Lower this VP cast operation to a non-VP intrinsic.
+ Value *expandPredicationToCastIntrinsic(IRBuilder<> &Builder,
+ VPIntrinsic &VPI);
+
/// Lower this VP memory operation to a non-VP intrinsic.
Value *expandPredicationInMemoryIntrinsic(IRBuilder<> &Builder,
VPIntrinsic &VPI);
@@ -436,6 +440,27 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder,
return Reduction;
}
+Value *CachingVPExpander::expandPredicationToCastIntrinsic(IRBuilder<> &Builder,
+ VPIntrinsic &VPI) {
+ // TODO: Add anthor Cast Intrinsic, VP_TRUNC/VP_ZEXT
+ switch (VPI.getIntrinsicID()) {
+ default:
+ llvm_unreachable("Not a VP memory intrinsic");
+ case Intrinsic::vp_inttoptr: {
+ Value *NewOp =
+ Builder.CreateIntToPtr(VPI.getOperand(0), VPI.getType(), VPI.getName());
+ replaceOperation(*NewOp, VPI);
+ return NewOp;
+ }
+ case Intrinsic::vp_ptrtoint: {
+ Value *NewOp =
+ Builder.CreatePtrToInt(VPI.getOperand(0), VPI.getType(), VPI.getName());
+ replaceOperation(*NewOp, VPI);
+ return NewOp;
+ }
+ }
+}
+
Value *
CachingVPExpander::expandPredicationInMemoryIntrinsic(IRBuilder<> &Builder,
VPIntrinsic &VPI) {
@@ -598,6 +623,10 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
if (auto *VPCmp = dyn_cast<VPCmpIntrinsic>(&VPI))
return expandPredicationInComparison(Builder, *VPCmp);
+ if (VPCastIntrinsic::isVPCast(VPI.getIntrinsicID())) {
+ return expandPredicationToCastIntrinsic(Builder, VPI);
+ }
+
switch (VPI.getIntrinsicID()) {
default:
break;