https://github.com/0xzre updated https://github.com/llvm/llvm-project/pull/169895
>From 8af38c0b21f6a5b6094a3ca5be6b59ec997db654 Mon Sep 17 00:00:00 2001 From: 0xzre <[email protected]> Date: Fri, 28 Nov 2025 11:28:17 +0700 Subject: [PATCH 1/4] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow AVX512 kmov intrinsics to be used in constexp --- clang/include/clang/Basic/BuiltinsX86.td | 6 +++--- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 7 +++++++ clang/lib/AST/ExprConstant.cpp | 10 ++++++++++ clang/lib/Headers/avx512bwintrin.h | 8 ++++---- clang/lib/Headers/avx512dqintrin.h | 4 ++-- clang/lib/Headers/avx512fintrin.h | 4 ++-- clang/test/CodeGen/X86/avx512bw-builtins.c | 8 ++++++++ clang/test/CodeGen/X86/avx512dq-builtins.c | 4 ++++ clang/test/CodeGen/X86/avx512f-builtins.c | 4 ++++ 9 files changed, 44 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Basic/BuiltinsX86.td b/clang/include/clang/Basic/BuiltinsX86.td index 98cea35beb0ea..36670a346a4ad 100644 --- a/clang/include/clang/Basic/BuiltinsX86.td +++ b/clang/include/clang/Basic/BuiltinsX86.td @@ -3160,15 +3160,15 @@ let Features = "avx512bw", Attributes = [NoThrow, Const] in { def kshiftridi : X86Builtin<"unsigned long long int(unsigned long long int, _Constant unsigned int)">; } -let Features = "avx512dq", Attributes = [NoThrow, Const] in { +let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in { def kmovb : X86Builtin<"unsigned char(unsigned char)">; } -let Features = "avx512f", Attributes = [NoThrow, Const] in { +let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in { def kmovw : X86Builtin<"unsigned short(unsigned short)">; } -let Features = "avx512bw", Attributes = [NoThrow, Const] in { +let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in { def kmovd : X86Builtin<"unsigned int(unsigned int)">; def kmovq : X86Builtin<"unsigned long long int(unsigned long long int)">; } diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index d21f42d94d3a5..e1beca9cd7ee4 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -5019,6 +5019,13 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call, S, OpPC, Call, [](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; }); + case X86::BI__builtin_ia32_kmovb: + case X86::BI__builtin_ia32_kmovw: + case X86::BI__builtin_ia32_kmovd: + case X86::BI__builtin_ia32_kmovq: + return interp__builtin_elementwise_int_unaryop( + S, OpPC, Call, [](const APSInt &Src) { return Src; }); + case X86::BI__builtin_ia32_kunpckhi: case X86::BI__builtin_ia32_kunpckdi: case X86::BI__builtin_ia32_kunpcksi: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 7b9380de6834d..c48ed9bad03fd 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -16900,6 +16900,16 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, [](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; }); } + case X86::BI__builtin_ia32_kmovb: + case X86::BI__builtin_ia32_kmovw: + case X86::BI__builtin_ia32_kmovd: + case X86::BI__builtin_ia32_kmovq: { + APSInt Val; + if (!EvaluateInteger(E->getArg(0), Val, Info)) + return false; + return Success(Val, E); + } + case clang::X86::BI__builtin_ia32_vec_ext_v4hi: case clang::X86::BI__builtin_ia32_vec_ext_v16qi: case clang::X86::BI__builtin_ia32_vec_ext_v8hi: diff --git a/clang/lib/Headers/avx512bwintrin.h b/clang/lib/Headers/avx512bwintrin.h index 67e8461560b04..89637f7570455 100644 --- a/clang/lib/Headers/avx512bwintrin.h +++ b/clang/lib/Headers/avx512bwintrin.h @@ -178,22 +178,22 @@ _kadd_mask64(__mmask64 __A, __mmask64 __B) { #define _kshiftri_mask64(A, I) \ ((__mmask64)__builtin_ia32_kshiftridi((__mmask64)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS +static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask32_u32(__mmask32 __A) { return (unsigned int)__builtin_ia32_kmovd((__mmask32)__A); } -static __inline__ unsigned long long __DEFAULT_FN_ATTRS +static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask64_u64(__mmask64 __A) { return (unsigned long long)__builtin_ia32_kmovq((__mmask64)__A); } -static __inline__ __mmask32 __DEFAULT_FN_ATTRS +static __inline__ __mmask32 __DEFAULT_FN_ATTRS_CONSTEXPR _cvtu32_mask32(unsigned int __A) { return (__mmask32)__builtin_ia32_kmovd((__mmask32)__A); } -static __inline__ __mmask64 __DEFAULT_FN_ATTRS +static __inline__ __mmask64 __DEFAULT_FN_ATTRS_CONSTEXPR _cvtu64_mask64(unsigned long long __A) { return (__mmask64)__builtin_ia32_kmovq((__mmask64)__A); } diff --git a/clang/lib/Headers/avx512dqintrin.h b/clang/lib/Headers/avx512dqintrin.h index f200b22f27ee1..40041d0118b08 100644 --- a/clang/lib/Headers/avx512dqintrin.h +++ b/clang/lib/Headers/avx512dqintrin.h @@ -123,12 +123,12 @@ _kadd_mask16(__mmask16 __A, __mmask16 __B) { #define _kshiftri_mask8(A, I) \ ((__mmask8)__builtin_ia32_kshiftriqi((__mmask8)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS +static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask8_u32(__mmask8 __A) { return (unsigned int)__builtin_ia32_kmovb((__mmask8)__A); } -static __inline__ __mmask8 __DEFAULT_FN_ATTRS +static __inline__ __mmask8 __DEFAULT_FN_ATTRS_CONSTEXPR _cvtu32_mask8(unsigned int __A) { return (__mmask8)__builtin_ia32_kmovb((__mmask8)__A); } diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index 806a13c414c10..35ff99c31a414 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -8069,12 +8069,12 @@ _mm512_kxor(__mmask16 __A, __mmask16 __B) { #define _kshiftri_mask16(A, I) \ ((__mmask16)__builtin_ia32_kshiftrihi((__mmask16)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS +static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask16_u32(__mmask16 __A) { return (unsigned int)__builtin_ia32_kmovw((__mmask16)__A); } -static __inline__ __mmask16 __DEFAULT_FN_ATTRS +static __inline__ __mmask16 __DEFAULT_FN_ATTRS_CONSTEXPR _cvtu32_mask16(unsigned int __A) { return (__mmask16)__builtin_ia32_kmovw((__mmask16)__A); } diff --git a/clang/test/CodeGen/X86/avx512bw-builtins.c b/clang/test/CodeGen/X86/avx512bw-builtins.c index c9c30dab389db..b90a66dd6422a 100644 --- a/clang/test/CodeGen/X86/avx512bw-builtins.c +++ b/clang/test/CodeGen/X86/avx512bw-builtins.c @@ -576,6 +576,14 @@ __mmask64 test_cvtu64_mask64(__m512i A, __m512i B, unsigned long long C) { return _mm512_mask_cmpneq_epu8_mask(_cvtu64_mask64(C), A, B); } +TEST_CONSTEXPR(_cvtmask32_u32((__mmask32)0xDEADBEEF) == 0xDEADBEEF); +TEST_CONSTEXPR(_cvtu32_mask32(0x13579BDF) == (__mmask32)0x13579BDF); +TEST_CONSTEXPR(_cvtu32_mask32(_cvtmask32_u32((__mmask32)0x2468ACE0)) == (__mmask32)0x2468ACE0); + +TEST_CONSTEXPR(_cvtmask64_u64((__mmask64)0x123456789ABCDEF0ULL) == 0x123456789ABCDEF0ULL); +TEST_CONSTEXPR(_cvtu64_mask64(0x0F0F0F0F0F0F0F0FULL) == (__mmask64)0x0F0F0F0F0F0F0F0FULL); +TEST_CONSTEXPR(_cvtu64_mask64(_cvtmask64_u64((__mmask64)0xF0F0F0F0F0F0F0F0ULL)) == (__mmask64)0xF0F0F0F0F0F0F0F0ULL); + __mmask32 test_load_mask32(__mmask32 *A, __m512i B, __m512i C) { // CHECK-LABEL: test_load_mask32 // CHECK: [[LOAD:%.*]] = load i32, ptr %{{.*}} diff --git a/clang/test/CodeGen/X86/avx512dq-builtins.c b/clang/test/CodeGen/X86/avx512dq-builtins.c index 542d4446a3690..fd536c4c33df1 100644 --- a/clang/test/CodeGen/X86/avx512dq-builtins.c +++ b/clang/test/CodeGen/X86/avx512dq-builtins.c @@ -384,6 +384,10 @@ __mmask8 test_cvtu32_mask8(__m512i A, __m512i B, unsigned int C) { return _mm512_mask_cmpneq_epu64_mask(_cvtu32_mask8(C), A, B); } +TEST_CONSTEXPR(_cvtmask8_u32((__mmask8)0x5A) == 0x5A); +TEST_CONSTEXPR(_cvtu32_mask8(0xB7) == (__mmask8)0xB7); +TEST_CONSTEXPR(_cvtu32_mask8(_cvtmask8_u32((__mmask8)0xDE)) == (__mmask8)0xDE); + __mmask8 test_load_mask8(__mmask8 *A, __m512i B, __m512i C) { // CHECK-LABEL: test_load_mask8 // CHECK: [[LOAD:%.*]] = load i8, ptr %{{.*}} diff --git a/clang/test/CodeGen/X86/avx512f-builtins.c b/clang/test/CodeGen/X86/avx512f-builtins.c index 6401a0e55a83b..3c903c4b8f867 100644 --- a/clang/test/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CodeGen/X86/avx512f-builtins.c @@ -9596,6 +9596,10 @@ __mmask16 test_cvtu32_mask16(__m512i A, __m512i B, unsigned int C) { return _mm512_mask_cmpneq_epu32_mask(_cvtu32_mask16(C), A, B); } +TEST_CONSTEXPR(_cvtmask16_u32((__mmask16)0xBEEF) == 0xBEEF); +TEST_CONSTEXPR(_cvtu32_mask16(0xCAFE) == (__mmask16)0xCAFE); +TEST_CONSTEXPR(_cvtu32_mask16(_cvtmask16_u32((__mmask16)0x1357)) == (__mmask16)0x1357); + __mmask16 test_load_mask16(__mmask16 *A, __m512i B, __m512i C) { // CHECK-LABEL: test_load_mask16 // CHECK: [[LOAD:%.*]] = load i16, ptr %{{.*}}{{$}} >From dcdf9504cc335788bbeb9130474c185d2041a37f Mon Sep 17 00:00:00 2001 From: 0xzre <[email protected]> Date: Sun, 30 Nov 2025 18:32:10 +0700 Subject: [PATCH 2/4] fix format clang --- clang/lib/Headers/avx512bwintrin.h | 4 ++-- clang/lib/Headers/avx512dqintrin.h | 4 ++-- clang/lib/Headers/avx512fintrin.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/lib/Headers/avx512bwintrin.h b/clang/lib/Headers/avx512bwintrin.h index 89637f7570455..48b7c98df7b68 100644 --- a/clang/lib/Headers/avx512bwintrin.h +++ b/clang/lib/Headers/avx512bwintrin.h @@ -178,8 +178,8 @@ _kadd_mask64(__mmask64 __A, __mmask64 __B) { #define _kshiftri_mask64(A, I) \ ((__mmask64)__builtin_ia32_kshiftridi((__mmask64)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR -_cvtmask32_u32(__mmask32 __A) { +static __inline__ unsigned int + __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask32_u32(__mmask32 __A) { return (unsigned int)__builtin_ia32_kmovd((__mmask32)__A); } diff --git a/clang/lib/Headers/avx512dqintrin.h b/clang/lib/Headers/avx512dqintrin.h index 40041d0118b08..ae02cdd47af2e 100644 --- a/clang/lib/Headers/avx512dqintrin.h +++ b/clang/lib/Headers/avx512dqintrin.h @@ -123,8 +123,8 @@ _kadd_mask16(__mmask16 __A, __mmask16 __B) { #define _kshiftri_mask8(A, I) \ ((__mmask8)__builtin_ia32_kshiftriqi((__mmask8)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR -_cvtmask8_u32(__mmask8 __A) { +static __inline__ unsigned int + __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask8_u32(__mmask8 __A) { return (unsigned int)__builtin_ia32_kmovb((__mmask8)__A); } diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index 35ff99c31a414..ca5d7e85061e6 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -8069,8 +8069,8 @@ _mm512_kxor(__mmask16 __A, __mmask16 __B) { #define _kshiftri_mask16(A, I) \ ((__mmask16)__builtin_ia32_kshiftrihi((__mmask16)(A), (unsigned int)(I))) -static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR -_cvtmask16_u32(__mmask16 __A) { +static __inline__ unsigned int + __DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask16_u32(__mmask16 __A) { return (unsigned int)__builtin_ia32_kmovw((__mmask16)__A); } >From 3581ab98493617c7311cbbede0a1672e132b5bb7 Mon Sep 17 00:00:00 2001 From: 0xzre <[email protected]> Date: Mon, 1 Dec 2025 07:58:25 +0700 Subject: [PATCH 3/4] move TEST_CONSTEXPR check below matching intrinsic --- clang/test/CodeGen/X86/avx512bw-builtins.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/clang/test/CodeGen/X86/avx512bw-builtins.c b/clang/test/CodeGen/X86/avx512bw-builtins.c index b90a66dd6422a..fd50ab97d2c42 100644 --- a/clang/test/CodeGen/X86/avx512bw-builtins.c +++ b/clang/test/CodeGen/X86/avx512bw-builtins.c @@ -561,26 +561,28 @@ unsigned int test_cvtmask32_u32(__m512i A, __m512i B) { return _cvtmask32_u32(_mm512_cmpneq_epu16_mask(A, B)); } +TEST_CONSTEXPR(_cvtmask32_u32((__mmask32)0xDEADBEEF) == 0xDEADBEEF); + unsigned long long test_cvtmask64_u64(__m512i A, __m512i B) { // CHECK-LABEL: test_cvtmask64_u64 return _cvtmask64_u64(_mm512_cmpneq_epu8_mask(A, B)); } +TEST_CONSTEXPR(_cvtmask64_u64((__mmask64)0x123456789ABCDEF0ULL) == 0x123456789ABCDEF0ULL); + __mmask32 test_cvtu32_mask32(__m512i A, __m512i B, unsigned int C) { // CHECK-LABEL: test_cvtu32_mask32 return _mm512_mask_cmpneq_epu16_mask(_cvtu32_mask32(C), A, B); } +TEST_CONSTEXPR(_cvtu32_mask32(0x13579BDF) == (__mmask32)0x13579BDF); +TEST_CONSTEXPR(_cvtu32_mask32(_cvtmask32_u32((__mmask32)0x2468ACE0)) == (__mmask32)0x2468ACE0); + __mmask64 test_cvtu64_mask64(__m512i A, __m512i B, unsigned long long C) { // CHECK-LABEL: test_cvtu64_mask64 return _mm512_mask_cmpneq_epu8_mask(_cvtu64_mask64(C), A, B); } -TEST_CONSTEXPR(_cvtmask32_u32((__mmask32)0xDEADBEEF) == 0xDEADBEEF); -TEST_CONSTEXPR(_cvtu32_mask32(0x13579BDF) == (__mmask32)0x13579BDF); -TEST_CONSTEXPR(_cvtu32_mask32(_cvtmask32_u32((__mmask32)0x2468ACE0)) == (__mmask32)0x2468ACE0); - -TEST_CONSTEXPR(_cvtmask64_u64((__mmask64)0x123456789ABCDEF0ULL) == 0x123456789ABCDEF0ULL); TEST_CONSTEXPR(_cvtu64_mask64(0x0F0F0F0F0F0F0F0FULL) == (__mmask64)0x0F0F0F0F0F0F0F0FULL); TEST_CONSTEXPR(_cvtu64_mask64(_cvtmask64_u64((__mmask64)0xF0F0F0F0F0F0F0F0ULL)) == (__mmask64)0xF0F0F0F0F0F0F0F0ULL); >From 22b229b371c7cc6598d603a72a05f9c13cd9e326 Mon Sep 17 00:00:00 2001 From: 0xzre <[email protected]> Date: Mon, 1 Dec 2025 23:26:02 +0700 Subject: [PATCH 4/4] move TEST_CONSTEXPR check below matching intrinsic --- clang/test/CodeGen/X86/avx512dq-builtins.c | 3 ++- clang/test/CodeGen/X86/avx512f-builtins.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/test/CodeGen/X86/avx512dq-builtins.c b/clang/test/CodeGen/X86/avx512dq-builtins.c index fd536c4c33df1..b8d9587af0394 100644 --- a/clang/test/CodeGen/X86/avx512dq-builtins.c +++ b/clang/test/CodeGen/X86/avx512dq-builtins.c @@ -378,13 +378,14 @@ unsigned int test_cvtmask8_u32(__m512i A, __m512i B) { return _cvtmask8_u32(_mm512_cmpneq_epu64_mask(A, B)); } +TEST_CONSTEXPR(_cvtmask8_u32((__mmask8)0x5A) == 0x5A); + __mmask8 test_cvtu32_mask8(__m512i A, __m512i B, unsigned int C) { // CHECK-LABEL: test_cvtu32_mask8 // CHECK: trunc i32 %{{.*}} to i8 return _mm512_mask_cmpneq_epu64_mask(_cvtu32_mask8(C), A, B); } -TEST_CONSTEXPR(_cvtmask8_u32((__mmask8)0x5A) == 0x5A); TEST_CONSTEXPR(_cvtu32_mask8(0xB7) == (__mmask8)0xB7); TEST_CONSTEXPR(_cvtu32_mask8(_cvtmask8_u32((__mmask8)0xDE)) == (__mmask8)0xDE); diff --git a/clang/test/CodeGen/X86/avx512f-builtins.c b/clang/test/CodeGen/X86/avx512f-builtins.c index 3c903c4b8f867..257559261905e 100644 --- a/clang/test/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CodeGen/X86/avx512f-builtins.c @@ -9589,6 +9589,8 @@ unsigned int test_cvtmask16_u32(__m512i A, __m512i B) { return _cvtmask16_u32(_mm512_cmpneq_epu32_mask(A, B)); } +TEST_CONSTEXPR(_cvtmask16_u32((__mmask16)0xBEEF) == 0xBEEF); + __mmask16 test_cvtu32_mask16(__m512i A, __m512i B, unsigned int C) { // CHECK-LABEL: test_cvtu32_mask16 // CHECK: trunc i32 %{{.*}} to i16 @@ -9596,7 +9598,6 @@ __mmask16 test_cvtu32_mask16(__m512i A, __m512i B, unsigned int C) { return _mm512_mask_cmpneq_epu32_mask(_cvtu32_mask16(C), A, B); } -TEST_CONSTEXPR(_cvtmask16_u32((__mmask16)0xBEEF) == 0xBEEF); TEST_CONSTEXPR(_cvtu32_mask16(0xCAFE) == (__mmask16)0xCAFE); TEST_CONSTEXPR(_cvtu32_mask16(_cvtmask16_u32((__mmask16)0x1357)) == (__mmask16)0x1357); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
