summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2017-09-13 15:16:38 +0000
committerTeresa Johnson <tejohnson@google.com>2017-09-13 15:16:38 +0000
commit1958083d35ff8aa0c8479e72e71c3fc47208ee16 (patch)
tree0f0f5fe6eccf9858eaffd7d84f8fabdd90b073f3 /llvm/lib/Transforms
parente5590927d6daa2c025c587a6db598d1aed429f1e (diff)
downloadbcm5719-llvm-1958083d35ff8aa0c8479e72e71c3fc47208ee16.tar.gz
bcm5719-llvm-1958083d35ff8aa0c8479e72e71c3fc47208ee16.zip
[ThinLTO] For SamplePGO, need to handle ICP targets consistently in thin link
Summary: SamplePGO indirect call profiles record the target as the original GUID for statics. The importer had special handling to map to the normal GUID in that case. The dead global analysis needs the same treatment or inconsistencies arise, resulting in linker unsats due to some dead symbols being exported and kept, leaving in references to other dead symbols that are removed. This can happen when a SamplePGO profile collected by one binary is used for a different binary, so the indirect call profiles may not accurately reflect live targets. Reviewers: danielcdh Subscribers: mehdi_amini, inglorion, llvm-commits, eraman Differential Revision: https://reviews.llvm.org/D37783 llvm-svn: 313151
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/IPO/FunctionImport.cpp40
1 files changed, 29 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp
index 88f70d961ed..da763b18d4d 100644
--- a/llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -187,6 +187,21 @@ selectCallee(const ModuleSummaryIndex &Index,
using EdgeInfo = std::tuple<const FunctionSummary *, unsigned /* Threshold */,
GlobalValue::GUID>;
+static ValueInfo
+updateValueInfoForIndirectCalls(const ModuleSummaryIndex &Index, ValueInfo VI) {
+ if (!VI.getSummaryList().empty())
+ return VI;
+ // For SamplePGO, the indirect call targets for local functions will
+ // have its original name annotated in profile. We try to find the
+ // corresponding PGOFuncName as the GUID.
+ // FIXME: Consider updating the edges in the graph after building
+ // it, rather than needing to perform this mapping on each walk.
+ auto GUID = Index.getGUIDFromOriginalID(VI.getGUID());
+ if (GUID == 0)
+ return nullptr;
+ return Index.getValueInfo(GUID);
+}
+
/// Compute the list of functions to import for a given caller. Mark these
/// imported functions and the symbols they reference in their source module as
/// exported from their source module.
@@ -201,17 +216,9 @@ static void computeImportForFunction(
DEBUG(dbgs() << " edge -> " << VI.getGUID() << " Threshold:" << Threshold
<< "\n");
- if (VI.getSummaryList().empty()) {
- // For SamplePGO, the indirect call targets for local functions will
- // have its original name annotated in profile. We try to find the
- // corresponding PGOFuncName as the GUID.
- auto GUID = Index.getGUIDFromOriginalID(VI.getGUID());
- if (GUID == 0)
- continue;
- VI = Index.getValueInfo(GUID);
- if (!VI)
- continue;
- }
+ VI = updateValueInfoForIndirectCalls(Index, VI);
+ if (!VI)
+ continue;
if (DefinedGVSummaries.count(VI.getGUID())) {
DEBUG(dbgs() << "ignored! Target already in destination module.\n");
@@ -461,6 +468,17 @@ void llvm::computeDeadSymbols(
for (auto &S : VI.getSummaryList())
if (S->isLive())
return;
+ // FIXME: If we knew which edges were created for indirect call profiles,
+ // we could skip them here. Any that are live should be reached via
+ // other edges, e.g. reference edges. Otherwise, using a profile collected
+ // on a slightly different binary might provoke preserving, importing
+ // and ultimately promoting calls to functions not linked into this
+ // binary, which increases the binary size unnecessarily. Note that
+ // if this code changes, the importer needs to change so that edges
+ // to functions marked dead are skipped.
+ VI = updateValueInfoForIndirectCalls(Index, VI);
+ if (!VI)
+ return;
for (auto &S : VI.getSummaryList())
S->setLive(true);
++LiveSymbols;
OpenPOWER on IntegriCloud