@@ -230,6 +230,61 @@ void PassBuilder::invokePeepholeEPCallbacks(FunctionPassManager &FPM,
230
230
for (auto &C : PeepholeEPCallbacks)
231
231
C (FPM, Level);
232
232
}
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
+ }
233
288
234
289
// Helper to add AnnotationRemarksPass.
235
290
static void addAnnotationRemarksPass (ModulePassManager &MPM) {
@@ -311,8 +366,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
311
366
LPM2.addPass (LoopIdiomRecognizePass ());
312
367
LPM2.addPass (IndVarSimplifyPass ());
313
368
314
- for (auto &C : LateLoopOptimizationsEPCallbacks)
315
- C (LPM2, Level);
369
+ invokeLateLoopOptimizationsEPCallbacks (LPM2, Level);
316
370
317
371
LPM2.addPass (LoopDeletionPass ());
318
372
@@ -330,8 +384,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
330
384
/* OnlyWhenForced= */ !PTO.LoopUnrolling ,
331
385
PTO.ForgetAllSCEVInLoopUnroll ));
332
386
333
- for (auto &C : LoopOptimizerEndEPCallbacks)
334
- C (LPM2, Level);
387
+ invokeLoopOptimizerEndEPCallbacks (LPM2, Level);
335
388
336
389
// We provide the opt remark emitter pass for LICM to use. We only need to do
337
390
// this once as it is immutable.
@@ -372,8 +425,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
372
425
373
426
FPM.addPass (CoroElidePass ());
374
427
375
- for (auto &C : ScalarOptimizerLateEPCallbacks)
376
- C (FPM, Level);
428
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
377
429
378
430
// Finally, do an expensive DCE pass to catch all the dead code exposed by
379
431
// the simplifications and basic cleanup after all the simplifications.
@@ -496,8 +548,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
496
548
LPM2.addPass (LoopIdiomRecognizePass ());
497
549
LPM2.addPass (IndVarSimplifyPass ());
498
550
499
- for (auto &C : LateLoopOptimizationsEPCallbacks)
500
- C (LPM2, Level);
551
+ invokeLateLoopOptimizationsEPCallbacks (LPM2, Level);
501
552
502
553
LPM2.addPass (LoopDeletionPass ());
503
554
@@ -515,8 +566,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
515
566
/* OnlyWhenForced= */ !PTO.LoopUnrolling ,
516
567
PTO.ForgetAllSCEVInLoopUnroll ));
517
568
518
- for (auto &C : LoopOptimizerEndEPCallbacks)
519
- C (LPM2, Level);
569
+ invokeLoopOptimizerEndEPCallbacks (LPM2, Level);
520
570
521
571
// We provide the opt remark emitter pass for LICM to use. We only need to do
522
572
// this once as it is immutable.
@@ -589,8 +639,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
589
639
590
640
FPM.addPass (CoroElidePass ());
591
641
592
- for (auto &C : ScalarOptimizerLateEPCallbacks)
593
- C (FPM, Level);
642
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
594
643
595
644
FPM.addPass (SimplifyCFGPass (SimplifyCFGOptions ()
596
645
.convertSwitchRangeToICmp (true )
@@ -772,8 +821,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
772
821
if (Level == OptimizationLevel::O2 || Level == OptimizationLevel::O3)
773
822
MainCGPipeline.addPass (OpenMPOptCGSCCPass ());
774
823
775
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
776
- C (MainCGPipeline, Level);
824
+ invokeCGSCCOptimizerLateEPCallbacks (MainCGPipeline, Level);
777
825
778
826
// Lastly, add the core function simplification pipeline nested inside the
779
827
// CGSCC walk.
@@ -928,8 +976,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
928
976
if (Phase == ThinOrFullLTOPhase::ThinLTOPostLink)
929
977
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
930
978
931
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
932
- C (MPM, Level);
979
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
933
980
934
981
// Specialize functions with IPSCCP.
935
982
if (EnableFunctionSpecialization && Level == OptimizationLevel::O3)
@@ -1189,8 +1236,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1189
1236
// memory operations.
1190
1237
MPM.addPass (RecomputeGlobalsAAPass ());
1191
1238
1192
- for (auto &C : OptimizerEarlyEPCallbacks)
1193
- C (MPM, Level);
1239
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1194
1240
1195
1241
FunctionPassManager OptimizePM;
1196
1242
OptimizePM.addPass (Float2IntPass ());
@@ -1208,8 +1254,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1208
1254
// rather than on each loop in an inside-out manner, and so they are actually
1209
1255
// function passes.
1210
1256
1211
- for (auto &C : VectorizerStartEPCallbacks)
1212
- C (OptimizePM, Level);
1257
+ invokeVectorizerStartEPCallbacks (OptimizePM, Level);
1213
1258
1214
1259
LoopPassManager LPM;
1215
1260
// First rotate loops that may have been un-rotated by prior passes.
@@ -1261,8 +1306,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
1261
1306
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (OptimizePM),
1262
1307
PTO.EagerlyInvalidateAnalyses ));
1263
1308
1264
- for (auto &C : OptimizerLastEPCallbacks)
1265
- C (MPM, Level);
1309
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1266
1310
1267
1311
// Split out cold code. Splitting is done late to avoid hiding context from
1268
1312
// other optimizations and inadvertently regressing performance. The tradeoff
@@ -1315,8 +1359,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
1315
1359
MPM.addPass (ForceFunctionAttrsPass ());
1316
1360
1317
1361
// Apply module pipeline start EP callback.
1318
- for (auto &C : PipelineStartEPCallbacks)
1319
- C (MPM, Level);
1362
+ invokePipelineStartEPCallbacks (MPM, Level);
1320
1363
1321
1364
if (PGOOpt && PGOOpt->DebugInfoForProfiling )
1322
1365
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
@@ -1360,8 +1403,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1360
1403
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1361
1404
1362
1405
// Apply module pipeline start EP callback.
1363
- for (auto &C : PipelineStartEPCallbacks)
1364
- C (MPM, Level);
1406
+ invokePipelineStartEPCallbacks (MPM, Level);
1365
1407
1366
1408
// If we are planning to perform ThinLTO later, we don't bloat the code with
1367
1409
// unrolling/vectorization/... now. Just simplify the module as much as we
@@ -1389,8 +1431,7 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
1389
1431
// Handle OptimizerLastEPCallbacks added by clang on PreLink. Actual
1390
1432
// optimization is going to be done in PostLink stage, but clang can't
1391
1433
// 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);
1394
1435
1395
1436
// Emit annotation remarks.
1396
1437
addAnnotationRemarksPass (MPM);
@@ -1473,8 +1514,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1473
1514
// Convert @llvm.global.annotations to !annotation metadata.
1474
1515
MPM.addPass (Annotation2MetadataPass ());
1475
1516
1476
- for (auto &C : FullLinkTimeOptimizationEarlyEPCallbacks)
1477
- C (MPM, Level);
1517
+ invokeFullLinkTimeOptimizationEarlyEPCallbacks (MPM, Level);
1478
1518
1479
1519
// Create a function that performs CFI checks for cross-DSO calls with targets
1480
1520
// in the current module.
@@ -1489,8 +1529,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1489
1529
// in ICP.
1490
1530
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1491
1531
1492
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1493
- C (MPM, Level);
1532
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1494
1533
1495
1534
// Emit annotation remarks.
1496
1535
addAnnotationRemarksPass (MPM);
@@ -1571,8 +1610,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1571
1610
// pipeline).
1572
1611
MPM.addPass (LowerTypeTestsPass (nullptr , nullptr , true ));
1573
1612
1574
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1575
- C (MPM, Level);
1613
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1576
1614
1577
1615
// Emit annotation remarks.
1578
1616
addAnnotationRemarksPass (MPM);
@@ -1753,8 +1791,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
1753
1791
if (PTO.CallGraphProfile )
1754
1792
MPM.addPass (CGProfilePass ());
1755
1793
1756
- for (auto &C : FullLinkTimeOptimizationLastEPCallbacks)
1757
- C (MPM, Level);
1794
+ invokeFullLinkTimeOptimizationLastEPCallbacks (MPM, Level);
1758
1795
1759
1796
// Emit annotation remarks.
1760
1797
addAnnotationRemarksPass (MPM);
@@ -1783,14 +1820,12 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1783
1820
/* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
1784
1821
/* IsCS */ false , PGOOpt->ProfileFile , PGOOpt->ProfileRemappingFile );
1785
1822
1786
- for (auto &C : PipelineStartEPCallbacks)
1787
- C (MPM, Level);
1823
+ invokePipelineStartEPCallbacks (MPM, Level);
1788
1824
1789
1825
if (PGOOpt && PGOOpt->DebugInfoForProfiling )
1790
1826
MPM.addPass (createModuleToFunctionPassAdaptor (AddDiscriminatorsPass ()));
1791
1827
1792
- for (auto &C : PipelineEarlySimplificationEPCallbacks)
1793
- C (MPM, Level);
1828
+ invokePipelineEarlySimplificationEPCallbacks (MPM, Level);
1794
1829
1795
1830
// Build a minimal pipeline based on the semantics required by LLVM,
1796
1831
// which is just that always inlining occurs. Further, disable generating
@@ -1808,44 +1843,38 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1808
1843
1809
1844
if (!CGSCCOptimizerLateEPCallbacks.empty ()) {
1810
1845
CGSCCPassManager CGPM;
1811
- for (auto &C : CGSCCOptimizerLateEPCallbacks)
1812
- C (CGPM, Level);
1846
+ invokeCGSCCOptimizerLateEPCallbacks (CGPM, Level);
1813
1847
if (!CGPM.isEmpty ())
1814
1848
MPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (std::move (CGPM)));
1815
1849
}
1816
1850
if (!LateLoopOptimizationsEPCallbacks.empty ()) {
1817
1851
LoopPassManager LPM;
1818
- for (auto &C : LateLoopOptimizationsEPCallbacks)
1819
- C (LPM, Level);
1852
+ invokeLateLoopOptimizationsEPCallbacks (LPM, Level);
1820
1853
if (!LPM.isEmpty ()) {
1821
1854
MPM.addPass (createModuleToFunctionPassAdaptor (
1822
1855
createFunctionToLoopPassAdaptor (std::move (LPM))));
1823
1856
}
1824
1857
}
1825
1858
if (!LoopOptimizerEndEPCallbacks.empty ()) {
1826
1859
LoopPassManager LPM;
1827
- for (auto &C : LoopOptimizerEndEPCallbacks)
1828
- C (LPM, Level);
1860
+ invokeLoopOptimizerEndEPCallbacks (LPM, Level);
1829
1861
if (!LPM.isEmpty ()) {
1830
1862
MPM.addPass (createModuleToFunctionPassAdaptor (
1831
1863
createFunctionToLoopPassAdaptor (std::move (LPM))));
1832
1864
}
1833
1865
}
1834
1866
if (!ScalarOptimizerLateEPCallbacks.empty ()) {
1835
1867
FunctionPassManager FPM;
1836
- for (auto &C : ScalarOptimizerLateEPCallbacks)
1837
- C (FPM, Level);
1868
+ invokeScalarOptimizerLateEPCallbacks (FPM, Level);
1838
1869
if (!FPM.isEmpty ())
1839
1870
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1840
1871
}
1841
1872
1842
- for (auto &C : OptimizerEarlyEPCallbacks)
1843
- C (MPM, Level);
1873
+ invokeOptimizerEarlyEPCallbacks (MPM, Level);
1844
1874
1845
1875
if (!VectorizerStartEPCallbacks.empty ()) {
1846
1876
FunctionPassManager FPM;
1847
- for (auto &C : VectorizerStartEPCallbacks)
1848
- C (FPM, Level);
1877
+ invokeVectorizerStartEPCallbacks (FPM, Level);
1849
1878
if (!FPM.isEmpty ())
1850
1879
MPM.addPass (createModuleToFunctionPassAdaptor (std::move (FPM)));
1851
1880
}
@@ -1859,8 +1888,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
1859
1888
CoroPM.addPass (GlobalDCEPass ());
1860
1889
MPM.addPass (CoroConditionalWrapper (std::move (CoroPM)));
1861
1890
1862
- for (auto &C : OptimizerLastEPCallbacks)
1863
- C (MPM, Level);
1891
+ invokeOptimizerLastEPCallbacks (MPM, Level);
1864
1892
1865
1893
if (LTOPreLink)
1866
1894
addRequiredLTOPreLinkPasses (MPM);
0 commit comments