Skip to content

Commit d165308

Browse files
pchintalapudivchuravy
authored andcommittedOct 6, 2023
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 (cherry picked from commit 3381729)
1 parent 3dc8fe6 commit d165308

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
@@ -575,6 +575,34 @@ class PassBuilder {
575575
return PIC;
576576
}
577577

578+
// Invoke the callbacks registered for the various extension points.
579+
// Custom pipelines should use these to invoke the callbacks registered
580+
// by TargetMachines and other clients.
581+
void invokePeepholeEPCallbacks(FunctionPassManager &FPM,
582+
OptimizationLevel Level);
583+
void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM,
584+
OptimizationLevel Level);
585+
void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
586+
OptimizationLevel Level);
587+
void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM,
588+
OptimizationLevel Level);
589+
void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
590+
OptimizationLevel Level);
591+
void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
592+
OptimizationLevel Level);
593+
void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
594+
OptimizationLevel Level);
595+
void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
596+
OptimizationLevel Level);
597+
void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
598+
OptimizationLevel Level);
599+
void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
600+
OptimizationLevel Level);
601+
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
602+
OptimizationLevel Level);
603+
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
604+
OptimizationLevel Level);
605+
578606
private:
579607
// O1 pass pipeline
580608
FunctionPassManager
@@ -608,7 +636,6 @@ class PassBuilder {
608636
bool RunProfileGen, bool IsCS, std::string ProfileFile,
609637
std::string ProfileRemappingFile,
610638
ThinOrFullLTOPhase LTOPhase);
611-
void invokePeepholeEPCallbacks(FunctionPassManager &, OptimizationLevel);
612639

613640
// Extension Point callbacks
614641
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
@@ -303,6 +303,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
303303
for (auto &C : PeepholeEPCallbacks)
304304
C(FPM, Level);
305305
}
306+
void PassBuilder::invokeLateLoopOptimizationsEPCallbacks(
307+
LoopPassManager &LPM, OptimizationLevel Level) {
308+
for (auto &C : LateLoopOptimizationsEPCallbacks)
309+
C(LPM, Level);
310+
}
311+
void PassBuilder::invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
312+
OptimizationLevel Level) {
313+
for (auto &C : LoopOptimizerEndEPCallbacks)
314+
C(LPM, Level);
315+
}
316+
void PassBuilder::invokeScalarOptimizerLateEPCallbacks(
317+
FunctionPassManager &FPM, OptimizationLevel Level) {
318+
for (auto &C : ScalarOptimizerLateEPCallbacks)
319+
C(FPM, Level);
320+
}
321+
void PassBuilder::invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
322+
OptimizationLevel Level) {
323+
for (auto &C : CGSCCOptimizerLateEPCallbacks)
324+
C(CGPM, Level);
325+
}
326+
void PassBuilder::invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
327+
OptimizationLevel Level) {
328+
for (auto &C : VectorizerStartEPCallbacks)
329+
C(FPM, Level);
330+
}
331+
void PassBuilder::invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
332+
OptimizationLevel Level) {
333+
for (auto &C : OptimizerEarlyEPCallbacks)
334+
C(MPM, Level);
335+
}
336+
void PassBuilder::invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
337+
OptimizationLevel Level) {
338+
for (auto &C : OptimizerLastEPCallbacks)
339+
C(MPM, Level);
340+
}
341+
void PassBuilder::invokeFullLinkTimeOptimizationEarlyEPCallbacks(
342+
ModulePassManager &MPM, OptimizationLevel Level) {
343+
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
344+
C(MPM, Level);
345+
}
346+
void PassBuilder::invokeFullLinkTimeOptimizationLastEPCallbacks(
347+
ModulePassManager &MPM, OptimizationLevel Level) {
348+
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
349+
C(MPM, Level);
350+
}
351+
void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
352+
OptimizationLevel Level) {
353+
for (auto &C : PipelineStartEPCallbacks)
354+
C(MPM, Level);
355+
}
356+
void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
357+
ModulePassManager &MPM, OptimizationLevel Level) {
358+
for (auto &C : PipelineEarlySimplificationEPCallbacks)
359+
C(MPM, Level);
360+
}
306361

307362
// Helper to add AnnotationRemarksPass.
308363
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.
@@ -569,8 +621,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
569621
LPM2.addPass(LoopIdiomRecognizePass());
570622
LPM2.addPass(IndVarSimplifyPass());
571623

572-
for (auto &C : LateLoopOptimizationsEPCallbacks)
573-
C(LPM2, Level);
624+
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);
574625

575626
LPM2.addPass(LoopDeletionPass());
576627

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

591-
for (auto &C : LoopOptimizerEndEPCallbacks)
592-
C(LPM2, Level);
642+
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
593643

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

662712
FPM.addPass(CoroElidePass());
663713

664-
for (auto &C : ScalarOptimizerLateEPCallbacks)
665-
C(FPM, Level);
714+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
666715

667716
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
668717
.convertSwitchRangeToICmp(true)
@@ -853,8 +902,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
853902
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
854903
MainCGPipeline.addPass(OpenMPOptCGSCCPass());
855904

856-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
857-
C(MainCGPipeline, Level);
905+
invokeCGSCCOptimizerLateEPCallbacks(MainCGPipeline, Level);
858906

859907
// Lastly, add the core function simplification pipeline nested inside the
860908
// CGSCC walk.
@@ -1009,8 +1057,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
10091057
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
10101058
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
10111059

1012-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
1013-
C(MPM, Level);
1060+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
10141061

10151062
// Interprocedural constant propagation now that basic cleanup has occurred
10161063
// and prior to optimizing globals.
@@ -1282,8 +1329,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12821329
// memory operations.
12831330
MPM.addPass(RecomputeGlobalsAAPass());
12841331

1285-
for (auto &C : OptimizerEarlyEPCallbacks)
1286-
C(MPM, Level);
1332+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
12871333

12881334
FunctionPassManager OptimizePM;
12891335
OptimizePM.addPass(Float2IntPass());
@@ -1301,8 +1347,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
13011347
// rather than on each loop in an inside-out manner, and so they are actually
13021348
// function passes.
13031349

1304-
for (auto &C : VectorizerStartEPCallbacks)
1305-
C(OptimizePM, Level);
1350+
invokeVectorizerStartEPCallbacks(OptimizePM, Level);
13061351

13071352
LoopPassManager LPM;
13081353
// First rotate loops that may have been un-rotated by prior passes.
@@ -1354,8 +1399,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
13541399
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
13551400
PTO.EagerlyInvalidateAnalyses));
13561401

1357-
for (auto &C : OptimizerLastEPCallbacks)
1358-
C(MPM, Level);
1402+
invokeOptimizerLastEPCallbacks(MPM, Level);
13591403

13601404
// Split out cold code. Splitting is done late to avoid hiding context from
13611405
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1408,8 +1452,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
14081452
MPM.addPass(ForceFunctionAttrsPass());
14091453

14101454
// Apply module pipeline start EP callback.
1411-
for (auto &C : PipelineStartEPCallbacks)
1412-
C(MPM, Level);
1455+
invokePipelineStartEPCallbacks(MPM, Level);
14131456

14141457
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
14151458
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
@@ -1453,8 +1496,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
14531496
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
14541497

14551498
// Apply module pipeline start EP callback.
1456-
for (auto &C : PipelineStartEPCallbacks)
1457-
C(MPM, Level);
1499+
invokePipelineStartEPCallbacks(MPM, Level);
14581500

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

14901530
// Emit annotation remarks.
14911531
addAnnotationRemarksPass(MPM);
@@ -1568,8 +1608,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
15681608
// Convert @llvm.global.annotations to !annotation metadata.
15691609
MPM.addPass(Annotation2MetadataPass());
15701610

1571-
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1572-
C(MPM, Level);
1611+
invokeFullLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);
15731612

15741613
// Create a function that performs CFI checks for cross-DSO calls with targets
15751614
// in the current module.
@@ -1584,8 +1623,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
15841623
// in ICP.
15851624
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
15861625

1587-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1588-
C(MPM, Level);
1626+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
15891627

15901628
// Emit annotation remarks.
15911629
addAnnotationRemarksPass(MPM);
@@ -1666,8 +1704,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
16661704
// pipeline).
16671705
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
16681706

1669-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1670-
C(MPM, Level);
1707+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
16711708

16721709
// Emit annotation remarks.
16731710
addAnnotationRemarksPass(MPM);
@@ -1850,8 +1887,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
18501887
if (PTO.CallGraphProfile)
18511888
MPM.addPass(CGProfilePass());
18521889

1853-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1854-
C(MPM, Level);
1890+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
18551891

18561892
// Emit annotation remarks.
18571893
addAnnotationRemarksPass(MPM);
@@ -1880,14 +1916,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
18801916
/* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
18811917
/* IsCS */ false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
18821918

1883-
for (auto &C : PipelineStartEPCallbacks)
1884-
C(MPM, Level);
1919+
invokePipelineStartEPCallbacks(MPM, Level);
18851920

18861921
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
18871922
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
18881923

1889-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
1890-
C(MPM, Level);
1924+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
18911925

18921926
// Build a minimal pipeline based on the semantics required by LLVM,
18931927
// which is just that always inlining occurs. Further, disable generating
@@ -1905,44 +1939,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
19051939

19061940
if (!CGSCCOptimizerLateEPCallbacks.empty()) {
19071941
CGSCCPassManager CGPM;
1908-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
1909-
C(CGPM, Level);
1942+
invokeCGSCCOptimizerLateEPCallbacks(CGPM, Level);
19101943
if (!CGPM.isEmpty())
19111944
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
19121945
}
19131946
if (!LateLoopOptimizationsEPCallbacks.empty()) {
19141947
LoopPassManager LPM;
1915-
for (auto &C : LateLoopOptimizationsEPCallbacks)
1916-
C(LPM, Level);
1948+
invokeLateLoopOptimizationsEPCallbacks(LPM, Level);
19171949
if (!LPM.isEmpty()) {
19181950
MPM.addPass(createModuleToFunctionPassAdaptor(
19191951
createFunctionToLoopPassAdaptor(std::move(LPM))));
19201952
}
19211953
}
19221954
if (!LoopOptimizerEndEPCallbacks.empty()) {
19231955
LoopPassManager LPM;
1924-
for (auto &C : LoopOptimizerEndEPCallbacks)
1925-
C(LPM, Level);
1956+
invokeLoopOptimizerEndEPCallbacks(LPM, Level);
19261957
if (!LPM.isEmpty()) {
19271958
MPM.addPass(createModuleToFunctionPassAdaptor(
19281959
createFunctionToLoopPassAdaptor(std::move(LPM))));
19291960
}
19301961
}
19311962
if (!ScalarOptimizerLateEPCallbacks.empty()) {
19321963
FunctionPassManager FPM;
1933-
for (auto &C : ScalarOptimizerLateEPCallbacks)
1934-
C(FPM, Level);
1964+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
19351965
if (!FPM.isEmpty())
19361966
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
19371967
}
19381968

1939-
for (auto &C : OptimizerEarlyEPCallbacks)
1940-
C(MPM, Level);
1969+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
19411970

19421971
if (!VectorizerStartEPCallbacks.empty()) {
19431972
FunctionPassManager FPM;
1944-
for (auto &C : VectorizerStartEPCallbacks)
1945-
C(FPM, Level);
1973+
invokeVectorizerStartEPCallbacks(FPM, Level);
19461974
if (!FPM.isEmpty())
19471975
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
19481976
}
@@ -1956,8 +1984,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
19561984
CoroPM.addPass(GlobalDCEPass());
19571985
MPM.addPass(CoroConditionalWrapper(std::move(CoroPM)));
19581986

1959-
for (auto &C : OptimizerLastEPCallbacks)
1960-
C(MPM, Level);
1987+
invokeOptimizerLastEPCallbacks(MPM, Level);
19611988

19621989
if (LTOPreLink)
19631990
addRequiredLTOPreLinkPasses(MPM);

0 commit comments

Comments
 (0)
Please sign in to comment.