[clang] [llvm] [fatlto] Use the ThinLTO default pipeline for FatLTO (PR #134434)
Paul Kirth via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 7 08:30:29 PDT 2025
================
@@ -1692,6 +1692,19 @@ PassBuilder::buildFatLTODefaultPipeline(OptimizationLevel Level, bool ThinLTO,
if (ThinLTO && PGOOpt && PGOOpt->Action == PGOOptions::SampleUse)
MPM.addPass(buildThinLTODefaultPipeline(Level, /*ImportSummary=*/nullptr));
else {
+ // ModuleSimplification does not run the coroutine passes for
+ // ThinLTOPreLink, so we need the coroutine passes to run for ThinLTO
+ // builds, otherwise they will miscompile.
+ if (ThinLTO) {
+ // TODO: replace w/ buildCoroWrapper() when it takes phase and level into
+ // consideration.
+ CGSCCPassManager CGPM;
+ CGPM.addPass(CoroSplitPass(Level != OptimizationLevel::O0));
+ CGPM.addPass(CoroAnnotationElidePass());
+ MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
+ MPM.addPass(CoroCleanupPass());
----------------
ilovepi wrote:
Hmm, 10% seems a bit high for overhead on build times, though we haven't used it too much w/ ThinLTO in our toolchain, so maybe that's it?
Looking at our build times when we enabled it in our toolchain, we saw about a 2.5% slowdown in total build time, but a 22% improvement in test time (ninja check-*). Overall that ended up being about 4.4% speedup in total time.
So, I'm not surprised it slowed down for just the build, but I am surprised it added a full 10%. Well, I guess I/O can have a lot of variance between machines, so maybe that's enough to explain it, since for ThinLTO it probably more than doubles the size of the `.o`.
https://github.com/llvm/llvm-project/pull/134434
More information about the cfe-commits
mailing list