[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