[llvm] r281537 - [ThinLTO] Add an option to llvm-lto to print some basic statistics for the index

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 14 14:04:59 PDT 2016


Author: mehdi_amini
Date: Wed Sep 14 16:04:59 2016
New Revision: 281537

URL: http://llvm.org/viewvc/llvm-project?rev=281537&view=rev
Log:
[ThinLTO] Add an option to llvm-lto to print some basic statistics for the index

Differential Revision: https://reviews.llvm.org/D24290

Modified:
    llvm/trunk/test/ThinLTO/X86/funcimport.ll
    llvm/trunk/tools/llvm-lto/llvm-lto.cpp

Modified: llvm/trunk/test/ThinLTO/X86/funcimport.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/funcimport.ll?rev=281537&r1=281536&r2=281537&view=diff
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/funcimport.ll (original)
+++ llvm/trunk/test/ThinLTO/X86/funcimport.ll Wed Sep 14 16:04:59 2016
@@ -3,6 +3,9 @@
 ; 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-index-stats %t3.bc | FileCheck %s -check-prefix=STATS
+; STATS: Index {{.*}} contains 24 nodes (13 functions, 3 alias, 8 globals) and 19 edges (8 refs and 11 calls)
+
 ; Ensure statics are promoted/renamed correctly from this file (all but
 ; constant variable need promotion).
 ; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=EXPORTSTATIC

Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=281537&r1=281536&r2=281537&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)
+++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Wed Sep 14 16:04:59 2016
@@ -42,6 +42,11 @@ static cl::opt<char>
                            "(default = '-O2')"),
              cl::Prefix, cl::ZeroOrMore, cl::init('2'));
 
+static cl::opt<bool>
+    IndexStats("thinlto-index-stats",
+               cl::desc("Print statistic for the index in every input files"),
+               cl::init(false));
+
 static cl::opt<bool> DisableVerify(
     "disable-verify", cl::init(false),
     cl::desc("Do not run the verifier during the optimization pipeline"));
@@ -264,6 +269,40 @@ getLocalLTOModule(StringRef Path, std::u
   return std::move(*Ret);
 }
 
+/// Print some statistics on the index for each input files.
+void printIndexStats() {
+  for (auto &Filename : InputFilenames) {
+    CurrentActivity = "loading file '" + Filename + "'";
+    ErrorOr<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
+        llvm::getModuleSummaryIndexForFile(Filename, diagnosticHandler);
+    error(IndexOrErr, "error " + CurrentActivity);
+    std::unique_ptr<ModuleSummaryIndex> Index = std::move(IndexOrErr.get());
+    CurrentActivity = "";
+    // Skip files without a module summary.
+    if (!Index)
+      report_fatal_error(Filename + " does not contain an index");
+
+    unsigned Calls = 0, Refs = 0, Functions = 0, Alias = 0, Globals = 0;
+    for (auto &Summaries : *Index) {
+      for (auto &Summary : Summaries.second) {
+        Refs += Summary->refs().size();
+        if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
+          Functions++;
+          Calls += FuncSummary->calls().size();
+        } else if (isa<AliasSummary>(Summary.get()))
+          Alias++;
+        else
+          Globals++;
+      }
+    }
+    outs() << "Index " << Filename << " contains "
+           << (Alias + Globals + Functions) << " nodes (" << Functions
+           << " functions, " << Alias << " alias, " << Globals
+           << " globals) and " << (Calls + Refs) << " edges (" << Refs
+           << " refs and " << Calls << " calls)\n";
+  }
+}
+
 /// \brief List symbols in each IR file.
 ///
 /// The main point here is to provide lit-testable coverage for the LTOModule
@@ -725,6 +764,11 @@ int main(int argc, char **argv) {
     return 0;
   }
 
+  if (IndexStats) {
+    printIndexStats();
+    return 0;
+  }
+
   if (CheckHasObjC) {
     for (auto &Filename : InputFilenames) {
       ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =




More information about the llvm-commits mailing list