[PATCH] D79772: Nondeterminism of iterators causes false ThinLTO cache misses
Katya Romanova via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 29 01:03:24 PDT 2020
kromanova updated this revision to Diff 267136.
kromanova added a comment.
I accidentally deleted a couple of important lines in previous patch. Please ignore it and look at the latest patch only.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79772/new/
https://reviews.llvm.org/D79772
Files:
llvm/lib/LTO/LTO.cpp
Index: llvm/lib/LTO/LTO.cpp
===================================================================
--- llvm/lib/LTO/LTO.cpp
+++ llvm/lib/LTO/LTO.cpp
@@ -139,8 +139,17 @@
// Include the hash for the current module
auto ModHash = Index.getModuleHash(ModuleID);
Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
+
+ std::vector<uint64_t> ExportsGUID;
+ ExportsGUID.reserve(ExportList.size());
for (const auto &VI : ExportList) {
auto GUID = VI.getGUID();
+ ExportsGUID.push_back(GUID);
+ }
+
+ // Sort the export list elements GUIDs.
+ llvm::sort(ExportsGUID);
+ for (uint64_t GUID : ExportsGUID) {
// The export list can impact the internalization, be conservative here
Hasher.update(ArrayRef<uint8_t>((uint8_t *)&GUID, sizeof(GUID)));
}
@@ -148,12 +157,21 @@
// Include the hash for every module we import functions from. The set of
// imported symbols for each module may affect code generation and is
// sensitive to link order, so include that as well.
- for (auto &Entry : ImportList) {
- auto ModHash = Index.getModuleHash(Entry.first());
+ using MapEntryTy = FunctionImporter::ImportMapTy::MapEntryTy;
+ std::vector<const MapEntryTy *> ImportModulesVector;
+ ImportModulesVector.reserve(ImportList.size());
+ for (const auto &Entry : ImportList)
+ ImportModulesVector.push_back(&Entry);
+ llvm::sort(ImportModulesVector,
+ [](const MapEntryTy *Lhs, const MapEntryTy *Rhs) {
+ return Lhs->getKey() < Rhs->getKey();
+ });
+ for (const MapEntryTy *Entry : ImportModulesVector) {
+ auto ModHash = Index.getModuleHash(Entry->first());
Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash)));
- AddUint64(Entry.second.size());
- for (auto &Fn : Entry.second)
+ AddUint64(Entry->second.size());
+ for (auto &Fn : Entry->second)
AddUint64(Fn);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79772.267136.patch
Type: text/x-patch
Size: 1916 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200529/7c55179a/attachment.bin>
More information about the llvm-commits
mailing list