Author: Simon Pilgrim Date: 2020-08-21T11:44:20+01:00 New Revision: 9ffc412e1afba9e4853c94669d26c9ba0707096c
URL: https://github.com/llvm/llvm-project/commit/9ffc412e1afba9e4853c94669d26c9ba0707096c DIFF: https://github.com/llvm/llvm-project/commit/9ffc412e1afba9e4853c94669d26c9ba0707096c.diff LOG: [X86] Enable constexpr on BITSCAN intrinsics (PR31446) This enables constexpr BSF/BSR intrinsics defined in ia32intrin.h Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Headers/ia32intrin.h clang/test/CodeGen/bitscan-builtins.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f19edfe6cfcd..6ea9a1499ed3 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -160,6 +160,12 @@ X86 Support in Clang ``_popcnt64``, ``__popcntd`` and ``__popcntq`` may now be used within constexpr expressions. +- The x86 intrinsics ``_bit_scan_forward``, ``__bsfd`` and ``__bsfq`` may now + be used within constexpr expressions. + +- The x86 intrinsics ``_bit_scan_reverse``, ``__bsrd`` and ``__bsrq`` may now + be used within constexpr expressions. + - The x86 intrinsics ``__bswap``, ``__bswapd``, ``__bswap64`` and ``__bswapq`` may now be used within constexpr expressions. diff --git a/clang/lib/Headers/ia32intrin.h b/clang/lib/Headers/ia32intrin.h index 88f031056f2d..a86ef868c3ce 100644 --- a/clang/lib/Headers/ia32intrin.h +++ b/clang/lib/Headers/ia32intrin.h @@ -36,7 +36,7 @@ * A 32-bit integer operand. * \returns A 32-bit integer containing the bit number. */ -static __inline__ int __DEFAULT_FN_ATTRS +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR __bsfd(int __A) { return __builtin_ctz(__A); } @@ -53,7 +53,7 @@ __bsfd(int __A) { * A 32-bit integer operand. * \returns A 32-bit integer containing the bit number. */ -static __inline__ int __DEFAULT_FN_ATTRS +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR __bsrd(int __A) { return 31 - __builtin_clz(__A); } @@ -95,7 +95,7 @@ _bswap(int __A) { * A 64-bit integer operand. * \returns A 32-bit integer containing the bit number. */ -static __inline__ int __DEFAULT_FN_ATTRS +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR __bsfq(long long __A) { return __builtin_ctzll(__A); } @@ -112,7 +112,7 @@ __bsfq(long long __A) { * A 64-bit integer operand. * \returns A 32-bit integer containing the bit number. */ -static __inline__ int __DEFAULT_FN_ATTRS +static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR __bsrq(long long __A) { return 63 - __builtin_clzll(__A); } diff --git a/clang/test/CodeGen/bitscan-builtins.c b/clang/test/CodeGen/bitscan-builtins.c index 176d829127b8..2fcebf477846 100644 --- a/clang/test/CodeGen/bitscan-builtins.c +++ b/clang/test/CodeGen/bitscan-builtins.c @@ -1,47 +1,74 @@ -// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC +// RUN: %clang_cc1 -x c++ -std=c++11 -ffreestanding %s -triple=x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP + // PR33722 -// RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -x c -ffreestanding %s -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKC +// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple x86_64-unknown-unknown -fms-extensions -fms-compatibility-version=19.00 -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECKCPP #include <x86intrin.h> int test_bit_scan_forward(int a) { return _bit_scan_forward(a); -// CHECK: @test_bit_scan_forward +// CHECKC-LABEL: @test_bit_scan_forward // CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) // CHECK: ret i32 %[[call]] } int test_bit_scan_reverse(int a) { return _bit_scan_reverse(a); +// CHECKC-LABEL: @test_bit_scan_reverse // CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) // CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]] // CHECK: ret i32 %[[sub]] } int test__bsfd(int X) { -// CHECK: @test__bsfd +// CHECKC-LABEL: @test__bsfd // CHECK: %[[call:.*]] = call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true) return __bsfd(X); } int test__bsfq(long long X) { -// CHECK: @test__bsfq +// CHECKC-LABEL: @test__bsfq // CHECK: %[[call:.*]] = call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true) return __bsfq(X); } int test__bsrd(int X) { -// CHECK: @test__bsrd +// CHECKC-LABEL: @test__bsrd // CHECK: %[[call:.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) // CHECK: %[[sub:.*]] = sub nsw i32 31, %[[call]] return __bsrd(X); } int test__bsrq(long long X) { -// CHECK: @test__bsrq +// CHECKC-LABEL: @test__bsrq // CHECK: %[[call:.*]] = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) // CHECK: %[[cast:.*]] = trunc i64 %[[call]] to i32 // CHECK: %[[sub:.*]] = sub nsw i32 63, %[[cast]] return __bsrq(X); } + +// Test constexpr handling. +#if defined(__cplusplus) && (__cplusplus >= 201103L) + +char bsf_0[_bit_scan_forward(0x00000001) == 0 ? 1 : -1]; +char bsf_1[_bit_scan_forward(0x10000000) == 28 ? 1 : -1]; + +char bsr_0[_bit_scan_reverse(0x00000001) == 0 ? 1 : -1]; +char bsr_1[_bit_scan_reverse(0x01000000) == 24 ? 1 : -1]; + +char bsfd_0[__bsfd(0x00000008) == 3 ? 1 : -1]; +char bsfd_1[__bsfd(0x00010008) == 3 ? 1 : -1]; + +char bsrd_0[__bsrd(0x00000010) == 4 ? 1 : -1]; +char bsrd_1[__bsrd(0x00100100) == 20 ? 1 : -1]; + +char bsfq_0[__bsfq(0x0000000800000000ULL) == 35 ? 1 : -1]; +char bsfq_1[__bsfq(0x0004000000000000ULL) == 50 ? 1 : -1]; + +char bsrq_0[__bsrq(0x0000100800000000ULL) == 44 ? 1 : -1]; +char bsrq_1[__bsrq(0x0004000100000000ULL) == 50 ? 1 : -1]; + +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits