Skip to content

Commit 20eb30e

Browse files
committed
[HLSL][SPIRV] Use resource names
1 parent de96199 commit 20eb30e

21 files changed

+117
-166
lines changed

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ CGHLSLRuntime::getCreateHandleFromBindingIntrinsic() {
243243
case llvm::Triple::dxil:
244244
return std::pair(llvm::Intrinsic::dx_resource_handlefrombinding, true);
245245
case llvm::Triple::spirv:
246-
return std::pair(llvm::Intrinsic::spv_resource_handlefrombinding, false);
246+
return std::pair(llvm::Intrinsic::spv_resource_handlefrombinding, true);
247247
default:
248248
llvm_unreachable("Intrinsic resource_handlefrombinding not supported by "
249249
"target architecture");
@@ -258,7 +258,7 @@ CGHLSLRuntime::getCreateHandleFromImplicitBindingIntrinsic() {
258258
true);
259259
case llvm::Triple::spirv:
260260
return std::pair(llvm::Intrinsic::spv_resource_handlefromimplicitbinding,
261-
false);
261+
true);
262262
default:
263263
llvm_unreachable(
264264
"Intrinsic resource_handlefromimplicitbinding not supported by "

llvm/include/llvm/IR/IntrinsicsSPIRV.td

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,15 @@ let TargetPrefix = "spv" in {
115115
// array size of the binding, as well as an index and an indicator
116116
// whether that index may be non-uniform.
117117
def int_spv_resource_handlefrombinding
118-
: DefaultAttrsIntrinsic<
119-
[llvm_any_ty],
120-
[llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty],
121-
[IntrNoMem]>;
118+
: DefaultAttrsIntrinsic<[llvm_any_ty],
119+
[llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
120+
llvm_i32_ty, llvm_i1_ty, llvm_ptr_ty],
121+
[IntrNoMem]>;
122122
def int_spv_resource_handlefromimplicitbinding
123-
: DefaultAttrsIntrinsic<
124-
[llvm_any_ty],
125-
[llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty],
126-
[IntrNoMem]>;
123+
: DefaultAttrsIntrinsic<[llvm_any_ty],
124+
[llvm_i32_ty, llvm_i32_ty, llvm_i32_ty,
125+
llvm_i32_ty, llvm_i1_ty, llvm_ptr_ty],
126+
[IntrNoMem]>;
127127

128128
def int_spv_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
129129
def int_spv_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;

llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp

Lines changed: 1 addition & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -799,107 +799,15 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
799799
return Reg;
800800
}
801801

802-
static std::string GetSpirvImageTypeName(const SPIRVType *Type,
803-
MachineIRBuilder &MIRBuilder,
804-
const std::string &Prefix,
805-
SPIRVGlobalRegistry &GR);
806-
807802
// Returns a name based on the Type. Notes that this does not look at
808803
// decorations, and will return the same string for two types that are the same
809804
// except for decorations.
810-
static std::string buildSpirvTypeName(const SPIRVType *Type,
811-
MachineIRBuilder &MIRBuilder,
812-
SPIRVGlobalRegistry &GR) {
813-
switch (Type->getOpcode()) {
814-
case SPIRV::OpTypeSampledImage: {
815-
return GetSpirvImageTypeName(Type, MIRBuilder, "sampled_image_", GR);
816-
}
817-
case SPIRV::OpTypeImage: {
818-
return GetSpirvImageTypeName(Type, MIRBuilder, "image_", GR);
819-
}
820-
case SPIRV::OpTypeArray: {
821-
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
822-
Register ElementTypeReg = Type->getOperand(1).getReg();
823-
auto *ElementType = MRI->getUniqueVRegDef(ElementTypeReg);
824-
uint32_t ArraySize = getArrayComponentCount(MRI, Type);
825-
return (buildSpirvTypeName(ElementType, MIRBuilder, GR) + Twine("[") +
826-
Twine(ArraySize) + Twine("]"))
827-
.str();
828-
}
829-
case SPIRV::OpTypeFloat:
830-
return ("f" + Twine(Type->getOperand(1).getImm())).str();
831-
case SPIRV::OpTypeSampler:
832-
return ("sampler");
833-
case SPIRV::OpTypeInt:
834-
if (Type->getOperand(2).getImm())
835-
return ("i" + Twine(Type->getOperand(1).getImm())).str();
836-
return ("u" + Twine(Type->getOperand(1).getImm())).str();
837-
case SPIRV::OpTypePointer: {
838-
uint32_t StorageClass = GR.getPointerStorageClass(Type);
839-
SPIRVType *PointeeType = GR.getPointeeType(Type);
840-
return ("p_" + Twine(StorageClass) + Twine("_") +
841-
buildSpirvTypeName(PointeeType, MIRBuilder, GR))
842-
.str();
843-
}
844-
case SPIRV::OpTypeStruct: {
845-
std::string TypeName = "{";
846-
for (uint32_t I = 1; I < Type->getNumOperands(); ++I) {
847-
SPIRVType *MemberType =
848-
GR.getSPIRVTypeForVReg(Type->getOperand(I).getReg());
849-
TypeName += '_' + buildSpirvTypeName(MemberType, MIRBuilder, GR);
850-
}
851-
return TypeName + "}";
852-
}
853-
case SPIRV::OpTypeVector: {
854-
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
855-
Register ElementTypeReg = Type->getOperand(1).getReg();
856-
auto *ElementType = MRI->getUniqueVRegDef(ElementTypeReg);
857-
uint32_t VectorSize = GR.getScalarOrVectorComponentCount(Type);
858-
return (buildSpirvTypeName(ElementType, MIRBuilder, GR) + Twine("[") +
859-
Twine(VectorSize) + Twine("]"))
860-
.str();
861-
}
862-
case SPIRV::OpTypeRuntimeArray: {
863-
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
864-
Register ElementTypeReg = Type->getOperand(1).getReg();
865-
auto *ElementType = MRI->getUniqueVRegDef(ElementTypeReg);
866-
uint32_t ArraySize = 0;
867-
return (buildSpirvTypeName(ElementType, MIRBuilder, GR) + Twine("[") +
868-
Twine(ArraySize) + Twine("]"))
869-
.str();
870-
}
871-
default:
872-
llvm_unreachable("Trying to the the name of an unknown type.");
873-
}
874-
}
875-
876-
static std::string GetSpirvImageTypeName(const SPIRVType *Type,
877-
MachineIRBuilder &MIRBuilder,
878-
const std::string &Prefix,
879-
SPIRVGlobalRegistry &GR) {
880-
Register SampledTypeReg = Type->getOperand(1).getReg();
881-
auto *SampledType = MIRBuilder.getMRI()->getUniqueVRegDef(SampledTypeReg);
882-
std::string TypeName =
883-
Prefix + buildSpirvTypeName(SampledType, MIRBuilder, GR);
884-
for (uint32_t I = 2; I < Type->getNumOperands(); ++I) {
885-
TypeName = (TypeName + '_' + Twine(Type->getOperand(I).getImm())).str();
886-
}
887-
return TypeName;
888-
}
889-
890805
Register SPIRVGlobalRegistry::getOrCreateGlobalVariableWithBinding(
891-
const SPIRVType *VarType, uint32_t Set, uint32_t Binding,
806+
const SPIRVType *VarType, uint32_t Set, uint32_t Binding, StringRef Name,
892807
MachineIRBuilder &MIRBuilder) {
893808
Register VarReg =
894809
MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::iIDRegClass);
895810

896-
// TODO(138533): The name should come from the llvm-ir, but how that name will
897-
// be passed from the HLSL to the backend has not been decided. Using this
898-
// place holder for now.
899-
std::string Name =
900-
("__resource_" + buildSpirvTypeName(VarType, MIRBuilder, *this) + "_" +
901-
Twine(Set) + "_" + Twine(Binding))
902-
.str();
903811
buildGlobalVariable(VarReg, VarType, Name, nullptr,
904812
getPointerStorageClass(VarType), nullptr, false, false,
905813
SPIRV::LinkageType::Import, MIRBuilder, false);

llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,7 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
548548
bool IsInstSelector);
549549
Register getOrCreateGlobalVariableWithBinding(const SPIRVType *VarType,
550550
uint32_t Set, uint32_t Binding,
551+
StringRef Name,
551552
MachineIRBuilder &MIRBuilder);
552553

553554
// Convenient helpers for getting types with check for duplicates.

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ class SPIRVInstructionSelector : public InstructionSelector {
322322
SPIRV::StorageClass::StorageClass SC,
323323
uint32_t Set, uint32_t Binding,
324324
uint32_t ArraySize, Register IndexReg,
325-
bool IsNonUniform,
325+
bool IsNonUniform, StringRef Name,
326326
MachineIRBuilder MIRBuilder) const;
327327
SPIRVType *widenTypeToVec4(const SPIRVType *Type, MachineInstr &I) const;
328328
bool extractSubvector(Register &ResVReg, const SPIRVType *ResType,
@@ -3380,22 +3380,22 @@ bool SPIRVInstructionSelector::selectImageWriteIntrinsic(
33803380
Register SPIRVInstructionSelector::buildPointerToResource(
33813381
const SPIRVType *SpirvResType, SPIRV::StorageClass::StorageClass SC,
33823382
uint32_t Set, uint32_t Binding, uint32_t ArraySize, Register IndexReg,
3383-
bool IsNonUniform, MachineIRBuilder MIRBuilder) const {
3383+
bool IsNonUniform, StringRef Name, MachineIRBuilder MIRBuilder) const {
33843384
const Type *ResType = GR.getTypeForSPIRVType(SpirvResType);
33853385
if (ArraySize == 1) {
33863386
SPIRVType *PtrType =
33873387
GR.getOrCreateSPIRVPointerType(ResType, MIRBuilder, SC);
33883388
assert(GR.getPointeeType(PtrType) == SpirvResType &&
33893389
"SpirvResType did not have an explicit layout.");
3390-
return GR.getOrCreateGlobalVariableWithBinding(PtrType, Set, Binding,
3390+
return GR.getOrCreateGlobalVariableWithBinding(PtrType, Set, Binding, Name,
33913391
MIRBuilder);
33923392
}
33933393

33943394
const Type *VarType = ArrayType::get(const_cast<Type *>(ResType), ArraySize);
33953395
SPIRVType *VarPointerType =
33963396
GR.getOrCreateSPIRVPointerType(VarType, MIRBuilder, SC);
33973397
Register VarReg = GR.getOrCreateGlobalVariableWithBinding(
3398-
VarPointerType, Set, Binding, MIRBuilder);
3398+
VarPointerType, Set, Binding, Name, MIRBuilder);
33993399

34003400
SPIRVType *ResPointerType =
34013401
GR.getOrCreateSPIRVPointerType(ResType, MIRBuilder, SC);
@@ -4081,6 +4081,9 @@ bool SPIRVInstructionSelector::loadHandleBeforePosition(
40814081
uint32_t ArraySize = foldImm(HandleDef.getOperand(4), MRI);
40824082
Register IndexReg = HandleDef.getOperand(5).getReg();
40834083
bool IsNonUniform = ArraySize > 1 && foldImm(HandleDef.getOperand(6), MRI);
4084+
std::string Name =
4085+
getStringValueFromReg(HandleDef.getOperand(7).getReg(), *MRI);
4086+
40844087
bool IsStructuredBuffer = ResType->getOpcode() == SPIRV::OpTypePointer;
40854088
MachineIRBuilder MIRBuilder(HandleDef);
40864089
SPIRVType *VarType = ResType;
@@ -4091,8 +4094,9 @@ bool SPIRVInstructionSelector::loadHandleBeforePosition(
40914094
SC = GR.getPointerStorageClass(ResType);
40924095
}
40934096

4094-
Register VarReg = buildPointerToResource(VarType, SC, Set, Binding, ArraySize,
4095-
IndexReg, IsNonUniform, MIRBuilder);
4097+
Register VarReg =
4098+
buildPointerToResource(VarType, SC, Set, Binding, ArraySize, IndexReg,
4099+
IsNonUniform, Name, MIRBuilder);
40964100

40974101
if (IsNonUniform)
40984102
buildOpDecorate(HandleReg, HandleDef, TII, SPIRV::Decoration::NonUniformEXT,

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ std::string getStringImm(const MachineInstr &MI, unsigned StartIndex) {
8080
return getSPIRVStringOperand(MI, StartIndex);
8181
}
8282

83+
std::string getStringValueFromReg(Register Reg, MachineRegisterInfo &MRI) {
84+
MachineInstr *Def = getVRegDef(MRI, Reg);
85+
assert(Def && Def->getOpcode() == TargetOpcode::G_GLOBAL_VALUE &&
86+
"Expected G_GLOBAL_VALUE");
87+
const GlobalValue *GV = Def->getOperand(1).getGlobal();
88+
Value *V = GV->getOperand(0);
89+
const ConstantDataArray *CDA = cast<ConstantDataArray>(V);
90+
return CDA->getAsCString().str();
91+
}
92+
8393
void addNumImm(const APInt &Imm, MachineInstrBuilder &MIB) {
8494
const auto Bitwidth = Imm.getBitWidth();
8595
if (Bitwidth == 1)

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ void addStringImm(const StringRef &Str, IRBuilder<> &B,
125125
// the reverse of the logic in addStringImm.
126126
std::string getStringImm(const MachineInstr &MI, unsigned StartIndex);
127127

128+
// Returns the string constant that the register refers to. It is assumed that
129+
// Reg is a global value that contains a string.
130+
std::string getStringValueFromReg(Register Reg, MachineRegisterInfo &MRI);
131+
128132
// Add the given numerical immediate to MIB.
129133
void addNumImm(const APInt &Imm, MachineInstrBuilder &MIB);
130134

llvm/test/CodeGen/SPIRV/hlsl-resources/BufferLoad.ll

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-vulkan-library %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-library %s -o - -filetype=obj | spirv-val %}
33

4+
@.str.b0 = private unnamed_addr constant [3 x i8] c"B0\00", align 1
5+
46
; CHECK-NOT: OpCapability StorageImageReadWithoutFormat
57

68
; CHECK-DAG: OpDecorate [[IntBufferVar:%[0-9]+]] DescriptorSet 16
@@ -20,7 +22,7 @@ define void @RWBufferLoad_Vec4_I32() #0 {
2022
; CHECK: [[buffer:%[0-9]+]] = OpLoad [[RWBufferTypeInt]] [[IntBufferVar]]
2123
%buffer0 = call target("spirv.Image", i32, 5, 2, 0, 0, 2, 24)
2224
@llvm.spv.resource.handlefrombinding.tspirv.Image_i32_5_2_0_0_2_24(
23-
i32 16, i32 7, i32 1, i32 0, i1 false)
25+
i32 16, i32 7, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
2426

2527
; CHECK: OpImageRead [[v4_int]] [[buffer]] [[zero]]
2628
%data0 = call <4 x i32> @llvm.spv.resource.load.typedbuffer(
@@ -35,7 +37,7 @@ define void @RWBufferLoad_I32() #0 {
3537
; CHECK: [[buffer:%[0-9]+]] = OpLoad [[RWBufferTypeInt]] [[IntBufferVar]]
3638
%buffer1 = call target("spirv.Image", i32, 5, 2, 0, 0, 2, 24)
3739
@llvm.spv.resource.handlefrombinding.tspirv.Image_i32_5_2_0_0_2_24(
38-
i32 16, i32 7, i32 1, i32 0, i1 false)
40+
i32 16, i32 7, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
3941

4042
; CHECK: [[V:%[0-9]+]] = OpImageRead [[v4_int]] [[buffer]] [[zero]]
4143
; CHECK: OpCompositeExtract [[int]] [[V]] 0
@@ -51,7 +53,7 @@ define void @RWBufferLoad_Vec2_I32() #0 {
5153
; CHECK: [[buffer:%[0-9]+]] = OpLoad [[RWBufferTypeInt]] [[IntBufferVar]]
5254
%buffer0 = call target("spirv.Image", i32, 5, 2, 0, 0, 2, 24)
5355
@llvm.spv.resource.handlefrombinding.tspirv.Image_i32_5_2_0_0_2_24(
54-
i32 16, i32 7, i32 1, i32 0, i1 false)
56+
i32 16, i32 7, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
5557

5658
; CHECK: [[V:%[0-9]+]] = OpImageRead [[v4_int]] [[buffer]] [[zero]]
5759
; CHECK: [[e0:%[0-9]+]] = OpCompositeExtract [[int]] [[V]] 0

llvm/test/CodeGen/SPIRV/hlsl-resources/BufferLoadStore.ll

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-vulkan-library %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-library %s -o - -filetype=obj | spirv-val %}
33

4+
@.str.b0 = private unnamed_addr constant [3 x i8] c"B0\00", align 1
5+
46
; CHECK-DAG: [[float:%[0-9]+]] = OpTypeFloat 32
57
; CHECK-DAG: [[v2float:%[0-9]+]] = OpTypeVector [[float]] 2
68
; CHECK-DAG: [[v4float:%[0-9]+]] = OpTypeVector [[float]] 4
@@ -18,7 +20,7 @@
1820
define void @main_scalar() local_unnamed_addr #0 {
1921
entry:
2022
; CHECK: [[H:%[0-9]+]] = OpLoad [[ImageType]] [[Var]]
21-
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
23+
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
2224

2325
; CHECK: [[R:%[0-9]+]] = OpImageRead [[v4float]] [[H]] [[one]]
2426
; CHECK: [[V:%[0-9]+]] = OpCompositeExtract [[float]] [[R]] 0
@@ -57,7 +59,7 @@ bb_both:
5759
define void @main_vector2() local_unnamed_addr #0 {
5860
entry:
5961
; CHECK: [[H:%[0-9]+]] = OpLoad [[ImageType]] [[Var]]
60-
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
62+
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
6163

6264
; CHECK: [[R:%[0-9]+]] = OpImageRead [[v4float]] [[H]] [[one]]
6365
; CHECK: [[E0:%[0-9]+]] = OpCompositeExtract [[float]] [[R]] 0
@@ -100,7 +102,7 @@ bb_both:
100102
define void @main_vector4() local_unnamed_addr #0 {
101103
entry:
102104
; CHECK: [[H:%[0-9]+]] = OpLoad [[ImageType]] [[Var]]
103-
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false)
105+
%s_h.i = tail call target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32 3, i32 5, i32 1, i32 0, i1 false, ptr nonnull @.str.b0)
104106

105107
; CHECK: [[R:%[0-9]+]] = OpImageRead [[v4float]] [[H]] [[one]]
106108
%0 = tail call noundef nonnull align 4 dereferenceable(4) ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_f32_5_2_0_0_2_0t(target("spirv.Image", float, 5, 2, 0, 0, 2, 1) %s_h.i, i32 1)
@@ -132,11 +134,5 @@ bb_both:
132134
ret void
133135
}
134136

135-
; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none)
136-
declare ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_f32_5_2_0_0_2_0t(target("spirv.Image", float, 5, 2, 0, 0, 2, 1), i32) #1
137-
138-
; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none)
139-
declare target("spirv.Image", float, 5, 2, 0, 0, 2, 1) @llvm.spv.resource.handlefrombinding.tspirv.Image_f32_5_2_0_0_2_0t(i32, i32, i32, i32, i1) #1
140-
141137
attributes #0 = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(readwrite, inaccessiblemem: none) "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
142138
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(none) }

llvm/test/CodeGen/SPIRV/hlsl-resources/BufferStore.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; RUN: llc -O3 -verify-machineinstrs -mtriple=spirv-vulkan-library %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-library %s -o - -filetype=obj | spirv-val %}
33

4+
@.str.b = private unnamed_addr constant [2 x i8] c"B\00", align 1
5+
46
; CHECK-NOT: OpCapability StorageImageReadWithoutFormat
57

68
; CHECK-DAG: OpDecorate [[IntBufferVar:%[0-9]+]] DescriptorSet 16
@@ -22,7 +24,7 @@ declare <4 x i32> @get_data() #1
2224
define void @RWBufferStore_Vec4_I32() #0 {
2325
%buffer0 = call target("spirv.Image", i32, 5, 2, 0, 0, 2, 24)
2426
@llvm.spv.resource.handlefrombinding.tspirv.Image_i32_5_2_0_0_2_24(
25-
i32 16, i32 7, i32 1, i32 0, i1 false)
27+
i32 16, i32 7, i32 1, i32 0, i1 false, ptr nonnull @.str.b)
2628

2729
; CHECK: [[data:%[0-9]+]] = OpFunctionCall
2830
%data = call <4 x i32> @get_data()

llvm/test/CodeGen/SPIRV/hlsl-resources/Packed.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G1"
55

6+
7+
@.str.unpacked = private unnamed_addr constant [12 x i8] c"UnpackedRes\00", align 1
8+
@.str.packed = private unnamed_addr constant [10 x i8] c"PackedRes\00", align 1
9+
610
; CHECK-DAG: OpName [[unpacked:%[0-9]+]] "unpacked"
711
; CHECK-DAG: OpName [[packed:%[0-9]+]] "packed"
812

@@ -22,15 +26,15 @@ target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:
2226

2327
define external i32 @unpacked_vulkan_buffer_load() {
2428
entry:
25-
%handle = tail call target("spirv.VulkanBuffer", [0 x %unpacked], 12, 0) @llvm.spv.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
29+
%handle = tail call target("spirv.VulkanBuffer", [0 x %unpacked], 12, 0) @llvm.spv.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr nonnull @.str.unpacked)
2630
%0 = tail call noundef nonnull align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer(target("spirv.VulkanBuffer", [0 x %unpacked], 12, 0) %handle, i32 1)
2731
%1 = load i32, ptr addrspace(11) %0, align 4
2832
ret i32 %1
2933
}
3034

3135
define external i32 @packed_vulkan_buffer_load() {
3236
entry:
33-
%handle = tail call target("spirv.VulkanBuffer", [0 x %packed], 12, 0) @llvm.spv.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false)
37+
%handle = tail call target("spirv.VulkanBuffer", [0 x %packed], 12, 0) @llvm.spv.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr nonnull @.str.packed)
3438
%0 = tail call noundef nonnull align 4 dereferenceable(4) ptr addrspace(11) @llvm.spv.resource.getpointer(target("spirv.VulkanBuffer", [0 x %packed], 12, 0) %handle, i32 1)
3539
%1 = load i32, ptr addrspace(11) %0, align 4
3640
ret i32 %1

0 commit comments

Comments
 (0)