@@ -303,6 +303,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
303
303
for (auto &C : PeepholeEPCallbacks)
304
304
C (FPM, Level);
305
305
}
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
+ }
306
361
307
362
// Helper to add AnnotationRemarksPass.
308
363
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.
@@ -569,8 +621,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
569
621
LPM2.addPass (LoopIdiomRecognizePass ());
570
622
LPM2.addPass (IndVarSimplifyPass ());
571
623
572
- for (auto &C : LateLoopOptimizationsEPCallbacks)
573
- C (LPM2, Level);
624
+ invokeLateLoopOptimizationsEPCallbacks (LPM2, Level);
574
625
575
626
LPM2.addPass (LoopDeletionPass ());
576
627
@@ -588,8 +639,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
588
639
/* OnlyWhenForced= */ !PTO.LoopUnrolling ,
589
640
PTO.ForgetAllSCEVInLoopUnroll ));
590
641
591
- for (auto &C : LoopOptimizerEndEPCallbacks)
592
- C (LPM2, Level);
642
+ invokeLoopOptimizerEndEPCallbacks (LPM2, Level);
593
643
594
644
// We provide the opt remark emitter pass for LICM to use. We only need to do
595
645
// this once as it is immutable.
@@ -661,8 +711,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
661
711
662
712
FPM.addPass (CoroElidePass ());
663
713
664
- for (auto &C : ScalarOptimizerLateEPCallbacks)
665
- C (FPM, Level);
714
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
666
715
667
716
FPM.addPass (SimplifyCFGPass (SimplifyCFGOptions ()
668
717
.convertSwitchRangeToICmp (true )
@@ -853,8 +902,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
853
902
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
854
903
MainCGPipeline.addPass (OpenMPOptCGSCCPass ());
855
904
856
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
857
- C (MainCGPipeline, Level);
905
+ invokeCGSCCOptimizerLateEPCallbacks (MainCGPipeline, Level);
858
906
859
907
// Lastly, add the core function simplification pipeline nested inside the
860
908
// CGSCC walk.
@@ -1009,8 +1057,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
1009
1057
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
1010
1058
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1011
1059
1012
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
1013
- C (MPM, Level);
1060
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
1014
1061
1015
1062
// Interprocedural constant propagation now that basic cleanup has occurred
1016
1063
// and prior to optimizing globals.
@@ -1282,8 +1329,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1282
1329
// memory operations.
1283
1330
MPM.addPass (RecomputeGlobalsAAPass ());
1284
1331
1285
- for (auto &C : OptimizerEarlyEPCallbacks)
1286
- C (MPM, Level);
1332
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1287
1333
1288
1334
FunctionPassManager OptimizePM;
1289
1335
OptimizePM.addPass (Float2IntPass ());
@@ -1301,8 +1347,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1301
1347
// rather than on each loop in an inside-out manner, and so they are actually
1302
1348
// function passes.
1303
1349
1304
- for (auto &C : VectorizerStartEPCallbacks)
1305
- C (OptimizePM, Level);
1350
+ invokeVectorizerStartEPCallbacks (OptimizePM, Level);
1306
1351
1307
1352
LoopPassManager LPM;
1308
1353
// First rotate loops that may have been un-rotated by prior passes.
@@ -1354,8 +1399,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1354
1399
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (OptimizePM),
1355
1400
PTO.EagerlyInvalidateAnalyses ));
1356
1401
1357
- for (auto &C : OptimizerLastEPCallbacks)
1358
- C (MPM, Level);
1402
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1359
1403
1360
1404
// Split out cold code. Splitting is done late to avoid hiding context from
1361
1405
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1408,8 +1452,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
1408
1452
MPM.addPass (ForceFunctionAttrsPass ());
1409
1453
1410
1454
// Apply module pipeline start EP callback.
1411
- for (auto &C : PipelineStartEPCallbacks)
1412
- C (MPM, Level);
1455
+ invokePipelineStartEPCallbacks (MPM, Level);
1413
1456
1414
1457
if (PGOOpt && PGOOpt->DebugInfoForProfiling )
1415
1458
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
@@ -1453,8 +1496,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1453
1496
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1454
1497
1455
1498
// Apply module pipeline start EP callback.
1456
- for (auto &C : PipelineStartEPCallbacks)
1457
- C (MPM, Level);
1499
+ invokePipelineStartEPCallbacks (MPM, Level);
1458
1500
1459
1501
// If we are planning to perform ThinLTO later, we don't bloat the code with
1460
1502
// unrolling/vectorization/... now. Just simplify the module as much as we
@@ -1482,10 +1524,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1482
1524
// Handle Optimizer{Early,Last}EPCallbacks added by clang on PreLink. Actual
1483
1525
// optimization is going to be done in PostLink stage, but clang can't add
1484
1526
// 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);
1489
1529
1490
1530
// Emit annotation remarks.
1491
1531
addAnnotationRemarksPass (MPM);
@@ -1568,8 +1608,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1568
1608
// Convert @llvm.global.annotations to !annotation metadata.
1569
1609
MPM.addPass (Annotation2MetadataPass ());
1570
1610
1571
- for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1572
- C (MPM, Level);
1611
+ invokeFullLinkTimeOptimizationEarlyEPCallbacks (MPM, Level);
1573
1612
1574
1613
// Create a function that performs CFI checks for cross-DSO calls with targets
1575
1614
// in the current module.
@@ -1584,8 +1623,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1584
1623
// in ICP.
1585
1624
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1586
1625
1587
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1588
- C (MPM, Level);
1626
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1589
1627
1590
1628
// Emit annotation remarks.
1591
1629
addAnnotationRemarksPass (MPM);
@@ -1666,8 +1704,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1666
1704
// pipeline).
1667
1705
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1668
1706
1669
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1670
- C (MPM, Level);
1707
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1671
1708
1672
1709
// Emit annotation remarks.
1673
1710
addAnnotationRemarksPass (MPM);
@@ -1850,8 +1887,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1850
1887
if (PTO.CallGraphProfile )
1851
1888
MPM.addPass (CGProfilePass ());
1852
1889
1853
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1854
- C (MPM, Level);
1890
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1855
1891
1856
1892
// Emit annotation remarks.
1857
1893
addAnnotationRemarksPass (MPM);
@@ -1880,14 +1916,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1880
1916
/* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
1881
1917
/* IsCS */ false , PGOOpt->ProfileFile , PGOOpt->ProfileRemappingFile );
1882
1918
1883
- for (auto &C : PipelineStartEPCallbacks)
1884
- C (MPM, Level);
1919
+ invokePipelineStartEPCallbacks (MPM, Level);
1885
1920
1886
1921
if (PGOOpt && PGOOpt->DebugInfoForProfiling )
1887
1922
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1888
1923
1889
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
1890
- C (MPM, Level);
1924
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
1891
1925
1892
1926
// Build a minimal pipeline based on the semantics required by LLVM,
1893
1927
// which is just that always inlining occurs. Further, disable generating
@@ -1905,44 +1939,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1905
1939
1906
1940
if (!CGSCCOptimizerLateEPCallbacks.empty ()) {
1907
1941
CGSCCPassManager CGPM;
1908
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
1909
- C (CGPM, Level);
1942
+ invokeCGSCCOptimizerLateEPCallbacks (CGPM, Level);
1910
1943
if (!CGPM.isEmpty ())
1911
1944
MPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (std::move (CGPM)));
1912
1945
}
1913
1946
if (!LateLoopOptimizationsEPCallbacks.empty ()) {
1914
1947
LoopPassManager LPM;
1915
- for (auto &C : LateLoopOptimizationsEPCallbacks)
1916
- C (LPM, Level);
1948
+ invokeLateLoopOptimizationsEPCallbacks (LPM, Level);
1917
1949
if (!LPM.isEmpty ()) {
1918
1950
MPM.addPass (createModuleToFunctionPassAdaptor (
1919
1951
createFunctionToLoopPassAdaptor (std::move (LPM))));
1920
1952
}
1921
1953
}
1922
1954
if (!LoopOptimizerEndEPCallbacks.empty ()) {
1923
1955
LoopPassManager LPM;
1924
- for (auto &C : LoopOptimizerEndEPCallbacks)
1925
- C (LPM, Level);
1956
+ invokeLoopOptimizerEndEPCallbacks (LPM, Level);
1926
1957
if (!LPM.isEmpty ()) {
1927
1958
MPM.addPass (createModuleToFunctionPassAdaptor (
1928
1959
createFunctionToLoopPassAdaptor (std::move (LPM))));
1929
1960
}
1930
1961
}
1931
1962
if (!ScalarOptimizerLateEPCallbacks.empty ()) {
1932
1963
FunctionPassManager FPM;
1933
- for (auto &C : ScalarOptimizerLateEPCallbacks)
1934
- C (FPM, Level);
1964
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
1935
1965
if (!FPM.isEmpty ())
1936
1966
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1937
1967
}
1938
1968
1939
- for (auto &C : OptimizerEarlyEPCallbacks)
1940
- C (MPM, Level);
1969
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1941
1970
1942
1971
if (!VectorizerStartEPCallbacks.empty ()) {
1943
1972
FunctionPassManager FPM;
1944
- for (auto &C : VectorizerStartEPCallbacks)
1945
- C (FPM, Level);
1973
+ invokeVectorizerStartEPCallbacks (FPM, Level);
1946
1974
if (!FPM.isEmpty ())
1947
1975
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1948
1976
}
@@ -1956,8 +1984,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1956
1984
CoroPM.addPass (GlobalDCEPass ());
1957
1985
MPM.addPass (CoroConditionalWrapper (std::move (CoroPM)));
1958
1986
1959
- for (auto &C : OptimizerLastEPCallbacks)
1960
- C (MPM, Level);
1987
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1961
1988
1962
1989
if (LTOPreLink)
1963
1990
addRequiredLTOPreLinkPasses (MPM);
0 commit comments