Index: llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h =================================================================== --- llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h +++ llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h @@ -181,6 +181,13 @@ bool isDSOLocal() const; }; +inline raw_ostream &operator<<(raw_ostream &OS, const ValueInfo &VI) { + OS << VI.getGUID(); + if (!VI.name().empty()) + OS << " (" << VI.name() << ")"; + return OS; +} + inline bool operator==(const ValueInfo &A, const ValueInfo &B) { assert(A.getRef() && B.getRef() && "Need ValueInfo with non-null Ref for comparison"); Index: llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp +++ llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp @@ -254,7 +254,7 @@ continue; } - LLVM_DEBUG(dbgs() << " ref -> " << VI.getGUID() << "\n"); + LLVM_DEBUG(dbgs() << " ref -> " << VI << "\n"); for (auto &RefSummary : VI.getSummaryList()) if (RefSummary->getSummaryKind() == GlobalValueSummary::GlobalVarKind && @@ -284,8 +284,8 @@ static int ImportCount = 0; for (auto &Edge : Summary.calls()) { ValueInfo VI = Edge.first; - LLVM_DEBUG(dbgs() << " edge -> " << VI.getGUID() - << " Threshold:" << Threshold << "\n"); + LLVM_DEBUG(dbgs() << " edge -> " << VI << " Threshold:" << Threshold + << "\n"); if (ImportCutoff >= 0 && ImportCount >= ImportCutoff) { LLVM_DEBUG(dbgs() << "ignored! import-cutoff value of " << ImportCutoff @@ -399,8 +399,13 @@ // Populate the worklist with the import for the functions in the current // module for (auto &GVSummary : DefinedGVSummaries) { +#ifndef NDEBUG + // FIXME: Change the GVSummaryMapTy to hold ValueInfo instead of GUID + // so this map look up (and possibly others) can be avoided. + auto VI = Index.getValueInfo(GVSummary.first); +#endif if (!Index.isGlobalValueLive(GVSummary.second)) { - LLVM_DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first << "\n"); + LLVM_DEBUG(dbgs() << "Ignores Dead GUID: " << VI << "\n"); continue; } auto *FuncSummary = @@ -408,7 +413,7 @@ if (!FuncSummary) // Skip import for global variables continue; - LLVM_DEBUG(dbgs() << "Initialize import for " << GVSummary.first << "\n"); + LLVM_DEBUG(dbgs() << "Initialize import for " << VI << "\n"); computeImportForFunction(*FuncSummary, Index, ImportInstrLimit, DefinedGVSummaries, Worklist, ImportList, ExportLists); @@ -600,14 +605,16 @@ } // Add values flagged in the index as live roots to the worklist. - for (const auto &Entry : Index) + for (const auto &Entry : Index) { + auto VI = Index.getValueInfo(Entry); for (auto &S : Entry.second.SummaryList) if (S->isLive()) { - LLVM_DEBUG(dbgs() << "Live root: " << Entry.first << "\n"); - Worklist.push_back(ValueInfo(/*IsAnalysis=*/false, &Entry)); + LLVM_DEBUG(dbgs() << "Live root: " << VI << "\n"); + Worklist.push_back(VI); ++LiveSymbols; break; } + } // Make value live and add it to the worklist if it was not live before. auto visit = [&](ValueInfo VI) { Index: llvm/trunk/test/ThinLTO/X86/Inputs/funcimport-debug.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/Inputs/funcimport-debug.ll +++ llvm/trunk/test/ThinLTO/X86/Inputs/funcimport-debug.ll @@ -0,0 +1,10 @@ +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 +} + +@baz = constant i32 10, align 4 Index: llvm/trunk/test/ThinLTO/X86/deadstrip.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/deadstrip.ll +++ llvm/trunk/test/ThinLTO/X86/deadstrip.ll @@ -1,3 +1,6 @@ +; Require asserts for -debug-only +; REQUIRES: asserts + ; RUN: opt -module-summary %s -o %t1.bc ; RUN: opt -module-summary %p/Inputs/deadstrip.ll -o %t2.bc ; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc @@ -18,7 +21,9 @@ ; RUN: -r %t2.bc,_baz,pl \ ; RUN: -r %t2.bc,_boo,pl \ ; RUN: -r %t2.bc,_dead_func,l \ -; RUN: -r %t2.bc,_another_dead_func,pl +; RUN: -r %t2.bc,_another_dead_func,pl \ +; RUN: -thinlto-threads=1 \ +; RUN: -debug-only=function-import 2>&1 | FileCheck %s --check-prefix=DEBUG ; RUN: llvm-dis < %t.out.1.3.import.bc | FileCheck %s --check-prefix=LTO2 ; RUN: llvm-dis < %t.out.2.3.import.bc | FileCheck %s --check-prefix=LTO2-CHECK2 ; RUN: llvm-nm %t.out.1 | FileCheck %s --check-prefix=CHECK2-NM @@ -71,6 +76,13 @@ ; CHECK-NM-NOT: bar ; CHECK-NM-NOT: dead +; DEBUG: Live root: 2412314959268824392 (llvm.global_ctors) +; DEBUG: Live root: 15822663052811949562 (main) +; DEBUG: Ignores Dead GUID: 7342339837106705152 (dead_func) +; DEBUG: Ignores Dead GUID: 7546896869197086323 (baz) +; DEBUG: Initialize import for 15611644523426561710 (boo) +; DEBUG: Ignores Dead GUID: 2384416018110111308 (another_dead_func) + ; Next test the case where Inputs/deadstrip.ll does not get a module index, ; which will cause it to be handled by regular LTO in the new LTO API. ; In that case there are uses of @dead_func in the regular LTO partition Index: llvm/trunk/test/ThinLTO/X86/funcimport-debug.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/funcimport-debug.ll +++ llvm/trunk/test/ThinLTO/X86/funcimport-debug.ll @@ -0,0 +1,35 @@ +; Test of function importing debug messages + +; Require asserts for -debug-only +; REQUIRES: asserts + +; 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/funcimport-debug.ll -o %t2.bc + +; RUN: llvm-lto2 run %t1.bc %t2.bc -o %t.o -save-temps \ +; RUN: -r=%t1.bc,_main,plx \ +; RUN: -r=%t1.bc,_foo,l \ +; RUN: -r=%t1.bc,_baz,l \ +; RUN: -r=%t2.bc,_foo,plx \ +; RUN: -r=%t2.bc,_baz,plx \ +; RUN: -thinlto-threads=1 \ +; RUN: -debug-only=function-import 2>&1 | FileCheck %s + +; CHECK-DAG: Initialize import for 6699318081062747564 (foo) +; CHECK-DAG: Initialize import for 15822663052811949562 (main) +; CHECK-DAG: ref -> 7546896869197086323 (baz) +; CHECK-DAG: edge -> 6699318081062747564 (foo) Threshold:100 + +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() + %0 = load i32, i32* @baz, align 4 + ret i32 %0 +} + +declare void @foo(...) #1 +@baz = external global i32