diff options
Diffstat (limited to 'llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp index 51dad439f57d..0d3dd650b8ee 100644 --- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp +++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp @@ -16,6 +16,7 @@ #include "llvm/Analysis/ObjCARCUtil.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/CodeGen/ExpandVectorPredication.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetPassConfig.h" @@ -46,7 +47,7 @@ static cl::opt<int64_t> MemIntrinsicExpandSizeThresholdOpt( namespace { struct PreISelIntrinsicLowering { - const TargetMachine &TM; + const TargetMachine *TM; const function_ref<TargetTransformInfo &(Function &)> LookupTTI; const function_ref<TargetLibraryInfo &(Function &)> LookupTLI; @@ -56,7 +57,7 @@ struct PreISelIntrinsicLowering { const bool UseMemIntrinsicLibFunc; explicit PreISelIntrinsicLowering( - const TargetMachine &TM_, + const TargetMachine *TM_, function_ref<TargetTransformInfo &(Function &)> LookupTTI_, function_ref<TargetLibraryInfo &(Function &)> LookupTLI_, bool UseMemIntrinsicLibFunc_ = true) @@ -222,10 +223,12 @@ bool PreISelIntrinsicLowering::shouldExpandMemIntrinsicWithSize( return SizeVal > Threshold || Threshold == 0; } -static bool canEmitLibcall(const TargetMachine &TM, Function *F, +static bool canEmitLibcall(const TargetMachine *TM, Function *F, RTLIB::Libcall LC) { // TODO: Should this consider the address space of the memcpy? - const TargetLowering *TLI = TM.getSubtargetImpl(*F)->getTargetLowering(); + if (!TM) + return true; + const TargetLowering *TLI = TM->getSubtargetImpl(*F)->getTargetLowering(); return TLI->getLibcallName(LC) != nullptr; } @@ -351,6 +354,18 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const { return Changed; }); break; +#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \ + case Intrinsic::VPID: +#include "llvm/IR/VPIntrinsics.def" + forEachCall(F, [&](CallInst *CI) { + Function *Parent = CI->getParent()->getParent(); + const TargetTransformInfo &TTI = LookupTTI(*Parent); + auto *VPI = cast<VPIntrinsic>(CI); + return expandVectorPredicationIntrinsic(*VPI, TTI); + }); + // Not all intrinsics are removed, but the code is changed in any case. + Changed = true; + break; case Intrinsic::objc_autorelease: Changed |= lowerObjCCall(F, "objc_autorelease"); break; @@ -453,7 +468,7 @@ public: return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); }; - const auto &TM = getAnalysis<TargetPassConfig>().getTM<TargetMachine>(); + const auto *TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>(); PreISelIntrinsicLowering Lowering(TM, LookupTTI, LookupTLI); return Lowering.lowerIntrinsics(M); } |
