summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2016-11-03 01:07:16 +0000
committerTeresa Johnson <tejohnson@google.com>2016-11-03 01:07:16 +0000
commit0515fb8d4b2dbfce4fc960abb08a8d9d2f48fe2b (patch)
tree9727e2c6a127abae389e08bb240db185c8d55fa0
parentef09aa9023ff2b469eac95eeb6e650ebc1fd4a97 (diff)
downloadbcm5719-llvm-0515fb8d4b2dbfce4fc960abb08a8d9d2f48fe2b.tar.gz
bcm5719-llvm-0515fb8d4b2dbfce4fc960abb08a8d9d2f48fe2b.zip
[ThinLTO] Handle distributed backend case when doing renaming
Summary: The recent change I made to consult the summary when deciding whether to rename (to handle inline asm) in r285513 broke the distributed build case. In a distributed backend we will only have a portion of the combined index, specifically for imported modules we only have the summaries for any imported definitions. When renaming on import we were asserting because no summary entry was found for a local reference being linked in (def wasn't imported). We only need to consult the summary for a renaming decision for the exporting module. For imports, we would have prevented importing any references to NoRename values already. Reviewers: mehdi_amini Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D26250 llvm-svn: 285871
-rw-r--r--llvm/lib/Transforms/Utils/FunctionImportUtils.cpp23
-rw-r--r--llvm/test/ThinLTO/X86/Inputs/distributed_import.ll6
-rw-r--r--llvm/test/ThinLTO/X86/distributed_import.ll20
3 files changed, 45 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp b/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
index b9b3606ecfb..d1710feba9d 100644
--- a/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp
@@ -67,10 +67,25 @@ bool FunctionImportGlobalProcessing::shouldPromoteLocalToGlobal(
if (GVar && GVar->isConstant() && GVar->hasGlobalUnnamedAddr())
return false;
- auto *Summary = ImportIndex.getGlobalValueSummary(SGV->getGUID());
- assert(Summary && "Missing summary for global value");
- if (Summary->noRename())
- return false;
+ // If we are exporting, we need to see whether this value is marked
+ // as NoRename in the summary. If we are importing, we may not have
+ // a summary in the distributed backend case (only summaries for values
+ // importes as defs, not references, are included in the index passed
+ // to the distributed backends).
+ auto Summaries = ImportIndex.findGlobalValueSummaryList(SGV->getGUID());
+ if (Summaries == ImportIndex.end())
+ // Assert that this is an import - we should always have access to the
+ // summary when exporting.
+ assert(isPerformingImport() &&
+ "Missing summary for global value when exporting");
+ else {
+ assert(Summaries->second.size() == 1 && "Local has more than one summary");
+ if (Summaries->second.front()->noRename()) {
+ assert((isModuleExporting() || !GlobalsToImport->count(SGV)) &&
+ "Imported a non-renamable local value");
+ return false;
+ }
+ }
// Eventually we only need to promote functions in the exporting module that
// are referenced by a potentially exported function (i.e. one that is in the
diff --git a/llvm/test/ThinLTO/X86/Inputs/distributed_import.ll b/llvm/test/ThinLTO/X86/Inputs/distributed_import.ll
new file mode 100644
index 00000000000..759c3371434
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/Inputs/distributed_import.ll
@@ -0,0 +1,6 @@
+@G = internal global i32 7
+define i32 @g() {
+entry:
+ %0 = load i32, i32* @G
+ ret i32 %0
+}
diff --git a/llvm/test/ThinLTO/X86/distributed_import.ll b/llvm/test/ThinLTO/X86/distributed_import.ll
new file mode 100644
index 00000000000..b1ffd51359d
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/distributed_import.ll
@@ -0,0 +1,20 @@
+; RUN: opt -module-summary %s -o %t1.bc
+; RUN: opt -module-summary %p/Inputs/distributed_import.ll -o %t2.bc
+
+; RUN: llvm-lto2 %t1.bc %t2.bc -o %t.o -save-temps \
+; RUN: -thinlto-distributed-indexes \
+; RUN: -r=%t1.bc,g, \
+; RUN: -r=%t1.bc,f,px \
+; RUN: -r=%t2.bc,g,px
+; RUN: opt -function-import -summary-file %t1.bc.thinlto.bc %t1.bc -o %t1.out
+; RUN: opt -function-import -summary-file %t2.bc.thinlto.bc %t2.bc -o %t2.out
+; RUN: llvm-dis -o - %t2.out | FileCheck %s
+; CHECK: @G.llvm.0
+
+declare i32 @g(...)
+
+define void @f() {
+entry:
+ call i32 (...) @g()
+ ret void
+}
OpenPOWER on IntegriCloud