Commit c0f104bf by Connal de Souza Committed by Copybara-Service

Optimize LowLevelHash by breaking dependency between final loads and previous len/ptr updates.

No functional change.

PiperOrigin-RevId: 619979819
Change-Id: I71a4ae14272bcdf1da2e201ed286f95213ecb5e2
parent c5d722bc
...@@ -37,6 +37,7 @@ uint64_t LowLevelHashLenGt16(const void* data, size_t len, uint64_t seed, ...@@ -37,6 +37,7 @@ uint64_t LowLevelHashLenGt16(const void* data, size_t len, uint64_t seed,
PrefetchToLocalCache(data); PrefetchToLocalCache(data);
const uint8_t* ptr = static_cast<const uint8_t*>(data); const uint8_t* ptr = static_cast<const uint8_t*>(data);
uint64_t starting_length = static_cast<uint64_t>(len); uint64_t starting_length = static_cast<uint64_t>(len);
const uint8_t* last_16_ptr = ptr + starting_length - 16;
uint64_t current_state = seed ^ salt[0]; uint64_t current_state = seed ^ salt[0];
if (len > 64) { if (len > 64) {
...@@ -97,15 +98,12 @@ uint64_t LowLevelHashLenGt16(const void* data, size_t len, uint64_t seed, ...@@ -97,15 +98,12 @@ uint64_t LowLevelHashLenGt16(const void* data, size_t len, uint64_t seed,
uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8); uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
current_state = Mix(a ^ salt[1], b ^ current_state); current_state = Mix(a ^ salt[1], b ^ current_state);
ptr += 16;
len -= 16;
} }
// We now have a data `ptr` with at least 1 and at most 16 bytes. But we can // We now have a data `ptr` with at least 1 and at most 16 bytes. But we can
// safely read from `ptr + len - 16`. // safely read from `ptr + len - 16`.
uint64_t a = absl::base_internal::UnalignedLoad64(ptr + len - 16); uint64_t a = absl::base_internal::UnalignedLoad64(last_16_ptr);
uint64_t b = absl::base_internal::UnalignedLoad64(ptr + len - 8); uint64_t b = absl::base_internal::UnalignedLoad64(last_16_ptr + 8);
return Mix(a ^ salt[1] ^ starting_length, b ^ current_state); return Mix(a ^ salt[1] ^ starting_length, b ^ current_state);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment