Revert "Speed up tail processing when hashing aligned C strings"
authorJohn Naylor <[email protected]>
Sun, 31 Mar 2024 07:18:36 +0000 (14:18 +0700)
committerJohn Naylor <[email protected]>
Sun, 31 Mar 2024 07:18:36 +0000 (14:18 +0700)
This reverts commit 07f0f6abfc7f6c55cede528d9689dedecefc734a.

This has shown failures on both Valgrind and big-endian machines,
per members skink and pike.

src/include/common/hashfn_unstable.h

index bd7323fe052bd18f33c6ecadc4c5c618bfe9668e..791750d136c48b4818a1c3f41b4681fa52b45b14 100644 (file)
@@ -219,9 +219,8 @@ static inline size_t
 fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str)
 {
    const char *const start = str;
-   uint64      chunk;
+   size_t      remainder;
    uint64      zero_byte_low;
-   uint64      mask;
 
    Assert(PointerIsAligned(start, uint64));
 
@@ -240,7 +239,7 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str)
     */
    for (;;)
    {
-       chunk = *(uint64 *) str;
+       uint64      chunk = *(uint64 *) str;
 
 #ifdef WORDS_BIGENDIAN
        zero_byte_low = haszero64(pg_bswap64(chunk));
@@ -255,37 +254,14 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str)
        str += FH_SIZEOF_ACCUM;
    }
 
-   if (zero_byte_low & 0xFF)
-   {
-       /*
-        * The next byte in the input is the NUL terminator, so we have
-        * nothing to do.
-        */
-   }
-   else
-   {
-       /*
-        * Create a mask for the remaining bytes so we can combine them into
-        * the hash. The mask also covers the NUL terminator, but that's
-        * harmless. The mask could contain 0x80 in bytes corresponding to the
-        * input past the terminator, but only where the input byte is zero or
-        * one, so also harmless.
-        */
-       mask = zero_byte_low | (zero_byte_low - 1);
-#ifdef WORDS_BIGENDIAN
-       /* need to mask the upper bytes */
-       mask = pg_bswap64(mask);
-#endif
-       hs->accum = chunk & mask;
-       fasthash_combine(hs);
-
-       /*
-        * The byte corresponding to the NUL will be 0x80, so the rightmost
-        * bit position will be in the range 15, 23, ..., 63. Turn this into
-        * byte position by dividing by 8.
-        */
-       str += pg_rightmost_one_pos64(zero_byte_low) / BITS_PER_BYTE;
-   }
+   /*
+    * The byte corresponding to the NUL will be 0x80, so the rightmost bit
+    * position will be in the range 7, 15, ..., 63. Turn this into byte
+    * position by dividing by 8.
+    */
+   remainder = pg_rightmost_one_pos64(zero_byte_low) / BITS_PER_BYTE;
+   fasthash_accum(hs, str, remainder);
+   str += remainder;
 
    return str - start;
 }