@@ -1986,6 +1986,10 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
19861986 if (const auto *ClangVecTy = Ty->getAs <VectorType>()) {
19871987 // Boolean vectors use `iN` as storage type.
19881988 if (ClangVecTy->isExtVectorBoolType ()) {
1989+ if (getLangOpts ().HLSL ) {
1990+ llvm::Value *Value = Builder.CreateLoad (Addr, Volatile, " load_boolvec" );
1991+ return EmitFromMemory (Value, Ty);
1992+ }
19891993 llvm::Type *ValTy = ConvertType (Ty);
19901994 unsigned ValNumElems =
19911995 cast<llvm::FixedVectorType>(ValTy)->getNumElements ();
@@ -2064,6 +2068,9 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
20642068
20652069 if (Ty->isExtVectorBoolType ()) {
20662070 llvm::Type *StoreTy = convertTypeForLoadStore (Ty, Value->getType ());
2071+ if (getLangOpts ().HLSL )
2072+ return Builder.CreateZExt (Value, StoreTy);
2073+
20672074 // Expand to the memory bit width.
20682075 unsigned MemNumElems = StoreTy->getPrimitiveSizeInBits ();
20692076 // <N x i1> --> <P x i1>.
@@ -2081,6 +2088,9 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
20812088llvm::Value *CodeGenFunction::EmitFromMemory (llvm::Value *Value, QualType Ty) {
20822089 if (Ty->isExtVectorBoolType ()) {
20832090 const auto *RawIntTy = Value->getType ();
2091+ if (getLangOpts ().HLSL )
2092+ return Builder.CreateTrunc (Value, ConvertType (Ty), " loadedv" );
2093+
20842094 // Bitcast iP --> <P x i1>.
20852095 auto *PaddedVecTy = llvm::FixedVectorType::get (
20862096 Builder.getInt1Ty (), RawIntTy->getPrimitiveSizeInBits ());
@@ -2407,6 +2417,11 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
24072417 // Read/modify/write the vector, inserting the new element.
24082418 llvm::Value *Vec = Builder.CreateLoad (Dst.getVectorAddress (),
24092419 Dst.isVolatileQualified ());
2420+ llvm::Type *OldVecTy = Vec->getType ();
2421+ if (getLangOpts ().HLSL && Dst.getType ()->isExtVectorBoolType ())
2422+
2423+ Vec = Builder.CreateTrunc (Vec, ConvertType (Dst.getType ()), " truncboolv" );
2424+
24102425 auto *IRStoreTy = dyn_cast<llvm::IntegerType>(Vec->getType ());
24112426 if (IRStoreTy) {
24122427 auto *IRVecTy = llvm::FixedVectorType::get (
@@ -2420,6 +2435,10 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
24202435 // <N x i1> --> <iN>.
24212436 Vec = Builder.CreateBitCast (Vec, IRStoreTy);
24222437 }
2438+
2439+ if (getLangOpts ().HLSL && Dst.getType ()->isExtVectorBoolType ())
2440+ Vec = Builder.CreateZExt (Vec, OldVecTy);
2441+
24232442 Builder.CreateStore (Vec, Dst.getVectorAddress (),
24242443 Dst.isVolatileQualified ());
24252444 return ;
0 commit comments