Skip to content

Commit fcc8566

Browse files
pchintalapudivchuravy
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 (cherry picked from commit 3381729)
1 parent 6f51ecd commit fcc8566

File tree

2 files changed

+110
-55
lines changed

2 files changed

+110
-55
lines changed

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,34 @@ class PassBuilder {
579579
return PIC;
580580
}
581581

582+
// Invoke the callbacks registered for the various extension points.
583+
// Custom pipelines should use these to invoke the callbacks registered
584+
// by TargetMachines and other clients.
585+
void invokePeepholeEPCallbacks(FunctionPassManager &FPM,
586+
OptimizationLevel Level);
587+
void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM,
588+
OptimizationLevel Level);
589+
void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
590+
OptimizationLevel Level);
591+
void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM,
592+
OptimizationLevel Level);
593+
void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
594+
OptimizationLevel Level);
595+
void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
596+
OptimizationLevel Level);
597+
void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
598+
OptimizationLevel Level);
599+
void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
600+
OptimizationLevel Level);
601+
void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
602+
OptimizationLevel Level);
603+
void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
604+
OptimizationLevel Level);
605+
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
606+
OptimizationLevel Level);
607+
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
608+
OptimizationLevel Level);
609+
582610
private:
583611
// O1 pass pipeline
584612
FunctionPassManager
@@ -612,7 +640,6 @@ class PassBuilder {
612640
bool RunProfileGen, bool IsCS, std::string ProfileFile,
613641
std::string ProfileRemappingFile,
614642
ThinOrFullLTOPhase LTOPhase);
615-
void invokePeepholeEPCallbacks(FunctionPassManager &, OptimizationLevel);
616643

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

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 82 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
230230
for (auto &C : PeepholeEPCallbacks)
231231
C(FPM, Level);
232232
}
233+
void PassBuilder::invokeLateLoopOptimizationsEPCallbacks(
234+
LoopPassManager &LPM, OptimizationLevel Level) {
235+
for (auto &C : LateLoopOptimizationsEPCallbacks)
236+
C(LPM, Level);
237+
}
238+
void PassBuilder::invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
239+
OptimizationLevel Level) {
240+
for (auto &C : LoopOptimizerEndEPCallbacks)
241+
C(LPM, Level);
242+
}
243+
void PassBuilder::invokeScalarOptimizerLateEPCallbacks(
244+
FunctionPassManager &FPM, OptimizationLevel Level) {
245+
for (auto &C : ScalarOptimizerLateEPCallbacks)
246+
C(FPM, Level);
247+
}
248+
void PassBuilder::invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
249+
OptimizationLevel Level) {
250+
for (auto &C : CGSCCOptimizerLateEPCallbacks)
251+
C(CGPM, Level);
252+
}
253+
void PassBuilder::invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
254+
OptimizationLevel Level) {
255+
for (auto &C : VectorizerStartEPCallbacks)
256+
C(FPM, Level);
257+
}
258+
void PassBuilder::invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
259+
OptimizationLevel Level) {
260+
for (auto &C : OptimizerEarlyEPCallbacks)
261+
C(MPM, Level);
262+
}
263+
void PassBuilder::invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
264+
OptimizationLevel Level) {
265+
for (auto &C : OptimizerLastEPCallbacks)
266+
C(MPM, Level);
267+
}
268+
void PassBuilder::invokeFullLinkTimeOptimizationEarlyEPCallbacks(
269+
ModulePassManager &MPM, OptimizationLevel Level) {
270+
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
271+
C(MPM, Level);
272+
}
273+
void PassBuilder::invokeFullLinkTimeOptimizationLastEPCallbacks(
274+
ModulePassManager &MPM, OptimizationLevel Level) {
275+
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
276+
C(MPM, Level);
277+
}
278+
void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
279+
OptimizationLevel Level) {
280+
for (auto &C : PipelineStartEPCallbacks)
281+
C(MPM, Level);
282+
}
283+
void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
284+
ModulePassManager &MPM, OptimizationLevel Level) {
285+
for (auto &C : PipelineEarlySimplificationEPCallbacks)
286+
C(MPM, Level);
287+
}
233288

234289
// Helper to add AnnotationRemarksPass.
235290
static void addAnnotationRemarksPass(ModulePassManager &MPM) {
@@ -311,8 +366,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
311366
LPM2.addPass(LoopIdiomRecognizePass());
312367
LPM2.addPass(IndVarSimplifyPass());
313368

314-
for (auto &C : LateLoopOptimizationsEPCallbacks)
315-
C(LPM2, Level);
369+
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);
316370

317371
LPM2.addPass(LoopDeletionPass());
318372

@@ -330,8 +384,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
330384
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
331385
PTO.ForgetAllSCEVInLoopUnroll));
332386

333-
for (auto &C : LoopOptimizerEndEPCallbacks)
334-
C(LPM2, Level);
387+
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
335388

336389
// We provide the opt remark emitter pass for LICM to use. We only need to do
337390
// this once as it is immutable.
@@ -372,8 +425,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
372425

373426
FPM.addPass(CoroElidePass());
374427

375-
for (auto &C : ScalarOptimizerLateEPCallbacks)
376-
C(FPM, Level);
428+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
377429

378430
// Finally, do an expensive DCE pass to catch all the dead code exposed by
379431
// the simplifications and basic cleanup after all the simplifications.
@@ -496,8 +548,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
496548
LPM2.addPass(LoopIdiomRecognizePass());
497549
LPM2.addPass(IndVarSimplifyPass());
498550

499-
for (auto &C : LateLoopOptimizationsEPCallbacks)
500-
C(LPM2, Level);
551+
invokeLateLoopOptimizationsEPCallbacks(LPM2, Level);
501552

502553
LPM2.addPass(LoopDeletionPass());
503554

@@ -515,8 +566,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
515566
/* OnlyWhenForced= */ !PTO.LoopUnrolling,
516567
PTO.ForgetAllSCEVInLoopUnroll));
517568

518-
for (auto &C : LoopOptimizerEndEPCallbacks)
519-
C(LPM2, Level);
569+
invokeLoopOptimizerEndEPCallbacks(LPM2, Level);
520570

521571
// We provide the opt remark emitter pass for LICM to use. We only need to do
522572
// this once as it is immutable.
@@ -589,8 +639,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
589639

590640
FPM.addPass(CoroElidePass());
591641

592-
for (auto &C : ScalarOptimizerLateEPCallbacks)
593-
C(FPM, Level);
642+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
594643

595644
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
596645
.convertSwitchRangeToICmp(true)
@@ -772,8 +821,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
772821
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
773822
MainCGPipeline.addPass(OpenMPOptCGSCCPass());
774823

775-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
776-
C(MainCGPipeline, Level);
824+
invokeCGSCCOptimizerLateEPCallbacks(MainCGPipeline, Level);
777825

778826
// Lastly, add the core function simplification pipeline nested inside the
779827
// CGSCC walk.
@@ -928,8 +976,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
928976
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
929977
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
930978

931-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
932-
C(MPM, Level);
979+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
933980

934981
// Specialize functions with IPSCCP.
935982
if (EnableFunctionSpecialization && Level == OptimizationLevel::O3)
@@ -1189,8 +1236,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
11891236
// memory operations.
11901237
MPM.addPass(RecomputeGlobalsAAPass());
11911238

1192-
for (auto &C : OptimizerEarlyEPCallbacks)
1193-
C(MPM, Level);
1239+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
11941240

11951241
FunctionPassManager OptimizePM;
11961242
OptimizePM.addPass(Float2IntPass());
@@ -1208,8 +1254,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12081254
// rather than on each loop in an inside-out manner, and so they are actually
12091255
// function passes.
12101256

1211-
for (auto &C : VectorizerStartEPCallbacks)
1212-
C(OptimizePM, Level);
1257+
invokeVectorizerStartEPCallbacks(OptimizePM, Level);
12131258

12141259
LoopPassManager LPM;
12151260
// First rotate loops that may have been un-rotated by prior passes.
@@ -1261,8 +1306,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12611306
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
12621307
PTO.EagerlyInvalidateAnalyses));
12631308

1264-
for (auto &C : OptimizerLastEPCallbacks)
1265-
C(MPM, Level);
1309+
invokeOptimizerLastEPCallbacks(MPM, Level);
12661310

12671311
// Split out cold code. Splitting is done late to avoid hiding context from
12681312
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1315,8 +1359,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
13151359
MPM.addPass(ForceFunctionAttrsPass());
13161360

13171361
// Apply module pipeline start EP callback.
1318-
for (auto &C : PipelineStartEPCallbacks)
1319-
C(MPM, Level);
1362+
invokePipelineStartEPCallbacks(MPM, Level);
13201363

13211364
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
13221365
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
@@ -1360,8 +1403,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
13601403
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
13611404

13621405
// Apply module pipeline start EP callback.
1363-
for (auto &C : PipelineStartEPCallbacks)
1364-
C(MPM, Level);
1406+
invokePipelineStartEPCallbacks(MPM, Level);
13651407

13661408
// If we are planning to perform ThinLTO later, we don't bloat the code with
13671409
// unrolling/vectorization/... now. Just simplify the module as much as we
@@ -1389,8 +1431,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
13891431
// Handle OptimizerLastEPCallbacks added by clang on PreLink. Actual
13901432
// optimization is going to be done in PostLink stage, but clang can't
13911433
// add callbacks there in case of in-process ThinLTO called by linker.
1392-
for (auto &C : OptimizerLastEPCallbacks)
1393-
C(MPM, Level);
1434+
invokeOptimizerLastEPCallbacks(MPM, Level);
13941435

13951436
// Emit annotation remarks.
13961437
addAnnotationRemarksPass(MPM);
@@ -1473,8 +1514,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
14731514
// Convert @llvm.global.annotations to !annotation metadata.
14741515
MPM.addPass(Annotation2MetadataPass());
14751516

1476-
for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1477-
C(MPM, Level);
1517+
invokeFullLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);
14781518

14791519
// Create a function that performs CFI checks for cross-DSO calls with targets
14801520
// in the current module.
@@ -1489,8 +1529,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
14891529
// in ICP.
14901530
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
14911531

1492-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1493-
C(MPM, Level);
1532+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
14941533

14951534
// Emit annotation remarks.
14961535
addAnnotationRemarksPass(MPM);
@@ -1571,8 +1610,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
15711610
// pipeline).
15721611
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
15731612

1574-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1575-
C(MPM, Level);
1613+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
15761614

15771615
// Emit annotation remarks.
15781616
addAnnotationRemarksPass(MPM);
@@ -1753,8 +1791,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
17531791
if (PTO.CallGraphProfile)
17541792
MPM.addPass(CGProfilePass());
17551793

1756-
for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1757-
C(MPM, Level);
1794+
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
17581795

17591796
// Emit annotation remarks.
17601797
addAnnotationRemarksPass(MPM);
@@ -1783,14 +1820,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
17831820
/* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
17841821
/* IsCS */ false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
17851822

1786-
for (auto &C : PipelineStartEPCallbacks)
1787-
C(MPM, Level);
1823+
invokePipelineStartEPCallbacks(MPM, Level);
17881824

17891825
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
17901826
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
17911827

1792-
for (auto &C : PipelineEarlySimplificationEPCallbacks)
1793-
C(MPM, Level);
1828+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
17941829

17951830
// Build a minimal pipeline based on the semantics required by LLVM,
17961831
// which is just that always inlining occurs. Further, disable generating
@@ -1808,44 +1843,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
18081843

18091844
if (!CGSCCOptimizerLateEPCallbacks.empty()) {
18101845
CGSCCPassManager CGPM;
1811-
for (auto &C : CGSCCOptimizerLateEPCallbacks)
1812-
C(CGPM, Level);
1846+
invokeCGSCCOptimizerLateEPCallbacks(CGPM, Level);
18131847
if (!CGPM.isEmpty())
18141848
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
18151849
}
18161850
if (!LateLoopOptimizationsEPCallbacks.empty()) {
18171851
LoopPassManager LPM;
1818-
for (auto &C : LateLoopOptimizationsEPCallbacks)
1819-
C(LPM, Level);
1852+
invokeLateLoopOptimizationsEPCallbacks(LPM, Level);
18201853
if (!LPM.isEmpty()) {
18211854
MPM.addPass(createModuleToFunctionPassAdaptor(
18221855
createFunctionToLoopPassAdaptor(std::move(LPM))));
18231856
}
18241857
}
18251858
if (!LoopOptimizerEndEPCallbacks.empty()) {
18261859
LoopPassManager LPM;
1827-
for (auto &C : LoopOptimizerEndEPCallbacks)
1828-
C(LPM, Level);
1860+
invokeLoopOptimizerEndEPCallbacks(LPM, Level);
18291861
if (!LPM.isEmpty()) {
18301862
MPM.addPass(createModuleToFunctionPassAdaptor(
18311863
createFunctionToLoopPassAdaptor(std::move(LPM))));
18321864
}
18331865
}
18341866
if (!ScalarOptimizerLateEPCallbacks.empty()) {
18351867
FunctionPassManager FPM;
1836-
for (auto &C : ScalarOptimizerLateEPCallbacks)
1837-
C(FPM, Level);
1868+
invokeScalarOptimizerLateEPCallbacks(FPM, Level);
18381869
if (!FPM.isEmpty())
18391870
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
18401871
}
18411872

1842-
for (auto &C : OptimizerEarlyEPCallbacks)
1843-
C(MPM, Level);
1873+
invokeOptimizerEarlyEPCallbacks(MPM, Level);
18441874

18451875
if (!VectorizerStartEPCallbacks.empty()) {
18461876
FunctionPassManager FPM;
1847-
for (auto &C : VectorizerStartEPCallbacks)
1848-
C(FPM, Level);
1877+
invokeVectorizerStartEPCallbacks(FPM, Level);
18491878
if (!FPM.isEmpty())
18501879
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
18511880
}
@@ -1859,8 +1888,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
18591888
CoroPM.addPass(GlobalDCEPass());
18601889
MPM.addPass(CoroConditionalWrapper(std::move(CoroPM)));
18611890

1862-
for (auto &C : OptimizerLastEPCallbacks)
1863-
C(MPM, Level);
1891+
invokeOptimizerLastEPCallbacks(MPM, Level);
18641892

18651893
if (LTOPreLink)
18661894
addRequiredLTOPreLinkPasses(MPM);

0 commit comments

Comments
 (0)