[ADT] llvm::bit_cast - use __builtin_bit_cast if available
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 22 Jan 2023 18:21:08 +0000 (18:21 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 22 Jan 2023 18:21:08 +0000 (18:21 +0000)
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

index 887dd51..d93023d 100644 (file)
 
 #include "llvm/Support/Compiler.h"
 #include <cstdint>
-#include <cstring>
 #include <limits>
 #include <type_traits>
 
+#if !__has_builtin(__builtin_bit_cast)
+#include <cstring>
+#endif
+
 #if defined(_MSC_VER) && !defined(_DEBUG)
 #include <cstdlib>  // for _byteswap_{ushort,ulong,uint64}
 #endif
@@ -48,9 +51,13 @@ template <
     typename = std::enable_if_t<std::is_trivially_copyable<To>::value>,
     typename = std::enable_if_t<std::is_trivially_copyable<From>::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.