@@ -411,16 +411,25 @@ static bool isLTOPreLink(ThinOrFullLTOPhase Phase) {
411411 Phase == ThinOrFullLTOPhase::FullLTOPreLink;
412412}
413413
414+ // Helper to check if the current compilation phase is LTO backend
415+ static bool isLTOPostLink (ThinOrFullLTOPhase Phase) {
416+ return Phase == ThinOrFullLTOPhase::ThinLTOPostLink ||
417+ Phase == ThinOrFullLTOPhase::FullLTOPostLink;
418+ }
419+
414420// Helper to wrap conditionally Coro passes.
415421static CoroConditionalWrapper buildCoroWrapper (ThinOrFullLTOPhase Phase) {
416422 // TODO: Skip passes according to Phase.
417423 ModulePassManager CoroPM;
418- CoroPM.addPass (CoroEarlyPass ());
419- CGSCCPassManager CGPM;
420- CGPM.addPass (CoroSplitPass ());
421- CoroPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (std::move (CGPM)));
422- CoroPM.addPass (CoroCleanupPass ());
423- CoroPM.addPass (GlobalDCEPass ());
424+ if (!isLTOPostLink (Phase))
425+ CoroPM.addPass (CoroEarlyPass ());
426+ if (!isLTOPreLink (Phase)) {
427+ CGSCCPassManager CGPM;
428+ CGPM.addPass (CoroSplitPass ());
429+ CoroPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (std::move (CGPM)));
430+ CoroPM.addPass (CoroCleanupPass ());
431+ CoroPM.addPass (GlobalDCEPass ());
432+ }
424433 return CoroConditionalWrapper (std::move (CoroPM));
425434}
426435
@@ -1004,7 +1013,7 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
10041013 MainCGPipeline.addPass (createCGSCCToFunctionPassAdaptor (
10051014 RequireAnalysisPass<ShouldNotRunFunctionPassesAnalysis, Function>()));
10061015
1007- if (Phase != ThinOrFullLTOPhase::ThinLTOPreLink ) {
1016+ if (! isLTOPreLink (Phase) ) {
10081017 MainCGPipeline.addPass (CoroSplitPass (Level != OptimizationLevel::O0));
10091018 MainCGPipeline.addPass (CoroAnnotationElidePass ());
10101019 }
@@ -1054,7 +1063,7 @@ PassBuilder::buildModuleInlinerPipeline(OptimizationLevel Level,
10541063 buildFunctionSimplificationPipeline (Level, Phase),
10551064 PTO.EagerlyInvalidateAnalyses ));
10561065
1057- if (Phase != ThinOrFullLTOPhase::ThinLTOPreLink ) {
1066+ if (! isLTOPreLink (Phase) ) {
10581067 MPM.addPass (createModuleToPostOrderCGSCCPassAdaptor (
10591068 CoroSplitPass (Level != OptimizationLevel::O0)));
10601069 MPM.addPass (
@@ -1114,7 +1123,8 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
11141123 // Do basic inference of function attributes from known properties of system
11151124 // libraries and other oracles.
11161125 MPM.addPass (InferFunctionAttrsPass ());
1117- MPM.addPass (CoroEarlyPass ());
1126+ if (!isLTOPostLink (Phase))
1127+ MPM.addPass (CoroEarlyPass ());
11181128
11191129 FunctionPassManager EarlyFPM;
11201130 EarlyFPM.addPass (EntryExitInstrumenterPass (/* PostInlining=*/ false ));
@@ -1277,7 +1287,7 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
12771287 // and argument promotion.
12781288 MPM.addPass (DeadArgumentEliminationPass ());
12791289
1280- if (Phase != ThinOrFullLTOPhase::ThinLTOPreLink )
1290+ if (! isLTOPreLink (Phase) )
12811291 MPM.addPass (CoroCleanupPass ());
12821292
12831293 // Optimize globals now that functions are fully simplified.
@@ -1613,8 +1623,7 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
16131623 MPM.addPass (MergeFunctionsPass ());
16141624
16151625 if (PTO.CallGraphProfile && !LTOPreLink)
1616- MPM.addPass (CGProfilePass (LTOPhase == ThinOrFullLTOPhase::FullLTOPostLink ||
1617- LTOPhase == ThinOrFullLTOPhase::ThinLTOPostLink));
1626+ MPM.addPass (CGProfilePass (isLTOPostLink (LTOPhase)));
16181627
16191628 // RelLookupTableConverterPass runs later in LTO post-link pipeline.
16201629 if (!LTOPreLink)
@@ -1943,9 +1952,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
19431952 return MPM;
19441953 }
19451954
1946- // TODO: Skip to match buildCoroWrapper.
1947- MPM.addPass (CoroEarlyPass ());
1948-
19491955 // Optimize globals to try and fold them into constants.
19501956 MPM.addPass (GlobalOptPass ());
19511957
0 commit comments