Index: llvm/trunk/lib/LTO/LTO.cpp =================================================================== --- llvm/trunk/lib/LTO/LTO.cpp +++ llvm/trunk/lib/LTO/LTO.cpp @@ -770,36 +770,40 @@ ThinLTO.ModuleMap.size()); StringMap ExportLists( ThinLTO.ModuleMap.size()); - ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, - ImportLists, ExportLists); + StringMap> ResolvedODR; - std::set ExportedGUIDs; - for (auto &Res : GlobalResolutions) { - if (!Res.second.IRName.empty() && - Res.second.Partition == GlobalResolution::External) - ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName)); - } + if (Conf.OptLevel > 0) { + ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, + ImportLists, ExportLists); + + std::set ExportedGUIDs; + for (auto &Res : GlobalResolutions) { + if (!Res.second.IRName.empty() && + Res.second.Partition == GlobalResolution::External) + ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName)); + } - auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) { - return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath(); - }; - auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { - const auto &ExportList = ExportLists.find(ModuleIdentifier); - return (ExportList != ExportLists.end() && - ExportList->second.count(GUID)) || - ExportedGUIDs.count(GUID); - }; - thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported); + auto isPrevailing = [&](GlobalValue::GUID GUID, + const GlobalValueSummary *S) { + return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath(); + }; + auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { + const auto &ExportList = ExportLists.find(ModuleIdentifier); + return (ExportList != ExportLists.end() && + ExportList->second.count(GUID)) || + ExportedGUIDs.count(GUID); + }; + thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported); - StringMap> ResolvedODR; - auto recordNewLinkage = [&](StringRef ModuleIdentifier, - GlobalValue::GUID GUID, - GlobalValue::LinkageTypes NewLinkage) { - ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; - }; + auto recordNewLinkage = [&](StringRef ModuleIdentifier, + GlobalValue::GUID GUID, + GlobalValue::LinkageTypes NewLinkage) { + ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; + }; - thinLTOResolveWeakForLinkerInIndex(ThinLTO.CombinedIndex, isPrevailing, - recordNewLinkage); + thinLTOResolveWeakForLinkerInIndex(ThinLTO.CombinedIndex, isPrevailing, + recordNewLinkage); + } std::unique_ptr BackendProc = ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, Index: llvm/trunk/test/ThinLTO/X86/Inputs/funcimport2.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/Inputs/funcimport2.ll +++ llvm/trunk/test/ThinLTO/X86/Inputs/funcimport2.ll @@ -0,0 +1,11 @@ +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + + +define i32 @main() #0 { +entry: + call void (...) @foo() + ret i32 0 +} + +declare void @foo(...) #1 Index: llvm/trunk/test/ThinLTO/X86/funcimport2.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/funcimport2.ll +++ llvm/trunk/test/ThinLTO/X86/funcimport2.ll @@ -0,0 +1,28 @@ +; Do setup work for all below tests: generate bitcode and combined index +; RUN: opt -module-summary %s -o %t1.bc +; RUN: opt -module-summary %p/Inputs/funcimport2.ll -o %t2.bc + +; RUN: llvm-lto2 %t1.bc %t2.bc -o %t.o -save-temps \ +; RUN: -r=%t1.bc,_foo,plx \ +; RUN: -r=%t2.bc,_main,plx \ +; RUN: -r=%t2.bc,_foo,l +; RUN: llvm-dis %t.o.1.3.import.bc -o - | FileCheck %s +; CHECK: define available_externally void @foo() + +; We shouldn't do any importing at -O0 +; rm -f %t.o.1.3.import.bc +; RUN: llvm-lto2 %t1.bc %t2.bc -o %t.o -save-temps \ +; RUN: -O0 \ +; RUN: -r=%t1.bc,_foo,plx \ +; RUN: -r=%t2.bc,_main,plx \ +; RUN: -r=%t2.bc,_foo,l +; RUN: llvm-dis %t.o.1.3.import.bc -o - | FileCheck %s --check-prefix=CHECKO0 +; CHECKO0: declare void @foo(...) + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + +define void @foo() #0 { +entry: + ret void +} Index: llvm/trunk/test/tools/gold/X86/Inputs/thinlto_funcimport.ll =================================================================== --- llvm/trunk/test/tools/gold/X86/Inputs/thinlto_funcimport.ll +++ llvm/trunk/test/tools/gold/X86/Inputs/thinlto_funcimport.ll @@ -0,0 +1,10 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define i32 @main() #0 { +entry: + call void (...) @foo() + ret i32 0 +} + +declare void @foo(...) #1 Index: llvm/trunk/test/tools/gold/X86/thinlto_funcimport.ll =================================================================== --- llvm/trunk/test/tools/gold/X86/thinlto_funcimport.ll +++ llvm/trunk/test/tools/gold/X86/thinlto_funcimport.ll @@ -0,0 +1,28 @@ +; Do setup work for all below tests: generate bitcode and combined index +; RUN: opt -module-summary %s -o %t1.bc +; RUN: opt -module-summary %p/Inputs/thinlto_funcimport.ll -o %t2.bc + +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=save-temps \ +; RUN: --plugin-opt=thinlto \ +; RUN: -shared %t1.bc %t2.bc -o %t +; RUN: llvm-dis %t2.bc.3.import.bc -o - | FileCheck %s +; CHECK: define available_externally void @foo() + +; We shouldn't do any importing at -O0 +; rm -f %t2.bc.3.import.bc +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=save-temps \ +; RUN: --plugin-opt=thinlto \ +; RUN: --plugin-opt=O0 \ +; RUN: -shared %t1.bc %t2.bc -o %t +; RUN: llvm-dis %t2.bc.3.import.bc -o - | FileCheck %s --check-prefix=CHECKO0 +; CHECKO0: declare void @foo(...) + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @foo() #0 { +entry: + ret void +} Index: llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp =================================================================== --- llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp +++ llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp @@ -26,6 +26,11 @@ using namespace lto; using namespace object; +static cl::opt + OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " + "(default = '-O2')"), + cl::Prefix, cl::ZeroOrMore, cl::init('2')); + static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); @@ -145,6 +150,8 @@ Conf.OptPipeline = OptPipeline; Conf.AAPipeline = AAPipeline; + Conf.OptLevel = OptLevel - '0'; + ThinBackend Backend; if (ThinLTODistributedIndexes) Backend = createWriteIndexesThinBackend("", "", true, "");