Index: llvm/include/llvm/IR/ModuleSummaryIndex.h =================================================================== --- llvm/include/llvm/IR/ModuleSummaryIndex.h +++ llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -173,7 +173,7 @@ RefAndFlags.setInt(HaveGVs); } - operator bool() const { return getRef(); } + explicit operator bool() const { return getRef(); } GlobalValue::GUID getGUID() const { return getRef()->first; } const GlobalValue *getValue() const { Index: llvm/lib/LTO/LTO.cpp =================================================================== --- llvm/lib/LTO/LTO.cpp +++ llvm/lib/LTO/LTO.cpp @@ -386,11 +386,10 @@ } static void thinLTOInternalizeAndPromoteGUID( - GlobalValueSummaryList &GVSummaryList, ValueInfo VI, - function_ref isExported, + ValueInfo VI, function_ref isExported, function_ref isPrevailing) { - for (auto &S : GVSummaryList) { + for (auto &S : VI.getSummaryList()) { if (isExported(S->modulePath(), VI)) { if (GlobalValue::isLocalLinkage(S->linkage())) S->setLinkage(GlobalValue::ExternalLinkage); @@ -422,8 +421,8 @@ function_ref isPrevailing) { for (auto &I : Index) - thinLTOInternalizeAndPromoteGUID( - I.second.SummaryList, Index.getValueInfo(I), isExported, isPrevailing); + thinLTOInternalizeAndPromoteGUID(Index.getValueInfo(I), isExported, + isPrevailing); } // Requires a destructor for std::vector. Index: llvm/lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- llvm/lib/Transforms/IPO/FunctionImport.cpp +++ llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -604,24 +604,26 @@ } #ifndef NDEBUG +static bool isGlobalVarSummary(const ModuleSummaryIndex &Index, ValueInfo VI) { + auto SL = VI.getSummaryList(); + return SL.empty() + ? false + : SL[0]->getSummaryKind() == GlobalValueSummary::GlobalVarKind; +} + static bool isGlobalVarSummary(const ModuleSummaryIndex &Index, GlobalValue::GUID G) { - if (const auto &VI = Index.getValueInfo(G)) { - auto SL = VI.getSummaryList(); - if (!SL.empty()) - return SL[0]->getSummaryKind() == GlobalValueSummary::GlobalVarKind; - } + if (const auto &VI = Index.getValueInfo(G)) + return isGlobalVarSummary(Index, VI); return false; } -static GlobalValue::GUID getGUID(GlobalValue::GUID G) { return G; } - template static unsigned numGlobalVarSummaries(const ModuleSummaryIndex &Index, T &Cont) { unsigned NumGVS = 0; for (auto &V : Cont) - if (isGlobalVarSummary(Index, getGUID(V))) + if (isGlobalVarSummary(Index, V)) ++NumGVS; return NumGVS; } Index: llvm/test/ThinLTO/X86/funcimport-stats.ll =================================================================== --- /dev/null +++ llvm/test/ThinLTO/X86/funcimport-stats.ll @@ -0,0 +1,21 @@ +; REQUIRES: asserts +; RUN: opt -module-summary %p/funcimport.ll -o %t.bc +; RUN: opt -module-summary %p/Inputs/funcimport.ll -o %t2.bc +; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %t2.bc + +; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t3.bc -o /dev/null -debug-only=function-import -stats > %t4 2>&1 +; RUN: cat %t4 | grep 'Is importing global' | count 4 +; RUN: cat %t4 | grep 'Is importing function' | count 8 +; RUN: cat %t4 | grep 'Is importing aliasee' | count 1 +; RUN: cat %t4 | FileCheck %s + +; CHECK: - [[NUM_FUNCS:[0-9]+]] functions imported from +; CHECK-NEXT: - [[NUM_VARS:[0-9]+]] global vars imported from + +; CHECK: [[NUM_FUNCS]] function-import - Number of functions imported in backend +; CHECK-NEXT: [[NUM_FUNCS]] function-import - Number of functions thin link decided to import +; CHECK-NEXT: [[NUM_VARS]] function-import - Number of global variables imported in backend +; CHECK-NEXT: [[NUM_VARS]] function-import - Number of global variables thin link decided to import +; CHECK-NEXT: 1 function-import - Number of modules imported from +; CHECK-NEXT: [[NUM_VARS]] module-summary-index - Number of live global variables marked read only +; CHECK-NEXT: 1 module-summary-index - Number of live global variables marked write only