[clang] c8e6bf0 - [X86] Enable constexpr on BSWAP intrinsics (PR31446)

Simon Pilgrim via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 21 02:59:11 PDT 2020


Author: Simon Pilgrim
Date: 2020-08-21T10:55:15+01:00
New Revision: c8e6bf0a65fdbda7a611e8047e2a644777f15b24

URL: https://github.com/llvm/llvm-project/commit/c8e6bf0a65fdbda7a611e8047e2a644777f15b24
DIFF: https://github.com/llvm/llvm-project/commit/c8e6bf0a65fdbda7a611e8047e2a644777f15b24.diff

LOG: [X86] Enable constexpr on BSWAP intrinsics (PR31446)

This enables constexpr BSWAP intrinsics defined in ia32intrin.h

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 0c864d8b4d14..f19edfe6cfcd 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -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
 --------------------
 

diff  --git a/clang/lib/Headers/ia32intrin.h b/clang/lib/Headers/ia32intrin.h
index bed75e18c4f6..88f031056f2d 100644
--- a/clang/lib/Headers/ia32intrin.h
+++ b/clang/lib/Headers/ia32intrin.h
@@ -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);
 }

diff  --git a/clang/test/CodeGen/x86-bswap.c b/clang/test/CodeGen/x86-bswap.c
index adf8b7846a02..e952e4f5b127 100644
--- a/clang/test/CodeGen/x86-bswap.c
+++ b/clang/test/CodeGen/x86-bswap.c
@@ -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


        


More information about the cfe-commits mailing list