[X86] Enable constexpr on BSWAP intrinsics (PR31446)
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 21 Aug 2020 09:53:17 +0000 (10:53 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 21 Aug 2020 09:55:15 +0000 (10:55 +0100)
This enables constexpr BSWAP intrinsics defined in ia32intrin.h

clang/docs/ReleaseNotes.rst
clang/lib/Headers/ia32intrin.h
clang/test/CodeGen/x86-bswap.c

index 0c864d8..f19edfe 100644 (file)
@@ -160,6 +160,9 @@ X86 Support in Clang
   ``_popcnt64``, ``__popcntd`` and ``__popcntq``  may now be used within
   constexpr expressions.
 
+- The x86 intrinsics ``__bswap``, ``__bswapd``, ``__bswap64`` and ``__bswapq``
+  may now be used within constexpr expressions.
+
 Internal API Changes
 --------------------
 
index bed75e1..88f0310 100644 (file)
@@ -69,12 +69,12 @@ __bsrd(int __A) {
  *     A 32-bit integer operand.
  *  \returns A 32-bit integer containing the swapped bytes.
  */
-static __inline__ int __DEFAULT_FN_ATTRS
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
 __bswapd(int __A) {
   return __builtin_bswap32(__A);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
 _bswap(int __A) {
   return __builtin_bswap32(__A);
 }
@@ -128,7 +128,7 @@ __bsrq(long long __A) {
  *     A 64-bit integer operand.
  *  \returns A 64-bit integer containing the swapped bytes.
  */
-static __inline__ long long __DEFAULT_FN_ATTRS
+static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
 __bswapq(long long __A) {
   return __builtin_bswap64(__A);
 }
index adf8b78..e952e4f 100644 (file)
@@ -1,29 +1,45 @@
-// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC
+// RUN: %clang_cc1 -x c++ -std=c++11 -ffreestanding %s -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP
 
 #include <x86intrin.h>
 
 int test__bswapd(int X) {
-// CHECK-LABEL: @test__bswapd
+// CHECKC-LABEL: @test__bswapd
 // CHECK: call i32 @llvm.bswap.i32
   return __bswapd(X);
 }
 
 int test_bswap(int X) {
-// CHECK-LABEL: @test_bswap
+// CHECKC-LABEL: @test_bswap
 // CHECK: call i32 @llvm.bswap.i32
   return _bswap(X);
 }
 
 long test__bswapq(long long X) {
-// CHECK-LABEL: @test__bswapq
+// CHECKC-LABEL: @test__bswapq
 // CHECK: call i64 @llvm.bswap.i64
   return __bswapq(X);
 }
 
 long test_bswap64(long long X) {
-// CHECK-LABEL: @test_bswap64
+// CHECKC-LABEL: @test_bswap64
 // CHECK: call i64 @llvm.bswap.i64
   return _bswap64(X);
 }
 
+// Test constexpr handling.
+#if defined(__cplusplus) && (__cplusplus >= 201103L)
 
+char bswapd_0[__bswapd(0x00000000) == 0x00000000 ? 1 : -1];
+char bswapd_1[__bswapd(0x01020304) == 0x04030201 ? 1 : -1];
+
+char bswap_0[_bswap(0x00000000) == 0x00000000 ? 1 : -1];
+char bswap_1[_bswap(0x10203040) == 0x40302010 ? 1 : -1];
+
+char bswapq_0[__bswapq(0x0000000000000000ULL) == 0x0000000000000000 ? 1 : -1];
+char bswapq_1[__bswapq(0x0102030405060708ULL) == 0x0807060504030201 ? 1 : -1];
+
+char bswap64_0[_bswap64(0x0000000000000000ULL) == 0x0000000000000000 ? 1 : -1];
+char bswap64_1[_bswap64(0x1020304050607080ULL) == 0x8070605040302010 ? 1 : -1];
+
+#endif