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

Reply via email to