https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/212146
>From 203919063d67f7f7653d30f124deea366824969f Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Thu, 6 Aug 2026 11:02:11 +0200 Subject: [PATCH 1/5] [CIR] Support load/store for Vector of bools --- clang/lib/CIR/CodeGen/CIRGenExpr.cpp | 26 +--------- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 32 +++++++++++-- clang/test/CIR/CodeGen/vector-bool.cpp | 47 +++++++++++++++++++ 3 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 clang/test/CIR/CodeGen/vector-bool.cpp diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index eef1cda1c90f9..34c7efc208ca2 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -469,18 +469,10 @@ void CIRGenFunction::emitStoreOfScalar(mlir::Value value, Address addr, bool isNontemporal) { if (const auto *clangVecTy = ty->getAs<clang::VectorType>()) { - // Boolean vectors use `iN` as storage type. - if (clangVecTy->isExtVectorBoolType()) - cgm.errorNYI(addr.getPointer().getLoc(), - "emitStoreOfScalar ExtVectorBoolType"); - // Handle vectors of size 3 like size 4 for better performance. - const mlir::Type elementType = addr.getElementType(); - const auto vecTy = cast<cir::VectorType>(elementType); - // TODO(CIR): Use `ABIInfo::getOptimalVectorMemoryType` once it upstreamed assert(!cir::MissingFeatures::cirgenABIInfo()); - if (vecTy.getSize() == 3 && !getLangOpts().PreserveVec3Type) + if (clangVecTy->getNumElements() == 3 && !getLangOpts().PreserveVec3Type) cgm.errorNYI(addr.getPointer().getLoc(), "emitStoreOfScalar Vec3 & PreserveVec3Type disabled"); } @@ -707,14 +699,8 @@ LValue CIRGenFunction::emitLValueForFieldInitialization( mlir::Value CIRGenFunction::emitToMemory(mlir::Value value, QualType ty) { if (auto *atomicTy = ty->getAs<AtomicType>()) ty = atomicTy->getValueType(); - - if (ty->isExtVectorBoolType()) { - cgm.errorNYI("emitToMemory: extVectorBoolType"); - } - // Unlike in classic codegen CIR, bools are kept as `cir.bool` and BitInts are // kept as `cir.int<N>` until further lowering - return value; } @@ -748,18 +734,10 @@ mlir::Value CIRGenFunction::emitLoadOfScalar(Address addr, bool isVolatile, // Traditional LLVM codegen handles thread local separately, CIR handles // as part of getAddrOfGlobalVar (GetGlobalOp). mlir::Type eltTy = addr.getElementType(); - if (const auto *clangVecTy = ty->getAs<clang::VectorType>()) { - if (clangVecTy->isExtVectorBoolType()) { - cgm.errorNYI(loc, "emitLoadOfScalar: ExtVectorBoolType"); - return nullptr; - } - - const auto vecTy = cast<cir::VectorType>(eltTy); - // Handle vectors of size 3 like size 4 for better performance. assert(!cir::MissingFeatures::cirgenABIInfo()); - if (vecTy.getSize() == 3 && !getLangOpts().PreserveVec3Type) + if (clangVecTy->getNumElements() == 3 && !getLangOpts().PreserveVec3Type) cgm.errorNYI(addr.getPointer().getLoc(), "emitLoadOfScalar Vec3 & PreserveVec3Type disabled"); } diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 717bf5e2e741e..e662d1024a3f1 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -115,6 +115,13 @@ static mlir::Type convertTypeForMemory(const mlir::TypeConverter &converter, dataLayout.getTypeSizeInBits(type)); } + if (auto vecTy = mlir::dyn_cast<cir::VectorType>(type)) { + if (mlir::isa<cir::BoolType>(vecTy.getElementType())) { + uint64_t bytePadded = std::max<uint64_t>(vecTy.getSize(), 8); + return mlir::IntegerType::get(type.getContext(), bytePadded); + } + } + // _BitInt(N) keeps its literal width as a value but is stored in a padded // integer iM in memory, the same way bool is i1 as a value and i8 in memory. // The byte-array storage form for wide split widths is not implemented; a @@ -194,9 +201,9 @@ lowerCIRVisibilityToLLVMVisibility(cir::VisibilityKind visibilityKind) { /// the memory represetnation of a CIR type is not equal to its scalar /// representation. static mlir::Value emitFromMemory(mlir::ConversionPatternRewriter &rewriter, + const mlir::TypeConverter &converter, mlir::DataLayout const &dataLayout, cir::LoadOp op, mlir::Value value) { - // TODO(cir): Handle other types similarly to clang's codegen EmitFromMemory if (auto boolTy = mlir::dyn_cast<cir::BoolType>(op.getType())) { // Create a cast value from specified size in datalayout to i1 @@ -204,6 +211,15 @@ static mlir::Value emitFromMemory(mlir::ConversionPatternRewriter &rewriter, return createIntCast(rewriter, value, rewriter.getI1Type()); } + // Convert the `iN` back to boolean vectors + if (auto vecTy = mlir::dyn_cast<cir::VectorType>(op.getType())) { + if (mlir::isa<cir::BoolType>(vecTy.getElementType())) { + mlir::Type mlirVecTy = converter.convertType(vecTy); + return mlir::LLVM::BitcastOp::create(rewriter, value.getLoc(), mlirVecTy, + value); + } + } + // Truncate the padded storage integer back to the _BitInt's literal width. if (auto intTy = mlir::dyn_cast<cir::IntType>(op.getType()); intTy && intTy.isBitInt()) @@ -228,6 +244,16 @@ static mlir::Value emitToMemory(mlir::ConversionPatternRewriter &rewriter, return createIntCast(rewriter, value, memType); } + // Boolean vectors use `iN` as storage type + if (auto vecTy = mlir::dyn_cast<cir::VectorType>(origType)) { + if (mlir::isa<cir::BoolType>(vecTy.getElementType())) { + uint64_t bytePadded = std::max<uint64_t>(vecTy.getSize(), 8); + auto resultTy = mlir::IntegerType::get(origType.getContext(), bytePadded); + return mlir::LLVM::BitcastOp::create(rewriter, value.getLoc(), resultTy, + value); + } + } + // Sign/zero-extend the _BitInt value to its padded storage integer. if (auto intTy = mlir::dyn_cast<cir::IntType>(origType); intTy && intTy.isBitInt()) @@ -2251,8 +2277,8 @@ mlir::LogicalResult CIRToLLVMLoadOpLowering::matchAndRewrite( newLoad->setAttr("cir.riscv_nontemporal_domain", domain); // Convert adapted result to its original type if needed. - mlir::Value result = - emitFromMemory(rewriter, dataLayout, op, newLoad.getResult()); + mlir::Value result = emitFromMemory(rewriter, *getTypeConverter(), dataLayout, + op, newLoad.getResult()); rewriter.replaceOp(op, result); assert(!cir::MissingFeatures::opLoadStoreTbaa()); return mlir::LogicalResult::success(); diff --git a/clang/test/CIR/CodeGen/vector-bool.cpp b/clang/test/CIR/CodeGen/vector-bool.cpp new file mode 100644 index 0000000000000..b5e8b9b3a2c88 --- /dev/null +++ b/clang/test/CIR/CodeGen/vector-bool.cpp @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG + +typedef bool v8b __attribute__((ext_vector_type(8))); + +void vec_bool_without_padding_needed() { + v8b a; + v8b b; +} + +// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> + +// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1 + +// OGCG: %[[A_ADDR:.*]] = alloca i8, align 1 +// OGCG: %[[B_ADDR:.*]] = alloca i8, align 1 + +void vec_bool_load_store_without_padding_needed() { + v8b a; + v8b b; + a = b; +} + +// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[TMP_B:.*]] = cir.load {{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<8 x !cir.bool>>, !cir.vector<8 x !cir.bool> +// CIR: cir.store {{.*}} %[[TMP_B]], %[[A_ADDR]] : !cir.vector<8 x !cir.bool>, !cir.ptr<!cir.vector<8 x !cir.bool>> + +// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1 +// LLVM: %[[TMP_B:.*]] = load i8, ptr %[[B_ADDR]], align 1 +// LLVM: %[[TMP_B_VEC:.*]] = bitcast i8 %[[TMP_B]] to <8 x i1> +// LLVM: %[[TMP_B_I8:.*]] = bitcast <8 x i1> %[[TMP_B_VEC]] to i8 +// LLVM: store i8 %[[TMP_B_I8]], ptr %[[A_ADDR]], align 1 + +// OGCG: %[[A_ADDR:.*]] = alloca i8, align 1 +// OGCG: %[[B_ADDR:.*]] = alloca i8, align 1 +// OGCG: %[[TMP_B:.*]] = load i8, ptr %b, align 1 +// OGCG: %[[TMP_B_VEC:.*]] = bitcast i8 %[[TMP_B]] to <8 x i1> +// OGCG: %[[TMP_B_I8:.*]] = bitcast <8 x i1> %[[TMP_B_VEC]] to i8 +// OGCG: store i8 %[[TMP_B_I8]], ptr %[[A_ADDR]], align 1 >From 502eb74acdd49697ac26442a02fffe6fa288a052 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Thu, 6 Aug 2026 18:36:20 +0200 Subject: [PATCH 2/5] Add NYI for constant matrix type --- clang/lib/CIR/CodeGen/CIRGenExpr.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index 34c7efc208ca2..562ee0b94da95 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -699,6 +699,12 @@ LValue CIRGenFunction::emitLValueForFieldInitialization( mlir::Value CIRGenFunction::emitToMemory(mlir::Value value, QualType ty) { if (auto *atomicTy = ty->getAs<AtomicType>()) ty = atomicTy->getValueType(); + + if (ty->isConstantMatrixBoolType()) { + cgm.errorNYI("emitToMemory: ConstantMatrixBoolType"); + return {}; + } + // Unlike in classic codegen CIR, bools are kept as `cir.bool` and BitInts are // kept as `cir.int<N>` until further lowering return value; >From c7b12fe6049f1f8b0a3ad7c71e3b0065954568f7 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Fri, 7 Aug 2026 18:10:53 +0200 Subject: [PATCH 3/5] Address code review comments --- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 1 + clang/test/CIR/CodeGen/vector-bool.cpp | 45 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index e662d1024a3f1..db7811eb6e5f7 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -116,6 +116,7 @@ static mlir::Type convertTypeForMemory(const mlir::TypeConverter &converter, } if (auto vecTy = mlir::dyn_cast<cir::VectorType>(type)) { + assert(!cir::MissingFeatures::hlsl()); if (mlir::isa<cir::BoolType>(vecTy.getElementType())) { uint64_t bytePadded = std::max<uint64_t>(vecTy.getSize(), 8); return mlir::IntegerType::get(type.getContext(), bytePadded); diff --git a/clang/test/CIR/CodeGen/vector-bool.cpp b/clang/test/CIR/CodeGen/vector-bool.cpp index b5e8b9b3a2c88..724d8109b048a 100644 --- a/clang/test/CIR/CodeGen/vector-bool.cpp +++ b/clang/test/CIR/CodeGen/vector-bool.cpp @@ -3,7 +3,7 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll // RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll -// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM typedef bool v8b __attribute__((ext_vector_type(8))); @@ -15,11 +15,8 @@ void vec_bool_without_padding_needed() { // CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> // CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> -// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1 -// LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1 - -// OGCG: %[[A_ADDR:.*]] = alloca i8, align 1 -// OGCG: %[[B_ADDR:.*]] = alloca i8, align 1 +// LLVM: %[[A_ADDR:.*]] = alloca i8, {{.*}}align 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, {{.*}}align 1 void vec_bool_load_store_without_padding_needed() { v8b a; @@ -32,16 +29,36 @@ void vec_bool_load_store_without_padding_needed() { // CIR: %[[TMP_B:.*]] = cir.load {{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<8 x !cir.bool>>, !cir.vector<8 x !cir.bool> // CIR: cir.store {{.*}} %[[TMP_B]], %[[A_ADDR]] : !cir.vector<8 x !cir.bool>, !cir.ptr<!cir.vector<8 x !cir.bool>> -// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1 -// LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1 +// LLVM: %[[A_ADDR:.*]] = alloca i8, {{.*}}align 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, {{.*}}align 1 // LLVM: %[[TMP_B:.*]] = load i8, ptr %[[B_ADDR]], align 1 // LLVM: %[[TMP_B_VEC:.*]] = bitcast i8 %[[TMP_B]] to <8 x i1> // LLVM: %[[TMP_B_I8:.*]] = bitcast <8 x i1> %[[TMP_B_VEC]] to i8 // LLVM: store i8 %[[TMP_B_I8]], ptr %[[A_ADDR]], align 1 -// OGCG: %[[A_ADDR:.*]] = alloca i8, align 1 -// OGCG: %[[B_ADDR:.*]] = alloca i8, align 1 -// OGCG: %[[TMP_B:.*]] = load i8, ptr %b, align 1 -// OGCG: %[[TMP_B_VEC:.*]] = bitcast i8 %[[TMP_B]] to <8 x i1> -// OGCG: %[[TMP_B_I8:.*]] = bitcast <8 x i1> %[[TMP_B_VEC]] to i8 -// OGCG: store i8 %[[TMP_B_I8]], ptr %[[A_ADDR]], align 1 +void vec_bool_extract_insert_without_padding_needed() { + v8b a; + v8b b; + a[2] = b[3]; +} + +// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[TMP_B:.*]] = cir.load {{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<8 x !cir.bool>>, !cir.vector<8 x !cir.bool> +// CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i +// CIR: %[[B_ELEM_3:.*]] = cir.vec.extract %[[TMP_B]][%[[CONST_3]] : !s32i] : !cir.vector<8 x !cir.bool> +// CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i +// CIR: %[[TMP_A:.*]] = cir.load {{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<8 x !cir.bool>>, !cir.vector<8 x !cir.bool> +// CIR: %[[RESULT:.*]] = cir.vec.insert %[[B_ELEM_3]], %[[TMP_A]][%[[CONST_2]] : !s32i] : !cir.vector<8 x !cir.bool> +// CIR: cir.store {{.*}} %[[RESULT]], %[[A_ADDR]] : !cir.vector<8 x !cir.bool>, !cir.ptr<!cir.vector<8 x !cir.bool>> + +// LLVM: %[[A_ADDR:.*]] = alloca i8, {{.*}}align 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, {{.*}}align 1 +// LLVM: %[[TMP_B:.*]] = load i8, ptr %[[B_ADDR]], align 1 +// LLVM: %[[TMP_B_VEC:.*]] = bitcast i8 %[[TMP_B]] to <8 x i1> +// LLVM: %[[B_ELEM_3:.*]] = extractelement <8 x i1> %[[TMP_B_VEC]], i32 3 +// LLVM: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1 +// LLVM: %[[TMP_A_VEC:.*]] = bitcast i8 %[[TMP_A]] to <8 x i1> +// LLVM: %[[RESULT:.*]] = insertelement <8 x i1> %[[TMP_A_VEC]], i1 %[[B_ELEM_3]], i32 2 +// LLVM: %[[RESULT_I8:.*]] = bitcast <8 x i1> %[[RESULT]] to i8 +// LLVM: store i8 %[[RESULT_I8]], ptr %[[A_ADDR]], align 1 >From 46f23525d7c24075291dafebd3b4f422b50e02d5 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Sat, 8 Aug 2026 19:43:44 +0200 Subject: [PATCH 4/5] Fix vp2intersect intrinsic --- clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp | 2 +- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 3 +- .../X86/avx512vlvp2intersect-builtins.c | 62 +++++++++---------- .../X86/avx512vp2intersect-builtins.c | 20 +++--- 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index 9228367fdd44f..89bd0cdae8f03 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -2559,7 +2559,7 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) { break; } - auto resVector = cir::VectorType::get(builder.getBoolTy(), numElts); + auto resVector = cir::VectorType::get(builder.getUIntNTy(1), numElts); cir::StructType resRecord = cir::StructType::get(&getMLIRContext(), {resVector, resVector}, diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index db7811eb6e5f7..316f8e36ec9f5 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -116,8 +116,9 @@ static mlir::Type convertTypeForMemory(const mlir::TypeConverter &converter, } if (auto vecTy = mlir::dyn_cast<cir::VectorType>(type)) { - assert(!cir::MissingFeatures::hlsl()); if (mlir::isa<cir::BoolType>(vecTy.getElementType())) { + assert(!cir::MissingFeatures::hlsl()); + // Pad to at least one byte. uint64_t bytePadded = std::max<uint64_t>(vecTy.getSize(), 8); return mlir::IntegerType::get(type.getContext(), bytePadded); } diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c index 9e585ba895b96..79d926182952d 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c @@ -15,17 +15,17 @@ #include <immintrin.h> -// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<8 x !cir.bool>, !cir.vector<8 x !cir.bool>}> -// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<4 x !cir.bool>, !cir.vector<4 x !cir.bool>}> -// CIR: !rec_anon_struct2 = !cir.struct<{!cir.vector<2 x !cir.bool>, !cir.vector<2 x !cir.bool>}> +// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<8 x !cir.int<u, 1>>, !cir.vector<8 x !cir.int<u, 1>>}> +// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<4 x !cir.int<u, 1>>, !cir.vector<4 x !cir.int<u, 1>>}> +// CIR: !rec_anon_struct2 = !cir.struct<{!cir.vector<2 x !cir.int<u, 1>>, !cir.vector<2 x !cir.int<u, 1>>}> void test_mm256_2intersect_epi32(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm256_2intersect_epi32 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.256" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s32i>, !cir.vector<8 x !s32i>) -> !rec_anon_struct - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<8 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<8 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm256_2intersect_epi32 @@ -51,15 +51,15 @@ void test_mm256_2intersect_epi32(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m void test_mm256_2intersect_epi64(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm256_2intersect_epi64 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.256" %{{.*}}, %{{.*}} : (!cir.vector<4 x !s64i>, !cir.vector<4 x !s64i>) -> !rec_anon_struct1 - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.bool> - // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.bool> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.bool> - // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.bool> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm256_2intersect_epi64 @@ -89,15 +89,15 @@ void test_mm256_2intersect_epi64(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m void test_mm_2intersect_epi32(__m128i a, __m128i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm_2intersect_epi32 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.128" %{{.*}}, %{{.*}} : (!cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>) -> !rec_anon_struct1 - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.bool> - // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.bool> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.bool> - // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.bool> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm_2intersect_epi32 @@ -127,15 +127,15 @@ void test_mm_2intersect_epi32(__m128i a, __m128i b, __mmask8 *m0, __mmask8 *m1) void test_mm_2intersect_epi64(__m128i a, __m128i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm_2intersect_epi64 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.128" %{{.*}}, %{{.*}} : (!cir.vector<2 x !s64i>, !cir.vector<2 x !s64i>) -> !rec_anon_struct2 - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct2 -> !cir.vector<2 x !cir.bool> - // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.bool> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<2 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct2 -> !cir.vector<2 x !cir.int<u, 1>> + // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.int<u, 1>> + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct2 -> !cir.vector<2 x !cir.bool> - // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.bool> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<2 x !cir.bool>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct2 -> !cir.vector<2 x !cir.int<u, 1>> + // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.int<u, 1>> + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm_2intersect_epi64 diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c index 54a02109dcb46..0d6dee981e2d5 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c @@ -16,16 +16,16 @@ #include <immintrin.h> -// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<16 x !cir.bool>, !cir.vector<16 x !cir.bool>}> -// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<8 x !cir.bool>, !cir.vector<8 x !cir.bool>}> +// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<16 x !cir.int<u, 1>>, !cir.vector<16 x !cir.int<u, 1>>}> +// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<8 x !cir.int<u, 1>>, !cir.vector<8 x !cir.int<u, 1>>}> void test_mm512_2intersect_epi32(__m512i a, __m512i b, __mmask16 *m0, __mmask16 *m1) { // CIR-LABEL: mm512_2intersect_epi32 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.512" %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>) -> !rec_anon_struct - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<16 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<16 x !cir.bool> -> !u16i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<16 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<16 x !cir.int<u, 1>> -> !u16i // CIR: cir.store align(2) %[[CAST1]], %{{.*}} : !u16i, !cir.ptr<!u16i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<16 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<16 x !cir.bool> -> !u16i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<16 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<16 x !cir.int<u, 1>> -> !u16i // CIR: cir.store align(2) %[[CAST2]], %{{.*}} : !u16i, !cir.ptr<!u16i> // LLVM-LABEL: test_mm512_2intersect_epi32 @@ -51,11 +51,11 @@ void test_mm512_2intersect_epi32(__m512i a, __m512i b, __mmask16 *m0, __mmask16 void test_mm512_2intersect_epi64(__m512i a, __m512i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm512_2intersect_epi64 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.512" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !rec_anon_struct1 - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<8 x !cir.bool> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<8 x !cir.bool> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.bool> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<u, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm512_2intersect_epi64 >From 30468a53af2be5d3b257c3e128e243b61b3028dd Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Tue, 11 Aug 2026 03:46:10 +0200 Subject: [PATCH 5/5] Use si1 to create vector of i1 --- clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp | 2 +- .../X86/avx512vlvp2intersect-builtins.c | 34 +++++++++---------- .../X86/avx512vp2intersect-builtins.c | 10 +++--- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index 89bd0cdae8f03..8b2570e92a45b 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -2559,7 +2559,7 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) { break; } - auto resVector = cir::VectorType::get(builder.getUIntNTy(1), numElts); + auto resVector = cir::VectorType::get(builder.getSIntNTy(1), numElts); cir::StructType resRecord = cir::StructType::get(&getMLIRContext(), {resVector, resVector}, diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c index 79d926182952d..b98ffe0d9e59d 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512vlvp2intersect-builtins.c @@ -15,17 +15,17 @@ #include <immintrin.h> -// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<8 x !cir.int<u, 1>>, !cir.vector<8 x !cir.int<u, 1>>}> +// CIR: !rec_anon_struct = !cir.struct<{!cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !cir.int<s, 1>>}> // CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<4 x !cir.int<u, 1>>, !cir.vector<4 x !cir.int<u, 1>>}> // CIR: !rec_anon_struct2 = !cir.struct<{!cir.vector<2 x !cir.int<u, 1>>, !cir.vector<2 x !cir.int<u, 1>>}> void test_mm256_2intersect_epi32(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm256_2intersect_epi32 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.256" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s32i>, !cir.vector<8 x !s32i>) -> !rec_anon_struct - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct -> !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct -> !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm256_2intersect_epi32 @@ -53,13 +53,13 @@ void test_mm256_2intersect_epi64(__m256i a, __m256i b, __mmask8 *m0, __mmask8 *m // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.256" %{{.*}}, %{{.*}} : (!cir.vector<4 x !s64i>, !cir.vector<4 x !s64i>) -> !rec_anon_struct1 // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm256_2intersect_epi64 @@ -91,13 +91,13 @@ void test_mm_2intersect_epi32(__m128i a, __m128i b, __mmask8 *m0, __mmask8 *m1) // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.128" %{{.*}}, %{{.*}} : (!cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>) -> !rec_anon_struct1 // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<4 x !cir.int<u, 1>> // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.int<u, 1>> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<4 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<4> : !s64i, #cir.int<5> : !s64i, #cir.int<6> : !s64i, #cir.int<7> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm_2intersect_epi32 @@ -129,13 +129,13 @@ void test_mm_2intersect_epi64(__m128i a, __m128i b, __mmask8 *m0, __mmask8 *m1) // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.128" %{{.*}}, %{{.*}} : (!cir.vector<2 x !s64i>, !cir.vector<2 x !s64i>) -> !rec_anon_struct2 // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct2 -> !cir.vector<2 x !cir.int<u, 1>> // CIR: %[[ZERO1:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.int<u, 1>> - // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF1:.*]] = cir.vec.shuffle(%[[VAL1]], %[[ZERO1]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[SHUF1]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct2 -> !cir.vector<2 x !cir.int<u, 1>> // CIR: %[[ZERO2:.*]] = cir.const #cir.zero : !cir.vector<2 x !cir.int<u, 1>> - // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[SHUF2:.*]] = cir.vec.shuffle(%[[VAL2]], %[[ZERO2]] : !cir.vector<2 x !cir.int<u, 1>>) [#cir.int<0> : !s64i, #cir.int<1> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i, #cir.int<2> : !s64i, #cir.int<3> : !s64i] : !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[SHUF2]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm_2intersect_epi64 diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c index 0d6dee981e2d5..199b0e0214bd9 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512vp2intersect-builtins.c @@ -17,7 +17,7 @@ // CIR: !rec_anon_struct = !cir.struct<{!cir.vector<16 x !cir.int<u, 1>>, !cir.vector<16 x !cir.int<u, 1>>}> -// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<8 x !cir.int<u, 1>>, !cir.vector<8 x !cir.int<u, 1>>}> +// CIR: !rec_anon_struct1 = !cir.struct<{!cir.vector<8 x !cir.int<s, 1>>, !cir.vector<8 x !cir.int<s, 1>>}> void test_mm512_2intersect_epi32(__m512i a, __m512i b, __mmask16 *m0, __mmask16 *m1) { // CIR-LABEL: mm512_2intersect_epi32 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.d.512" %{{.*}}, %{{.*}} : (!cir.vector<16 x !s32i>, !cir.vector<16 x !s32i>) -> !rec_anon_struct @@ -51,11 +51,11 @@ void test_mm512_2intersect_epi32(__m512i a, __m512i b, __mmask16 *m0, __mmask16 void test_mm512_2intersect_epi64(__m512i a, __m512i b, __mmask8 *m0, __mmask8 *m1) { // CIR-LABEL: mm512_2intersect_epi64 // CIR: %[[RES:.*]] = cir.call_llvm_intrinsic "x86.avx512.vp2intersect.q.512" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s64i>, !cir.vector<8 x !s64i>) -> !rec_anon_struct1 - // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[VAL1:.*]] = cir.extract_member %[[RES]][0] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST1:.*]] = cir.cast bitcast %[[VAL1]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST1]], %{{.*}} : !u8i, !cir.ptr<!u8i> - // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<u, 1>> - // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<u, 1>> -> !u8i + // CIR: %[[VAL2:.*]] = cir.extract_member %[[RES]][1] : !rec_anon_struct1 -> !cir.vector<8 x !cir.int<s, 1>> + // CIR: %[[CAST2:.*]] = cir.cast bitcast %[[VAL2]] : !cir.vector<8 x !cir.int<s, 1>> -> !u8i // CIR: cir.store align(1) %[[CAST2]], %{{.*}} : !u8i, !cir.ptr<!u8i> // LLVM-LABEL: test_mm512_2intersect_epi64 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
