[llvm] [CodeGen][NPM] Support generic regalloc-npm option (PR #172485)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 18 09:55:39 PST 2025


================
@@ -1135,32 +1155,76 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addTargetRegisterAllocator(
     addMachineFunctionPass(RegAllocFastPass(), PMW);
 }
 
+template <typename Derived, typename TargetMachineT>
+template <typename RegAllocPassBuilderT>
+void CodeGenPassBuilder<Derived, TargetMachineT>::addRegAllocPassOrOpt(
+    PassManagerWrapper &PMW, RegAllocPassBuilderT PassBuilder) const {
+  if (auto Err = addRegAllocPassFromOpt(PMW)) {
+    report_fatal_error(std::move(Err));
+  }
+  if (Opt.RegAllocPipeline.empty())
+    addMachineFunctionPass(std::move(PassBuilder()), PMW);
+}
+
+template <typename Derived, typename TargetMachineT>
+Error CodeGenPassBuilder<Derived, TargetMachineT>::addRegAllocPassFromOpt(
+    PassManagerWrapper &PMW, StringRef MatchPassTo) const {
+  StringRef Pipeline = Opt.RegAllocPipeline;
+  if (Pipeline.empty())
+    return Error::success();
+
+  StringRef PassOpt;
+  std::tie(PassOpt, Opt.RegAllocPipeline) = Pipeline.split(',');
+
+  if (PassOpt == "default")
+    return Error::success();
+
+  bool Matched = false;
+  // Reuse the registered parser to parse the pass name.
+#define RA_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)          \
+  if (PassBuilder::checkParametrizedPassName(PassOpt, NAME)) {                 \
+    if (!MatchPassTo.empty() && MatchPassTo != CLASS) {                        \
+      return make_error<StringError>(                                          \
+          Twine("expected ") + PIC->getPassNameForClassName(MatchPassTo) +     \
+              " in option --regalloc-npm",                                     \
+          inconvertibleErrorCode());                                           \
+    }                                                                          \
+    auto Params = PassBuilder::parsePassParameters(PARSER, PassOpt, NAME, PB); \
+    if (!Params)                                                               \
+      return Params.takeError();                                               \
+    addMachineFunctionPass(CREATE_PASS(*Params), PMW);                         \
+    Matched = true;                                                            \
+  }
+#include "llvm/Passes/MachinePassRegistry.def"
+
+  if (!Matched)
+    return make_error<StringError>(Twine("unknown register allocator pass: ") +
+                                       PassOpt,
+                                   inconvertibleErrorCode());
+
+  return Error::success();
+}
+
 /// Find and instantiate the register allocation pass requested by this target
 /// at the current optimization level.  Different register allocators are
 /// defined as separate passes because they may require different analysis.
 ///
-/// This helper ensures that the -regalloc-npm= option is always available,
-/// even for targets that override the default allocator.
+/// This helper ensures that the -regalloc-npm-pipeline= option is always
+/// available, even for targets that override the default allocator.
 template <typename Derived, typename TargetMachineT>
 void CodeGenPassBuilder<Derived, TargetMachineT>::addRegAllocPass(
     PassManagerWrapper &PMW, bool Optimized) const {
-  // Use the specified -regalloc-npm={basic|greedy|fast|pbqp}
-  if (Opt.RegAlloc > RegAllocType::Default) {
-    switch (Opt.RegAlloc) {
-    case RegAllocType::Fast:
-      addMachineFunctionPass(RegAllocFastPass(), PMW);
-      break;
-    case RegAllocType::Greedy:
-      addMachineFunctionPass(RAGreedyPass(), PMW);
-      break;
-    default:
-      reportFatalUsageError("register allocator not supported yet");
-    }
-    return;
+  // At O0 (not optimized), only regallocfast is allowed
+  StringRef MatchPassTo = Optimized ? StringRef{} : "RegAllocFastPass";
+
+  // Use the specified -regalloc-npm-pipeline= option if provided
+  if (auto Err = addRegAllocPassFromOpt(PMW, MatchPassTo)) {
+    report_fatal_error(std::move(Err));
----------------
arsenm wrote:

```suggestion
    reportFatalUsageError(std::move(Err));
```
Ditto

https://github.com/llvm/llvm-project/pull/172485


More information about the llvm-commits mailing list