summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp')
-rw-r--r--llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp25
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);
}