https://github.com/sskzakaria updated https://github.com/llvm/llvm-project/pull/173739
>From 8342ffc978d6503228aed72161ed25d742f2a6bd Mon Sep 17 00:00:00 2001 From: sskzakaria <[email protected]> Date: Sat, 27 Dec 2025 13:40:51 -0500 Subject: [PATCH 1/5] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow AVX512 movm - kmov --- clang/include/clang/Basic/BuiltinsX86.td | 24 ++++++++----- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 38 ++++++++++++++++++++ clang/lib/AST/ExprConstant.cpp | 35 ++++++++++++++++++ clang/lib/Headers/avx512bwintrin.h | 10 +++--- clang/lib/Headers/avx512dqintrin.h | 10 +++--- clang/lib/Headers/avx512fintrin.h | 5 ++- clang/lib/Headers/avx512vlbwintrin.h | 20 +++++------ clang/lib/Headers/avx512vldqintrin.h | 20 +++++------ clang/test/CodeGen/X86/avx512bw-builtins.c | 26 ++++++++------ clang/test/CodeGen/X86/avx512dq-builtins.c | 5 +++ clang/test/CodeGen/X86/avx512f-builtins.c | 2 ++ clang/test/CodeGen/X86/avx512vlbw-builtins.c | 13 +++++++ clang/test/CodeGen/X86/avx512vldq-builtins.c | 10 ++++++ 13 files changed, 161 insertions(+), 57 deletions(-) diff --git a/clang/include/clang/Basic/BuiltinsX86.td b/clang/include/clang/Basic/BuiltinsX86.td index c8d476e47808b..b4cc4c257edc1 100644 --- a/clang/include/clang/Basic/BuiltinsX86.td +++ b/clang/include/clang/Basic/BuiltinsX86.td @@ -2430,19 +2430,23 @@ let Features = "avx512bw,avx512vl", def cvtb2mask256 : X86Builtin<"unsigned int(_Vector<32, char>)">; } -let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in { +let Features = "avx512bw,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in { def cvtmask2b128 : X86Builtin<"_Vector<16, char>(unsigned short)">; } -let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in { +let Features = "avx512bw,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in { def cvtmask2b256 : X86Builtin<"_Vector<32, char>(unsigned int)">; } -let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in { +let Features = "avx512bw,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in { def cvtmask2w128 : X86Builtin<"_Vector<8, short>(unsigned char)">; } -let Features = "avx512bw,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in { +let Features = "avx512bw,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in { def cvtmask2w256 : X86Builtin<"_Vector<16, short>(unsigned short)">; } @@ -2456,19 +2460,23 @@ let Features = "avx512dq,avx512vl", def cvtd2mask256 : X86Builtin<"unsigned char(_Vector<8, int>)">; } -let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in { +let Features = "avx512dq,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in { def cvtmask2d128 : X86Builtin<"_Vector<4, int>(unsigned char)">; } -let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in { +let Features = "avx512dq,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in { def cvtmask2d256 : X86Builtin<"_Vector<8, int>(unsigned char)">; } -let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in { +let Features = "avx512dq,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in { def cvtmask2q128 : X86Builtin<"_Vector<2, long long int>(unsigned char)">; } -let Features = "avx512dq,avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in { +let Features = "avx512dq,avx512vl", + Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in { def cvtmask2q256 : X86Builtin<"_Vector<4, long long int>(unsigned char)">; } diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index c8f986a55ed3e..55f4d3c45dce4 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3421,6 +3421,30 @@ static bool interp__builtin_ia32_cvt_vec2mask(InterpState &S, CodePtr OpPC, pushInteger(S, RetMask, Call->getType()); return true; } + +static bool interp__builtin_ia32_cvt_mask2vec(InterpState &S, CodePtr OpPC, + const CallExpr *Call, + unsigned ID) { + assert(Call->getNumArgs() == 1); + + APSInt Mask = popToAPSInt(S, Call->getArg(0)); + + const Pointer &Vec = S.Stk.peek<Pointer>(); + unsigned NumElems = Vec.getNumElems(); + PrimType ElemT = Vec.getFieldDesc()->getPrimType(); + + for (unsigned i = 0; i < NumElems; ++i) { + bool BitSet = Mask[i]; + + INT_TYPE_SWITCH_NO_BOOL( + ElemT, { Vec.elem<T>(i) = BitSet ? T::from(-1) : T::from(0); }); + } + + Vec.initializeAllElements(); + + return true; +} + static bool interp__builtin_ia32_cvtsd2ss(InterpState &S, CodePtr OpPC, const CallExpr *Call, bool HasRoundingMask) { @@ -5533,6 +5557,20 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call, case X86::BI__builtin_ia32_cvtq2mask512: return interp__builtin_ia32_cvt_vec2mask(S, OpPC, Call, BuiltinID); + case X86::BI__builtin_ia32_cvtmask2b128: + case X86::BI__builtin_ia32_cvtmask2b256: + case X86::BI__builtin_ia32_cvtmask2b512: + case X86::BI__builtin_ia32_cvtmask2w128: + case X86::BI__builtin_ia32_cvtmask2w256: + case X86::BI__builtin_ia32_cvtmask2w512: + case X86::BI__builtin_ia32_cvtmask2d128: + case X86::BI__builtin_ia32_cvtmask2d256: + case X86::BI__builtin_ia32_cvtmask2d512: + case X86::BI__builtin_ia32_cvtmask2q128: + case X86::BI__builtin_ia32_cvtmask2q256: + case X86::BI__builtin_ia32_cvtmask2q512: + return interp__builtin_ia32_cvt_mask2vec(S, OpPC, Call, BuiltinID); + case X86::BI__builtin_ia32_cvtsd2ss: return interp__builtin_ia32_cvtsd2ss(S, OpPC, Call, false); diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index f80dabf5444c7..4d75ced485db5 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12388,6 +12388,41 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { return Success(APValue(ResultElements.data(), RetLen), E); } + case clang::X86::BI__builtin_ia32_cvtmask2b128: + case clang::X86::BI__builtin_ia32_cvtmask2b256: + case clang::X86::BI__builtin_ia32_cvtmask2b512: + case clang::X86::BI__builtin_ia32_cvtmask2w128: + case clang::X86::BI__builtin_ia32_cvtmask2w256: + case clang::X86::BI__builtin_ia32_cvtmask2w512: + case clang::X86::BI__builtin_ia32_cvtmask2d128: + case clang::X86::BI__builtin_ia32_cvtmask2d256: + case clang::X86::BI__builtin_ia32_cvtmask2d512: + case clang::X86::BI__builtin_ia32_cvtmask2q128: + case clang::X86::BI__builtin_ia32_cvtmask2q256: + case clang::X86::BI__builtin_ia32_cvtmask2q512: { + assert(E->getNumArgs() == 1); + APSInt Mask; + if (!EvaluateInteger(E->getArg(0), Mask, Info)) + return false; + + QualType VecTy = E->getType(); + const VectorType *VT = VecTy->castAs<VectorType>(); + unsigned VectorLen = VT->getNumElements(); + QualType ElemTy = VT->getElementType(); + unsigned ElemWidth = Info.Ctx.getTypeSize(ElemTy); + + SmallVector<APValue, 16> Elems; + for (unsigned i = 0; i < VectorLen; ++i) { + bool BitSet = Mask[i]; + APSInt ElemVal(ElemWidth, /*isUnsigned=*/false); + if (BitSet) { + ElemVal.setAllBits(); + } + Elems.push_back(APValue(ElemVal)); + } + return Success(APValue(Elems.data(), VectorLen), E); + } + case X86::BI__builtin_ia32_extracti32x4_256_mask: case X86::BI__builtin_ia32_extractf32x4_256_mask: case X86::BI__builtin_ia32_extracti32x4_mask: diff --git a/clang/lib/Headers/avx512bwintrin.h b/clang/lib/Headers/avx512bwintrin.h index 48b7c98df7b68..cd4663abe7d9e 100644 --- a/clang/lib/Headers/avx512bwintrin.h +++ b/clang/lib/Headers/avx512bwintrin.h @@ -1760,15 +1760,13 @@ _mm512_movepi16_mask(__m512i __A) { return (__mmask32) __builtin_ia32_cvtw2mask512 ((__v32hi) __A); } -static __inline__ __m512i __DEFAULT_FN_ATTRS512 -_mm512_movm_epi8 (__mmask64 __A) -{ +static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR +_mm512_movm_epi8(__mmask64 __A) { return (__m512i) __builtin_ia32_cvtmask2b512 (__A); } -static __inline__ __m512i __DEFAULT_FN_ATTRS512 -_mm512_movm_epi16 (__mmask32 __A) -{ +static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR +_mm512_movm_epi16(__mmask32 __A) { return (__m512i) __builtin_ia32_cvtmask2w512 (__A); } diff --git a/clang/lib/Headers/avx512dqintrin.h b/clang/lib/Headers/avx512dqintrin.h index ae02cdd47af2e..084ac891821c0 100644 --- a/clang/lib/Headers/avx512dqintrin.h +++ b/clang/lib/Headers/avx512dqintrin.h @@ -1051,15 +1051,13 @@ static __inline__ __mmask16 return (__mmask16) __builtin_ia32_cvtd2mask512 ((__v16si) __A); } -static __inline__ __m512i __DEFAULT_FN_ATTRS512 -_mm512_movm_epi32 (__mmask16 __A) -{ +static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR +_mm512_movm_epi32(__mmask16 __A) { return (__m512i) __builtin_ia32_cvtmask2d512 (__A); } -static __inline__ __m512i __DEFAULT_FN_ATTRS512 -_mm512_movm_epi64 (__mmask8 __A) -{ +static __inline__ __m512i __DEFAULT_FN_ATTRS512_CONSTEXPR +_mm512_movm_epi64(__mmask8 __A) { return (__m512i) __builtin_ia32_cvtmask2q512 (__A); } diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index 9bcb42033f6ef..6b505ae188ae4 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -5355,9 +5355,8 @@ _mm_maskz_getexp_ss (__mmask8 __U, __m128 __A, __m128 __B) (__v4sf)_mm_setzero_ps(), \ (__mmask8)(U), (int)(R))) -static __inline__ __mmask16 __DEFAULT_FN_ATTRS -_mm512_kmov (__mmask16 __A) -{ +static __inline__ __mmask16 __DEFAULT_FN_ATTRS_CONSTEXPR +_mm512_kmov(__mmask16 __A) { return __A; } diff --git a/clang/lib/Headers/avx512vlbwintrin.h b/clang/lib/Headers/avx512vlbwintrin.h index a7c1e1c4fc3d2..b66d3961dffc9 100644 --- a/clang/lib/Headers/avx512vlbwintrin.h +++ b/clang/lib/Headers/avx512vlbwintrin.h @@ -2500,27 +2500,23 @@ _mm256_movepi16_mask(__m256i __A) { return (__mmask16) __builtin_ia32_cvtw2mask256 ((__v16hi) __A); } -static __inline__ __m128i __DEFAULT_FN_ATTRS128 -_mm_movm_epi8 (__mmask16 __A) -{ +static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR +_mm_movm_epi8(__mmask16 __A) { return (__m128i) __builtin_ia32_cvtmask2b128 (__A); } -static __inline__ __m256i __DEFAULT_FN_ATTRS256 -_mm256_movm_epi8 (__mmask32 __A) -{ +static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR +_mm256_movm_epi8(__mmask32 __A) { return (__m256i) __builtin_ia32_cvtmask2b256 (__A); } -static __inline__ __m128i __DEFAULT_FN_ATTRS128 -_mm_movm_epi16 (__mmask8 __A) -{ +static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR +_mm_movm_epi16(__mmask8 __A) { return (__m128i) __builtin_ia32_cvtmask2w128 (__A); } -static __inline__ __m256i __DEFAULT_FN_ATTRS256 -_mm256_movm_epi16 (__mmask16 __A) -{ +static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR +_mm256_movm_epi16(__mmask16 __A) { return (__m256i) __builtin_ia32_cvtmask2w256 (__A); } diff --git a/clang/lib/Headers/avx512vldqintrin.h b/clang/lib/Headers/avx512vldqintrin.h index c956aeb7d03a4..cd1effdec2d62 100644 --- a/clang/lib/Headers/avx512vldqintrin.h +++ b/clang/lib/Headers/avx512vldqintrin.h @@ -924,27 +924,23 @@ _mm256_movepi32_mask(__m256i __A) { return (__mmask8) __builtin_ia32_cvtd2mask256 ((__v8si) __A); } -static __inline__ __m128i __DEFAULT_FN_ATTRS128 -_mm_movm_epi32 (__mmask8 __A) -{ +static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR +_mm_movm_epi32(__mmask8 __A) { return (__m128i) __builtin_ia32_cvtmask2d128 (__A); } -static __inline__ __m256i __DEFAULT_FN_ATTRS256 -_mm256_movm_epi32 (__mmask8 __A) -{ +static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR +_mm256_movm_epi32(__mmask8 __A) { return (__m256i) __builtin_ia32_cvtmask2d256 (__A); } -static __inline__ __m128i __DEFAULT_FN_ATTRS128 -_mm_movm_epi64 (__mmask8 __A) -{ +static __inline__ __m128i __DEFAULT_FN_ATTRS128_CONSTEXPR +_mm_movm_epi64(__mmask8 __A) { return (__m128i) __builtin_ia32_cvtmask2q128 (__A); } -static __inline__ __m256i __DEFAULT_FN_ATTRS256 -_mm256_movm_epi64 (__mmask8 __A) -{ +static __inline__ __m256i __DEFAULT_FN_ATTRS256_CONSTEXPR +_mm256_movm_epi64(__mmask8 __A) { return (__m256i) __builtin_ia32_cvtmask2q256 (__A); } diff --git a/clang/test/CodeGen/X86/avx512bw-builtins.c b/clang/test/CodeGen/X86/avx512bw-builtins.c index 7cdec9b4cbbee..96b809cffdd9f 100644 --- a/clang/test/CodeGen/X86/avx512bw-builtins.c +++ b/clang/test/CodeGen/X86/avx512bw-builtins.c @@ -2952,16 +2952,15 @@ __m512i test_mm512_movm_epi8(__mmask64 __A) { return _mm512_movm_epi8(__A); } -TEST_CONSTEXPR(_mm512_movepi8_mask( - ((__m512i)(__v64qi){0, 1, char(129), 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, char(255)}) -) == (__mmask64)0x8000000000000004); +TEST_CONSTEXPR(match_v64qi(_mm512_movm_epi8(0x8000000000000005), + -1, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1)); __m512i test_mm512_movm_epi16(__mmask32 __A) { @@ -2971,6 +2970,13 @@ __m512i test_mm512_movm_epi16(__mmask32 __A) { return _mm512_movm_epi16(__A); } +TEST_CONSTEXPR(match_v32hi(_mm512_movm_epi16(0x80000007), + -1, -1, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1)); + + __m512i test_mm512_broadcastb_epi8(__m128i __A) { // CHECK-LABEL: test_mm512_broadcastb_epi8 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <64 x i32> zeroinitializer diff --git a/clang/test/CodeGen/X86/avx512dq-builtins.c b/clang/test/CodeGen/X86/avx512dq-builtins.c index d8647b5547ceb..edbe591b02cbb 100644 --- a/clang/test/CodeGen/X86/avx512dq-builtins.c +++ b/clang/test/CodeGen/X86/avx512dq-builtins.c @@ -1381,6 +1381,8 @@ __m512i test_mm512_movm_epi32(__mmask16 __A) { return _mm512_movm_epi32(__A); } +TEST_CONSTEXPR(match_v16si(_mm512_movm_epi32(0x8005), -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1)); + __m512i test_mm512_movm_epi64(__mmask8 __A) { // CHECK-LABEL: test_mm512_movm_epi64 // CHECK: %{{.*}} = bitcast i8 %{{.*}} to <8 x i1> @@ -1388,6 +1390,9 @@ __m512i test_mm512_movm_epi64(__mmask8 __A) { return _mm512_movm_epi64(__A); } +TEST_CONSTEXPR(match_v8di(_mm512_movm_epi64(0x85), -1, 0, -1, 0, 0, 0, 0, -1)); + + __mmask8 test_mm512_movepi64_mask(__m512i __A) { // CHECK-LABEL: test_mm512_movepi64_mask // CHECK: [[CMP:%.*]] = icmp slt <8 x i64> %{{.*}}, zeroinitializer diff --git a/clang/test/CodeGen/X86/avx512f-builtins.c b/clang/test/CodeGen/X86/avx512f-builtins.c index 1402ee411029a..f78b28d6da1b1 100644 --- a/clang/test/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CodeGen/X86/avx512f-builtins.c @@ -4988,6 +4988,8 @@ __mmask16 test_mm512_kmov(__mmask16 __A) { return _mm512_kmov(__A); } +TEST_CONSTEXPR(_mm512_kmov((__mmask16)0x8005) == (__mmask16)0x8005); + __m512d test_mm512_mask_unpackhi_pd(__m512d __W, __mmask8 __U, __m512d __A, __m512d __B) { // CHECK-LABEL: test_mm512_mask_unpackhi_pd // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15> diff --git a/clang/test/CodeGen/X86/avx512vlbw-builtins.c b/clang/test/CodeGen/X86/avx512vlbw-builtins.c index f6f27d9c3da3d..9f70f4639b4ab 100644 --- a/clang/test/CodeGen/X86/avx512vlbw-builtins.c +++ b/clang/test/CodeGen/X86/avx512vlbw-builtins.c @@ -3219,6 +3219,8 @@ __m128i test_mm_movm_epi8(__mmask16 __A) { return _mm_movm_epi8(__A); } +TEST_CONSTEXPR(match_v16qi(_mm_movm_epi8(0x8005),-1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1)); + __m256i test_mm256_movm_epi8(__mmask32 __A) { // CHECK-LABEL: test_mm256_movm_epi8 // CHECK: %{{.*}} = bitcast i32 %{{.*}} to <32 x i1> @@ -3226,6 +3228,12 @@ __m256i test_mm256_movm_epi8(__mmask32 __A) { return _mm256_movm_epi8(__A); } +TEST_CONSTEXPR(match_v32qi(_mm256_movm_epi8(0x80000007), + -1, -1, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1)); + __m128i test_mm_movm_epi16(__mmask8 __A) { // CHECK-LABEL: test_mm_movm_epi16 // CHECK: %{{.*}} = bitcast i8 %{{.*}} to <8 x i1> @@ -3233,6 +3241,8 @@ __m128i test_mm_movm_epi16(__mmask8 __A) { return _mm_movm_epi16(__A); } +TEST_CONSTEXPR(match_v8hi(_mm_movm_epi16(0x85), -1, 0, -1, 0, 0, 0, 0, -1)); + __m256i test_mm256_movm_epi16(__mmask16 __A) { // CHECK-LABEL: test_mm256_movm_epi16 // CHECK: %{{.*}} = bitcast i16 %{{.*}} to <16 x i1> @@ -3240,6 +3250,9 @@ __m256i test_mm256_movm_epi16(__mmask16 __A) { return _mm256_movm_epi16(__A); } +TEST_CONSTEXPR(match_v16hi(_mm256_movm_epi16(0x8005), -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1)); + + __m128i test_mm_mask_broadcastb_epi8(__m128i __O, __mmask16 __M, __m128i __A) { // CHECK-LABEL: test_mm_mask_broadcastb_epi8 // CHECK: shufflevector <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i32> zeroinitializer diff --git a/clang/test/CodeGen/X86/avx512vldq-builtins.c b/clang/test/CodeGen/X86/avx512vldq-builtins.c index 92d8e1aa0879a..652fe149db927 100644 --- a/clang/test/CodeGen/X86/avx512vldq-builtins.c +++ b/clang/test/CodeGen/X86/avx512vldq-builtins.c @@ -944,6 +944,8 @@ __m128i test_mm_movm_epi32(__mmask8 __A) { return _mm_movm_epi32(__A); } +TEST_CONSTEXPR(match_v4si(_mm_movm_epi32(0x05), -1, 0, -1, 0)); + __m256i test_mm256_movm_epi32(__mmask8 __A) { // CHECK-LABEL: test_mm256_movm_epi32 // CHECK: %{{.*}} = bitcast i8 %{{.*}} to <8 x i1> @@ -951,6 +953,8 @@ __m256i test_mm256_movm_epi32(__mmask8 __A) { return _mm256_movm_epi32(__A); } +TEST_CONSTEXPR(match_v8si(_mm256_movm_epi32(0x85), -1, 0, -1, 0, 0, 0, 0, -1)); + __m128i test_mm_movm_epi64(__mmask8 __A) { // CHECK-LABEL: test_mm_movm_epi64 // CHECK: %{{.*}} = bitcast i8 %{{.*}} to <8 x i1> @@ -959,6 +963,9 @@ __m128i test_mm_movm_epi64(__mmask8 __A) { return _mm_movm_epi64(__A); } +TEST_CONSTEXPR(match_v2di(_mm_movm_epi64(0x03), -1, -1)); + + __m256i test_mm256_movm_epi64(__mmask8 __A) { // CHECK-LABEL: test_mm256_movm_epi64 // CHECK: %{{.*}} = bitcast i8 %{{.*}} to <8 x i1> @@ -967,6 +974,9 @@ __m256i test_mm256_movm_epi64(__mmask8 __A) { return _mm256_movm_epi64(__A); } +TEST_CONSTEXPR(match_v4di(_mm256_movm_epi64(0x05), -1, 0, -1, 0)); + + __mmask8 test_mm_movepi64_mask(__m128i __A) { // CHECK-LABEL: test_mm_movepi64_mask // CHECK: [[CMP:%.*]] = icmp slt <2 x i64> %{{.*}}, zeroinitializer >From a9d1efdf0531e3f247454046cb2bb136572319cf Mon Sep 17 00:00:00 2001 From: sskzakaria <[email protected]> Date: Sat, 27 Dec 2025 14:40:02 -0500 Subject: [PATCH 2/5] minor --- clang/lib/Headers/avx512fintrin.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index 6b505ae188ae4..e03e8689d3f8a 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -5355,8 +5355,8 @@ _mm_maskz_getexp_ss (__mmask8 __U, __m128 __A, __m128 __B) (__v4sf)_mm_setzero_ps(), \ (__mmask8)(U), (int)(R))) -static __inline__ __mmask16 __DEFAULT_FN_ATTRS_CONSTEXPR -_mm512_kmov(__mmask16 __A) { +static __inline__ __mmask16 + __DEFAULT_FN_ATTRS_CONSTEXPR _mm512_kmov(__mmask16 __A) { return __A; } >From d842eaf441477e819ef7bc3cc77fcc1c095e309d Mon Sep 17 00:00:00 2001 From: sskzakaria <[email protected]> Date: Sun, 28 Dec 2025 06:13:30 -0500 Subject: [PATCH 3/5] Update clang/lib/AST/ByteCode/InterpBuiltin.cpp Co-authored-by: Timm Baeder <[email protected]> --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 55f4d3c45dce4..4118e48c9dafc 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3433,7 +3433,7 @@ static bool interp__builtin_ia32_cvt_mask2vec(InterpState &S, CodePtr OpPC, unsigned NumElems = Vec.getNumElems(); PrimType ElemT = Vec.getFieldDesc()->getPrimType(); - for (unsigned i = 0; i < NumElems; ++i) { + for (unsigned I = 0; i != NumElems; ++i) { bool BitSet = Mask[i]; INT_TYPE_SWITCH_NO_BOOL( >From 9ac7d760c4089cc54e8d7d1f729c3dbf351deaec Mon Sep 17 00:00:00 2001 From: sskzakaria <[email protected]> Date: Sun, 28 Dec 2025 07:05:57 -0500 Subject: [PATCH 4/5] minor requested change --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 4118e48c9dafc..57d5f0ae6eed3 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3433,11 +3433,11 @@ static bool interp__builtin_ia32_cvt_mask2vec(InterpState &S, CodePtr OpPC, unsigned NumElems = Vec.getNumElems(); PrimType ElemT = Vec.getFieldDesc()->getPrimType(); - for (unsigned I = 0; i != NumElems; ++i) { - bool BitSet = Mask[i]; + for (unsigned I = 0; I != NumElems; ++I) { + bool BitSet = Mask[I]; INT_TYPE_SWITCH_NO_BOOL( - ElemT, { Vec.elem<T>(i) = BitSet ? T::from(-1) : T::from(0); }); + ElemT, { Vec.elem<T>(I) = BitSet ? T::from(-1) : T::from(0); }); } Vec.initializeAllElements(); >From 3c44a0c5e09bdd8369467fb24d2b8091910860a4 Mon Sep 17 00:00:00 2001 From: sskzakaria <[email protected]> Date: Sun, 28 Dec 2025 09:41:06 -0500 Subject: [PATCH 5/5] minor requested change --- clang/lib/AST/ExprConstant.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 4d75ced485db5..8618979d1eba0 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12412,8 +12412,8 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { unsigned ElemWidth = Info.Ctx.getTypeSize(ElemTy); SmallVector<APValue, 16> Elems; - for (unsigned i = 0; i < VectorLen; ++i) { - bool BitSet = Mask[i]; + for (unsigned I = 0; I != VectorLen; ++I) { + bool BitSet = Mask[I]; APSInt ElemVal(ElemWidth, /*isUnsigned=*/false); if (BitSet) { ElemVal.setAllBits(); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
