From dd8ecde00b3b3d8d0f80d7df43393f583d782413 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Sun, 22 Jan 2023 18:21:08 +0000 Subject: [PATCH] [ADT] llvm::bit_cast - use __builtin_bit_cast if available If the compiler supports __builtin_bit_cast we should try to use it instead of std::memcpy (and avoid including the cstring header). Differential Revision: https://reviews.llvm.org/D142305 --- llvm/include/llvm/ADT/bit.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/ADT/bit.h b/llvm/include/llvm/ADT/bit.h index 887dd51..d93023d 100644 --- a/llvm/include/llvm/ADT/bit.h +++ b/llvm/include/llvm/ADT/bit.h @@ -16,10 +16,13 @@ #include "llvm/Support/Compiler.h" #include -#include #include #include +#if !__has_builtin(__builtin_bit_cast) +#include +#endif + #if defined(_MSC_VER) && !defined(_DEBUG) #include // for _byteswap_{ushort,ulong,uint64} #endif @@ -48,9 +51,13 @@ template < typename = std::enable_if_t::value>, typename = std::enable_if_t::value>> [[nodiscard]] inline To bit_cast(const From &from) noexcept { +#if __has_builtin(__builtin_bit_cast) + return __builtin_bit_cast(To, from); +#else To to; std::memcpy(&to, &from, sizeof(To)); return to; +#endif } /// Reverses the bytes in the given integer value V. -- 2.7.4