[ThinLTO] Thin link efficiency: skip candidate added later with higher 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 llvm-svn: 289867
This commit is contained in:
parent
0e8a299f19
commit
475b51a700
|
@ -266,7 +266,8 @@ static void exportGlobalInModule(const ModuleSummaryIndex &Index,
|
||||||
ExportList.insert(GUID);
|
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
|
/// 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
|
/// imported functions and the symbols they reference in their source module as
|
||||||
|
@ -362,7 +363,7 @@ static void computeImportForFunction(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert the newly imported function to the worklist.
|
// Insert the newly imported function to the worklist.
|
||||||
Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold);
|
Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold, GUID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,8 +397,16 @@ static void ComputeImportForModule(
|
||||||
// Process the newly imported functions and add callees to the worklist.
|
// Process the newly imported functions and add callees to the worklist.
|
||||||
while (!Worklist.empty()) {
|
while (!Worklist.empty()) {
|
||||||
auto FuncInfo = Worklist.pop_back_val();
|
auto FuncInfo = Worklist.pop_back_val();
|
||||||
auto *Summary = FuncInfo.first;
|
auto *Summary = std::get<0>(FuncInfo);
|
||||||
auto Threshold = FuncInfo.second;
|
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,
|
computeImportForFunction(*Summary, Index, Threshold, DefinedGVSummaries,
|
||||||
Worklist, ImportList, ExportLists);
|
Worklist, ImportList, ExportLists);
|
||||||
|
|
Loading…
Reference in New Issue