diff options
author | liqin.weng <liqin.weng@spacemit.com> | 2023-09-09 15:34:46 +0800 |
---|---|---|
committer | liqin.weng <liqin.weng@spacemit.com> | 2023-09-09 15:34:46 +0800 |
commit | 1b622fff44cac855c79adad3ad78b1f4010a2b96 (patch) | |
tree | 6f6744998a275ac9db48d8ad7369706389f5d3c4 /llvm/lib/CodeGen/ExpandVectorPredication.cpp | |
parent | c7b25faaac022c93ba32a7c97ebb675ed1b05f89 (diff) | |
download | llvm-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.cpp | 29 |
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; |