Skip to content

Commit

Permalink
[ThinLTO] Thin link efficiency: skip candidate added later with highe…
Browse files Browse the repository at this point in the history
…r threshold (NFC)

Summary:
Thin link efficiency improvement. After adding an importing candidate to
the worklist we might have later added it again with a higher threshold.
Skip it when popped from the worklist if we recorded a higher threshold
than the current worklist entry, it will get processed again at the
higher threshold when that entry is popped.

This required adding the summary's GUID to the worklist, so that it can
be used to query the recorded highest threshold for it when we pop from the
worklist.

Reviewers: mehdi_amini

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289867 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
teresajohnson committed Dec 15, 2016
1 parent 31f8665 commit de94ece
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions lib/Transforms/IPO/FunctionImport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@ static void exportGlobalInModule(const ModuleSummaryIndex &Index,
ExportList.insert(GUID);
}

using EdgeInfo = std::pair<const FunctionSummary *, unsigned /* Threshold */>;
using EdgeInfo = std::tuple<const FunctionSummary *, unsigned /* Threshold */,
GlobalValue::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
Expand Down Expand Up @@ -362,7 +363,7 @@ static void computeImportForFunction(
}

// Insert the newly imported function to the worklist.
Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold);
Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold, GUID);
}
}

Expand Down Expand Up @@ -396,8 +397,16 @@ static void ComputeImportForModule(
// Process the newly imported functions and add callees to the worklist.
while (!Worklist.empty()) {
auto FuncInfo = Worklist.pop_back_val();
auto *Summary = FuncInfo.first;
auto Threshold = FuncInfo.second;
auto *Summary = std::get<0>(FuncInfo);
auto Threshold = std::get<1>(FuncInfo);
auto GUID = std::get<2>(FuncInfo);

// Check if we later added this summary with a higher threshold.
// If so, skip this entry.
auto ExportModulePath = Summary->modulePath();
auto &LatestProcessedThreshold = ImportList[ExportModulePath][GUID];
if (LatestProcessedThreshold > Threshold)
continue;

computeImportForFunction(*Summary, Index, Threshold, DefinedGVSummaries,
Worklist, ImportList, ExportLists);
Expand Down

0 comments on commit de94ece

Please sign in to comment.