[llvm] [PassBuilder] Add callback invoking to PassBuilder string API (PR #157153)

Gabriel Baraldi via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 18 07:07:03 PDT 2025


https://github.com/gbaraldi updated https://github.com/llvm/llvm-project/pull/157153

>From cebd0a9a5341e51ffa7774e1960a8de385011a27 Mon Sep 17 00:00:00 2001
From: gbaraldi <baraldigabriel at gmail.com>
Date: Fri, 5 Sep 2025 14:55:28 -0300
Subject: [PATCH 1/7] Initial stage of callback invoking with PassBuilder

---
 .../llvm/Passes/TargetPassRegistry.inc        | 36 +++++++++++++++++++
 llvm/lib/Passes/PassRegistry.def              | 28 ++++++++++++++-
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/llvm/include/llvm/Passes/TargetPassRegistry.inc b/llvm/include/llvm/Passes/TargetPassRegistry.inc
index 068b27794191c..2d76db006e4a1 100644
--- a/llvm/include/llvm/Passes/TargetPassRegistry.inc
+++ b/llvm/include/llvm/Passes/TargetPassRegistry.inc
@@ -133,6 +133,42 @@ PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
   return false;
 });
 
+PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
+                                       ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
+#include GET_PASS_REGISTRY
+#undef MODULE_CALLBACK
+#define MODULE_LTO_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2, ThinOrFullLTOPhase::None); return true; }
+#include GET_PASS_REGISTRY
+#undef MODULE_LTO_CALLBACK
+  return false;
+});
+
+PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
+                                       ArrayRef<PassBuilder::PipelineElement>) {
+#define FUNCTION_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
+#include GET_PASS_REGISTRY
+#undef FUNCTION_CALLBACK
+  return false;
+});
+
+
+PB.registerPipelineParsingCallback([=](StringRef Name, CGSCCPassManager &CGPM,
+                                       ArrayRef<PassBuilder::PipelineElement>) {
+#define CGSCC_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(CGPM, OptimizationLevel::O2); return true; }
+#include GET_PASS_REGISTRY
+#undef CGSCC_CALLBACK
+  return false;
+});
+PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
+                                       ArrayRef<PassBuilder::PipelineElement>) {
+#define LOOP_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
+#include GET_PASS_REGISTRY
+#undef LOOP_CALLBACK
+  return false;
+});
+
+
 PB.registerPipelineParsingCallback([=](StringRef Name,
                                        MachineFunctionPassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 299aaa801439b..dfa41d618643e 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -725,7 +725,6 @@ FUNCTION_PASS_WITH_PARAMS(
       return ExpandFpPass(TM, OL);
     },
     parseExpandFpOptions, "opt-level=N")
-    
 #undef FUNCTION_PASS_WITH_PARAMS
 
 #ifndef LOOPNEST_PASS
@@ -804,3 +803,30 @@ LOOP_PASS_WITH_PARAMS(
     },
     parseLoopUnswitchOptions, "nontrivial;no-nontrivial;trivial;no-trivial")
 #undef LOOP_PASS_WITH_PARAMS
+
+#ifdef MODULE_CALLBACK
+MODULE_CALLBACK("PipelineStartCallbacks", invokePipelineStartEPCallbacks)
+#endif
+
+// There are some full lto specific ones that are ignored here for now
+#ifdef MODULE_LTO_CALLBACK
+MODULE_LTO_CALLBACK("PipelineEarlySimplificationCallbacks", invokePipelineEarlySimplificationEPCallbacks)
+MODULE_LTO_CALLBACK("OptimizerEarlyCallbacks", invokeOptimizerEarlyEPCallbacks)
+MODULE_LTO_CALLBACK("OptimizerLastCallbacks", invokeOptimizerLastEPCallbacks)
+#endif
+
+#ifdef FUNCTION_CALLBACK
+FUNCTION_CALLBACK("PeepholeCallbacks", invokePeepholeEPCallbacks)
+FUNCTION_CALLBACK("ScalarOptimizerLateCallbacks", invokeScalarOptimizerLateEPCallbacks)
+FUNCTION_CALLBACK("VectorizerStartCallbacks", invokeVectorizerStartEPCallbacks)
+#endif
+
+#ifdef LOOP_CALLBACK
+LOOP_CALLBACK("LateLoopOptimizationsCallbacks", invokeLateLoopOptimizationsEPCallbacks)
+LOOP_CALLBACK("LoopOptimizerEndCallbacks", invokeLoopOptimizerEndEPCallbacks)
+#endif
+
+#ifdef CGSCC_CALLBACK
+CGSCC_CALLBACK("CGSCCOptimizerLateCallbacks", invokeCGSCCOptimizerLateEPCallbacks)
+#endif
+

>From 52540e73ab626318aebbeee74b0b3f6d52cbdc0e Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Tue, 16 Sep 2025 14:16:43 +0000
Subject: [PATCH 2/7] Cleanup code, address suggestions and add test

---
 .../llvm/Passes/TargetPassRegistry.inc        | 39 +-------
 llvm/lib/Passes/PassBuilder.cpp               | 96 +++++++++++++++++++
 .../Other/pipeline-callbacks-string-api.ll    | 27 ++++++
 3 files changed, 125 insertions(+), 37 deletions(-)
 create mode 100644 llvm/test/Other/pipeline-callbacks-string-api.ll

diff --git a/llvm/include/llvm/Passes/TargetPassRegistry.inc b/llvm/include/llvm/Passes/TargetPassRegistry.inc
index 2d76db006e4a1..48948528a95d6 100644
--- a/llvm/include/llvm/Passes/TargetPassRegistry.inc
+++ b/llvm/include/llvm/Passes/TargetPassRegistry.inc
@@ -92,7 +92,7 @@ if (PIC) {
     return true;                                                               \
   }
 
-PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
+PB.registerPipelineParsingCallback([&](StringRef Name, ModulePassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {
 #define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
 #include GET_PASS_REGISTRY
@@ -109,7 +109,7 @@ PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
   return false;
 });
 
-PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
+PB.registerPipelineParsingCallback([&](StringRef Name, FunctionPassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {
 #define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
 #include GET_PASS_REGISTRY
@@ -133,41 +133,6 @@ PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
   return false;
 });
 
-PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
-                                       ArrayRef<PassBuilder::PipelineElement>) {
-#define MODULE_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
-#include GET_PASS_REGISTRY
-#undef MODULE_CALLBACK
-#define MODULE_LTO_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2, ThinOrFullLTOPhase::None); return true; }
-#include GET_PASS_REGISTRY
-#undef MODULE_LTO_CALLBACK
-  return false;
-});
-
-PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
-                                       ArrayRef<PassBuilder::PipelineElement>) {
-#define FUNCTION_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
-#include GET_PASS_REGISTRY
-#undef FUNCTION_CALLBACK
-  return false;
-});
-
-
-PB.registerPipelineParsingCallback([=](StringRef Name, CGSCCPassManager &CGPM,
-                                       ArrayRef<PassBuilder::PipelineElement>) {
-#define CGSCC_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(CGPM, OptimizationLevel::O2); return true; }
-#include GET_PASS_REGISTRY
-#undef CGSCC_CALLBACK
-  return false;
-});
-PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
-                                       ArrayRef<PassBuilder::PipelineElement>) {
-#define LOOP_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
-#include GET_PASS_REGISTRY
-#undef LOOP_CALLBACK
-  return false;
-});
-
 
 PB.registerPipelineParsingCallback([=](StringRef Name,
                                        MachineFunctionPassManager &PM,
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 587f0ece0859b..cda64690ffc5d 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -528,6 +528,102 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 #include "llvm/Passes/MachinePassRegistry.def"
     });
   }
+  auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> {
+    if (P == "O0") return OptimizationLevel::O0;
+    if (P == "O1") return OptimizationLevel::O1;
+    if (P == "O2") return OptimizationLevel::O2;
+    if (P == "O3") return OptimizationLevel::O3;
+    if (P == "Os") return OptimizationLevel::Os;
+    if (P == "Oz") return OptimizationLevel::Oz;
+    return make_error<StringError>(
+        formatv("invalid optimization level '{}'", P).str(),
+        inconvertibleErrorCode());
+  };
+
+  // Module-level callbacks without LTO phase
+  this->registerPipelineParsingCallback(
+      [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
+              ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_CALLBACK(NAME, INVOKE)                                             \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
+    if (!L)                                                                       \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
+    this->INVOKE(PM, L.get());                                                    \
+    return true;                                                                  \
+  }
+#include "PassRegistry.def"
+#undef MODULE_CALLBACK
+        return false;
+      });
+
+  // Module-level callbacks with LTO phase (use Phase::None for string API)
+  this->registerPipelineParsingCallback(
+      [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
+              ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_LTO_CALLBACK(NAME, INVOKE)                                         \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
+    if (!L)                                                                       \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
+    this->INVOKE(PM, L.get(), ThinOrFullLTOPhase::None);                          \
+    return true;                                                                  \
+  }
+#include "PassRegistry.def"
+#undef MODULE_LTO_CALLBACK
+        return false;
+      });
+
+  // Function-level callbacks
+  this->registerPipelineParsingCallback(
+      [this, parseLevelParam](StringRef Name, FunctionPassManager &PM,
+              ArrayRef<PassBuilder::PipelineElement>) {
+#define FUNCTION_CALLBACK(NAME, INVOKE)                                           \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
+    if (!L)                                                                       \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
+    this->INVOKE(PM, L.get());                                                    \
+    return true;                                                                  \
+  }
+#include "PassRegistry.def"
+#undef FUNCTION_CALLBACK
+        return false;
+      });
+
+  // CGSCC-level callbacks
+  this->registerPipelineParsingCallback(
+      [this, parseLevelParam](StringRef Name, CGSCCPassManager &PM,
+              ArrayRef<PassBuilder::PipelineElement>) {
+#define CGSCC_CALLBACK(NAME, INVOKE)                                              \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
+    if (!L)                                                                       \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
+    this->INVOKE(PM, L.get());                                                    \
+    return true;                                                                  \
+  }
+#include "PassRegistry.def"
+#undef CGSCC_CALLBACK
+        return false;
+      });
+
+  // Loop-level callbacks
+  this->registerPipelineParsingCallback(
+      [this, parseLevelParam](StringRef Name, LoopPassManager &PM,
+              ArrayRef<PassBuilder::PipelineElement>) {
+#define LOOP_CALLBACK(NAME, INVOKE)                                               \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
+    if (!L)                                                                       \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
+    this->INVOKE(PM, L.get());                                                    \
+    return true;                                                                  \
+  }
+#include "PassRegistry.def"
+#undef LOOP_CALLBACK
+        return false;
+      });
 }
 
 void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
diff --git a/llvm/test/Other/pipeline-callbacks-string-api.ll b/llvm/test/Other/pipeline-callbacks-string-api.ll
new file mode 100644
index 0000000000000..609e1d755f332
--- /dev/null
+++ b/llvm/test/Other/pipeline-callbacks-string-api.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-glob -p=VECSTART,VECEND,MODSTART,LTOEARLY,INVALID
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-vectorizer-start='no-op-function' \
+; RUN:   -passes='function(VectorizerStartCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-peephole='no-op-function' \
+; RUN:   -passes='PeepholeCallbacks<Os>' < %s 2>&1 | FileCheck %s --check-prefix=PEEP
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-pipeline-start='no-op-module' \
+; RUN:   -passes='PipelineStartCallbacks<O1>' < %s 2>&1 | FileCheck %s --check-prefix=MODSTART
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-pipeline-early-simplification='no-op-module' \
+; RUN:   -passes='PipelineEarlySimplificationCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=LTOEARLY
+; RUN: not opt -disable-output -passes='VectorizerStartCallbacks<foo>' < %s 2>&1 | FileCheck %s --check-prefix=INVALID
+
+; VECSTART: no-op-function
+; PEEP: no-op-function
+; MODSTART: no-op-module
+; LTOEARLY: no-op-module
+; INVALID: invalid optimization level 'foo'
+
+define void @f() {
+entry:
+  ret void
+}
+
+

>From dc28e4e4ef0ede80408752d40d5a58312586179d Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Tue, 16 Sep 2025 14:30:42 +0000
Subject: [PATCH 3/7] Fix whitespace

---
 llvm/include/llvm/Passes/TargetPassRegistry.inc | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/include/llvm/Passes/TargetPassRegistry.inc b/llvm/include/llvm/Passes/TargetPassRegistry.inc
index 48948528a95d6..3e5d1ab06cd11 100644
--- a/llvm/include/llvm/Passes/TargetPassRegistry.inc
+++ b/llvm/include/llvm/Passes/TargetPassRegistry.inc
@@ -133,7 +133,6 @@ PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
   return false;
 });
 
-
 PB.registerPipelineParsingCallback([=](StringRef Name,
                                        MachineFunctionPassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {

>From a1320e3dad2b9fe3c0751b85ee31f8159be9c974 Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Tue, 16 Sep 2025 19:43:15 +0000
Subject: [PATCH 4/7] Suggestions from code review

---
 .../llvm/Passes/TargetPassRegistry.inc        |   4 +-
 llvm/lib/Passes/PassBuilder.cpp               | 113 +++++++++---------
 llvm/lib/Passes/PassRegistry.def              |   2 +
 .../Other/pipeline-callbacks-string-api.ll    |   4 +-
 4 files changed, 64 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Passes/TargetPassRegistry.inc b/llvm/include/llvm/Passes/TargetPassRegistry.inc
index 3e5d1ab06cd11..068b27794191c 100644
--- a/llvm/include/llvm/Passes/TargetPassRegistry.inc
+++ b/llvm/include/llvm/Passes/TargetPassRegistry.inc
@@ -92,7 +92,7 @@ if (PIC) {
     return true;                                                               \
   }
 
-PB.registerPipelineParsingCallback([&](StringRef Name, ModulePassManager &PM,
+PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {
 #define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
 #include GET_PASS_REGISTRY
@@ -109,7 +109,7 @@ PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
   return false;
 });
 
-PB.registerPipelineParsingCallback([&](StringRef Name, FunctionPassManager &PM,
+PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
                                        ArrayRef<PassBuilder::PipelineElement>) {
 #define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
 #include GET_PASS_REGISTRY
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index cda64690ffc5d..e3bb928f6703a 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -188,6 +188,7 @@
 #include "llvm/Support/CodeGen.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/Regex.h"
@@ -529,28 +530,32 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     });
   }
   auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> {
-    if (P == "O0") return OptimizationLevel::O0;
-    if (P == "O1") return OptimizationLevel::O1;
-    if (P == "O2") return OptimizationLevel::O2;
-    if (P == "O3") return OptimizationLevel::O3;
-    if (P == "Os") return OptimizationLevel::Os;
-    if (P == "Oz") return OptimizationLevel::Oz;
-    return make_error<StringError>(
-        formatv("invalid optimization level '{}'", P).str(),
-        inconvertibleErrorCode());
+    auto OptLevel = llvm::StringSwitch<std::optional<OptimizationLevel>>(P)
+                        .Case("O0", OptimizationLevel::O0)
+                        .Case("O1", OptimizationLevel::O1)
+                        .Case("O2", OptimizationLevel::O2)
+                        .Case("O3", OptimizationLevel::O3)
+                        .Case("Os", OptimizationLevel::Os)
+                        .Case("Oz", OptimizationLevel::Oz)
+                        .Default(std::nullopt);
+    if (!OptLevel)
+      return llvm::createStringError(llvm::inconvertibleErrorCode(),
+                                     "invalid optimization level '%s'",
+                                     P.str().c_str());
+    return *OptLevel;
   };
 
   // Module-level callbacks without LTO phase
-  this->registerPipelineParsingCallback(
+  registerPipelineParsingCallback(
       [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
-              ArrayRef<PassBuilder::PipelineElement>) {
-#define MODULE_CALLBACK(NAME, INVOKE)                                             \
-  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
-    if (!L)                                                                       \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
-    this->INVOKE(PM, L.get());                                                    \
-    return true;                                                                  \
+                              ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_CALLBACK(NAME, INVOKE)                                          \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
+    if (!L)                                                                    \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    INVOKE(PM, L.get());                                                       \
+    return true;                                                               \
   }
 #include "PassRegistry.def"
 #undef MODULE_CALLBACK
@@ -558,16 +563,16 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
       });
 
   // Module-level callbacks with LTO phase (use Phase::None for string API)
-  this->registerPipelineParsingCallback(
+  registerPipelineParsingCallback(
       [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
-              ArrayRef<PassBuilder::PipelineElement>) {
-#define MODULE_LTO_CALLBACK(NAME, INVOKE)                                         \
-  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
-    if (!L)                                                                       \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
-    this->INVOKE(PM, L.get(), ThinOrFullLTOPhase::None);                          \
-    return true;                                                                  \
+                              ArrayRef<PassBuilder::PipelineElement>) {
+#define MODULE_LTO_CALLBACK(NAME, INVOKE)                                      \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
+    if (!L)                                                                    \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    INVOKE(PM, L.get(), ThinOrFullLTOPhase::None);                             \
+    return true;                                                               \
   }
 #include "PassRegistry.def"
 #undef MODULE_LTO_CALLBACK
@@ -575,16 +580,16 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
       });
 
   // Function-level callbacks
-  this->registerPipelineParsingCallback(
+  registerPipelineParsingCallback(
       [this, parseLevelParam](StringRef Name, FunctionPassManager &PM,
-              ArrayRef<PassBuilder::PipelineElement>) {
-#define FUNCTION_CALLBACK(NAME, INVOKE)                                           \
-  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
-    if (!L)                                                                       \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
-    this->INVOKE(PM, L.get());                                                    \
-    return true;                                                                  \
+                              ArrayRef<PassBuilder::PipelineElement>) {
+#define FUNCTION_CALLBACK(NAME, INVOKE)                                        \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
+    if (!L)                                                                    \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    INVOKE(PM, L.get());                                                       \
+    return true;                                                               \
   }
 #include "PassRegistry.def"
 #undef FUNCTION_CALLBACK
@@ -592,16 +597,16 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
       });
 
   // CGSCC-level callbacks
-  this->registerPipelineParsingCallback(
+  registerPipelineParsingCallback(
       [this, parseLevelParam](StringRef Name, CGSCCPassManager &PM,
-              ArrayRef<PassBuilder::PipelineElement>) {
-#define CGSCC_CALLBACK(NAME, INVOKE)                                              \
-  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
-    if (!L)                                                                       \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
-    this->INVOKE(PM, L.get());                                                    \
-    return true;                                                                  \
+                              ArrayRef<PassBuilder::PipelineElement>) {
+#define CGSCC_CALLBACK(NAME, INVOKE)                                           \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
+    if (!L)                                                                    \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    INVOKE(PM, L.get());                                                       \
+    return true;                                                               \
   }
 #include "PassRegistry.def"
 #undef CGSCC_CALLBACK
@@ -609,16 +614,16 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
       });
 
   // Loop-level callbacks
-  this->registerPipelineParsingCallback(
+  registerPipelineParsingCallback(
       [this, parseLevelParam](StringRef Name, LoopPassManager &PM,
-              ArrayRef<PassBuilder::PipelineElement>) {
-#define LOOP_CALLBACK(NAME, INVOKE)                                               \
-  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                       \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);       \
-    if (!L)                                                                       \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);    \
-    this->INVOKE(PM, L.get());                                                    \
-    return true;                                                                  \
+                              ArrayRef<PassBuilder::PipelineElement>) {
+#define LOOP_CALLBACK(NAME, INVOKE)                                            \
+  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
+    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
+    if (!L)                                                                    \
+      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    INVOKE(PM, L.get());                                                       \
+    return true;                                                               \
   }
 #include "PassRegistry.def"
 #undef LOOP_CALLBACK
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index dfa41d618643e..6c67ac07855da 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -725,6 +725,7 @@ FUNCTION_PASS_WITH_PARAMS(
       return ExpandFpPass(TM, OL);
     },
     parseExpandFpOptions, "opt-level=N")
+
 #undef FUNCTION_PASS_WITH_PARAMS
 
 #ifndef LOOPNEST_PASS
@@ -819,6 +820,7 @@ MODULE_LTO_CALLBACK("OptimizerLastCallbacks", invokeOptimizerLastEPCallbacks)
 FUNCTION_CALLBACK("PeepholeCallbacks", invokePeepholeEPCallbacks)
 FUNCTION_CALLBACK("ScalarOptimizerLateCallbacks", invokeScalarOptimizerLateEPCallbacks)
 FUNCTION_CALLBACK("VectorizerStartCallbacks", invokeVectorizerStartEPCallbacks)
+FUNCTION_CALLBACK("VectorizerEndCallbacks", invokeVectorizerEndEPCallbacks)
 #endif
 
 #ifdef LOOP_CALLBACK
diff --git a/llvm/test/Other/pipeline-callbacks-string-api.ll b/llvm/test/Other/pipeline-callbacks-string-api.ll
index 609e1d755f332..bae2ebc2f6d1a 100644
--- a/llvm/test/Other/pipeline-callbacks-string-api.ll
+++ b/llvm/test/Other/pipeline-callbacks-string-api.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-glob -p=VECSTART,VECEND,MODSTART,LTOEARLY,INVALID
+
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-vectorizer-start='no-op-function' \
 ; RUN:   -passes='function(VectorizerStartCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
@@ -23,5 +23,3 @@ define void @f() {
 entry:
   ret void
 }
-
-

>From 39efaa0f7b725d245ab9812c403e6b5ad0517bf0 Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Tue, 16 Sep 2025 22:07:51 +0000
Subject: [PATCH 5/7] Adress comments from code review

---
 llvm/lib/Passes/PassBuilder.cpp               | 114 +++++++++---------
 .../Other/pipeline-callbacks-string-api.ll    |  29 ++++-
 2 files changed, 83 insertions(+), 60 deletions(-)

diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index e3bb928f6703a..814acc212a013 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -480,6 +480,26 @@ class RequireAllMachineFunctionPropertiesPass
 
 } // namespace
 
+static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
+  return StringSwitch<std::optional<OptimizationLevel>>(S)
+      .Case("O0", OptimizationLevel::O0)
+      .Case("O1", OptimizationLevel::O1)
+      .Case("O2", OptimizationLevel::O2)
+      .Case("O3", OptimizationLevel::O3)
+      .Case("Os", OptimizationLevel::Os)
+      .Case("Oz", OptimizationLevel::Oz)
+      .Default(std::nullopt);
+}
+
+static Expected<OptimizationLevel> parseOptLevelParam(StringRef S) {
+  std::optional<OptimizationLevel> OptLevel = parseOptLevel(S);
+  if (OptLevel)
+    return *OptLevel;
+  return make_error<StringError>(
+      formatv("invalid optimization level '{}'", S).str(),
+      inconvertibleErrorCode());
+}
+
 PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
                          std::optional<PGOOptions> PGOOpt,
                          PassInstrumentationCallbacks *PIC)
@@ -529,31 +549,18 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 #include "llvm/Passes/MachinePassRegistry.def"
     });
   }
-  auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> {
-    auto OptLevel = llvm::StringSwitch<std::optional<OptimizationLevel>>(P)
-                        .Case("O0", OptimizationLevel::O0)
-                        .Case("O1", OptimizationLevel::O1)
-                        .Case("O2", OptimizationLevel::O2)
-                        .Case("O3", OptimizationLevel::O3)
-                        .Case("Os", OptimizationLevel::Os)
-                        .Case("Oz", OptimizationLevel::Oz)
-                        .Default(std::nullopt);
-    if (!OptLevel)
-      return llvm::createStringError(llvm::inconvertibleErrorCode(),
-                                     "invalid optimization level '%s'",
-                                     P.str().c_str());
-    return *OptLevel;
-  };
 
   // Module-level callbacks without LTO phase
   registerPipelineParsingCallback(
-      [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
-                              ArrayRef<PassBuilder::PipelineElement>) {
+      [this](StringRef Name, ModulePassManager &PM,
+             ArrayRef<PassBuilder::PipelineElement>) {
 #define MODULE_CALLBACK(NAME, INVOKE)                                          \
   if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
-    if (!L)                                                                    \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+    if (!L) {                                                                  \
+      errs() << NAME ": " << toString(L.takeError()) << '\n';                  \
+      return false;                                                            \
+    }                                                                          \
     INVOKE(PM, L.get());                                                       \
     return true;                                                               \
   }
@@ -564,13 +571,15 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 
   // Module-level callbacks with LTO phase (use Phase::None for string API)
   registerPipelineParsingCallback(
-      [this, parseLevelParam](StringRef Name, ModulePassManager &PM,
-                              ArrayRef<PassBuilder::PipelineElement>) {
+      [this](StringRef Name, ModulePassManager &PM,
+             ArrayRef<PassBuilder::PipelineElement>) {
 #define MODULE_LTO_CALLBACK(NAME, INVOKE)                                      \
   if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
-    if (!L)                                                                    \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+    if (!L) {                                                                  \
+      errs() << NAME ": " << toString(L.takeError()) << '\n';                  \
+      return false;                                                            \
+    }                                                                          \
     INVOKE(PM, L.get(), ThinOrFullLTOPhase::None);                             \
     return true;                                                               \
   }
@@ -581,13 +590,15 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 
   // Function-level callbacks
   registerPipelineParsingCallback(
-      [this, parseLevelParam](StringRef Name, FunctionPassManager &PM,
-                              ArrayRef<PassBuilder::PipelineElement>) {
+      [this](StringRef Name, FunctionPassManager &PM,
+             ArrayRef<PassBuilder::PipelineElement>) {
 #define FUNCTION_CALLBACK(NAME, INVOKE)                                        \
   if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
-    if (!L)                                                                    \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+    if (!L) {                                                                  \
+      errs() << NAME ": " << toString(L.takeError()) << '\n';                  \
+      return false;                                                            \
+    }                                                                          \
     INVOKE(PM, L.get());                                                       \
     return true;                                                               \
   }
@@ -598,13 +609,15 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 
   // CGSCC-level callbacks
   registerPipelineParsingCallback(
-      [this, parseLevelParam](StringRef Name, CGSCCPassManager &PM,
-                              ArrayRef<PassBuilder::PipelineElement>) {
+      [this](StringRef Name, CGSCCPassManager &PM,
+             ArrayRef<PassBuilder::PipelineElement>) {
 #define CGSCC_CALLBACK(NAME, INVOKE)                                           \
   if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
-    if (!L)                                                                    \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+    if (!L) {                                                                  \
+      errs() << NAME ": " << toString(L.takeError()) << '\n';                  \
+      return false;                                                            \
+    }                                                                          \
     INVOKE(PM, L.get());                                                       \
     return true;                                                               \
   }
@@ -615,13 +628,15 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 
   // Loop-level callbacks
   registerPipelineParsingCallback(
-      [this, parseLevelParam](StringRef Name, LoopPassManager &PM,
-                              ArrayRef<PassBuilder::PipelineElement>) {
+      [this](StringRef Name, LoopPassManager &PM,
+             ArrayRef<PassBuilder::PipelineElement>) {
 #define LOOP_CALLBACK(NAME, INVOKE)                                            \
   if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \
-    auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME);    \
-    if (!L)                                                                    \
-      return (errs() << NAME ": " << toString(L.takeError()) << '\n', false);  \
+    auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
+    if (!L) {                                                                  \
+      errs() << NAME ": " << toString(L.takeError()) << '\n';                  \
+      return false;                                                            \
+    }                                                                          \
     INVOKE(PM, L.get());                                                       \
     return true;                                                               \
   }
@@ -714,25 +729,6 @@ static std::optional<int> parseDevirtPassName(StringRef Name) {
   return Count;
 }
 
-static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
-  return StringSwitch<std::optional<OptimizationLevel>>(S)
-      .Case("O0", OptimizationLevel::O0)
-      .Case("O1", OptimizationLevel::O1)
-      .Case("O2", OptimizationLevel::O2)
-      .Case("O3", OptimizationLevel::O3)
-      .Case("Os", OptimizationLevel::Os)
-      .Case("Oz", OptimizationLevel::Oz)
-      .Default(std::nullopt);
-}
-
-static Expected<OptimizationLevel> parseOptLevelParam(StringRef S) {
-  std::optional<OptimizationLevel> OptLevel = parseOptLevel(S);
-  if (OptLevel)
-    return *OptLevel;
-  return make_error<StringError>(
-      formatv("invalid optimization level '{}'", S).str(),
-      inconvertibleErrorCode());
-}
 
 Expected<bool> PassBuilder::parseSinglePassOption(StringRef Params,
                                                   StringRef OptionName,
diff --git a/llvm/test/Other/pipeline-callbacks-string-api.ll b/llvm/test/Other/pipeline-callbacks-string-api.ll
index bae2ebc2f6d1a..f091718632ab6 100644
--- a/llvm/test/Other/pipeline-callbacks-string-api.ll
+++ b/llvm/test/Other/pipeline-callbacks-string-api.ll
@@ -1,4 +1,3 @@
-
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-vectorizer-start='no-op-function' \
 ; RUN:   -passes='function(VectorizerStartCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
@@ -11,12 +10,40 @@
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-pipeline-early-simplification='no-op-module' \
 ; RUN:   -passes='PipelineEarlySimplificationCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=LTOEARLY
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-optimizer-early='no-op-module' \
+; RUN:   -passes='OptimizerEarlyCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTEARLY
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-optimizer-last='no-op-module' \
+; RUN:   -passes='OptimizerLastCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTLAST
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-scalar-optimizer-late='no-op-function' \
+; RUN:   -passes='function(ScalarOptimizerLateCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=SCALATE
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-vectorizer-end='no-op-function' \
+; RUN:   -passes='function(VectorizerEndCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECEND
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-late-loop-optimizations='no-op-loop' \
+; RUN:   -passes='loop(LateLoopOptimizationsCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LATELOOP
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-loop-optimizer-end='no-op-loop' \
+; RUN:   -passes='loop(LoopOptimizerEndCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LOOPOPTEND
+; RUN: opt -disable-output -print-pipeline-passes \
+; RUN:   -passes-ep-cgscc-optimizer-late='no-op-cgscc' \
+; RUN:   -passes='cgscc(CGSCCOptimizerLateCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=CGSCCTLATE
 ; RUN: not opt -disable-output -passes='VectorizerStartCallbacks<foo>' < %s 2>&1 | FileCheck %s --check-prefix=INVALID
 
 ; VECSTART: no-op-function
 ; PEEP: no-op-function
 ; MODSTART: no-op-module
 ; LTOEARLY: no-op-module
+; OPTEARLY: no-op-module
+; OPTLAST: no-op-module
+; SCALATE: no-op-function
+; VECEND: no-op-function
+; LATELOOP: no-op-loop
+; LOOPOPTEND: no-op-loop
+; CGSCCTLATE: no-op-cgscc
 ; INVALID: invalid optimization level 'foo'
 
 define void @f() {

>From bc8f1960192dc4b2f72f286e494ae3e1b50ad613 Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Tue, 16 Sep 2025 22:09:35 +0000
Subject: [PATCH 6/7] Whitespace

---
 llvm/lib/Passes/PassBuilder.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 814acc212a013..01f21faacd13e 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -729,7 +729,6 @@ static std::optional<int> parseDevirtPassName(StringRef Name) {
   return Count;
 }
 
-
 Expected<bool> PassBuilder::parseSinglePassOption(StringRef Params,
                                                   StringRef OptionName,
                                                   StringRef PassName) {

>From e882daf89a510d7c1a288feb9257c70b46b0af4a Mon Sep 17 00:00:00 2001
From: Gabriel Baraldi <baraldigabriel at gmail.com>
Date: Thu, 18 Sep 2025 14:06:37 +0000
Subject: [PATCH 7/7] Change "pass" names and refactor code slightly

---
 llvm/lib/Passes/PassBuilder.cpp               |  5 ---
 llvm/lib/Passes/PassRegistry.def              | 32 +++++++++++--------
 .../Other/pipeline-callbacks-string-api.ll    | 24 +++++++-------
 3 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 01f21faacd13e..262b574e6278d 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -565,7 +565,6 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     return true;                                                               \
   }
 #include "PassRegistry.def"
-#undef MODULE_CALLBACK
         return false;
       });
 
@@ -584,7 +583,6 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     return true;                                                               \
   }
 #include "PassRegistry.def"
-#undef MODULE_LTO_CALLBACK
         return false;
       });
 
@@ -603,7 +601,6 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     return true;                                                               \
   }
 #include "PassRegistry.def"
-#undef FUNCTION_CALLBACK
         return false;
       });
 
@@ -622,7 +619,6 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     return true;                                                               \
   }
 #include "PassRegistry.def"
-#undef CGSCC_CALLBACK
         return false;
       });
 
@@ -641,7 +637,6 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
     return true;                                                               \
   }
 #include "PassRegistry.def"
-#undef LOOP_CALLBACK
         return false;
       });
 }
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 6c67ac07855da..b8fba0dfc0c56 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -806,29 +806,33 @@ LOOP_PASS_WITH_PARAMS(
 #undef LOOP_PASS_WITH_PARAMS
 
 #ifdef MODULE_CALLBACK
-MODULE_CALLBACK("PipelineStartCallbacks", invokePipelineStartEPCallbacks)
+MODULE_CALLBACK("pipeline-start-callbacks", invokePipelineStartEPCallbacks)
 #endif
+#undef MODULE_CALLBACK
 
 // There are some full lto specific ones that are ignored here for now
 #ifdef MODULE_LTO_CALLBACK
-MODULE_LTO_CALLBACK("PipelineEarlySimplificationCallbacks", invokePipelineEarlySimplificationEPCallbacks)
-MODULE_LTO_CALLBACK("OptimizerEarlyCallbacks", invokeOptimizerEarlyEPCallbacks)
-MODULE_LTO_CALLBACK("OptimizerLastCallbacks", invokeOptimizerLastEPCallbacks)
+MODULE_LTO_CALLBACK("pipeline-early-simplification-callbacks", invokePipelineEarlySimplificationEPCallbacks)
+MODULE_LTO_CALLBACK("optimizer-early-callbacks", invokeOptimizerEarlyEPCallbacks)
+MODULE_LTO_CALLBACK("optimizer-last-callbacks", invokeOptimizerLastEPCallbacks)
 #endif
+#undef MODULE_LTO_CALLBACK
 
 #ifdef FUNCTION_CALLBACK
-FUNCTION_CALLBACK("PeepholeCallbacks", invokePeepholeEPCallbacks)
-FUNCTION_CALLBACK("ScalarOptimizerLateCallbacks", invokeScalarOptimizerLateEPCallbacks)
-FUNCTION_CALLBACK("VectorizerStartCallbacks", invokeVectorizerStartEPCallbacks)
-FUNCTION_CALLBACK("VectorizerEndCallbacks", invokeVectorizerEndEPCallbacks)
-#endif
-
-#ifdef LOOP_CALLBACK
-LOOP_CALLBACK("LateLoopOptimizationsCallbacks", invokeLateLoopOptimizationsEPCallbacks)
-LOOP_CALLBACK("LoopOptimizerEndCallbacks", invokeLoopOptimizerEndEPCallbacks)
+FUNCTION_CALLBACK("peephole-callbacks", invokePeepholeEPCallbacks)
+FUNCTION_CALLBACK("scalar-optimizer-late-callbacks", invokeScalarOptimizerLateEPCallbacks)
+FUNCTION_CALLBACK("vectorizer-start-callbacks", invokeVectorizerStartEPCallbacks)
+FUNCTION_CALLBACK("vectorizer-end-callbacks", invokeVectorizerEndEPCallbacks)
 #endif
+#undef FUNCTION_CALLBACK
 
 #ifdef CGSCC_CALLBACK
-CGSCC_CALLBACK("CGSCCOptimizerLateCallbacks", invokeCGSCCOptimizerLateEPCallbacks)
+CGSCC_CALLBACK("cgscc-optimizer-late-callbacks", invokeCGSCCOptimizerLateEPCallbacks)
 #endif
+#undef CGSCC_CALLBACK
 
+#ifdef LOOP_CALLBACK
+LOOP_CALLBACK("late-loop-optimizations-callbacks", invokeLateLoopOptimizationsEPCallbacks)
+LOOP_CALLBACK("loop-optimizer-end-callbacks", invokeLoopOptimizerEndEPCallbacks)
+#endif
+#undef LOOP_CALLBACK
diff --git a/llvm/test/Other/pipeline-callbacks-string-api.ll b/llvm/test/Other/pipeline-callbacks-string-api.ll
index f091718632ab6..3a4fe50219661 100644
--- a/llvm/test/Other/pipeline-callbacks-string-api.ll
+++ b/llvm/test/Other/pipeline-callbacks-string-api.ll
@@ -1,37 +1,37 @@
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-vectorizer-start='no-op-function' \
-; RUN:   -passes='function(VectorizerStartCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
+; RUN:   -passes='function(vectorizer-start-callbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-peephole='no-op-function' \
-; RUN:   -passes='PeepholeCallbacks<Os>' < %s 2>&1 | FileCheck %s --check-prefix=PEEP
+; RUN:   -passes='peephole-callbacks<Os>' < %s 2>&1 | FileCheck %s --check-prefix=PEEP
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-pipeline-start='no-op-module' \
-; RUN:   -passes='PipelineStartCallbacks<O1>' < %s 2>&1 | FileCheck %s --check-prefix=MODSTART
+; RUN:   -passes='pipeline-start-callbacks<O1>' < %s 2>&1 | FileCheck %s --check-prefix=MODSTART
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-pipeline-early-simplification='no-op-module' \
-; RUN:   -passes='PipelineEarlySimplificationCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=LTOEARLY
+; RUN:   -passes='pipeline-early-simplification-callbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=LTOEARLY
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-optimizer-early='no-op-module' \
-; RUN:   -passes='OptimizerEarlyCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTEARLY
+; RUN:   -passes='optimizer-early-callbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTEARLY
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-optimizer-last='no-op-module' \
-; RUN:   -passes='OptimizerLastCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTLAST
+; RUN:   -passes='optimizer-last-callbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=OPTLAST
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-scalar-optimizer-late='no-op-function' \
-; RUN:   -passes='function(ScalarOptimizerLateCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=SCALATE
+; RUN:   -passes='function(scalar-optimizer-late-callbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=SCALATE
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-vectorizer-end='no-op-function' \
-; RUN:   -passes='function(VectorizerEndCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECEND
+; RUN:   -passes='function(vectorizer-end-callbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECEND
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-late-loop-optimizations='no-op-loop' \
-; RUN:   -passes='loop(LateLoopOptimizationsCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LATELOOP
+; RUN:   -passes='loop(late-loop-optimizations-callbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LATELOOP
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-loop-optimizer-end='no-op-loop' \
-; RUN:   -passes='loop(LoopOptimizerEndCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LOOPOPTEND
+; RUN:   -passes='loop(loop-optimizer-end-callbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=LOOPOPTEND
 ; RUN: opt -disable-output -print-pipeline-passes \
 ; RUN:   -passes-ep-cgscc-optimizer-late='no-op-cgscc' \
-; RUN:   -passes='cgscc(CGSCCOptimizerLateCallbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=CGSCCTLATE
-; RUN: not opt -disable-output -passes='VectorizerStartCallbacks<foo>' < %s 2>&1 | FileCheck %s --check-prefix=INVALID
+; RUN:   -passes='cgscc(cgscc-optimizer-late-callbacks<O2>)' < %s 2>&1 | FileCheck %s --check-prefix=CGSCCTLATE
+; RUN: not opt -disable-output -passes='vectorizer-start-callbacks<foo>' < %s 2>&1 | FileCheck %s --check-prefix=INVALID
 
 ; VECSTART: no-op-function
 ; PEEP: no-op-function



More information about the llvm-commits mailing list