Skip to content

Commit 50f8b16

Browse files
committed
wip
1 parent e3c16e0 commit 50f8b16

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
20812088
llvm::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;

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T) {
112112
// Check for the boolean vector case.
113113
if (T->isExtVectorBoolType()) {
114114
auto *FixedVT = cast<llvm::FixedVectorType>(R);
115+
116+
if (Context.getLangOpts().HLSL) {
117+
llvm::Type *IRElemTy = ConvertTypeForMem(Context.BoolTy);
118+
return llvm::FixedVectorType::get(IRElemTy, FixedVT->getNumElements());
119+
}
120+
115121
// Pad to at least one byte.
116122
uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
117123
return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);

0 commit comments

Comments
 (0)