diff options
author | Joseph Huber <huberjn@outlook.com> | 2023-11-29 09:04:36 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-29 09:04:36 -0600 |
commit | 0468867c982c9438cf1e9adb71709cb9c7d66391 (patch) | |
tree | 3fd13e3a08c8ff2563bf21381f35ad83178422df | |
parent | 244389ad1794b0bc6c659bd685cf6ea9a7cad8e3 (diff) | |
download | llvm-0468867c982c9438cf1e9adb71709cb9c7d66391.zip llvm-0468867c982c9438cf1e9adb71709cb9c7d66391.tar.gz llvm-0468867c982c9438cf1e9adb71709cb9c7d66391.tar.bz2 |
[libc] Fix the GPU build for the hashing support (#73799)
Summary:
For reasons unknown to me, this function is undefined only on the GPU
build if you use `uintptr_t` but not `uint64_t` directly. This patch
makes an ifdef to use this directly for the GPU build to fix the bots.
-rw-r--r-- | libc/src/__support/HashTable/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libc/src/__support/HashTable/generic/bitmask_impl.inc | 23 |
2 files changed, 17 insertions, 7 deletions
diff --git a/libc/src/__support/HashTable/CMakeLists.txt b/libc/src/__support/HashTable/CMakeLists.txt index 22e91d4..e9b4aa3 100644 --- a/libc/src/__support/HashTable/CMakeLists.txt +++ b/libc/src/__support/HashTable/CMakeLists.txt @@ -5,6 +5,7 @@ add_header_library( FLAGS PREFER_GENERIC DEPENDS + libc.src.__support.common libc.src.__support.bit libc.src.__support.macros.properties.cpu_features ) diff --git a/libc/src/__support/HashTable/generic/bitmask_impl.inc b/libc/src/__support/HashTable/generic/bitmask_impl.inc index 13e0838..b8d2bfc 100644 --- a/libc/src/__support/HashTable/generic/bitmask_impl.inc +++ b/libc/src/__support/HashTable/generic/bitmask_impl.inc @@ -6,38 +6,47 @@ // //===----------------------------------------------------------------------===// +#include "src/__support/common.h" #include "src/__support/endian.h" namespace LIBC_NAMESPACE { namespace internal { + +// GPU architectures are 64-bit but use 32-bit general purpose registers. +#ifdef LIBC_TARGET_ARCH_IS_GPU +using bitmask_t = uint32_t; +#else +using bitmask_t = uintptr_t; +#endif + // Helper function to spread a byte across the whole word. // Accumutively, the procedure looks like: // byte = 0x00000000000000ff // byte | (byte << 8) = 0x000000000000ffff // byte | (byte << 16) = 0x00000000ffffffff // byte | (byte << 32) = 0xffffffffffffffff -LIBC_INLINE constexpr uintptr_t repeat_byte(uintptr_t byte) { +LIBC_INLINE constexpr bitmask_t repeat_byte(bitmask_t byte) { size_t shift_amount = 8; - while (shift_amount < sizeof(uintptr_t) * 8) { + while (shift_amount < sizeof(bitmask_t) * 8) { byte |= byte << shift_amount; shift_amount <<= 1; } return byte; } -using BitMask = BitMaskAdaptor<uintptr_t, repeat_byte(0x80), 0x8ull>; +using BitMask = BitMaskAdaptor<bitmask_t, repeat_byte(0x80), 0x8ull>; using IteratableBitMask = IteratableBitMaskAdaptor<BitMask>; struct Group { - uintptr_t data; + bitmask_t data; // Load a group of control words from an arbitary address. LIBC_INLINE static Group load(const void *__restrict addr) { union { - uintptr_t value; - char bytes[sizeof(uintptr_t)]; + bitmask_t value; + char bytes[sizeof(bitmask_t)]; } data; - for (size_t i = 0; i < sizeof(uintptr_t); ++i) + for (size_t i = 0; i < sizeof(bitmask_t); ++i) data.bytes[i] = static_cast<const char *>(addr)[i]; return {data.value}; } |