Skip to content

Commit aca7655

Browse files
committed
Check the second element is actually padding in when looking for the peeled array pattern.
1 parent f09dfda commit aca7655

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,11 @@ bool matchPeeledArrayPattern(const StructType *Ty, Type *&OriginalElementType,
10631063
if (T_in_struct != SecondElement)
10641064
return false;
10651065

1066+
auto *Padding_in_struct =
1067+
dyn_cast<TargetExtType>(ArrayElementType->getStructElementType(1));
1068+
if (!Padding_in_struct || Padding_in_struct->getName() != "spirv.Padding")
1069+
return false;
1070+
10661071
const uint64_t ArraySize = FirstElement->getArrayNumElements();
10671072
TotalSize = ArraySize + 1;
10681073
OriginalElementType = ArrayElementType;

llvm/test/CodeGen/SPIRV/hlsl-resources/cbuffer-peeled-array-minimal.ll

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,22 @@
2323
; CHECK-DAG: %[[ZERO:[0-9]+]] = OpConstant %[[UINT]] 0
2424
; CHECK-DAG: %[[MYCBUFFER:[0-9]+]] = OpVariable %[[PTR_WRAPPER]] Uniform
2525

26+
; CHECK-DAG: %[[I64:[0-9]+]] = OpTypeInt 64 0
27+
; CHECK-DAG: %[[STRUCT2:[0-9]+]] = OpTypeStruct %[[I64]] %[[UINT]]
28+
; CHECK-DAG: %[[CONST_3:[0-9]+]] = OpConstant %[[UINT]] 3
29+
; CHECK-DAG: %[[ARRAY2:[0-9]+]] = OpTypeArray %[[STRUCT2]] %[[CONST_3]]
30+
; CHECK-DAG: %[[CBLAYOUT2:[0-9]+]] = OpTypeStruct %[[ARRAY2]] %[[I64]]
31+
; CHECK-DAG: %[[PTR_PRIVATE:[0-9]+]] = OpTypePointer Private %[[CBLAYOUT2]]
32+
; CHECK-DAG: %[[MYPRIVATEVAR:[0-9]+]] = OpVariable %[[PTR_PRIVATE]] Private
33+
2634
%__cblayout_MyCBuffer = type <{ <{ [3 x <{ %OrigType, target("spirv.Padding", 12) }>], %OrigType }>, float }>
2735
%OrigType = type <{ float }>
2836

37+
%__cblayout_MyCBuffer2 = type <{ [ 3 x <{ i64, i32 }> ], i64 }>
38+
2939
@MyCBuffer.cb = local_unnamed_addr global target("spirv.VulkanBuffer", %__cblayout_MyCBuffer, 2, 0) poison
40+
@myPrivateVar = internal addrspace(10) global %__cblayout_MyCBuffer2 poison
41+
3042
@myArray = external hidden local_unnamed_addr addrspace(12) global <{ [3 x <{ %OrigType, target("spirv.Padding", 12) }>], %OrigType }>, align 1
3143
@MyCBuffer.str = private unnamed_addr constant [10 x i8] c"MyCBuffer\00", align 1
3244
@.str = private unnamed_addr constant [7 x i8] c"output\00", align 1
@@ -54,9 +66,13 @@ entry:
5466
; CHECK: %[[VAL_FLOAT:[0-9]+]] = OpLoad %[[FLOAT]] %[[PTR_FIELD]] Aligned 4
5567
%2 = load float, ptr addrspace(12) %cbufferidx.i, align 4
5668

69+
%val = load i64, ptr addrspace(10) getelementptr (%__cblayout_MyCBuffer2, ptr addrspace(10) @myPrivateVar, i32 0, i32 1), align 8
70+
%val.float = sitofp i64 %val to float
71+
5772
%vecinit4.i = insertelement <4 x float> <float poison, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, float %2, i64 0
73+
%vecinit4.i.2 = insertelement <4 x float> %vecinit4.i, float %val.float, i64 1
5874
%3 = tail call noundef align 16 dereferenceable(16) ptr addrspace(11) @llvm.spv.resource.getpointer.p11.tspirv.Image_f32_5_2_0_0_2_1t(target("spirv.Image", float, 5, 2, 0, 0, 2, 1) %0, i32 0)
59-
store <4 x float> %vecinit4.i, ptr addrspace(11) %3, align 16
75+
store <4 x float> %vecinit4.i.2, ptr addrspace(11) %3, align 16
6076
; CHECK: OpImageWrite {{%[0-9]+}} {{%[0-9]+}} {{%[0-9]+}}
6177
ret void
6278
}
@@ -71,4 +87,4 @@ attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
7187

7288
!hlsl.cbs = !{!0}
7389

74-
!0 = distinct !{ptr @MyCBuffer.cb, ptr addrspace(12) @myArray, null}
90+
!0 = distinct !{ptr @MyCBuffer.cb, ptr addrspace(12) @myArray, null}

0 commit comments

Comments
 (0)