Skip to content

Commit a2b4c0f

Browse files
authored
[X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow AVX512 mask predicate intrinsics to be used in constexpr (#165054)
Enables constexpr evaluation for the following AVX512 Instrinsics: ``` _mm_movepi8_mask _mm256_movepi8_mask _mm512_movepi8_mask _mm_movepi16_mask _mm256_movepi16_mask _mm512_movepi16_mask _mm_movepi32_mask _mm256_movepi32_mask _mm512_movepi32_mask _mm_movepi64_mask _mm256_movepi64_mask _mm512_movepi64_mask ``` Part of #162072
1 parent 02db2de commit a2b4c0f

File tree

11 files changed

+174
-47
lines changed

11 files changed

+174
-47
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2469,24 +2469,28 @@ let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256
24692469
def rsqrt14ps256_mask : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8, float>, unsigned char)">;
24702470
}
24712471

2472-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
2472+
let Features = "avx512bw",
2473+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
24732474
def cvtb2mask512 : X86Builtin<"unsigned long long int(_Vector<64, char>)">;
24742475
def cvtmask2b512 : X86Builtin<"_Vector<64, char>(unsigned long long int)">;
24752476
def cvtmask2w512 : X86Builtin<"_Vector<32, short>(unsigned int)">;
24762477
}
24772478

2478-
let Features = "avx512dq", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
2479+
let Features = "avx512dq",
2480+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
24792481
def cvtd2mask512 : X86Builtin<"unsigned short(_Vector<16, int>)">;
24802482
def cvtmask2d512 : X86Builtin<"_Vector<16, int>(unsigned short)">;
24812483
def cvtmask2q512 : X86Builtin<"_Vector<8, long long int>(unsigned char)">;
24822484
def cvtq2mask512 : X86Builtin<"unsigned char(_Vector<8, long long int>)">;
24832485
}
24842486

2485-
let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
2487+
let Features = "avx512bw,avx512vl",
2488+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
24862489
def cvtb2mask128 : X86Builtin<"unsigned short(_Vector<16, char>)">;
24872490
}
24882491

2489-
let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
2492+
let Features = "avx512bw,avx512vl",
2493+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
24902494
def cvtb2mask256 : X86Builtin<"unsigned int(_Vector<32, char>)">;
24912495
}
24922496

@@ -2506,11 +2510,13 @@ let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVector
25062510
def cvtmask2w256 : X86Builtin<"_Vector<16, short>(unsigned short)">;
25072511
}
25082512

2509-
let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
2513+
let Features = "avx512dq,avx512vl",
2514+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
25102515
def cvtd2mask128 : X86Builtin<"unsigned char(_Vector<4, int>)">;
25112516
}
25122517

2513-
let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
2518+
let Features = "avx512dq,avx512vl",
2519+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
25142520
def cvtd2mask256 : X86Builtin<"unsigned char(_Vector<8, int>)">;
25152521
}
25162522

@@ -2530,11 +2536,13 @@ let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVector
25302536
def cvtmask2q256 : X86Builtin<"_Vector<4, long long int>(unsigned char)">;
25312537
}
25322538

2533-
let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
2539+
let Features = "avx512dq,avx512vl",
2540+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
25342541
def cvtq2mask128 : X86Builtin<"unsigned char(_Vector<2, long long int>)">;
25352542
}
25362543

2537-
let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
2544+
let Features = "avx512dq,avx512vl",
2545+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
25382546
def cvtq2mask256 : X86Builtin<"unsigned char(_Vector<4, long long int>)">;
25392547
}
25402548

@@ -3328,15 +3336,18 @@ let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256
33283336
def vcvtps2ph256_mask : X86Builtin<"_Vector<8, short>(_Vector<8, float>, _Constant int, _Vector<8, short>, unsigned char)">;
33293337
}
33303338

3331-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
3339+
let Features = "avx512bw",
3340+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
33323341
def cvtw2mask512 : X86Builtin<"unsigned int(_Vector<32, short>)">;
33333342
}
33343343

3335-
let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
3344+
let Features = "avx512bw,avx512vl",
3345+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
33363346
def cvtw2mask128 : X86Builtin<"unsigned char(_Vector<8, short>)">;
33373347
}
33383348

3339-
let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
3349+
let Features = "avx512bw,avx512vl",
3350+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
33403351
def cvtw2mask256 : X86Builtin<"unsigned short(_Vector<16, short>)">;
33413352
}
33423353

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3362,6 +3362,28 @@ static bool interp__builtin_ia32_vpconflict(InterpState &S, CodePtr OpPC,
33623362
return true;
33633363
}
33643364

3365+
static bool interp__builtin_ia32_cvt_vec2mask(InterpState &S, CodePtr OpPC,
3366+
const CallExpr *Call,
3367+
unsigned ID) {
3368+
assert(Call->getNumArgs() == 1);
3369+
3370+
const Pointer &Vec = S.Stk.pop<Pointer>();
3371+
unsigned RetWidth = S.getASTContext().getIntWidth(Call->getType());
3372+
APInt RetMask(RetWidth, 0);
3373+
3374+
unsigned VectorLen = Vec.getNumElems();
3375+
PrimType ElemT = Vec.getFieldDesc()->getPrimType();
3376+
3377+
for (unsigned ElemNum = 0; ElemNum != VectorLen; ++ElemNum) {
3378+
APSInt A;
3379+
INT_TYPE_SWITCH_NO_BOOL(ElemT, { A = Vec.elem<T>(ElemNum).toAPSInt(); });
3380+
unsigned MSB = A[A.getBitWidth() - 1];
3381+
RetMask.setBitVal(ElemNum, MSB);
3382+
}
3383+
pushInteger(S, RetMask, Call->getType());
3384+
return true;
3385+
}
3386+
33653387
static bool interp__builtin_ia32_shuffle_generic(
33663388
InterpState &S, CodePtr OpPC, const CallExpr *Call,
33673389
llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>
@@ -4779,6 +4801,20 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
47794801
case X86::BI__builtin_ia32_vec_set_v4di:
47804802
return interp__builtin_vec_set(S, OpPC, Call, BuiltinID);
47814803

4804+
case X86::BI__builtin_ia32_cvtb2mask128:
4805+
case X86::BI__builtin_ia32_cvtb2mask256:
4806+
case X86::BI__builtin_ia32_cvtb2mask512:
4807+
case X86::BI__builtin_ia32_cvtw2mask128:
4808+
case X86::BI__builtin_ia32_cvtw2mask256:
4809+
case X86::BI__builtin_ia32_cvtw2mask512:
4810+
case X86::BI__builtin_ia32_cvtd2mask128:
4811+
case X86::BI__builtin_ia32_cvtd2mask256:
4812+
case X86::BI__builtin_ia32_cvtd2mask512:
4813+
case X86::BI__builtin_ia32_cvtq2mask128:
4814+
case X86::BI__builtin_ia32_cvtq2mask256:
4815+
case X86::BI__builtin_ia32_cvtq2mask512:
4816+
return interp__builtin_ia32_cvt_vec2mask(S, OpPC, Call, BuiltinID);
4817+
47824818
case X86::BI__builtin_ia32_cmpb128_mask:
47834819
case X86::BI__builtin_ia32_cmpw128_mask:
47844820
case X86::BI__builtin_ia32_cmpd128_mask:

clang/lib/AST/ExprConstant.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16593,6 +16593,37 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1659316593
return Success(Vec.getVectorElt(Idx).getInt(), E);
1659416594
}
1659516595

16596+
case clang::X86::BI__builtin_ia32_cvtb2mask128:
16597+
case clang::X86::BI__builtin_ia32_cvtb2mask256:
16598+
case clang::X86::BI__builtin_ia32_cvtb2mask512:
16599+
case clang::X86::BI__builtin_ia32_cvtw2mask128:
16600+
case clang::X86::BI__builtin_ia32_cvtw2mask256:
16601+
case clang::X86::BI__builtin_ia32_cvtw2mask512:
16602+
case clang::X86::BI__builtin_ia32_cvtd2mask128:
16603+
case clang::X86::BI__builtin_ia32_cvtd2mask256:
16604+
case clang::X86::BI__builtin_ia32_cvtd2mask512:
16605+
case clang::X86::BI__builtin_ia32_cvtq2mask128:
16606+
case clang::X86::BI__builtin_ia32_cvtq2mask256:
16607+
case clang::X86::BI__builtin_ia32_cvtq2mask512: {
16608+
assert(E->getNumArgs() == 1);
16609+
APValue Vec;
16610+
if (!EvaluateVector(E->getArg(0), Vec, Info))
16611+
return false;
16612+
16613+
unsigned VectorLen = Vec.getVectorLength();
16614+
unsigned RetWidth = Info.Ctx.getIntWidth(E->getType());
16615+
llvm::APInt Bits(RetWidth, 0);
16616+
16617+
for (unsigned ElemNum = 0; ElemNum != VectorLen; ++ElemNum) {
16618+
const APSInt &A = Vec.getVectorElt(ElemNum).getInt();
16619+
unsigned MSB = A[A.getBitWidth() - 1];
16620+
Bits.setBitVal(ElemNum, MSB);
16621+
}
16622+
16623+
APSInt RetMask(Bits, /*isUnsigned=*/true);
16624+
return Success(APValue(RetMask), E);
16625+
}
16626+
1659616627
case clang::X86::BI__builtin_ia32_cmpb128_mask:
1659716628
case clang::X86::BI__builtin_ia32_cmpw128_mask:
1659816629
case clang::X86::BI__builtin_ia32_cmpd128_mask:

clang/lib/Headers/avx512bwintrin.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1759,15 +1759,13 @@ _mm512_mask_testn_epi16_mask (__mmask32 __U, __m512i __A, __m512i __B)
17591759
_mm512_setzero_si512());
17601760
}
17611761

1762-
static __inline__ __mmask64 __DEFAULT_FN_ATTRS512
1763-
_mm512_movepi8_mask (__m512i __A)
1764-
{
1762+
static __inline__ __mmask64 __DEFAULT_FN_ATTRS512_CONSTEXPR
1763+
_mm512_movepi8_mask(__m512i __A) {
17651764
return (__mmask64) __builtin_ia32_cvtb2mask512 ((__v64qi) __A);
17661765
}
17671766

1768-
static __inline__ __mmask32 __DEFAULT_FN_ATTRS512
1769-
_mm512_movepi16_mask (__m512i __A)
1770-
{
1767+
static __inline__ __mmask32 __DEFAULT_FN_ATTRS512_CONSTEXPR
1768+
_mm512_movepi16_mask(__m512i __A) {
17711769
return (__mmask32) __builtin_ia32_cvtw2mask512 ((__v32hi) __A);
17721770
}
17731771

clang/lib/Headers/avx512dqintrin.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,9 +1046,8 @@ _mm512_maskz_cvtepu64_ps (__mmask8 __U, __m512i __A) {
10461046
(__v2df)_mm_setzero_pd(), \
10471047
(__mmask8)(U), (int)(C), (int)(R)))
10481048

1049-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS512
1050-
_mm512_movepi32_mask (__m512i __A)
1051-
{
1049+
static __inline__ __mmask16
1050+
__DEFAULT_FN_ATTRS512_CONSTEXPR _mm512_movepi32_mask(__m512i __A) {
10521051
return (__mmask16) __builtin_ia32_cvtd2mask512 ((__v16si) __A);
10531052
}
10541053

@@ -1064,9 +1063,8 @@ _mm512_movm_epi64 (__mmask8 __A)
10641063
return (__m512i) __builtin_ia32_cvtmask2q512 (__A);
10651064
}
10661065

1067-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS512
1068-
_mm512_movepi64_mask (__m512i __A)
1069-
{
1066+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS512_CONSTEXPR
1067+
_mm512_movepi64_mask(__m512i __A) {
10701068
return (__mmask8) __builtin_ia32_cvtq2mask512 ((__v8di) __A);
10711069
}
10721070

clang/lib/Headers/avx512vlbwintrin.h

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2480,27 +2480,23 @@ _mm256_mask_testn_epi16_mask (__mmask16 __U, __m256i __A, __m256i __B)
24802480
_mm256_setzero_si256());
24812481
}
24822482

2483-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128
2484-
_mm_movepi8_mask (__m128i __A)
2485-
{
2483+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
2484+
_mm_movepi8_mask(__m128i __A) {
24862485
return (__mmask16) __builtin_ia32_cvtb2mask128 ((__v16qi) __A);
24872486
}
24882487

2489-
static __inline__ __mmask32 __DEFAULT_FN_ATTRS256
2490-
_mm256_movepi8_mask (__m256i __A)
2491-
{
2488+
static __inline__ __mmask32 __DEFAULT_FN_ATTRS256_CONSTEXPR
2489+
_mm256_movepi8_mask(__m256i __A) {
24922490
return (__mmask32) __builtin_ia32_cvtb2mask256 ((__v32qi) __A);
24932491
}
24942492

2495-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS128
2496-
_mm_movepi16_mask (__m128i __A)
2497-
{
2493+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS128_CONSTEXPR
2494+
_mm_movepi16_mask(__m128i __A) {
24982495
return (__mmask8) __builtin_ia32_cvtw2mask128 ((__v8hi) __A);
24992496
}
25002497

2501-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS256
2502-
_mm256_movepi16_mask (__m256i __A)
2503-
{
2498+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS256_CONSTEXPR
2499+
_mm256_movepi16_mask(__m256i __A) {
25042500
return (__mmask16) __builtin_ia32_cvtw2mask256 ((__v16hi) __A);
25052501
}
25062502

clang/lib/Headers/avx512vldqintrin.h

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -914,15 +914,13 @@ _mm256_maskz_cvtepu64_ps(__mmask8 __U, __m256i __A) {
914914
(__v8sf)_mm256_setzero_ps(), \
915915
(__mmask8)(U)))
916916

917-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS128
918-
_mm_movepi32_mask (__m128i __A)
919-
{
917+
static __inline__ __mmask8
918+
__DEFAULT_FN_ATTRS128_CONSTEXPR _mm_movepi32_mask(__m128i __A) {
920919
return (__mmask8) __builtin_ia32_cvtd2mask128 ((__v4si) __A);
921920
}
922921

923-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS256
924-
_mm256_movepi32_mask (__m256i __A)
925-
{
922+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS256_CONSTEXPR
923+
_mm256_movepi32_mask(__m256i __A) {
926924
return (__mmask8) __builtin_ia32_cvtd2mask256 ((__v8si) __A);
927925
}
928926

@@ -950,15 +948,13 @@ _mm256_movm_epi64 (__mmask8 __A)
950948
return (__m256i) __builtin_ia32_cvtmask2q256 (__A);
951949
}
952950

953-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS128
954-
_mm_movepi64_mask (__m128i __A)
955-
{
951+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS128_CONSTEXPR
952+
_mm_movepi64_mask(__m128i __A) {
956953
return (__mmask8) __builtin_ia32_cvtq2mask128 ((__v2di) __A);
957954
}
958955

959-
static __inline__ __mmask8 __DEFAULT_FN_ATTRS256
960-
_mm256_movepi64_mask (__m256i __A)
961-
{
956+
static __inline__ __mmask8 __DEFAULT_FN_ATTRS256_CONSTEXPR
957+
_mm256_movepi64_mask(__m256i __A) {
962958
return (__mmask8) __builtin_ia32_cvtq2mask256 ((__v4di) __A);
963959
}
964960

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2880,13 +2880,37 @@ __mmask64 test_mm512_movepi8_mask(__m512i __A) {
28802880
return _mm512_movepi8_mask(__A);
28812881
}
28822882

2883+
TEST_CONSTEXPR(_mm512_movepi8_mask(
2884+
((__m512i)(__v64qi){0, 1, char(129), 3, 4, 5, 6, 7,
2885+
8, 9, 10, 11, 12, 13, 14, 15,
2886+
16, 17, 18, 19, 20, 21, 22, 23,
2887+
24, 25, 26, 27, 28, 29, 30, 31,
2888+
32, 33, 34, 35, 36, 37, 38, 39,
2889+
40, 41, 42, 43, 44, 45, 46, 47,
2890+
48, 49, 50, 51, 52, 53, 54, 55,
2891+
56, 57, 58, 59, 60, 61, 62, char(255)})
2892+
) == (__mmask64)0x8000000000000004);
2893+
2894+
28832895
__m512i test_mm512_movm_epi8(__mmask64 __A) {
28842896
// CHECK-LABEL: test_mm512_movm_epi8
28852897
// CHECK: %{{.*}} = bitcast i64 %{{.*}} to <64 x i1>
28862898
// CHECK: %vpmovm2.i = sext <64 x i1> %{{.*}} to <64 x i8>
28872899
return _mm512_movm_epi8(__A);
28882900
}
28892901

2902+
TEST_CONSTEXPR(_mm512_movepi8_mask(
2903+
((__m512i)(__v64qi){0, 1, char(129), 3, 4, 5, 6, 7,
2904+
8, 9, 10, 11, 12, 13, 14, 15,
2905+
16, 17, 18, 19, 20, 21, 22, 23,
2906+
24, 25, 26, 27, 28, 29, 30, 31,
2907+
32, 33, 34, 35, 36, 37, 38, 39,
2908+
40, 41, 42, 43, 44, 45, 46, 47,
2909+
48, 49, 50, 51, 52, 53, 54, 55,
2910+
56, 57, 58, 59, 60, 61, 62, char(255)})
2911+
) == (__mmask64)0x8000000000000004);
2912+
2913+
28902914
__m512i test_mm512_movm_epi16(__mmask32 __A) {
28912915
// CHECK-LABEL: test_mm512_movm_epi16
28922916
// CHECK: %{{.*}} = bitcast i32 %{{.*}} to <32 x i1>
@@ -3132,6 +3156,13 @@ __mmask32 test_mm512_movepi16_mask(__m512i __A) {
31323156
return _mm512_movepi16_mask(__A);
31333157
}
31343158

3159+
TEST_CONSTEXPR(_mm512_movepi16_mask(
3160+
((__m512i)(__v32hi){0, 1, short(32768), 3, 4, 5, 6, 7,
3161+
8, 9, 10, 11, 12, 13, 14, 15,
3162+
16, 17, 18, 19, 20, 21, 22, 23,
3163+
24, 25, 26, 27, 28, 29, 30, short(32768)})
3164+
) == (__mmask32)0x80000004);
3165+
31353166
void test_mm512_mask_cvtepi16_storeu_epi8 (void * __P, __mmask32 __M, __m512i __A)
31363167
{
31373168
// CHECK-LABEL: test_mm512_mask_cvtepi16_storeu_epi8

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,6 +1359,8 @@ __mmask16 test_mm512_movepi32_mask(__m512i __A) {
13591359
return _mm512_movepi32_mask(__A);
13601360
}
13611361

1362+
TEST_CONSTEXPR(_mm512_movepi32_mask(((__m512i)(__v16si){0, 1, -1, 3, 4, 5, 6, 7,8, 9, 10, 11, 12, 13, 14, -1})) == (__mmask16)0x8004);
1363+
13621364
__m512i test_mm512_movm_epi32(__mmask16 __A) {
13631365
// CHECK-LABEL: test_mm512_movm_epi32
13641366
// CHECK: %{{.*}} = bitcast i16 %{{.*}} to <16 x i1>
@@ -1379,6 +1381,8 @@ __mmask8 test_mm512_movepi64_mask(__m512i __A) {
13791381
return _mm512_movepi64_mask(__A);
13801382
}
13811383

1384+
TEST_CONSTEXPR(_mm512_movepi64_mask(((__m512i)(__v8di){0, 1, -1, 3, 4, 5, 6, -1})) == (__mmask8)0x84);
1385+
13821386
__m512 test_mm512_broadcast_f32x2(__m128 __A) {
13831387
// CHECK-LABEL: test_mm512_broadcast_f32x2
13841388
// CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>

0 commit comments

Comments
 (0)