Skip to content

Commit bc9f573

Browse files
committed
Fix array size
1 parent 6672631 commit bc9f573

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -715,10 +715,11 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
715715

716716
static std::string buildSpirvTypeName(const SPIRVType *Type,
717717
MachineIRBuilder &MIRBuilder) {
718+
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
718719
switch (Type->getOpcode()) {
719720
case SPIRV::OpTypeSampledImage: {
720721
Register SampledTypeReg = Type->getOperand(1).getReg();
721-
auto *SampledType = MIRBuilder.getMRI()->getUniqueVRegDef(SampledTypeReg);
722+
auto *SampledType = MRI->getUniqueVRegDef(SampledTypeReg);
722723
std::string TypeName =
723724
"sampled_image_" + buildSpirvTypeName(SampledType, MIRBuilder);
724725
for (uint32_t I = 2; I < Type->getNumOperands(); ++I) {
@@ -728,7 +729,7 @@ static std::string buildSpirvTypeName(const SPIRVType *Type,
728729
}
729730
case SPIRV::OpTypeImage: {
730731
Register SampledTypeReg = Type->getOperand(1).getReg();
731-
auto *SampledType = MIRBuilder.getMRI()->getUniqueVRegDef(SampledTypeReg);
732+
auto *SampledType = MRI->getUniqueVRegDef(SampledTypeReg);
732733
std::string TypeName =
733734
"image_" + buildSpirvTypeName(SampledType, MIRBuilder);
734735
for (uint32_t I = 2; I < Type->getNumOperands(); ++I) {
@@ -738,8 +739,12 @@ static std::string buildSpirvTypeName(const SPIRVType *Type,
738739
}
739740
case SPIRV::OpTypeArray: {
740741
Register ElementTypeReg = Type->getOperand(1).getReg();
741-
auto *ElementType = MIRBuilder.getMRI()->getUniqueVRegDef(ElementTypeReg);
742-
uint32_t ArraySize = 32; // Type->getOperand(2).getCImm()->getZExtValue();
742+
auto *ElementType = MRI->getUniqueVRegDef(ElementTypeReg);
743+
const SPIRVType *TypeInst = MRI->getVRegDef(Type->getOperand(2).getReg());
744+
assert(TypeInst->getOpcode() != SPIRV::OpConstantI);
745+
MachineInstr *ImmInst = MRI->getVRegDef(TypeInst->getOperand(1).getReg());
746+
assert(ImmInst->getOpcode() == TargetOpcode::G_CONSTANT);
747+
uint32_t ArraySize = ImmInst->getOperand(1).getCImm()->getZExtValue();
743748
return (buildSpirvTypeName(ElementType, MIRBuilder) + Twine("[") +
744749
Twine(ArraySize) + Twine("]"))
745750
.str();

llvm/test/CodeGen/SPIRV/SampledImageDynIdx.ll

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
; CHECK-DAG: OpDecorate [[Var:%[0-9]+]] DescriptorSet 3
1010
; CHECK-DAG: OpDecorate [[Var]] Binding 4
11+
; CHECK-DAG: OpDecorate [[OtherVar:%[0-9]+]] DescriptorSet 3
12+
; CHECK-DAG: OpDecorate [[OtherVar]] Binding 4
1113

1214
; CHECK-DAG: [[int:%[0-9]+]] = OpTypeInt 32 0
1315
; CHECK-DAG: [[BufferType:%[0-9]+]] = OpTypeImage [[int]] 1D 2 0 0 1 R32i {{$}}
@@ -19,6 +21,11 @@
1921
; CHECK-DAG: [[ArrayPtrType:%[0-9]+]] = OpTypePointer UniformConstant [[BufferArrayType]]
2022
; CHECK-DAG: [[Var]] = OpVariable [[ArrayPtrType]] UniformConstant
2123

24+
; CHECK-DAG: [[OtherArraySize:%[0-9]+]] = OpConstant [[int]] 5
25+
; CHECK-DAG: [[OtherBufferArrayType:%[0-9]+]] = OpTypeArray [[BufferType]] [[OtherArraySize]]
26+
; CHECK-DAG: [[OtherArrayPtrType:%[0-9]+]] = OpTypePointer UniformConstant [[OtherBufferArrayType]]
27+
; CHECK-DAG: [[OtherVar]] = OpVariable [[OtherArrayPtrType]] UniformConstant
28+
2229
; CHECK: {{%[0-9]+}} = OpFunction {{%[0-9]+}} DontInline {{%[0-9]+}}
2330
; CHECK-NEXT: OpLabel
2431
define void @main() #0 {
@@ -36,4 +43,23 @@ define void @main() #0 {
3643
ret void
3744
}
3845

46+
; CHECK: {{%[0-9]+}} = OpFunction {{%[0-9]+}} DontInline {{%[0-9]+}}
47+
; CHECK-NEXT: OpLabel
48+
define void @DifferentArraySizesAreDifferentVariables() #0 {
49+
; Make sure we use different variables when the array sizes are different
50+
; same in case one function calls the other.
51+
; CHECK: [[ac:%[0-9]+]] = OpAccessChain [[BufferPtrType]] [[Var]] [[Zero]]
52+
; CHECK: [[buffer:%[0-9]+]] = OpLoad [[BufferType]] [[ac]]
53+
%buffer0 = call target("spirv.Image", i32, 0, 2, 0, 0, 1, 24)
54+
@llvm.spv.handle.fromBinding.tspirv.Image_f32_0_2_0_0_1_24(
55+
i32 3, i32 4, i32 3, i32 0, i1 false)
56+
57+
; CHECK: [[ac:%[0-9]+]] = OpAccessChain [[BufferPtrType]] [[OtherVar]] [[One]]
58+
; CHECK: [[buffer:%[0-9]+]] = OpLoad [[BufferType]] [[ac]]
59+
%buffer1 = call target("spirv.Image", i32, 0, 2, 0, 0, 1, 24)
60+
@llvm.spv.handle.fromBinding.tspirv.Image_f32_0_2_0_0_1_24(
61+
i32 3, i32 4, i32 5, i32 1, i1 false)
62+
ret void
63+
}
64+
3965
attributes #0 = { convergent noinline norecurse "frame-pointer"="all" "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }

0 commit comments

Comments
 (0)