Avoid misaligned loads from StaticRandomData in the size [4, 8] hashing case. (#4743)

Avoid misaligned loads from StaticRandomData in the size [4, 8] hashing
case. We can use aligned loads in this case for lower latency. We
introduce the SampleAlignedRandomData function for this purpose.
This commit is contained in:
ezbr
2024-12-31 04:32:13 +00:00
committed by GitHub
parent 4bbc189d55
commit 9d09061301
+9 -1
View File
@@ -387,6 +387,14 @@ class Hasher {
return data;
}
// As above, but for small offsets, we can use aligned loads, which are
// faster. The offset must be in the range [0, 8).
static auto SampleAlignedRandomData(ssize_t offset) -> uint64_t {
CARBON_DCHECK(static_cast<size_t>(offset) <
sizeof(StaticRandomData) / sizeof(uint64_t));
return StaticRandomData[offset];
}
// Random data taken from the hexadecimal digits of Pi's fractional component,
// written in lexical order for convenience of reading. The resulting
// byte-stream will be different due to little-endian integers. These can be
@@ -950,7 +958,7 @@ inline auto Hasher::HashSizedBytes(llvm::ArrayRef<std::byte> bytes) -> void {
// Note that we don't drop to the `WeakMix` routine here because we want
// to use sampled random data to encode the size, which may not be as
// effective without the full 128-bit folded result.
buffer = Mix(data ^ buffer, SampleRandomData(size));
buffer = Mix(data ^ buffer, SampleAlignedRandomData(size - 1));
CARBON_MCA_END("dynamic-8b");
return;
}