[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