Skip to content

Commit 52540e7

Browse files
committed
Cleanup code, address suggestions and add test
1 parent cebd0a9 commit 52540e7

File tree

3 files changed

+125
-37
lines changed

3 files changed

+125
-37
lines changed

llvm/include/llvm/Passes/TargetPassRegistry.inc

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ if (PIC) {
9292
return true; \
9393
}
9494

95-
PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
95+
PB.registerPipelineParsingCallback([&](StringRef Name, ModulePassManager &PM,
9696
ArrayRef<PassBuilder::PipelineElement>) {
9797
#define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
9898
#include GET_PASS_REGISTRY
@@ -109,7 +109,7 @@ PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
109109
return false;
110110
});
111111

112-
PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
112+
PB.registerPipelineParsingCallback([&](StringRef Name, FunctionPassManager &PM,
113113
ArrayRef<PassBuilder::PipelineElement>) {
114114
#define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
115115
#include GET_PASS_REGISTRY
@@ -133,41 +133,6 @@ PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
133133
return false;
134134
});
135135

136-
PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
137-
ArrayRef<PassBuilder::PipelineElement>) {
138-
#define MODULE_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
139-
#include GET_PASS_REGISTRY
140-
#undef MODULE_CALLBACK
141-
#define MODULE_LTO_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2, ThinOrFullLTOPhase::None); return true; }
142-
#include GET_PASS_REGISTRY
143-
#undef MODULE_LTO_CALLBACK
144-
return false;
145-
});
146-
147-
PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
148-
ArrayRef<PassBuilder::PipelineElement>) {
149-
#define FUNCTION_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
150-
#include GET_PASS_REGISTRY
151-
#undef FUNCTION_CALLBACK
152-
return false;
153-
});
154-
155-
156-
PB.registerPipelineParsingCallback([=](StringRef Name, CGSCCPassManager &CGPM,
157-
ArrayRef<PassBuilder::PipelineElement>) {
158-
#define CGSCC_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(CGPM, OptimizationLevel::O2); return true; }
159-
#include GET_PASS_REGISTRY
160-
#undef CGSCC_CALLBACK
161-
return false;
162-
});
163-
PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
164-
ArrayRef<PassBuilder::PipelineElement>) {
165-
#define LOOP_CALLBACK(NAME, INVOKE) if (Name == NAME) { PB.INVOKE(PM, OptimizationLevel::O2); return true; }
166-
#include GET_PASS_REGISTRY
167-
#undef LOOP_CALLBACK
168-
return false;
169-
});
170-
171136

172137
PB.registerPipelineParsingCallback([=](StringRef Name,
173138
MachineFunctionPassManager &PM,

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,102 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
528528
#include "llvm/Passes/MachinePassRegistry.def"
529529
});
530530
}
531+
auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> {
532+
if (P == "O0") return OptimizationLevel::O0;
533+
if (P == "O1") return OptimizationLevel::O1;
534+
if (P == "O2") return OptimizationLevel::O2;
535+
if (P == "O3") return OptimizationLevel::O3;
536+
if (P == "Os") return OptimizationLevel::Os;
537+
if (P == "Oz") return OptimizationLevel::Oz;
538+
return make_error<StringError>(
539+
formatv("invalid optimization level '{}'", P).str(),
540+
inconvertibleErrorCode());
541+
};
542+
543+
// Module-level callbacks without LTO phase
544+
this->registerPipelineParsingCallback(
545+
[this, parseLevelParam](StringRef Name, ModulePassManager &PM,
546+
ArrayRef<PassBuilder::PipelineElement>) {
547+
#define MODULE_CALLBACK(NAME, INVOKE) \
548+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
549+
auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \
550+
if (!L) \
551+
return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \
552+
this->INVOKE(PM, L.get()); \
553+
return true; \
554+
}
555+
#include "PassRegistry.def"
556+
#undef MODULE_CALLBACK
557+
return false;
558+
});
559+
560+
// Module-level callbacks with LTO phase (use Phase::None for string API)
561+
this->registerPipelineParsingCallback(
562+
[this, parseLevelParam](StringRef Name, ModulePassManager &PM,
563+
ArrayRef<PassBuilder::PipelineElement>) {
564+
#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
565+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
566+
auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \
567+
if (!L) \
568+
return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \
569+
this->INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
570+
return true; \
571+
}
572+
#include "PassRegistry.def"
573+
#undef MODULE_LTO_CALLBACK
574+
return false;
575+
});
576+
577+
// Function-level callbacks
578+
this->registerPipelineParsingCallback(
579+
[this, parseLevelParam](StringRef Name, FunctionPassManager &PM,
580+
ArrayRef<PassBuilder::PipelineElement>) {
581+
#define FUNCTION_CALLBACK(NAME, INVOKE) \
582+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
583+
auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \
584+
if (!L) \
585+
return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \
586+
this->INVOKE(PM, L.get()); \
587+
return true; \
588+
}
589+
#include "PassRegistry.def"
590+
#undef FUNCTION_CALLBACK
591+
return false;
592+
});
593+
594+
// CGSCC-level callbacks
595+
this->registerPipelineParsingCallback(
596+
[this, parseLevelParam](StringRef Name, CGSCCPassManager &PM,
597+
ArrayRef<PassBuilder::PipelineElement>) {
598+
#define CGSCC_CALLBACK(NAME, INVOKE) \
599+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
600+
auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \
601+
if (!L) \
602+
return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \
603+
this->INVOKE(PM, L.get()); \
604+
return true; \
605+
}
606+
#include "PassRegistry.def"
607+
#undef CGSCC_CALLBACK
608+
return false;
609+
});
610+
611+
// Loop-level callbacks
612+
this->registerPipelineParsingCallback(
613+
[this, parseLevelParam](StringRef Name, LoopPassManager &PM,
614+
ArrayRef<PassBuilder::PipelineElement>) {
615+
#define LOOP_CALLBACK(NAME, INVOKE) \
616+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
617+
auto L = PassBuilder::parsePassParameters(parseLevelParam, Name, NAME); \
618+
if (!L) \
619+
return (errs() << NAME ": " << toString(L.takeError()) << '\n', false); \
620+
this->INVOKE(PM, L.get()); \
621+
return true; \
622+
}
623+
#include "PassRegistry.def"
624+
#undef LOOP_CALLBACK
625+
return false;
626+
});
531627
}
532628

533629
void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-glob -p=VECSTART,VECEND,MODSTART,LTOEARLY,INVALID
2+
; RUN: opt -disable-output -print-pipeline-passes \
3+
; RUN: -passes-ep-vectorizer-start='no-op-function' \
4+
; RUN: -passes='function(VectorizerStartCallbacks<O3>)' < %s 2>&1 | FileCheck %s --check-prefix=VECSTART
5+
; RUN: opt -disable-output -print-pipeline-passes \
6+
; RUN: -passes-ep-peephole='no-op-function' \
7+
; RUN: -passes='PeepholeCallbacks<Os>' < %s 2>&1 | FileCheck %s --check-prefix=PEEP
8+
; RUN: opt -disable-output -print-pipeline-passes \
9+
; RUN: -passes-ep-pipeline-start='no-op-module' \
10+
; RUN: -passes='PipelineStartCallbacks<O1>' < %s 2>&1 | FileCheck %s --check-prefix=MODSTART
11+
; RUN: opt -disable-output -print-pipeline-passes \
12+
; RUN: -passes-ep-pipeline-early-simplification='no-op-module' \
13+
; RUN: -passes='PipelineEarlySimplificationCallbacks<O2>' < %s 2>&1 | FileCheck %s --check-prefix=LTOEARLY
14+
; RUN: not opt -disable-output -passes='VectorizerStartCallbacks<foo>' < %s 2>&1 | FileCheck %s --check-prefix=INVALID
15+
16+
; VECSTART: no-op-function
17+
; PEEP: no-op-function
18+
; MODSTART: no-op-module
19+
; LTOEARLY: no-op-module
20+
; INVALID: invalid optimization level 'foo'
21+
22+
define void @f() {
23+
entry:
24+
ret void
25+
}
26+
27+

0 commit comments

Comments
 (0)