@@ -300,6 +300,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
300
300
for (auto &C : PeepholeEPCallbacks)
301
301
C (FPM, Level);
302
302
}
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
+ }
303
358
304
359
// Helper to add AnnotationRemarksPass.
305
360
static void addAnnotationRemarksPass (ModulePassManager &MPM) {
@@ -384,8 +439,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
384
439
LPM2.addPass (LoopIdiomRecognizePass ());
385
440
LPM2.addPass (IndVarSimplifyPass ());
386
441
387
- for (auto &C : LateLoopOptimizationsEPCallbacks)
388
- C (LPM2, Level);
442
+ invokeLateLoopOptimizationsEPCallbacks (LPM2, Level);
389
443
390
444
LPM2.addPass (LoopDeletionPass ());
391
445
@@ -403,8 +457,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
403
457
/* OnlyWhenForced= */ !PTO.LoopUnrolling ,
404
458
PTO.ForgetAllSCEVInLoopUnroll ));
405
459
406
- for (auto &C : LoopOptimizerEndEPCallbacks)
407
- C (LPM2, Level);
460
+ invokeLoopOptimizerEndEPCallbacks (LPM2, Level);
408
461
409
462
// We provide the opt remark emitter pass for LICM to use. We only need to do
410
463
// this once as it is immutable.
@@ -445,8 +498,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
445
498
446
499
FPM.addPass (CoroElidePass ());
447
500
448
- for (auto &C : ScalarOptimizerLateEPCallbacks)
449
- C (FPM, Level);
501
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
450
502
451
503
// Finally, do an expensive DCE pass to catch all the dead code exposed by
452
504
// the simplifications and basic cleanup after all the simplifications.
@@ -570,8 +622,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
570
622
LPM2.addPass (LoopIdiomRecognizePass ());
571
623
LPM2.addPass (IndVarSimplifyPass ());
572
624
573
- for (auto &C : LateLoopOptimizationsEPCallbacks)
574
- C (LPM2, Level);
625
+ invokeLateLoopOptimizationsEPCallbacks (LPM2, Level);
575
626
576
627
LPM2.addPass (LoopDeletionPass ());
577
628
@@ -589,8 +640,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
589
640
/* OnlyWhenForced= */ !PTO.LoopUnrolling ,
590
641
PTO.ForgetAllSCEVInLoopUnroll ));
591
642
592
- for (auto &C : LoopOptimizerEndEPCallbacks)
593
- C (LPM2, Level);
643
+ invokeLoopOptimizerEndEPCallbacks (LPM2, Level);
594
644
595
645
// We provide the opt remark emitter pass for LICM to use. We only need to do
596
646
// this once as it is immutable.
@@ -662,8 +712,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
662
712
663
713
FPM.addPass (CoroElidePass ());
664
714
665
- for (auto &C : ScalarOptimizerLateEPCallbacks)
666
- C (FPM, Level);
715
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
667
716
668
717
FPM.addPass (SimplifyCFGPass (SimplifyCFGOptions ()
669
718
.convertSwitchRangeToICmp (true )
@@ -849,8 +898,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
849
898
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
850
899
MainCGPipeline.addPass (OpenMPOptCGSCCPass ());
851
900
852
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
853
- C (MainCGPipeline, Level);
901
+ invokeCGSCCOptimizerLateEPCallbacks (MainCGPipeline, Level);
854
902
855
903
// Add the core function simplification pipeline nested inside the
856
904
// CGSCC walk.
@@ -1007,8 +1055,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
1007
1055
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
1008
1056
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1009
1057
1010
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
1011
- C (MPM, Level);
1058
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
1012
1059
1013
1060
// Interprocedural constant propagation now that basic cleanup has occurred
1014
1061
// and prior to optimizing globals.
@@ -1279,8 +1326,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1279
1326
// memory operations.
1280
1327
MPM.addPass (RecomputeGlobalsAAPass ());
1281
1328
1282
- for (auto &C : OptimizerEarlyEPCallbacks)
1283
- C (MPM, Level);
1329
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1284
1330
1285
1331
FunctionPassManager OptimizePM;
1286
1332
OptimizePM.addPass (Float2IntPass ());
@@ -1303,8 +1349,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1303
1349
// rather than on each loop in an inside-out manner, and so they are actually
1304
1350
// function passes.
1305
1351
1306
- for (auto &C : VectorizerStartEPCallbacks)
1307
- C (OptimizePM, Level);
1352
+ invokeVectorizerStartEPCallbacks (OptimizePM, Level);
1308
1353
1309
1354
LoopPassManager LPM;
1310
1355
// First rotate loops that may have been un-rotated by prior passes.
@@ -1356,8 +1401,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1356
1401
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (OptimizePM),
1357
1402
PTO.EagerlyInvalidateAnalyses ));
1358
1403
1359
- for (auto &C : OptimizerLastEPCallbacks)
1360
- C (MPM, Level);
1404
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1361
1405
1362
1406
// Split out cold code. Splitting is done late to avoid hiding context from
1363
1407
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1413,8 +1457,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
1413
1457
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1414
1458
1415
1459
// Apply module pipeline start EP callback.
1416
- for (auto &C : PipelineStartEPCallbacks)
1417
- C (MPM, Level);
1460
+ invokePipelineStartEPCallbacks (MPM, Level);
1418
1461
1419
1462
const ThinOrFullLTOPhase LTOPhase = LTOPreLink
1420
1463
? ThinOrFullLTOPhase::FullLTOPreLink
@@ -1455,8 +1498,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1455
1498
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1456
1499
1457
1500
// Apply module pipeline start EP callback.
1458
- for (auto &C : PipelineStartEPCallbacks)
1459
- C (MPM, Level);
1501
+ invokePipelineStartEPCallbacks (MPM, Level);
1460
1502
1461
1503
// If we are planning to perform ThinLTO later, we don't bloat the code with
1462
1504
// unrolling/vectorization/... now. Just simplify the module as much as we
@@ -1481,10 +1523,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1481
1523
// Handle Optimizer{Early,Last}EPCallbacks added by clang on PreLink. Actual
1482
1524
// optimization is going to be done in PostLink stage, but clang can't add
1483
1525
// 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);
1488
1528
1489
1529
// Emit annotation remarks.
1490
1530
addAnnotationRemarksPass (MPM);
@@ -1559,8 +1599,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1559
1599
ModuleSummaryIndex *ExportSummary) {
1560
1600
ModulePassManager MPM;
1561
1601
1562
- for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1563
- C (MPM, Level);
1602
+ invokeFullLinkTimeOptimizationEarlyEPCallbacks (MPM, Level);
1564
1603
1565
1604
// Create a function that performs CFI checks for cross-DSO calls with targets
1566
1605
// in the current module.
@@ -1575,8 +1614,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1575
1614
// in ICP.
1576
1615
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1577
1616
1578
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1579
- C (MPM, Level);
1617
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1580
1618
1581
1619
// Emit annotation remarks.
1582
1620
addAnnotationRemarksPass (MPM);
@@ -1657,8 +1695,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1657
1695
// pipeline).
1658
1696
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1659
1697
1660
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1661
- C (MPM, Level);
1698
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1662
1699
1663
1700
// Emit annotation remarks.
1664
1701
addAnnotationRemarksPass (MPM);
@@ -1867,8 +1904,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1867
1904
if (PTO.CallGraphProfile )
1868
1905
MPM.addPass (CGProfilePass ());
1869
1906
1870
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1871
- C (MPM, Level);
1907
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1872
1908
1873
1909
// Emit annotation remarks.
1874
1910
addAnnotationRemarksPass (MPM);
@@ -1898,14 +1934,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1898
1934
/* IsCS */ false , PGOOpt->ProfileFile , PGOOpt->ProfileRemappingFile ,
1899
1935
PGOOpt->FS );
1900
1936
1901
- for (auto &C : PipelineStartEPCallbacks)
1902
- C (MPM, Level);
1937
+ invokePipelineStartEPCallbacks (MPM, Level);
1903
1938
1904
1939
if (PGOOpt && PGOOpt->DebugInfoForProfiling )
1905
1940
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1906
1941
1907
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
1908
- C (MPM, Level);
1942
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
1909
1943
1910
1944
// Build a minimal pipeline based on the semantics required by LLVM,
1911
1945
// which is just that always inlining occurs. Further, disable generating
@@ -1923,44 +1957,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1923
1957
1924
1958
if (!CGSCCOptimizerLateEPCallbacks.empty ()) {
1925
1959
CGSCCPassManager CGPM;
1926
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
1927
- C (CGPM, Level);
1960
+ invokeCGSCCOptimizerLateEPCallbacks (CGPM, Level);
1928
1961
if (!CGPM.isEmpty ())
1929
1962
MPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (std::move (CGPM)));
1930
1963
}
1931
1964
if (!LateLoopOptimizationsEPCallbacks.empty ()) {
1932
1965
LoopPassManager LPM;
1933
- for (auto &C : LateLoopOptimizationsEPCallbacks)
1934
- C (LPM, Level);
1966
+ invokeLateLoopOptimizationsEPCallbacks (LPM, Level);
1935
1967
if (!LPM.isEmpty ()) {
1936
1968
MPM.addPass (createModuleToFunctionPassAdaptor (
1937
1969
createFunctionToLoopPassAdaptor (std::move (LPM))));
1938
1970
}
1939
1971
}
1940
1972
if (!LoopOptimizerEndEPCallbacks.empty ()) {
1941
1973
LoopPassManager LPM;
1942
- for (auto &C : LoopOptimizerEndEPCallbacks)
1943
- C (LPM, Level);
1974
+ invokeLoopOptimizerEndEPCallbacks (LPM, Level);
1944
1975
if (!LPM.isEmpty ()) {
1945
1976
MPM.addPass (createModuleToFunctionPassAdaptor (
1946
1977
createFunctionToLoopPassAdaptor (std::move (LPM))));
1947
1978
}
1948
1979
}
1949
1980
if (!ScalarOptimizerLateEPCallbacks.empty ()) {
1950
1981
FunctionPassManager FPM;
1951
- for (auto &C : ScalarOptimizerLateEPCallbacks)
1952
- C (FPM, Level);
1982
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
1953
1983
if (!FPM.isEmpty ())
1954
1984
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1955
1985
}
1956
1986
1957
- for (auto &C : OptimizerEarlyEPCallbacks)
1958
- C (MPM, Level);
1987
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1959
1988
1960
1989
if (!VectorizerStartEPCallbacks.empty ()) {
1961
1990
FunctionPassManager FPM;
1962
- for (auto &C : VectorizerStartEPCallbacks)
1963
- C (FPM, Level);
1991
+ invokeVectorizerStartEPCallbacks (FPM, Level);
1964
1992
if (!FPM.isEmpty ())
1965
1993
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1966
1994
}
@@ -1974,8 +2002,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1974
2002
CoroPM.addPass (GlobalDCEPass ());
1975
2003
MPM.addPass (CoroConditionalWrapper (std::move (CoroPM)));
1976
2004
1977
- for (auto &C : OptimizerLastEPCallbacks)
1978
- C (MPM, Level);
2005
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1979
2006
1980
2007
if (LTOPreLink)
1981
2008
addRequiredLTOPreLinkPasses (MPM);
0 commit comments