Skip to content

Commit 8af38c0

Browse files
committed
[X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow AVX512 kmov intrinsics to be used in constexp
1 parent 25d027b commit 8af38c0

File tree

9 files changed

+44
-11
lines changed

9 files changed

+44
-11
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
@@ -5019,6 +5019,13 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
50195019
S, OpPC, Call,
50205020
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
50215021

5022+
case X86::BI__builtin_ia32_kmovb:
5023+
case X86::BI__builtin_ia32_kmovw:
5024+
case X86::BI__builtin_ia32_kmovd:
5025+
case X86::BI__builtin_ia32_kmovq:
5026+
return interp__builtin_elementwise_int_unaryop(
5027+
S, OpPC, Call, [](const APSInt &Src) { return Src; });
5028+
50225029
case X86::BI__builtin_ia32_kunpckhi:
50235030
case X86::BI__builtin_ia32_kunpckdi:
50245031
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
@@ -16900,6 +16900,16 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1690016900
[](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
1690116901
}
1690216902

16903+
case X86::BI__builtin_ia32_kmovb:
16904+
case X86::BI__builtin_ia32_kmovw:
16905+
case X86::BI__builtin_ia32_kmovd:
16906+
case X86::BI__builtin_ia32_kmovq: {
16907+
APSInt Val;
16908+
if (!EvaluateInteger(E->getArg(0), Val, Info))
16909+
return false;
16910+
return Success(Val, E);
16911+
}
16912+
1690316913
case clang::X86::BI__builtin_ia32_vec_ext_v4hi:
1690416914
case clang::X86::BI__builtin_ia32_vec_ext_v16qi:
1690516915
case clang::X86::BI__builtin_ia32_vec_ext_v8hi:

clang/lib/Headers/avx512bwintrin.h

Lines changed: 4 additions & 4 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
181+
static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR
182182
_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: 2 additions & 2 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
126+
static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR
127127
_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: 2 additions & 2 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
8072+
static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR
80738073
_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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,14 @@ __mmask64 test_cvtu64_mask64(__m512i A, __m512i B, unsigned long long C) {
576576
return _mm512_mask_cmpneq_epu8_mask(_cvtu64_mask64(C), A, B);
577577
}
578578

579+
TEST_CONSTEXPR(_cvtmask32_u32((__mmask32)0xDEADBEEF) == 0xDEADBEEF);
580+
TEST_CONSTEXPR(_cvtu32_mask32(0x13579BDF) == (__mmask32)0x13579BDF);
581+
TEST_CONSTEXPR(_cvtu32_mask32(_cvtmask32_u32((__mmask32)0x2468ACE0)) == (__mmask32)0x2468ACE0);
582+
583+
TEST_CONSTEXPR(_cvtmask64_u64((__mmask64)0x123456789ABCDEF0ULL) == 0x123456789ABCDEF0ULL);
584+
TEST_CONSTEXPR(_cvtu64_mask64(0x0F0F0F0F0F0F0F0FULL) == (__mmask64)0x0F0F0F0F0F0F0F0FULL);
585+
TEST_CONSTEXPR(_cvtu64_mask64(_cvtmask64_u64((__mmask64)0xF0F0F0F0F0F0F0F0ULL)) == (__mmask64)0xF0F0F0F0F0F0F0F0ULL);
586+
579587
__mmask32 test_load_mask32(__mmask32 *A, __m512i B, __m512i C) {
580588
// CHECK-LABEL: test_load_mask32
581589
// CHECK: [[LOAD:%.*]] = load i32, ptr %{{.*}}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,10 @@ __mmask8 test_cvtu32_mask8(__m512i A, __m512i B, unsigned int C) {
384384
return _mm512_mask_cmpneq_epu64_mask(_cvtu32_mask8(C), A, B);
385385
}
386386

387+
TEST_CONSTEXPR(_cvtmask8_u32((__mmask8)0x5A) == 0x5A);
388+
TEST_CONSTEXPR(_cvtu32_mask8(0xB7) == (__mmask8)0xB7);
389+
TEST_CONSTEXPR(_cvtu32_mask8(_cvtmask8_u32((__mmask8)0xDE)) == (__mmask8)0xDE);
390+
387391
__mmask8 test_load_mask8(__mmask8 *A, __m512i B, __m512i C) {
388392
// CHECK-LABEL: test_load_mask8
389393
// CHECK: [[LOAD:%.*]] = load i8, ptr %{{.*}}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9596,6 +9596,10 @@ __mmask16 test_cvtu32_mask16(__m512i A, __m512i B, unsigned int C) {
95969596
return _mm512_mask_cmpneq_epu32_mask(_cvtu32_mask16(C), A, B);
95979597
}
95989598

9599+
TEST_CONSTEXPR(_cvtmask16_u32((__mmask16)0xBEEF) == 0xBEEF);
9600+
TEST_CONSTEXPR(_cvtu32_mask16(0xCAFE) == (__mmask16)0xCAFE);
9601+
TEST_CONSTEXPR(_cvtu32_mask16(_cvtmask16_u32((__mmask16)0x1357)) == (__mmask16)0x1357);
9602+
95999603
__mmask16 test_load_mask16(__mmask16 *A, __m512i B, __m512i C) {
96009604
// CHECK-LABEL: test_load_mask16
96019605
// CHECK: [[LOAD:%.*]] = load i16, ptr %{{.*}}{{$}}

0 commit comments

Comments
 (0)