Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}
Loading