mgrang updated this revision to Diff 188824.
mgrang retitled this revision from "[ProfileData] Remove non-determinism: 
Change DenseMap to MapVector" to "[ProfileData] Sort FuncData before iteration 
to remove non-determinism".
mgrang added a reviewer: dblaikie.
Herald added a subscriber: jdoerfert.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57986/new/

https://reviews.llvm.org/D57986

Files:
  lib/ProfileData/InstrProfWriter.cpp


Index: lib/ProfileData/InstrProfWriter.cpp
===================================================================
--- lib/ProfileData/InstrProfWriter.cpp
+++ lib/ProfileData/InstrProfWriter.cpp
@@ -376,14 +376,41 @@
   if (ProfileKind == PF_IRLevel)
     OS << "# IR level Instrumentation Flag\n:ir\n";
   InstrProfSymtab Symtab;
+
+  using FuncPair = detail::DenseMapPair<uint64_t, InstrProfRecord>;
+  using RecordType = std::pair<StringRef, FuncPair>;
+
+  SmallVector<RecordType, 4> OrderedFuncData;
   for (const auto &I : FunctionData)
-    if (shouldEncodeData(I.getValue()))
-      if (Error E = Symtab.addFuncName(I.getKey()))
+    for (const auto &Func : I.getValue())
+      OrderedFuncData.push_back(std::make_pair(I.getKey(), Func));
+
+  llvm::sort(OrderedFuncData, [](const RecordType &A, const RecordType &B) {
+                                 auto nameA = A.first;
+                                 auto nameB = B.first;
+                                 int comp = nameA.compare(nameB);
+                                 if (comp)
+                                   return comp < 0;
+
+                                 auto hashA = A.second.first;
+                                 auto hashB = B.second.first;
+                                 return hashA < hashB;
+                              });
+
+  for (const auto &pair : OrderedFuncData) {
+    const auto &key = pair.first;
+    if (shouldEncodeData(FunctionData[key]))
+      if (Error E = Symtab.addFuncName(key))
         return E;
+  }
+
+  for (const auto &pair : OrderedFuncData) {
+    const auto &key = pair.first;
+    if (shouldEncodeData(FunctionData[key])) {
+      const auto &Func = pair.second;
+      writeRecordInText(pair.first, Func.first, Func.second, Symtab, OS);
+    }
+  }
 
-  for (const auto &I : FunctionData)
-    if (shouldEncodeData(I.getValue()))
-      for (const auto &Func : I.getValue())
-        writeRecordInText(I.getKey(), Func.first, Func.second, Symtab, OS);
   return Error::success();
 }


Index: lib/ProfileData/InstrProfWriter.cpp
===================================================================
--- lib/ProfileData/InstrProfWriter.cpp
+++ lib/ProfileData/InstrProfWriter.cpp
@@ -376,14 +376,41 @@
   if (ProfileKind == PF_IRLevel)
     OS << "# IR level Instrumentation Flag\n:ir\n";
   InstrProfSymtab Symtab;
+
+  using FuncPair = detail::DenseMapPair<uint64_t, InstrProfRecord>;
+  using RecordType = std::pair<StringRef, FuncPair>;
+
+  SmallVector<RecordType, 4> OrderedFuncData;
   for (const auto &I : FunctionData)
-    if (shouldEncodeData(I.getValue()))
-      if (Error E = Symtab.addFuncName(I.getKey()))
+    for (const auto &Func : I.getValue())
+      OrderedFuncData.push_back(std::make_pair(I.getKey(), Func));
+
+  llvm::sort(OrderedFuncData, [](const RecordType &A, const RecordType &B) {
+                                 auto nameA = A.first;
+                                 auto nameB = B.first;
+                                 int comp = nameA.compare(nameB);
+                                 if (comp)
+                                   return comp < 0;
+
+                                 auto hashA = A.second.first;
+                                 auto hashB = B.second.first;
+                                 return hashA < hashB;
+                              });
+
+  for (const auto &pair : OrderedFuncData) {
+    const auto &key = pair.first;
+    if (shouldEncodeData(FunctionData[key]))
+      if (Error E = Symtab.addFuncName(key))
         return E;
+  }
+
+  for (const auto &pair : OrderedFuncData) {
+    const auto &key = pair.first;
+    if (shouldEncodeData(FunctionData[key])) {
+      const auto &Func = pair.second;
+      writeRecordInText(pair.first, Func.first, Func.second, Symtab, OS);
+    }
+  }
 
-  for (const auto &I : FunctionData)
-    if (shouldEncodeData(I.getValue()))
-      for (const auto &Func : I.getValue())
-        writeRecordInText(I.getKey(), Func.first, Func.second, Symtab, OS);
   return Error::success();
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to