[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 00:30:22 PDT 2020


kromanova updated this revision to Diff 267133.
kromanova marked 5 inline comments as done.
kromanova added a comment.

Updated the code to fix code review comments.


Repository:
  rG LLVM Github Monorepo

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
@@ -136,11 +136,16 @@
   AddString(Conf.DefaultTriple);
   AddString(Conf.DwoDir);
 
-  // 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 +153,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.267133.patch
Type: text/x-patch
Size: 1978 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200529/865e85bc/attachment.bin>


More information about the llvm-commits mailing list