]> granicus.if.org Git - llvm/commitdiff
[ThinLTO] Thin link efficiency improvement: don't re-export globals (NFC)
authorTeresa Johnson <tejohnson@google.com>
Thu, 15 Dec 2016 23:50:06 +0000 (23:50 +0000)
committerTeresa Johnson <tejohnson@google.com>
Thu, 15 Dec 2016 23:50:06 +0000 (23:50 +0000)
Summary:
We were reinvoking exportGlobalInModule numerous times redundantly.
No need to re-export globals referenced by a global that was already
imported from its module. This resulted in a large speedup in the thin
link for a big application, particularly when importing aggressiveness
was cranked up.

Reviewers: mehdi_amini

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289896 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/FunctionImport.cpp
test/ThinLTO/X86/Inputs/export.ll [new file with mode: 0644]
test/ThinLTO/X86/export.ll [new file with mode: 0644]

index 799d402d6e45648ca8738df94dfe7aa37acff133..7875db2796a4c680da0f656835213962469c7e3d 100644 (file)
@@ -338,6 +338,7 @@ static void computeImportForFunction(
                    << ProcessedThreshold << "\n");
       continue;
     }
+    bool PreviouslyImported = ProcessedThreshold != 0;
     // Mark this function as imported in this module, with the current Threshold
     ProcessedThreshold = AdjThreshold;
 
@@ -345,15 +346,18 @@ static void computeImportForFunction(
     if (ExportLists) {
       auto &ExportList = (*ExportLists)[ExportModulePath];
       ExportList.insert(GUID);
-      // Mark all functions and globals referenced by this function as exported
-      // to the outside if they are defined in the same source module.
-      for (auto &Edge : ResolvedCalleeSummary->calls()) {
-        auto CalleeGUID = Edge.first.getGUID();
-        exportGlobalInModule(Index, ExportModulePath, CalleeGUID, ExportList);
-      }
-      for (auto &Ref : ResolvedCalleeSummary->refs()) {
-        auto GUID = Ref.getGUID();
-        exportGlobalInModule(Index, ExportModulePath, GUID, ExportList);
+      if (!PreviouslyImported) {
+        // This is the first time this function was exported from its source
+        // module, so mark all functions and globals it references as exported
+        // to the outside if they are defined in the same source module.
+        for (auto &Edge : ResolvedCalleeSummary->calls()) {
+          auto CalleeGUID = Edge.first.getGUID();
+          exportGlobalInModule(Index, ExportModulePath, CalleeGUID, ExportList);
+        }
+        for (auto &Ref : ResolvedCalleeSummary->refs()) {
+          auto GUID = Ref.getGUID();
+          exportGlobalInModule(Index, ExportModulePath, GUID, ExportList);
+        }
       }
     }
 
diff --git a/test/ThinLTO/X86/Inputs/export.ll b/test/ThinLTO/X86/Inputs/export.ll
new file mode 100644 (file)
index 0000000..cab8591
--- /dev/null
@@ -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 i32 @main() #0 {
+entry:
+  call void @callstaticfunc()
+  ret i32 0
+}
+
+declare void @callstaticfunc()
diff --git a/test/ThinLTO/X86/export.ll b/test/ThinLTO/X86/export.ll
new file mode 100644 (file)
index 0000000..cb87ddd
--- /dev/null
@@ -0,0 +1,26 @@
+; 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/export.ll -o %t2.bc
+; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t1.bc %t2.bc
+
+; Ensure statics are promoted/renamed correctly from this file.
+; RUN: llvm-lto -thinlto-action=promote %t1.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s
+; CHECK-DAG: @staticvar.llvm.0 = hidden global
+; CHECK-DAG: define hidden void @staticfunc.llvm.0
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+@staticvar = internal global i32 1, align 4
+
+define void @callstaticfunc() #0 {
+entry:
+  call void @staticfunc()
+  ret void
+}
+
+define internal void @staticfunc() #0 {
+entry:
+  %0 = load i32, i32* @staticvar, align 4
+  ret void
+}