summaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/MLInlineAdvisor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/MLInlineAdvisor.cpp')
-rw-r--r--llvm/lib/Analysis/MLInlineAdvisor.cpp67
1 files changed, 41 insertions, 26 deletions
diff --git a/llvm/lib/Analysis/MLInlineAdvisor.cpp b/llvm/lib/Analysis/MLInlineAdvisor.cpp
index 8853a13972be..f90717d3085e 100644
--- a/llvm/lib/Analysis/MLInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/MLInlineAdvisor.cpp
@@ -27,6 +27,7 @@
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/ReleaseModeModelRunner.h"
#include "llvm/Analysis/TargetTransformInfo.h"
+#include "llvm/Analysis/TensorSpec.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Module.h"
@@ -74,21 +75,22 @@ llvm::getReleaseModeAdvisor(Module &M, ModuleAnalysisManager &MAM,
if (!llvm::isEmbeddedModelEvaluatorValid<CompiledModelType>() &&
InteractiveChannelBaseName.empty())
return nullptr;
- std::unique_ptr<MLModelRunner> AOTRunner;
- if (InteractiveChannelBaseName.empty())
- AOTRunner = std::make_unique<ReleaseModeModelRunner<CompiledModelType>>(
- M.getContext(), FeatureMap, DecisionName,
- EmbeddedModelRunnerOptions().setModelSelector(ModelSelector));
- else {
- auto Features = FeatureMap;
- if (InteractiveIncludeDefault)
- Features.push_back(DefaultDecisionSpec);
- AOTRunner = std::make_unique<InteractiveModelRunner>(
- M.getContext(), Features, InlineDecisionSpec,
- InteractiveChannelBaseName + ".out",
- InteractiveChannelBaseName + ".in");
- }
- return std::make_unique<MLInlineAdvisor>(M, MAM, std::move(AOTRunner),
+ auto RunnerFactory = [&](const std::vector<TensorSpec> &InputFeatures)
+ -> std::unique_ptr<MLModelRunner> {
+ std::unique_ptr<MLModelRunner> AOTRunner;
+ if (InteractiveChannelBaseName.empty())
+ AOTRunner = std::make_unique<ReleaseModeModelRunner<CompiledModelType>>(
+ M.getContext(), InputFeatures, DecisionName,
+ EmbeddedModelRunnerOptions().setModelSelector(ModelSelector));
+ else {
+ AOTRunner = std::make_unique<InteractiveModelRunner>(
+ M.getContext(), InputFeatures, InlineDecisionSpec,
+ InteractiveChannelBaseName + ".out",
+ InteractiveChannelBaseName + ".in");
+ }
+ return AOTRunner;
+ };
+ return std::make_unique<MLInlineAdvisor>(M, MAM, RunnerFactory,
GetDefaultAdvice);
}
@@ -106,8 +108,9 @@ static cl::opt<bool> KeepFPICache(
"For test - keep the ML Inline advisor's FunctionPropertiesInfo cache"),
cl::init(false));
-// clang-format off
-std::vector<TensorSpec> llvm::FeatureMap{
+const std::vector<TensorSpec> &MLInlineAdvisor::getInitialFeatureMap() {
+ // clang-format off
+static std::vector<TensorSpec> FeatureMap{
#define POPULATE_NAMES(DTYPE, SHAPE, NAME, __) TensorSpec::createSpec<DTYPE>(#NAME, SHAPE),
// InlineCost features - these must come first
INLINE_COST_FEATURE_ITERATOR(POPULATE_NAMES)
@@ -116,7 +119,9 @@ std::vector<TensorSpec> llvm::FeatureMap{
INLINE_FEATURE_ITERATOR(POPULATE_NAMES)
#undef POPULATE_NAMES
};
-// clang-format on
+ // clang-format on
+ return FeatureMap;
+}
const char *const llvm::DecisionName = "inlining_decision";
const TensorSpec llvm::InlineDecisionSpec =
@@ -138,17 +143,17 @@ CallBase *getInlinableCS(Instruction &I) {
MLInlineAdvisor::MLInlineAdvisor(
Module &M, ModuleAnalysisManager &MAM,
- std::unique_ptr<MLModelRunner> Runner,
+ std::function<
+ std::unique_ptr<MLModelRunner>(const std::vector<TensorSpec> &)>
+ GetModelRunner,
std::function<bool(CallBase &)> GetDefaultAdvice)
: InlineAdvisor(
M, MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager()),
- ModelRunner(std::move(Runner)), GetDefaultAdvice(GetDefaultAdvice),
+ GetDefaultAdvice(GetDefaultAdvice), FeatureMap(getInitialFeatureMap()),
CG(MAM.getResult<LazyCallGraphAnalysis>(M)),
UseIR2Vec(MAM.getCachedResult<IR2VecVocabAnalysis>(M) != nullptr),
InitialIRSize(getModuleIRSize()), CurrentIRSize(InitialIRSize),
PSI(MAM.getResult<ProfileSummaryAnalysis>(M)) {
- assert(ModelRunner);
- ModelRunner->switchContext("");
// Extract the 'call site height' feature - the position of a call site
// relative to the farthest statically reachable SCC node. We don't mutate
// this value while inlining happens. Empirically, this feature proved
@@ -188,7 +193,7 @@ MLInlineAdvisor::MLInlineAdvisor(
}
NodeCount = AllNodes.size();
- if (auto IR2VecVocabResult = MAM.getCachedResult<IR2VecVocabAnalysis>(M)) {
+ if (auto *IR2VecVocabResult = MAM.getCachedResult<IR2VecVocabAnalysis>(M)) {
if (!IR2VecVocabResult->isValid()) {
M.getContext().emitError("IR2VecVocabAnalysis is not valid");
return;
@@ -200,6 +205,15 @@ MLInlineAdvisor::MLInlineAdvisor(
FeatureMap.push_back(
TensorSpec::createSpec<float>("caller_embedding", {IR2VecDim}));
}
+ if (InteractiveIncludeDefault)
+ FeatureMap.push_back(DefaultDecisionSpec);
+
+ ModelRunner = GetModelRunner(getFeatureMap());
+ if (!ModelRunner) {
+ M.getContext().emitError("Could not create model runner");
+ return;
+ }
+ ModelRunner->switchContext("");
}
unsigned MLInlineAdvisor::getInitialFunctionLevel(const Function &F) const {
@@ -471,7 +485,8 @@ std::unique_ptr<InlineAdvice> MLInlineAdvisor::getAdviceImpl(CallBase &CB) {
}
// This one would have been set up to be right at the end.
if (!InteractiveChannelBaseName.empty() && InteractiveIncludeDefault)
- *ModelRunner->getTensor<int64_t>(FeatureMap.size()) = GetDefaultAdvice(CB);
+ *ModelRunner->getTensor<int64_t>(getFeatureMap().size() - 1) =
+ GetDefaultAdvice(CB);
return getAdviceFromModel(CB, ORE);
}
@@ -549,8 +564,8 @@ void MLInlineAdvice::reportContextForRemark(
DiagnosticInfoOptimizationBase &OR) {
using namespace ore;
OR << NV("Callee", Callee->getName());
- for (size_t I = 0; I < FeatureMap.size(); ++I)
- OR << NV(FeatureMap[I].name(),
+ for (size_t I = 0; I < getAdvisor()->getFeatureMap().size(); ++I)
+ OR << NV(getAdvisor()->getFeatureMap()[I].name(),
*getAdvisor()->getModelRunner().getTensor<int64_t>(I));
OR << NV("ShouldInline", isInliningRecommended());
}