[llvm] [MLGO] Model selection for models lowered through EmitC (PR #212650)
Paul Kirth via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 30 08:47:32 PDT 2026
================
@@ -72,20 +72,67 @@ using CompiledModelType = llvm::InlinerSizeModel;
using CompiledModelType = NoopSavedModelImpl;
#endif
+#if defined(LLVM_HAVE_EMITC_COMPILE_INLINER)
+#include "llvm/Analysis/EmitCModelRunner.h"
+#include "llvm/Analysis/InlinerSizeModelMulti.h"
+
+enum class EmitCModelChoice {
+ Default,
+#define MLGO_MODEL(CLASS_NAME, CLI_FLAG) CLASS_NAME,
+#include "llvm/Analysis/InlinerModels.def"
+};
+
+static llvm::cl::opt<EmitCModelChoice> SelectedMLGOModel(
+ "mlgo-model", llvm::cl::desc("Select the MLGO model to execute:"),
+ llvm::cl::init(EmitCModelChoice::Default),
+ llvm::cl::values(clEnumValN(EmitCModelChoice::Default, "default",
+ "Use standard heuristic")
+#define MLGO_MODEL(CLASS_NAME, CLI_FLAG) \
+ , clEnumValN(EmitCModelChoice::CLASS_NAME, CLI_FLAG, \
+ "Use the " CLI_FLAG " MLGO model")
+#include "llvm/Analysis/InlinerModels.def"
+ ));
+
+static std::unique_ptr<MLModelRunner>
+createEmitCModelRunner(LLVMContext &Ctx,
+ const std::vector<TensorSpec> &InputFeatures) {
+ switch (SelectedMLGOModel) {
+ case EmitCModelChoice::Default:
+ return nullptr;
+#define MLGO_MODEL(CLASS_NAME, CLI_FLAG) \
+ case EmitCModelChoice::CLASS_NAME: \
+ return std::make_unique<EmitCModelRunner<CLASS_NAME>>(Ctx, InputFeatures);
+#include "llvm/Analysis/InlinerModels.def"
+ }
+ llvm_unreachable("Unknown MLGO model type!");
+}
+#endif
+
std::unique_ptr<InlineAdvisor>
llvm::getReleaseModeAdvisor(Module &M, ModuleAnalysisManager &MAM,
std::function<bool(CallBase &)> GetDefaultAdvice) {
if (!llvm::isEmbeddedModelEvaluatorValid<CompiledModelType>() &&
- InteractiveChannelBaseName.empty())
+ InteractiveChannelBaseName.empty()
+#if defined(LLVM_HAVE_EMITC_COMPILE_INLINER)
+ && SelectedMLGOModel == EmitCModelChoice::Default
+#endif
+ )
return nullptr;
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 {
+ if (InteractiveChannelBaseName.empty()) {
+#if defined(LLVM_HAVE_EMITC_COMPILE_INLINER)
+ if (SelectedMLGOModel != EmitCModelChoice::Default) {
+ AOTRunner = createEmitCModelRunner(M.getContext(), InputFeatures);
+ } else
+#endif
+ {
+ AOTRunner = std::make_unique<ReleaseModeModelRunner<CompiledModelType>>(
+ M.getContext(), InputFeatures, DecisionName,
+ EmbeddedModelRunnerOptions().setModelSelector(ModelSelector));
+ }
+ } else {
----------------
ilovepi wrote:
Thanks I think this is a lot easier to follow. A `getModelRunner()` helper that hides all this may also be a nice option, but I'll leave that up to you.
https://github.com/llvm/llvm-project/pull/212650
More information about the llvm-commits
mailing list