Skip to content

Commit c2fe1d9

Browse files
authored
[X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - add AVX512 KTEST/KORTEST intrinsics to be used in constexpr (#166103)
Add AVX512 KTEST/KORTEST intrinsics to be used in constexpr. Fixes #162051
1 parent d07a4fe commit c2fe1d9

File tree

9 files changed

+417
-59
lines changed

9 files changed

+417
-59
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3167,31 +3167,31 @@ let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31673167
def kordi : X86Builtin<"unsigned long long int(unsigned long long int, unsigned long long int)">;
31683168
}
31693169

3170-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3170+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
31713171
def kortestcqi : X86Builtin<"int(unsigned char, unsigned char)">;
31723172
def kortestzqi : X86Builtin<"int(unsigned char, unsigned char)">;
31733173
}
31743174

3175-
let Features = "avx512f", Attributes = [NoThrow, Const] in {
3175+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr] in {
31763176
def kortestchi : X86Builtin<"int(unsigned short, unsigned short)">;
31773177
def kortestzhi : X86Builtin<"int(unsigned short, unsigned short)">;
31783178
}
31793179

3180-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3180+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31813181
def kortestcsi : X86Builtin<"int(unsigned int, unsigned int)">;
31823182
def kortestzsi : X86Builtin<"int(unsigned int, unsigned int)">;
31833183
def kortestcdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">;
31843184
def kortestzdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">;
31853185
}
31863186

3187-
let Features = "avx512dq", Attributes = [NoThrow, Const] in {
3187+
let Features = "avx512dq", Attributes = [NoThrow, Const, Constexpr] in {
31883188
def ktestcqi : X86Builtin<"int(unsigned char, unsigned char)">;
31893189
def ktestzqi : X86Builtin<"int(unsigned char, unsigned char)">;
31903190
def ktestchi : X86Builtin<"int(unsigned short, unsigned short)">;
31913191
def ktestzhi : X86Builtin<"int(unsigned short, unsigned short)">;
31923192
}
31933193

3194-
let Features = "avx512bw", Attributes = [NoThrow, Const] in {
3194+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
31953195
def ktestcsi : X86Builtin<"int(unsigned int, unsigned int)">;
31963196
def ktestzsi : X86Builtin<"int(unsigned int, unsigned int)">;
31973197
def ktestcdi : X86Builtin<"int(unsigned long long int, unsigned long long int)">;

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3831,6 +3831,42 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
38313831
return Result;
38323832
});
38333833

3834+
case clang::X86::BI__builtin_ia32_ktestcqi:
3835+
case clang::X86::BI__builtin_ia32_ktestchi:
3836+
case clang::X86::BI__builtin_ia32_ktestcsi:
3837+
case clang::X86::BI__builtin_ia32_ktestcdi:
3838+
return interp__builtin_elementwise_int_binop(
3839+
S, OpPC, Call, [](const APSInt &A, const APSInt &B) {
3840+
return APInt(sizeof(unsigned char) * 8, (~A & B) == 0);
3841+
});
3842+
3843+
case clang::X86::BI__builtin_ia32_ktestzqi:
3844+
case clang::X86::BI__builtin_ia32_ktestzhi:
3845+
case clang::X86::BI__builtin_ia32_ktestzsi:
3846+
case clang::X86::BI__builtin_ia32_ktestzdi:
3847+
return interp__builtin_elementwise_int_binop(
3848+
S, OpPC, Call, [](const APSInt &A, const APSInt &B) {
3849+
return APInt(sizeof(unsigned char) * 8, (A & B) == 0);
3850+
});
3851+
3852+
case clang::X86::BI__builtin_ia32_kortestcqi:
3853+
case clang::X86::BI__builtin_ia32_kortestchi:
3854+
case clang::X86::BI__builtin_ia32_kortestcsi:
3855+
case clang::X86::BI__builtin_ia32_kortestcdi:
3856+
return interp__builtin_elementwise_int_binop(
3857+
S, OpPC, Call, [](const APSInt &A, const APSInt &B) {
3858+
return APInt(sizeof(unsigned char) * 8, ~(A | B) == 0);
3859+
});
3860+
3861+
case clang::X86::BI__builtin_ia32_kortestzqi:
3862+
case clang::X86::BI__builtin_ia32_kortestzhi:
3863+
case clang::X86::BI__builtin_ia32_kortestzsi:
3864+
case clang::X86::BI__builtin_ia32_kortestzdi:
3865+
return interp__builtin_elementwise_int_binop(
3866+
S, OpPC, Call, [](const APSInt &A, const APSInt &B) {
3867+
return APInt(sizeof(unsigned char) * 8, (A | B) == 0);
3868+
});
3869+
38343870
case clang::X86::BI__builtin_ia32_lzcnt_u16:
38353871
case clang::X86::BI__builtin_ia32_lzcnt_u32:
38363872
case clang::X86::BI__builtin_ia32_lzcnt_u64:

clang/lib/AST/ExprConstant.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16244,6 +16244,54 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1624416244
return Success(Val, E);
1624516245
}
1624616246

16247+
case clang::X86::BI__builtin_ia32_ktestcqi:
16248+
case clang::X86::BI__builtin_ia32_ktestchi:
16249+
case clang::X86::BI__builtin_ia32_ktestcsi:
16250+
case clang::X86::BI__builtin_ia32_ktestcdi: {
16251+
APSInt A, B;
16252+
if (!EvaluateInteger(E->getArg(0), A, Info) ||
16253+
!EvaluateInteger(E->getArg(1), B, Info))
16254+
return false;
16255+
16256+
return Success((~A & B) == 0, E);
16257+
}
16258+
16259+
case clang::X86::BI__builtin_ia32_ktestzqi:
16260+
case clang::X86::BI__builtin_ia32_ktestzhi:
16261+
case clang::X86::BI__builtin_ia32_ktestzsi:
16262+
case clang::X86::BI__builtin_ia32_ktestzdi: {
16263+
APSInt A, B;
16264+
if (!EvaluateInteger(E->getArg(0), A, Info) ||
16265+
!EvaluateInteger(E->getArg(1), B, Info))
16266+
return false;
16267+
16268+
return Success((A & B) == 0, E);
16269+
}
16270+
16271+
case clang::X86::BI__builtin_ia32_kortestcqi:
16272+
case clang::X86::BI__builtin_ia32_kortestchi:
16273+
case clang::X86::BI__builtin_ia32_kortestcsi:
16274+
case clang::X86::BI__builtin_ia32_kortestcdi: {
16275+
APSInt A, B;
16276+
if (!EvaluateInteger(E->getArg(0), A, Info) ||
16277+
!EvaluateInteger(E->getArg(1), B, Info))
16278+
return false;
16279+
16280+
return Success(~(A | B) == 0, E);
16281+
}
16282+
16283+
case clang::X86::BI__builtin_ia32_kortestzqi:
16284+
case clang::X86::BI__builtin_ia32_kortestzhi:
16285+
case clang::X86::BI__builtin_ia32_kortestzsi:
16286+
case clang::X86::BI__builtin_ia32_kortestzdi: {
16287+
APSInt A, B;
16288+
if (!EvaluateInteger(E->getArg(0), A, Info) ||
16289+
!EvaluateInteger(E->getArg(1), B, Info))
16290+
return false;
16291+
16292+
return Success((A | B) == 0, E);
16293+
}
16294+
1624716295
case clang::X86::BI__builtin_ia32_lzcnt_u16:
1624816296
case clang::X86::BI__builtin_ia32_lzcnt_u32:
1624916297
case clang::X86::BI__builtin_ia32_lzcnt_u64: {

clang/lib/Headers/avx512bwintrin.h

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -92,69 +92,65 @@ _kxor_mask64(__mmask64 __A, __mmask64 __B) {
9292
return (__mmask64)__builtin_ia32_kxordi((__mmask64)__A, (__mmask64)__B);
9393
}
9494

95-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
96-
_kortestc_mask32_u8(__mmask32 __A, __mmask32 __B)
97-
{
95+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
96+
_kortestc_mask32_u8(__mmask32 __A, __mmask32 __B) {
9897
return (unsigned char)__builtin_ia32_kortestcsi(__A, __B);
9998
}
10099

101-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
102-
_kortestz_mask32_u8(__mmask32 __A, __mmask32 __B)
103-
{
100+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
101+
_kortestz_mask32_u8(__mmask32 __A, __mmask32 __B) {
104102
return (unsigned char)__builtin_ia32_kortestzsi(__A, __B);
105103
}
106104

107-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
105+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
108106
_kortest_mask32_u8(__mmask32 __A, __mmask32 __B, unsigned char *__C) {
109107
*__C = (unsigned char)__builtin_ia32_kortestcsi(__A, __B);
110108
return (unsigned char)__builtin_ia32_kortestzsi(__A, __B);
111109
}
112110

113-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
111+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
114112
_kortestc_mask64_u8(__mmask64 __A, __mmask64 __B) {
115113
return (unsigned char)__builtin_ia32_kortestcdi(__A, __B);
116114
}
117115

118-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
116+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
119117
_kortestz_mask64_u8(__mmask64 __A, __mmask64 __B) {
120118
return (unsigned char)__builtin_ia32_kortestzdi(__A, __B);
121119
}
122120

123-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
121+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
124122
_kortest_mask64_u8(__mmask64 __A, __mmask64 __B, unsigned char *__C) {
125123
*__C = (unsigned char)__builtin_ia32_kortestcdi(__A, __B);
126124
return (unsigned char)__builtin_ia32_kortestzdi(__A, __B);
127125
}
128126

129-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
130-
_ktestc_mask32_u8(__mmask32 __A, __mmask32 __B)
131-
{
127+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
128+
_ktestc_mask32_u8(__mmask32 __A, __mmask32 __B) {
132129
return (unsigned char)__builtin_ia32_ktestcsi(__A, __B);
133130
}
134131

135-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
136-
_ktestz_mask32_u8(__mmask32 __A, __mmask32 __B)
137-
{
132+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
133+
_ktestz_mask32_u8(__mmask32 __A, __mmask32 __B) {
138134
return (unsigned char)__builtin_ia32_ktestzsi(__A, __B);
139135
}
140136

141-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
137+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
142138
_ktest_mask32_u8(__mmask32 __A, __mmask32 __B, unsigned char *__C) {
143139
*__C = (unsigned char)__builtin_ia32_ktestcsi(__A, __B);
144140
return (unsigned char)__builtin_ia32_ktestzsi(__A, __B);
145141
}
146142

147-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
143+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
148144
_ktestc_mask64_u8(__mmask64 __A, __mmask64 __B) {
149145
return (unsigned char)__builtin_ia32_ktestcdi(__A, __B);
150146
}
151147

152-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
148+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
153149
_ktestz_mask64_u8(__mmask64 __A, __mmask64 __B) {
154150
return (unsigned char)__builtin_ia32_ktestzdi(__A, __B);
155151
}
156152

157-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
153+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
158154
_ktest_mask64_u8(__mmask64 __A, __mmask64 __B, unsigned char *__C) {
159155
*__C = (unsigned char)__builtin_ia32_ktestcdi(__A, __B);
160156
return (unsigned char)__builtin_ia32_ktestzdi(__A, __B);

clang/lib/Headers/avx512dqintrin.h

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,55 +59,49 @@ _kxor_mask8(__mmask8 __A, __mmask8 __B) {
5959
return (__mmask8)__builtin_ia32_kxorqi((__mmask8)__A, (__mmask8)__B);
6060
}
6161

62-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
63-
_kortestc_mask8_u8(__mmask8 __A, __mmask8 __B)
64-
{
62+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
63+
_kortestc_mask8_u8(__mmask8 __A, __mmask8 __B) {
6564
return (unsigned char)__builtin_ia32_kortestcqi(__A, __B);
6665
}
6766

68-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
69-
_kortestz_mask8_u8(__mmask8 __A, __mmask8 __B)
70-
{
67+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
68+
_kortestz_mask8_u8(__mmask8 __A, __mmask8 __B) {
7169
return (unsigned char)__builtin_ia32_kortestzqi(__A, __B);
7270
}
7371

74-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
72+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
7573
_kortest_mask8_u8(__mmask8 __A, __mmask8 __B, unsigned char *__C) {
7674
*__C = (unsigned char)__builtin_ia32_kortestcqi(__A, __B);
7775
return (unsigned char)__builtin_ia32_kortestzqi(__A, __B);
7876
}
7977

80-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
81-
_ktestc_mask8_u8(__mmask8 __A, __mmask8 __B)
82-
{
78+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
79+
_ktestc_mask8_u8(__mmask8 __A, __mmask8 __B) {
8380
return (unsigned char)__builtin_ia32_ktestcqi(__A, __B);
8481
}
8582

86-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
87-
_ktestz_mask8_u8(__mmask8 __A, __mmask8 __B)
88-
{
83+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
84+
_ktestz_mask8_u8(__mmask8 __A, __mmask8 __B) {
8985
return (unsigned char)__builtin_ia32_ktestzqi(__A, __B);
9086
}
9187

92-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
88+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
9389
_ktest_mask8_u8(__mmask8 __A, __mmask8 __B, unsigned char *__C) {
9490
*__C = (unsigned char)__builtin_ia32_ktestcqi(__A, __B);
9591
return (unsigned char)__builtin_ia32_ktestzqi(__A, __B);
9692
}
9793

98-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
99-
_ktestc_mask16_u8(__mmask16 __A, __mmask16 __B)
100-
{
94+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
95+
_ktestc_mask16_u8(__mmask16 __A, __mmask16 __B) {
10196
return (unsigned char)__builtin_ia32_ktestchi(__A, __B);
10297
}
10398

104-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
105-
_ktestz_mask16_u8(__mmask16 __A, __mmask16 __B)
106-
{
99+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
100+
_ktestz_mask16_u8(__mmask16 __A, __mmask16 __B) {
107101
return (unsigned char)__builtin_ia32_ktestzhi(__A, __B);
108102
}
109103

110-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
104+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
111105
_ktest_mask16_u8(__mmask16 __A, __mmask16 __B, unsigned char *__C) {
112106
*__C = (unsigned char)__builtin_ia32_ktestchi(__A, __B);
113107
return (unsigned char)__builtin_ia32_ktestzhi(__A, __B);

clang/lib/Headers/avx512fintrin.h

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8068,31 +8068,27 @@ _mm512_kor(__mmask16 __A, __mmask16 __B) {
80688068
return (__mmask16) __builtin_ia32_korhi ((__mmask16) __A, (__mmask16) __B);
80698069
}
80708070

8071-
static __inline__ int __DEFAULT_FN_ATTRS
8072-
_mm512_kortestc (__mmask16 __A, __mmask16 __B)
8073-
{
8071+
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
8072+
_mm512_kortestc(__mmask16 __A, __mmask16 __B) {
80748073
return __builtin_ia32_kortestchi ((__mmask16) __A, (__mmask16) __B);
80758074
}
80768075

8077-
static __inline__ int __DEFAULT_FN_ATTRS
8078-
_mm512_kortestz (__mmask16 __A, __mmask16 __B)
8079-
{
8076+
static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
8077+
_mm512_kortestz(__mmask16 __A, __mmask16 __B) {
80808078
return __builtin_ia32_kortestzhi ((__mmask16) __A, (__mmask16) __B);
80818079
}
80828080

8083-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
8084-
_kortestc_mask16_u8(__mmask16 __A, __mmask16 __B)
8085-
{
8081+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
8082+
_kortestc_mask16_u8(__mmask16 __A, __mmask16 __B) {
80868083
return (unsigned char)__builtin_ia32_kortestchi(__A, __B);
80878084
}
80888085

8089-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
8090-
_kortestz_mask16_u8(__mmask16 __A, __mmask16 __B)
8091-
{
8086+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
8087+
_kortestz_mask16_u8(__mmask16 __A, __mmask16 __B) {
80928088
return (unsigned char)__builtin_ia32_kortestzhi(__A, __B);
80938089
}
80948090

8095-
static __inline__ unsigned char __DEFAULT_FN_ATTRS
8091+
static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
80968092
_kortest_mask16_u8(__mmask16 __A, __mmask16 __B, unsigned char *__C) {
80978093
*__C = (unsigned char)__builtin_ia32_kortestchi(__A, __B);
80988094
return (unsigned char)__builtin_ia32_kortestzhi(__A, __B);

0 commit comments

Comments
 (0)