[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