Skip to content

Commit

Permalink
[ThinLTO] Skip opt pipeline and summary wrapper pass on empty modules (
Browse files Browse the repository at this point in the history
…llvm#120143)

Follow up to PR118508, to avoid unnecessary compile time for an empty
combind regular LTO module if all modules end up being ThinLTO only.

This required minor changes to a few tests to ensure they weren't empty.
  • Loading branch information
teresajohnson authored Jan 11, 2025
1 parent 90eca3f commit 799955e
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 6 deletions.
4 changes: 4 additions & 0 deletions lld/test/ELF/lto/new-pass-manager.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@

target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define void @foo() {
ret void
}
31 changes: 26 additions & 5 deletions llvm/lib/LTO/LTOBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,14 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
MPM.run(Mod, MAM);
}

static bool isEmptyModule(const Module &Mod) {
// Module is empty if it has no functions, no globals, no inline asm and no
// named metadata (aliases and ifuncs require functions or globals so we
// don't need to check those explicitly).
return Mod.empty() && Mod.global_empty() && Mod.named_metadata_empty() &&
Mod.getModuleInlineAsm().empty();
}

bool lto::opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
bool IsThinLTO, ModuleSummaryIndex *ExportSummary,
const ModuleSummaryIndex *ImportSummary,
Expand All @@ -372,9 +380,16 @@ bool lto::opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
/*EmbedBitcode*/ true, /*EmbedCmdline*/ true,
/*Cmdline*/ CmdArgs);
}
// FIXME: Plumb the combined index into the new pass manager.
runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary,
ImportSummary);
// No need to run any opt passes if the module is empty.
// In theory these passes should take almost no time for an empty
// module, however, this guards against doing any unnecessary summary-based
// analysis in the case of a ThinLTO build where this might be an empty
// regular LTO combined module, with a large combined index from ThinLTO.
if (!isEmptyModule(Mod)) {
// FIXME: Plumb the combined index into the new pass manager.
runNewPMPasses(Conf, Mod, TM, Conf.OptLevel, IsThinLTO, ExportSummary,
ImportSummary);
}
return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod);
}

Expand Down Expand Up @@ -422,8 +437,14 @@ static void codegen(const Config &Conf, TargetMachine *TM,
legacy::PassManager CodeGenPasses;
TargetLibraryInfoImpl TLII(Triple(Mod.getTargetTriple()));
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
CodeGenPasses.add(
createImmutableModuleSummaryIndexWrapperPass(&CombinedIndex));
// No need to make index available if the module is empty.
// In theory these passes should not use the index for an empty
// module, however, this guards against doing any unnecessary summary-based
// analysis in the case of a ThinLTO build where this might be an empty
// regular LTO combined module, with a large combined index from ThinLTO.
if (!isEmptyModule(Mod))
CodeGenPasses.add(
createImmutableModuleSummaryIndexWrapperPass(&CombinedIndex));
if (Conf.PreCodeGenPassesHook)
Conf.PreCodeGenPassesHook(CodeGenPasses);
if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Feature/load_plugin_error.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

; RUN: opt %s -o %t.o
; RUN: not llvm-lto2 run -load-pass-plugin=%t/nonexistent.so %t.o -o %t \
; RUN: -r %t.o,test 2>&1 | \
; RUN: -r %t.o,test,plx 2>&1 | \
; RUN: FileCheck %s

; CHECK: Could not load library {{.*}}nonexistent.so
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/Other/X86/lto-hot-cold-split.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; OLDPM-ANYLTO-POSTLINK-Os: HotColdSplittingPass

define void @foo() {
ret void
}

0 comments on commit 799955e

Please sign in to comment.