diff options
author | LiqinWeng <liqin.weng@spacemit.com> | 2024-11-25 10:05:29 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-25 10:05:29 +0800 |
commit | 02408d6b28951b2e094d00a70a398883c6b0cb33 (patch) | |
tree | fbdf3549f647638fd6ab81a6b593da846f5fd21f /llvm/lib/CodeGen/ExpandVectorPredication.cpp | |
parent | e70f9e20964161abd3518d77b9efc736c6b6255e (diff) | |
download | llvm-02408d6b28951b2e094d00a70a398883c6b0cb33.zip llvm-02408d6b28951b2e094d00a70a398883c6b0cb33.tar.gz llvm-02408d6b28951b2e094d00a70a398883c6b0cb33.tar.bz2 |
[VP] Refactoring some functions in ExpandVectorPredication.NFC (#115840)
Building vp intrinsic functions using a unified interface for
expandPredicationToIntCall/expandPredicationToFPCall/expandPredicationToCastIntrinsic
functions.
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ExpandVectorPredication.cpp | 116 |
1 files changed, 26 insertions, 90 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp index 4274c13..5ca2238 100644 --- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp +++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp @@ -175,8 +175,7 @@ struct CachingVPExpander { VPIntrinsic &PI); /// Lower this VP int call to a unpredicated int call. - Value *expandPredicationToIntCall(IRBuilder<> &Builder, VPIntrinsic &PI, - unsigned UnpredicatedIntrinsicID); + Value *expandPredicationToIntCall(IRBuilder<> &Builder, VPIntrinsic &PI); /// Lower this VP fp call to a unpredicated fp call. Value *expandPredicationToFPCall(IRBuilder<> &Builder, VPIntrinsic &PI, @@ -287,33 +286,19 @@ 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); - Value *NewOp = Builder.CreateIntrinsic( - UnpredicatedIntrinsicID, {VPI.getType()}, {Op0, Op1}, - /*FMFSource=*/nullptr, VPI.getName()); - replaceOperation(*NewOp, VPI); - return NewOp; - } - case Intrinsic::bswap: - case Intrinsic::bitreverse: { - Value *Op = VPI.getOperand(0); - Value *NewOp = - Builder.CreateIntrinsic(UnpredicatedIntrinsicID, {VPI.getType()}, {Op}, - /*FMFSource=*/nullptr, VPI.getName()); - replaceOperation(*NewOp, VPI); - return NewOp; - } +Value *CachingVPExpander::expandPredicationToIntCall(IRBuilder<> &Builder, + VPIntrinsic &VPI) { + std::optional<unsigned> FID = VPI.getFunctionalIntrinsicID(); + if (!FID) + return nullptr; + SmallVector<Value *, 2> Argument; + for (unsigned i = 0; i < VPI.getNumOperands() - 3; i++) { + Argument.push_back(VPI.getOperand(i)); } - return nullptr; + Value *NewOp = Builder.CreateIntrinsic(FID.value(), {VPI.getType()}, Argument, + /*FMFSource=*/nullptr, VPI.getName()); + replaceOperation(*NewOp, VPI); + return NewOp; } Value *CachingVPExpander::expandPredicationToFPCall( @@ -323,20 +308,15 @@ Value *CachingVPExpander::expandPredicationToFPCall( switch (UnpredicatedIntrinsicID) { case Intrinsic::fabs: - case Intrinsic::sqrt: { - Value *Op0 = VPI.getOperand(0); - Value *NewOp = - Builder.CreateIntrinsic(UnpredicatedIntrinsicID, {VPI.getType()}, {Op0}, - /*FMFSource=*/nullptr, VPI.getName()); - replaceOperation(*NewOp, VPI); - return NewOp; - } + case Intrinsic::sqrt: case Intrinsic::maxnum: case Intrinsic::minnum: { - Value *Op0 = VPI.getOperand(0); - Value *Op1 = VPI.getOperand(1); + SmallVector<Value *, 2> Argument; + for (unsigned i = 0; i < VPI.getNumOperands() - 3; i++) { + Argument.push_back(VPI.getOperand(i)); + } Value *NewOp = Builder.CreateIntrinsic( - UnpredicatedIntrinsicID, {VPI.getType()}, {Op0, Op1}, + UnpredicatedIntrinsicID, {VPI.getType()}, Argument, /*FMFSource=*/nullptr, VPI.getName()); replaceOperation(*NewOp, VPI); return NewOp; @@ -438,56 +418,13 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder, Value *CachingVPExpander::expandPredicationToCastIntrinsic(IRBuilder<> &Builder, VPIntrinsic &VPI) { - Value *CastOp = nullptr; - switch (VPI.getIntrinsicID()) { - default: - llvm_unreachable("Not a VP cast intrinsic"); - case Intrinsic::vp_sext: - CastOp = - Builder.CreateSExt(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_zext: - CastOp = - Builder.CreateZExt(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_trunc: - CastOp = - Builder.CreateTrunc(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_inttoptr: - CastOp = - Builder.CreateIntToPtr(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_ptrtoint: - CastOp = - Builder.CreatePtrToInt(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_fptosi: - CastOp = - Builder.CreateFPToSI(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; + Intrinsic::ID VPID = VPI.getIntrinsicID(); + unsigned CastOpcode = VPIntrinsic::getFunctionalOpcodeForVP(VPID).value(); + assert(Instruction::isCast(CastOpcode)); + Value *CastOp = + Builder.CreateCast(Instruction::CastOps(CastOpcode), VPI.getOperand(0), + VPI.getType(), VPI.getName()); - case Intrinsic::vp_fptoui: - CastOp = - Builder.CreateFPToUI(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_sitofp: - CastOp = - Builder.CreateSIToFP(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_uitofp: - CastOp = - Builder.CreateUIToFP(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_fptrunc: - CastOp = - Builder.CreateFPTrunc(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - case Intrinsic::vp_fpext: - CastOp = - Builder.CreateFPExt(VPI.getOperand(0), VPI.getType(), VPI.getName()); - break; - } replaceOperation(*CastOp, VPI); return CastOp; } @@ -672,8 +609,7 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) { case Intrinsic::vp_umin: case Intrinsic::vp_bswap: case Intrinsic::vp_bitreverse: - return expandPredicationToIntCall(Builder, VPI, - VPI.getFunctionalIntrinsicID().value()); + return expandPredicationToIntCall(Builder, VPI); case Intrinsic::vp_fabs: case Intrinsic::vp_sqrt: case Intrinsic::vp_maxnum: |