[PATCH] D73698: [ThinLTO] Import globals recursively
Eugene Leviant via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 6 08:43:38 PST 2020
evgeny777 updated this revision to Diff 242918.
evgeny777 added a comment.
Rebased
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D73698/new/
https://reviews.llvm.org/D73698
Files:
llvm/lib/Transforms/IPO/FunctionImport.cpp
llvm/test/ThinLTO/X86/import-constant.ll
Index: llvm/test/ThinLTO/X86/import-constant.ll
===================================================================
--- llvm/test/ThinLTO/X86/import-constant.ll
+++ llvm/test/ThinLTO/X86/import-constant.ll
@@ -20,7 +20,7 @@
; @outer is a write-only variable, so it's been converted to zeroinitializer.
; IMPORT: @outer = internal local_unnamed_addr global %struct.Q zeroinitializer
; IMPORT-NEXT: @_ZL3Obj.llvm.{{.*}} = available_externally hidden constant %struct.S { i32 4, i32 8, i32* @val }
-; IMPORT-NEXT: @val = external dso_local global i32
+; IMPORT-NEXT: @val = available_externally dso_local global i32 42
; OPT: @outer = internal unnamed_addr global %struct.Q zeroinitializer
Index: llvm/lib/Transforms/IPO/FunctionImport.cpp
===================================================================
--- llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -261,8 +261,8 @@
namespace {
-using EdgeInfo = std::tuple<const FunctionSummary *, unsigned /* Threshold */,
- GlobalValue::GUID>;
+using EdgeInfo =
+ std::tuple<const GlobalValueSummary *, unsigned /* Threshold */>;
} // anonymous namespace
@@ -282,8 +282,9 @@
}
static void computeImportForReferencedGlobals(
- const FunctionSummary &Summary, const ModuleSummaryIndex &Index,
+ const GlobalValueSummary &Summary, const ModuleSummaryIndex &Index,
const GVSummaryMapTy &DefinedGVSummaries,
+ SmallVectorImpl<EdgeInfo> &Worklist,
FunctionImporter::ImportMapTy &ImportList,
StringMap<FunctionImporter::ExportSetTy> *ExportLists) {
for (auto &VI : Summary.refs()) {
@@ -321,6 +322,11 @@
// which is more efficient than adding them here.
if (ExportLists)
(*ExportLists)[RefSummary->modulePath()].insert(VI);
+
+ // If variable is not writeonly we attempt to recursively analyze
+ // its references in order to import referenced constants.
+ if (!Index.isWriteOnly(cast<GlobalVarSummary>(RefSummary.get())))
+ Worklist.emplace_back(RefSummary.get(), 0);
break;
}
}
@@ -360,7 +366,7 @@
StringMap<FunctionImporter::ExportSetTy> *ExportLists,
FunctionImporter::ImportThresholdsTy &ImportThresholds) {
computeImportForReferencedGlobals(Summary, Index, DefinedGVSummaries,
- ImportList, ExportLists);
+ Worklist, ImportList, ExportLists);
static int ImportCount = 0;
for (auto &Edge : Summary.calls()) {
ValueInfo VI = Edge.first;
@@ -508,7 +514,7 @@
ImportCount++;
// Insert the newly imported function to the worklist.
- Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold, VI.getGUID());
+ Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold);
}
}
@@ -549,13 +555,17 @@
// Process the newly imported functions and add callees to the worklist.
while (!Worklist.empty()) {
- auto FuncInfo = Worklist.pop_back_val();
- auto *Summary = std::get<0>(FuncInfo);
- auto Threshold = std::get<1>(FuncInfo);
-
- computeImportForFunction(*Summary, Index, Threshold, DefinedGVSummaries,
- Worklist, ImportList, ExportLists,
- ImportThresholds);
+ auto GVInfo = Worklist.pop_back_val();
+ auto *Summary = std::get<0>(GVInfo);
+ auto Threshold = std::get<1>(GVInfo);
+
+ if (auto *FS = dyn_cast<FunctionSummary>(Summary))
+ computeImportForFunction(*FS, Index, Threshold, DefinedGVSummaries,
+ Worklist, ImportList, ExportLists,
+ ImportThresholds);
+ else
+ computeImportForReferencedGlobals(*Summary, Index, DefinedGVSummaries,
+ Worklist, ImportList, ExportLists);
}
// Print stats about functions considered but rejected for importing
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D73698.242918.patch
Type: text/x-patch
Size: 3920 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200206/2490f880/attachment.bin>
More information about the llvm-commits
mailing list