Skip to content

Commit dae9139

Browse files
authored
[X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow AVX512 kmov intrinsics to be used in constexp (#169895)
Resolves #166975
1 parent 4e316d7 commit dae9139

File tree

9 files changed

+51
-14
lines changed

9 files changed

+51
-14
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3160,15 +3160,15 @@ let Features = "avx512bw", Attributes = [NoThrow, Const] in {
31603160
def kshiftridi : X86Builtin<"unsigned long long int(unsigned long long int, _Constant unsigned int)">;
31613161
}
31623162

3163-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3163+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
31643164
def kmovb : X86Builtin<"unsigned char(unsigned char)">;
31653165
}
31663166

3167-
let Features = "avx512f", Attributes = [NoThrow, Const] in {
3167+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in {
31683168
def kmovw : X86Builtin<"unsigned short(unsigned short)">;
31693169
}
31703170

3171-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3171+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31723172
def kmovd : X86Builtin<"unsigned int(unsigned int)">;
31733173
def kmovq : X86Builtin<"unsigned long long int(unsigned long long int)">;
31743174
}

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5003,6 +5003,13 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
50035003
S, OpPC, Call,
50045004
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
50055005

5006+
case X86::BI__builtin_ia32_kmovb:
5007+
case X86::BI__builtin_ia32_kmovw:
5008+
case X86::BI__builtin_ia32_kmovd:
5009+
case X86::BI__builtin_ia32_kmovq:
5010+
return interp__builtin_elementwise_int_unaryop(
5011+
S, OpPC, Call, [](const APSInt &Src) { return Src; });
5012+
50065013
case X86::BI__builtin_ia32_kunpckhi:
50075014
case X86::BI__builtin_ia32_kunpckdi:
50085015
case X86::BI__builtin_ia32_kunpcksi:

clang/lib/AST/ExprConstant.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16897,6 +16897,16 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1689716897
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
1689816898
}
1689916899

16900+
case X86::BI__builtin_ia32_kmovb:
16901+
case X86::BI__builtin_ia32_kmovw:
16902+
case X86::BI__builtin_ia32_kmovd:
16903+
case X86::BI__builtin_ia32_kmovq: {
16904+
APSInt Val;
16905+
if (!EvaluateInteger(E->getArg(0), Val, Info))
16906+
return false;
16907+
return Success(Val, E);
16908+
}
16909+
1690016910
case clang::X86::BI__builtin_ia32_vec_ext_v4hi:
1690116911
case clang::X86::BI__builtin_ia32_vec_ext_v16qi:
1690216912
case clang::X86::BI__builtin_ia32_vec_ext_v8hi:

clang/lib/Headers/avx512bwintrin.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,22 +178,22 @@ _kadd_mask64(__mmask64 __A, __mmask64 __B) {
178178
#define _kshiftri_mask64(A, I) \
179179
((__mmask64)__builtin_ia32_kshiftridi((__mmask64)(A), (unsigned int)(I)))
180180

181-
static __inline__ unsigned int __DEFAULT_FN_ATTRS
182-
_cvtmask32_u32(__mmask32 __A) {
181+
static __inline__ unsigned int
182+
__DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask32_u32(__mmask32 __A) {
183183
return (unsigned int)__builtin_ia32_kmovd((__mmask32)__A);
184184
}
185185

186-
static __inline__ unsigned long long __DEFAULT_FN_ATTRS
186+
static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CONSTEXPR
187187
_cvtmask64_u64(__mmask64 __A) {
188188
return (unsigned long long)__builtin_ia32_kmovq((__mmask64)__A);
189189
}
190190

191-
static __inline__ __mmask32 __DEFAULT_FN_ATTRS
191+
static __inline__ __mmask32 __DEFAULT_FN_ATTRS_CONSTEXPR
192192
_cvtu32_mask32(unsigned int __A) {
193193
return (__mmask32)__builtin_ia32_kmovd((__mmask32)__A);
194194
}
195195

196-
static __inline__ __mmask64 __DEFAULT_FN_ATTRS
196+
static __inline__ __mmask64 __DEFAULT_FN_ATTRS_CONSTEXPR
197197
_cvtu64_mask64(unsigned long long __A) {
198198
return (__mmask64)__builtin_ia32_kmovq((__mmask64)__A);
199199
}

clang/lib/Headers/avx512dqintrin.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ _kadd_mask16(__mmask16 __A, __mmask16 __B) {
123123
#define _kshiftri_mask8(A, I) \
124124
((__mmask8)__builtin_ia32_kshiftriqi((__mmask8)(A), (unsigned int)(I)))
125125

126-
static __inline__ unsigned int __DEFAULT_FN_ATTRS
127-
_cvtmask8_u32(__mmask8 __A) {
126+
static __inline__ unsigned int
127+
__DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask8_u32(__mmask8 __A) {
128128
return (unsigned int)__builtin_ia32_kmovb((__mmask8)__A);
129129
}
130130

131-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS
131+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS_CONSTEXPR
132132
_cvtu32_mask8(unsigned int __A) {
133133
return (__mmask8)__builtin_ia32_kmovb((__mmask8)__A);
134134
}

clang/lib/Headers/avx512fintrin.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8069,12 +8069,12 @@ _mm512_kxor(__mmask16 __A, __mmask16 __B) {
80698069
#define _kshiftri_mask16(A, I) \
80708070
((__mmask16)__builtin_ia32_kshiftrihi((__mmask16)(A), (unsigned int)(I)))
80718071

8072-
static __inline__ unsigned int __DEFAULT_FN_ATTRS
8073-
_cvtmask16_u32(__mmask16 __A) {
8072+
static __inline__ unsigned int
8073+
__DEFAULT_FN_ATTRS_CONSTEXPR _cvtmask16_u32(__mmask16 __A) {
80748074
return (unsigned int)__builtin_ia32_kmovw((__mmask16)__A);
80758075
}
80768076

8077-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS
8077+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS_CONSTEXPR
80788078
_cvtu32_mask16(unsigned int __A) {
80798079
return (__mmask16)__builtin_ia32_kmovw((__mmask16)__A);
80808080
}

clang/test/CodeGen/X86/avx512bw-builtins.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,21 +561,31 @@ unsigned int test_cvtmask32_u32(__m512i A, __m512i B) {
561561
return _cvtmask32_u32(_mm512_cmpneq_epu16_mask(A, B));
562562
}
563563

564+
TEST_CONSTEXPR(_cvtmask32_u32((__mmask32)0xDEADBEEF) == 0xDEADBEEF);
565+
564566
unsigned long long test_cvtmask64_u64(__m512i A, __m512i B) {
565567
// CHECK-LABEL: test_cvtmask64_u64
566568
return _cvtmask64_u64(_mm512_cmpneq_epu8_mask(A, B));
567569
}
568570

571+
TEST_CONSTEXPR(_cvtmask64_u64((__mmask64)0x123456789ABCDEF0ULL) == 0x123456789ABCDEF0ULL);
572+
569573
__mmask32 test_cvtu32_mask32(__m512i A, __m512i B, unsigned int C) {
570574
// CHECK-LABEL: test_cvtu32_mask32
571575
return _mm512_mask_cmpneq_epu16_mask(_cvtu32_mask32(C), A, B);
572576
}
573577

578+
TEST_CONSTEXPR(_cvtu32_mask32(0x13579BDF) == (__mmask32)0x13579BDF);
579+
TEST_CONSTEXPR(_cvtu32_mask32(_cvtmask32_u32((__mmask32)0x2468ACE0)) == (__mmask32)0x2468ACE0);
580+
574581
__mmask64 test_cvtu64_mask64(__m512i A, __m512i B, unsigned long long C) {
575582
// CHECK-LABEL: test_cvtu64_mask64
576583
return _mm512_mask_cmpneq_epu8_mask(_cvtu64_mask64(C), A, B);
577584
}
578585

586+
TEST_CONSTEXPR(_cvtu64_mask64(0x0F0F0F0F0F0F0F0FULL) == (__mmask64)0x0F0F0F0F0F0F0F0FULL);
587+
TEST_CONSTEXPR(_cvtu64_mask64(_cvtmask64_u64((__mmask64)0xF0F0F0F0F0F0F0F0ULL)) == (__mmask64)0xF0F0F0F0F0F0F0F0ULL);
588+
579589
__mmask32 test_load_mask32(__mmask32 *A, __m512i B, __m512i C) {
580590
// CHECK-LABEL: test_load_mask32
581591
// CHECK: [[LOAD:%.*]] = load i32, ptr %{{.*}}

clang/test/CodeGen/X86/avx512dq-builtins.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,12 +378,17 @@ unsigned int test_cvtmask8_u32(__m512i A, __m512i B) {
378378
return _cvtmask8_u32(_mm512_cmpneq_epu64_mask(A, B));
379379
}
380380

381+
TEST_CONSTEXPR(_cvtmask8_u32((__mmask8)0x5A) == 0x5A);
382+
381383
__mmask8 test_cvtu32_mask8(__m512i A, __m512i B, unsigned int C) {
382384
// CHECK-LABEL: test_cvtu32_mask8
383385
// CHECK: trunc i32 %{{.*}} to i8
384386
return _mm512_mask_cmpneq_epu64_mask(_cvtu32_mask8(C), A, B);
385387
}
386388

389+
TEST_CONSTEXPR(_cvtu32_mask8(0xB7) == (__mmask8)0xB7);
390+
TEST_CONSTEXPR(_cvtu32_mask8(_cvtmask8_u32((__mmask8)0xDE)) == (__mmask8)0xDE);
391+
387392
__mmask8 test_load_mask8(__mmask8 *A, __m512i B, __m512i C) {
388393
// CHECK-LABEL: test_load_mask8
389394
// CHECK: [[LOAD:%.*]] = load i8, ptr %{{.*}}

clang/test/CodeGen/X86/avx512f-builtins.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9589,13 +9589,18 @@ unsigned int test_cvtmask16_u32(__m512i A, __m512i B) {
95899589
return _cvtmask16_u32(_mm512_cmpneq_epu32_mask(A, B));
95909590
}
95919591

9592+
TEST_CONSTEXPR(_cvtmask16_u32((__mmask16)0xBEEF) == 0xBEEF);
9593+
95929594
__mmask16 test_cvtu32_mask16(__m512i A, __m512i B, unsigned int C) {
95939595
// CHECK-LABEL: test_cvtu32_mask16
95949596
// CHECK: trunc i32 %{{.*}} to i16
95959597
// CHECK: bitcast i16 %{{.*}} to <16 x i1>
95969598
return _mm512_mask_cmpneq_epu32_mask(_cvtu32_mask16(C), A, B);
95979599
}
95989600

9601+
TEST_CONSTEXPR(_cvtu32_mask16(0xCAFE) == (__mmask16)0xCAFE);
9602+
TEST_CONSTEXPR(_cvtu32_mask16(_cvtmask16_u32((__mmask16)0x1357)) == (__mmask16)0x1357);
9603+
95999604
__mmask16 test_load_mask16(__mmask16 *A, __m512i B, __m512i C) {
96009605
// CHECK-LABEL: test_load_mask16
96019606
// CHECK: [[LOAD:%.*]] = load i16, ptr %{{.*}}{{$}}

0 commit comments

Comments
 (0)