aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Passes/PassBuilder.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2025-06-27 12:07:09 +0200
committerGitHub <noreply@github.com>2025-06-27 12:07:09 +0200
commit7f223d121d745b9136b04c64d5b8f791adc962ad (patch)
treee32d211794e43b67606078ebff600493df92f7ff /llvm/lib/Passes/PassBuilder.cpp
parent613804cca986c4934274afa35f8606a3e44b149d (diff)
downloadllvm-7f223d121d745b9136b04c64d5b8f791adc962ad.zip
llvm-7f223d121d745b9136b04c64d5b8f791adc962ad.tar.gz
llvm-7f223d121d745b9136b04c64d5b8f791adc962ad.tar.bz2
[PassBuilder] Treat pipeline aliases as normal passes (#146038)
Pipelines like `-passes="default<O3>"` are currently parsed in a special way. Switch them to work like normal, parameterized module passes.
Diffstat (limited to 'llvm/lib/Passes/PassBuilder.cpp')
-rw-r--r--llvm/lib/Passes/PassBuilder.cpp73
1 files changed, 18 insertions, 55 deletions
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 4603eaf..f95c32d 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -374,9 +374,6 @@
using namespace llvm;
-static const Regex DefaultAliasRegex(
- "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
-
cl::opt<bool> llvm::PrintPipelinePasses(
"print-pipeline-passes",
cl::desc("Print a '-passes' compatible string describing the pipeline "
@@ -618,6 +615,15 @@ static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
.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,
StringRef PassName) {
@@ -1507,13 +1513,6 @@ Expected<bool> parseVirtRegRewriterPassOptions(StringRef Params) {
} // namespace
-/// Tests whether a pass name starts with a valid prefix for a default pipeline
-/// alias.
-static bool startsWithDefaultPipelineAliasPrefix(StringRef Name) {
- return Name.starts_with("default") || Name.starts_with("thinlto") ||
- Name.starts_with("lto");
-}
-
/// Tests whether registered callbacks will accept a given pass name.
///
/// When parsing a pipeline text, the type of the outermost pipeline may be
@@ -1535,10 +1534,6 @@ static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks) {
template <typename CallbacksT>
static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
- // Manually handle aliases for pre-configured pipeline fragments.
- if (startsWithDefaultPipelineAliasPrefix(Name))
- return DefaultAliasRegex.match(Name);
-
StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
// Explicitly handle pass manager names.
@@ -1737,6 +1732,15 @@ PassBuilder::parsePipelineText(StringRef Text) {
return {std::move(ResultPipeline)};
}
+static void setupOptionsForPipelineAlias(PipelineTuningOptions &PTO,
+ OptimizationLevel L) {
+ // This is consistent with old pass manager invoked via opt, but
+ // inconsistent with clang. Clang doesn't enable loop vectorization
+ // but does enable slp vectorization at Oz.
+ PTO.LoopVectorization = L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
+ PTO.SLPVectorization = L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
+}
+
Error PassBuilder::parseModulePass(ModulePassManager &MPM,
const PipelineElement &E) {
auto &Name = E.Name;
@@ -1789,47 +1793,6 @@ Error PassBuilder::parseModulePass(ModulePassManager &MPM,
;
}
- // Manually handle aliases for pre-configured pipeline fragments.
- if (startsWithDefaultPipelineAliasPrefix(Name)) {
- SmallVector<StringRef, 3> Matches;
- if (!DefaultAliasRegex.match(Name, &Matches))
- return make_error<StringError>(
- formatv("unknown default pipeline alias '{}'", Name).str(),
- inconvertibleErrorCode());
-
- assert(Matches.size() == 3 && "Must capture two matched strings!");
-
- OptimizationLevel L = *parseOptLevel(Matches[2]);
-
- // This is consistent with old pass manager invoked via opt, but
- // inconsistent with clang. Clang doesn't enable loop vectorization
- // but does enable slp vectorization at Oz.
- PTO.LoopVectorization =
- L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
- PTO.SLPVectorization =
- L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
-
- if (Matches[1] == "default") {
- MPM.addPass(buildPerModuleDefaultPipeline(L));
- } else if (Matches[1] == "thinlto-pre-link") {
- MPM.addPass(buildThinLTOPreLinkDefaultPipeline(L));
- } else if (Matches[1] == "thinlto") {
- MPM.addPass(buildThinLTODefaultPipeline(L, nullptr));
- } else if (Matches[1] == "lto-pre-link") {
- if (PTO.UnifiedLTO)
- // When UnifiedLTO is enabled, use the ThinLTO pre-link pipeline. This
- // avoids compile-time performance regressions and keeps the pre-link
- // LTO pipeline "unified" for both LTO modes.
- MPM.addPass(buildThinLTOPreLinkDefaultPipeline(L));
- else
- MPM.addPass(buildLTOPreLinkDefaultPipeline(L));
- } else {
- assert(Matches[1] == "lto" && "Not one of the matched options!");
- MPM.addPass(buildLTODefaultPipeline(L, nullptr));
- }
- return Error::success();
- }
-
// Finally expand the basic registered passes from the .inc file.
#define MODULE_PASS(NAME, CREATE_PASS) \
if (Name == NAME) { \