[llvm] [CodeGen] Fix non-determinism in MachineBlockHashInfo hashes (PR #192826)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 19 11:10:30 PDT 2026


================
@@ -11,12 +11,111 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/MachineBlockHashInfo.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringRef.h"
 #include "llvm/CodeGen/Passes.h"
+#include "llvm/IR/Constants.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Target/TargetMachine.h"
 
 using namespace llvm;
 
+template <typename T>
+std::enable_if_t<is_integral_or_enum<T>::value, uint64_t>
+hashValue(const T &Val) {
+  return static_cast<uint64_t>(Val);
+}
+
+static uint64_t hashValue(StringRef S) {
+  uint64_t Hash = 0;
+  for (char C : S)
+    Hash = hashing::detail::hash_16_bytes(Hash, C);
+  return Hash;
+}
+
+template <typename T> uint64_t hashValue(ArrayRef<T> A) {
+  uint64_t Hash = 0;
+  for (const auto &C : A)
+    Hash = hashing::detail::hash_16_bytes(Hash, C);
+  return Hash;
+}
+
+static uint64_t hashValue(const APInt &I) {
+  return hashValue(ArrayRef(I.getRawData(), I.getNumWords()));
+}
+
+template <typename T> static uint64_t ignoreValue(const T *) { return 1; }
+
+static uint64_t hashCombine() { return 0; }
+
+template <typename T, typename... Ts>
+uint64_t hashCombine(const T &Hash, const Ts &...Args) {
+  return hashing::detail::hash_16_bytes(hashValue(Hash), hashCombine(Args...));
+}
+
+// Similar to hash_code llvm::hash_value(const MachineOperand &MO) but stable.
+static uint64_t hashOperand(const MachineOperand &MO) {
----------------
vitalybuka wrote:

Done

https://github.com/llvm/llvm-project/pull/192826


More information about the llvm-commits mailing list