Skip to content

Commit 3381729

Browse files
pchintalapudiaeubanks
authored andcommitted
Expose PassBuilder extension point callbacks
This patch allows access to callbacks registered by TargetMachines to allow custom pipelines to run those callbacks. Reviewed By: aeubanks Differential Revision: https://reviews.llvm.org/D148561
1 parent 1e07692 commit 3381729

File tree

2 files changed

+111
-57
lines changed

2 files changed

+111
-57
lines changed

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,34 @@ class PassBuilder {
555555
return PIC;
556556
}
557557

558+
// Invoke the callbacks registered for the various extension points.
559+
// Custom pipelines should use these to invoke the callbacks registered
560+
// by TargetMachines and other clients.
561+
void invokePeepholeEPCallbacks(FunctionPassManager &FPM,
562+
OptimizationLevel Level);
563+
void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM,
564+
OptimizationLevel Level);
565+
void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
566+
OptimizationLevel Level);
567+
void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM,
568+
OptimizationLevel Level);
569+
void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
570+
OptimizationLevel Level);
571+
void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
572+
OptimizationLevel Level);
573+
void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
574+
OptimizationLevel Level);
575+
void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
576+
OptimizationLevel Level);
577+
void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
578+
OptimizationLevel Level);
579+
void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
580+
OptimizationLevel Level);
581+
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
582+
OptimizationLevel Level);
583+
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
584+
OptimizationLevel Level);
585+
558586
private:
559587
// O1 pass pipeline
560588
FunctionPassManager
@@ -589,7 +617,6 @@ class PassBuilder {
589617
std::string ProfileRemappingFile,
590618
ThinOrFullLTOPhase LTOPhase,
591619
IntrusiveRefCntPtr<vfs::FileSystem> FS);
592-
void invokePeepholeEPCallbacks(FunctionPassManager &, OptimizationLevel);
593620

594621
// Extension Point callbacks
595622
SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 83 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
300300
for (auto &C : PeepholeEPCallbacks)
301301
C(FPM, Level);
302302
}
303+
void PassBuilder::invokeLateLoopOptimizationsEPCallbacks(
304+
LoopPassManager &LPM, OptimizationLevel Level) {
305+
for (auto &C : LateLoopOptimizationsEPCallbacks)
306+
C(LPM, Level);
307+
}
308+
void PassBuilder::invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
309+
OptimizationLevel Level) {
310+
for (auto &C : LoopOptimizerEndEPCallbacks)
311+
C(LPM, Level);
312+
}
313+
void PassBuilder::invokeScalarOptimizerLateEPCallbacks(
314+
FunctionPassManager &FPM, OptimizationLevel Level) {
315+
for (auto &C : ScalarOptimizerLateEPCallbacks)
316+
C(FPM, Level);
317+
}
318+
void PassBuilder::invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
319+
OptimizationLevel Level) {
320+
for (auto &C : CGSCCOptimizerLateEPCallbacks)
321+
C(CGPM, Level);
322+
}
323+
void PassBuilder::invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
324+
OptimizationLevel Level) {
325+
for (auto &C : VectorizerStartEPCallbacks)
326+
C(FPM, Level);
327+
}
328+
void PassBuilder::invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
329+
OptimizationLevel Level) {
330+
for (auto &C : OptimizerEarlyEPCallbacks)
331+
C(MPM, Level);
332+
}
333+
void PassBuilder::invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
334+
OptimizationLevel Level) {
335+
for (auto &C : OptimizerLastEPCallbacks)
336+
C(MPM, Level);
337+
}
338+
void PassBuilder::invokeFullLinkTimeOptimizationEarlyEPCallbacks(
339+
ModulePassManager &MPM, OptimizationLevel Level) {
340+
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
341+
C(MPM, Level);
342+
}
343+
void PassBuilder::invokeFullLinkTimeOptimizationLastEPCallbacks(
344+
ModulePassManager &MPM, OptimizationLevel Level) {
345+
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
346+
C(MPM, Level);
347+
}
348+
void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
349+
OptimizationLevel Level) {
350+
for (auto &C : PipelineStartEPCallbacks)
351+
C(MPM, Level);
352+
}
353+
void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
354+
ModulePassManager &MPM, OptimizationLevel Level) {
355+
for (auto &C : PipelineEarlySimplificationEPCallbacks)
356+
C(MPM, Level);
357+
}
303358

304359
// Helper to add AnnotationRemarksPass.
305360
static void addAnnotationRemarksPass(ModulePassManager &MPM) {
@@ -384,8 +439,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
384439
LPM2.addPass(LoopIdiomRecognizePass());
385440
LPM2.addPass(IndVarSimplifyPass());
386441

387-
for (auto &C : LateLoopOptimizationsEPCallbacks)
388-
C(LPM2, Level);
442+
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);
389443

390444
LPM2.addPass(LoopDeletionPass());
391445

@@ -403,8 +457,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
403457
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
404458
PTO.ForgetAllSCEVInLoopUnroll));
405459

406-
for (auto &C : LoopOptimizerEndEPCallbacks)
407-
C(LPM2, Level);
460+
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
408461

409462
// We provide the opt remark emitter pass for LICM to use. We only need to do
410463
// this once as it is immutable.
@@ -445,8 +498,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
445498

446499
FPM.addPass(CoroElidePass());
447500

448-
for (auto &C : ScalarOptimizerLateEPCallbacks)
449-
C(FPM, Level);
501+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
450502

451503
// Finally, do an expensive DCE pass to catch all the dead code exposed by
452504
// the simplifications and basic cleanup after all the simplifications.
@@ -570,8 +622,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
570622
LPM2.addPass(LoopIdiomRecognizePass());
571623
LPM2.addPass(IndVarSimplifyPass());
572624

573-
for (auto &C : LateLoopOptimizationsEPCallbacks)
574-
C(LPM2, Level);
625+
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);
575626

576627
LPM2.addPass(LoopDeletionPass());
577628

@@ -589,8 +640,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
589640
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
590641
PTO.ForgetAllSCEVInLoopUnroll));
591642

592-
for (auto &C : LoopOptimizerEndEPCallbacks)
593-
C(LPM2, Level);
643+
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
594644

595645
// We provide the opt remark emitter pass for LICM to use. We only need to do
596646
// this once as it is immutable.
@@ -662,8 +712,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
662712

663713
FPM.addPass(CoroElidePass());
664714

665-
for (auto &C : ScalarOptimizerLateEPCallbacks)
666-
C(FPM, Level);
715+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
667716

668717
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
669718
.convertSwitchRangeToICmp(true)
@@ -849,8 +898,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
849898
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
850899
MainCGPipeline.addPass(OpenMPOptCGSCCPass());
851900

852-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
853-
C(MainCGPipeline, Level);
901+
invokeCGSCCOptimizerLateEPCallbacks(MainCGPipeline, Level);
854902

855903
// Add the core function simplification pipeline nested inside the
856904
// CGSCC walk.
@@ -1007,8 +1055,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
10071055
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
10081056
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
10091057

1010-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
1011-
C(MPM, Level);
1058+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
10121059

10131060
// Interprocedural constant propagation now that basic cleanup has occurred
10141061
// and prior to optimizing globals.
@@ -1279,8 +1326,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12791326
// memory operations.
12801327
MPM.addPass(RecomputeGlobalsAAPass());
12811328

1282-
for (auto &C : OptimizerEarlyEPCallbacks)
1283-
C(MPM, Level);
1329+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
12841330

12851331
FunctionPassManager OptimizePM;
12861332
OptimizePM.addPass(Float2IntPass());
@@ -1303,8 +1349,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
13031349
// rather than on each loop in an inside-out manner, and so they are actually
13041350
// function passes.
13051351

1306-
for (auto &C : VectorizerStartEPCallbacks)
1307-
C(OptimizePM, Level);
1352+
invokeVectorizerStartEPCallbacks(OptimizePM, Level);
13081353

13091354
LoopPassManager LPM;
13101355
// First rotate loops that may have been un-rotated by prior passes.
@@ -1356,8 +1401,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
13561401
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
13571402
PTO.EagerlyInvalidateAnalyses));
13581403

1359-
for (auto &C : OptimizerLastEPCallbacks)
1360-
C(MPM, Level);
1404+
invokeOptimizerLastEPCallbacks(MPM, Level);
13611405

13621406
// Split out cold code. Splitting is done late to avoid hiding context from
13631407
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1413,8 +1457,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
14131457
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
14141458

14151459
// Apply module pipeline start EP callback.
1416-
for (auto &C : PipelineStartEPCallbacks)
1417-
C(MPM, Level);
1460+
invokePipelineStartEPCallbacks(MPM, Level);
14181461

14191462
const ThinOrFullLTOPhase LTOPhase = LTOPreLink
14201463
? ThinOrFullLTOPhase::FullLTOPreLink
@@ -1455,8 +1498,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
14551498
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
14561499

14571500
// Apply module pipeline start EP callback.
1458-
for (auto &C : PipelineStartEPCallbacks)
1459-
C(MPM, Level);
1501+
invokePipelineStartEPCallbacks(MPM, Level);
14601502

14611503
// If we are planning to perform ThinLTO later, we don't bloat the code with
14621504
// unrolling/vectorization/... now. Just simplify the module as much as we
@@ -1481,10 +1523,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
14811523
// Handle Optimizer{Early,Last}EPCallbacks added by clang on PreLink. Actual
14821524
// optimization is going to be done in PostLink stage, but clang can't add
14831525
// callbacks there in case of in-process ThinLTO called by linker.
1484-
for (auto &C : OptimizerEarlyEPCallbacks)
1485-
C(MPM, Level);
1486-
for (auto &C : OptimizerLastEPCallbacks)
1487-
C(MPM, Level);
1526+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
1527+
invokeOptimizerLastEPCallbacks(MPM, Level);
14881528

14891529
// Emit annotation remarks.
14901530
addAnnotationRemarksPass(MPM);
@@ -1559,8 +1599,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
15591599
ModuleSummaryIndex *ExportSummary) {
15601600
ModulePassManager MPM;
15611601

1562-
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1563-
C(MPM, Level);
1602+
invokeFullLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);
15641603

15651604
// Create a function that performs CFI checks for cross-DSO calls with targets
15661605
// in the current module.
@@ -1575,8 +1614,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
15751614
// in ICP.
15761615
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
15771616

1578-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1579-
C(MPM, Level);
1617+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
15801618

15811619
// Emit annotation remarks.
15821620
addAnnotationRemarksPass(MPM);
@@ -1657,8 +1695,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
16571695
// pipeline).
16581696
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
16591697

1660-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1661-
C(MPM, Level);
1698+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
16621699

16631700
// Emit annotation remarks.
16641701
addAnnotationRemarksPass(MPM);
@@ -1867,8 +1904,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
18671904
if (PTO.CallGraphProfile)
18681905
MPM.addPass(CGProfilePass());
18691906

1870-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1871-
C(MPM, Level);
1907+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
18721908

18731909
// Emit annotation remarks.
18741910
addAnnotationRemarksPass(MPM);
@@ -1898,14 +1934,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
18981934
/* IsCS */ false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile,
18991935
PGOOpt->FS);
19001936

1901-
for (auto &C : PipelineStartEPCallbacks)
1902-
C(MPM, Level);
1937+
invokePipelineStartEPCallbacks(MPM, Level);
19031938

19041939
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
19051940
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
19061941

1907-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
1908-
C(MPM, Level);
1942+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
19091943

19101944
// Build a minimal pipeline based on the semantics required by LLVM,
19111945
// which is just that always inlining occurs. Further, disable generating
@@ -1923,44 +1957,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
19231957

19241958
if (!CGSCCOptimizerLateEPCallbacks.empty()) {
19251959
CGSCCPassManager CGPM;
1926-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
1927-
C(CGPM, Level);
1960+
invokeCGSCCOptimizerLateEPCallbacks(CGPM, Level);
19281961
if (!CGPM.isEmpty())
19291962
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
19301963
}
19311964
if (!LateLoopOptimizationsEPCallbacks.empty()) {
19321965
LoopPassManager LPM;
1933-
for (auto &C : LateLoopOptimizationsEPCallbacks)
1934-
C(LPM, Level);
1966+
invokeLateLoopOptimizationsEPCallbacks(LPM, Level);
19351967
if (!LPM.isEmpty()) {
19361968
MPM.addPass(createModuleToFunctionPassAdaptor(
19371969
createFunctionToLoopPassAdaptor(std::move(LPM))));
19381970
}
19391971
}
19401972
if (!LoopOptimizerEndEPCallbacks.empty()) {
19411973
LoopPassManager LPM;
1942-
for (auto &C : LoopOptimizerEndEPCallbacks)
1943-
C(LPM, Level);
1974+
invokeLoopOptimizerEndEPCallbacks(LPM, Level);
19441975
if (!LPM.isEmpty()) {
19451976
MPM.addPass(createModuleToFunctionPassAdaptor(
19461977
createFunctionToLoopPassAdaptor(std::move(LPM))));
19471978
}
19481979
}
19491980
if (!ScalarOptimizerLateEPCallbacks.empty()) {
19501981
FunctionPassManager FPM;
1951-
for (auto &C : ScalarOptimizerLateEPCallbacks)
1952-
C(FPM, Level);
1982+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
19531983
if (!FPM.isEmpty())
19541984
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
19551985
}
19561986

1957-
for (auto &C : OptimizerEarlyEPCallbacks)
1958-
C(MPM, Level);
1987+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
19591988

19601989
if (!VectorizerStartEPCallbacks.empty()) {
19611990
FunctionPassManager FPM;
1962-
for (auto &C : VectorizerStartEPCallbacks)
1963-
C(FPM, Level);
1991+
invokeVectorizerStartEPCallbacks(FPM, Level);
19641992
if (!FPM.isEmpty())
19651993
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
19661994
}
@@ -1974,8 +2002,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
19742002
CoroPM.addPass(GlobalDCEPass());
19752003
MPM.addPass(CoroConditionalWrapper(std::move(CoroPM)));
19762004

1977-
for (auto &C : OptimizerLastEPCallbacks)
1978-
C(MPM, Level);
2005+
invokeOptimizerLastEPCallbacks(MPM, Level);
19792006

19802007
if (LTOPreLink)
19812008
addRequiredLTOPreLinkPasses(MPM);

0 commit comments

Comments
 (0)