xref: /llvm-project/llvm/test/CodeGen/SPIRV/pstruct.ll (revision f8a21dff70cc5d20db731b3af1858c5a2ae96d30)
1*f8a21dffSNatalie Chouinard; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2*f8a21dffSNatalie Chouinard
3*f8a21dffSNatalie Chouinard; TODO(#60133): Requires updates following opaque pointer migration.
4*f8a21dffSNatalie Chouinard; XFAIL: *
58468e674SAndrey Tretyakov
68468e674SAndrey Tretyakov%struct.ST = type { i32, i32, i32 }
78468e674SAndrey Tretyakov
88468e674SAndrey Tretyakov; CHECK-SPIRV: OpName %[[#struct:]] "struct.ST"
98468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#int:]] = OpTypeInt 32 0
108468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#intP:]] = OpTypePointer Function %[[#int]]
118468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#struct]] = OpTypeStruct %[[#int]] %[[#int]] %[[#int]]
128468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#structP:]] = OpTypePointer Function %[[#struct]]
138468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#structPP:]] = OpTypePointer Function %[[#structP]]
148468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#zero:]] = OpConstant %[[#int]] 0
158468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#one:]] = OpConstant %[[#int]] 1
168468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#two:]] = OpConstant %[[#int]] 2
178468e674SAndrey Tretyakov
188468e674SAndrey Tretyakovdefine dso_local spir_func i32 @cmp_func(i8* %p1, i8* %p2) {
198468e674SAndrey Tretyakoventry:
208468e674SAndrey Tretyakov  %retval = alloca i32, align 4
218468e674SAndrey Tretyakov  %p1.addr = alloca i8*, align 8
228468e674SAndrey Tretyakov  %p2.addr = alloca i8*, align 8
238468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#s1:]] = OpVariable %[[#structPP]]
248468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#s2:]] = OpVariable %[[#structPP]]
258468e674SAndrey Tretyakov  %s1 = alloca %struct.ST*, align 8
268468e674SAndrey Tretyakov  %s2 = alloca %struct.ST*, align 8
278468e674SAndrey Tretyakov  store i8* %p1, i8** %p1.addr, align 8
288468e674SAndrey Tretyakov  store i8* %p2, i8** %p2.addr, align 8
298468e674SAndrey Tretyakov  %0 = load i8*, i8** %p1.addr, align 8
308468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t1:]] = OpBitcast %[[#structP]]
318468e674SAndrey Tretyakov; CHECK-SPIRV: OpStore %[[#s1]] %[[#t1]]
328468e674SAndrey Tretyakov  %1 = bitcast i8* %0 to %struct.ST*
338468e674SAndrey Tretyakov  store %struct.ST* %1, %struct.ST** %s1, align 8
348468e674SAndrey Tretyakov  %2 = load i8*, i8** %p2.addr, align 8
358468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t2:]] = OpBitcast %[[#structP]]
368468e674SAndrey Tretyakov; CHECK-SPIRV: OpStore %[[#s2]] %[[#t2]]
378468e674SAndrey Tretyakov  %3 = bitcast i8* %2 to %struct.ST*
388468e674SAndrey Tretyakov  store %struct.ST* %3, %struct.ST** %s2, align 8
398468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t3:]] = OpLoad %[[#structP]] %[[#s1]]
408468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t3]] %[[#zero]] %[[#zero]]
418468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#a1]]
428468e674SAndrey Tretyakov  %4 = load %struct.ST*, %struct.ST** %s1, align 8
438468e674SAndrey Tretyakov  %a = getelementptr inbounds %struct.ST, %struct.ST* %4, i32 0, i32 0
448468e674SAndrey Tretyakov  %5 = load i32, i32* %a, align 4
458468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t4:]] = OpLoad %[[#structP]] %[[#s2]]
468468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a2:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t4]] %[[#zero]] %[[#zero]]
478468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#a2]]
488468e674SAndrey Tretyakov  %6 = load %struct.ST*, %struct.ST** %s2, align 8
498468e674SAndrey Tretyakov  %a1 = getelementptr inbounds %struct.ST, %struct.ST* %6, i32 0, i32 0
508468e674SAndrey Tretyakov  %7 = load i32, i32* %a1, align 4
518468e674SAndrey Tretyakov  %cmp = icmp ne i32 %5, %7
528468e674SAndrey Tretyakov  br i1 %cmp, label %if.then, label %if.end
538468e674SAndrey Tretyakov
548468e674SAndrey Tretyakovif.then:                                          ; preds = %entry
558468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t5:]] = OpLoad %[[#structP]] %[[#s1]]
568468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a_1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t5]] %[[#zero]] %[[#zero]]
578468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#a_1]]
588468e674SAndrey Tretyakov  %8 = load %struct.ST*, %struct.ST** %s1, align 8
598468e674SAndrey Tretyakov  %a2 = getelementptr inbounds %struct.ST, %struct.ST* %8, i32 0, i32 0
608468e674SAndrey Tretyakov  %9 = load i32, i32* %a2, align 4
618468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t6:]] = OpLoad %[[#structP]] %[[#s2]]
628468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a_2:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t6]] %[[#zero]] %[[#zero]]
638468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#a_2]]
648468e674SAndrey Tretyakov  %10 = load %struct.ST*, %struct.ST** %s2, align 8
658468e674SAndrey Tretyakov  %a3 = getelementptr inbounds %struct.ST, %struct.ST* %10, i32 0, i32 0
668468e674SAndrey Tretyakov  %11 = load i32, i32* %a3, align 4
678468e674SAndrey Tretyakov  %sub = sub nsw i32 %9, %11
688468e674SAndrey Tretyakov  store i32 %sub, i32* %retval, align 4
698468e674SAndrey Tretyakov  br label %return
708468e674SAndrey Tretyakov
718468e674SAndrey Tretyakovif.end:                                           ; preds = %entry
728468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t7:]] = OpLoad %[[#structP]] %[[#s1]]
738468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t7]] %[[#zero]] %[[#one]]
748468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#b1]]
758468e674SAndrey Tretyakov  %12 = load %struct.ST*, %struct.ST** %s1, align 8
768468e674SAndrey Tretyakov  %b = getelementptr inbounds %struct.ST, %struct.ST* %12, i32 0, i32 1
778468e674SAndrey Tretyakov  %13 = load i32, i32* %b, align 4
788468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t8:]] = OpLoad %[[#structP]] %[[#s2]]
798468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b2:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t8]] %[[#zero]] %[[#one]]
808468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#b2]]
818468e674SAndrey Tretyakov  %14 = load %struct.ST*, %struct.ST** %s2, align 8
828468e674SAndrey Tretyakov  %b4 = getelementptr inbounds %struct.ST, %struct.ST* %14, i32 0, i32 1
838468e674SAndrey Tretyakov  %15 = load i32, i32* %b4, align 4
848468e674SAndrey Tretyakov  %cmp5 = icmp ne i32 %13, %15
858468e674SAndrey Tretyakov  br i1 %cmp5, label %if.then6, label %if.end10
868468e674SAndrey Tretyakov
878468e674SAndrey Tretyakovif.then6:                                         ; preds = %if.end
888468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t9:]] = OpLoad %[[#structP]] %[[#s1]]
898468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b_1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t9]] %[[#zero]] %[[#one]]
908468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#b_1]]
918468e674SAndrey Tretyakov  %16 = load %struct.ST*, %struct.ST** %s1, align 8
928468e674SAndrey Tretyakov  %b7 = getelementptr inbounds %struct.ST, %struct.ST* %16, i32 0, i32 1
938468e674SAndrey Tretyakov  %17 = load i32, i32* %b7, align 4
948468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t10:]] = OpLoad %[[#structP]] %[[#s2]]
958468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b_2:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t10]] %[[#zero]] %[[#one]]
968468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#b_2]]
978468e674SAndrey Tretyakov  %18 = load %struct.ST*, %struct.ST** %s2, align 8
988468e674SAndrey Tretyakov  %b8 = getelementptr inbounds %struct.ST, %struct.ST* %18, i32 0, i32 1
998468e674SAndrey Tretyakov  %19 = load i32, i32* %b8, align 4
1008468e674SAndrey Tretyakov  %sub9 = sub nsw i32 %17, %19
1018468e674SAndrey Tretyakov  store i32 %sub9, i32* %retval, align 4
1028468e674SAndrey Tretyakov  br label %return
1038468e674SAndrey Tretyakov
1048468e674SAndrey Tretyakovif.end10:                                         ; preds = %if.end
1058468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t11:]] = OpLoad %[[#structP]] %[[#s1]]
1068468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#c1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t11]] %[[#zero]] %[[#two]]
1078468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#c1]]
1088468e674SAndrey Tretyakov  %20 = load %struct.ST*, %struct.ST** %s1, align 8
1098468e674SAndrey Tretyakov  %c = getelementptr inbounds %struct.ST, %struct.ST* %20, i32 0, i32 2
1108468e674SAndrey Tretyakov  %21 = load i32, i32* %c, align 4
1118468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#t12:]] = OpLoad %[[#structP]] %[[#s2]]
1128468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#c2:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#t12]] %[[#zero]] %[[#two]]
1138468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#c2]]
1148468e674SAndrey Tretyakov  %22 = load %struct.ST*, %struct.ST** %s2, align 8
1158468e674SAndrey Tretyakov  %c11 = getelementptr inbounds %struct.ST, %struct.ST* %22, i32 0, i32 2
1168468e674SAndrey Tretyakov  %23 = load i32, i32* %c11, align 4
1178468e674SAndrey Tretyakov  %sub12 = sub nsw i32 %21, %23
1188468e674SAndrey Tretyakov  store i32 %sub12, i32* %retval, align 4
1198468e674SAndrey Tretyakov  br label %return
1208468e674SAndrey Tretyakov
1218468e674SAndrey Tretyakovreturn:                                           ; preds = %if.end10, %if.then6, %if.then
1228468e674SAndrey Tretyakov  %24 = load i32, i32* %retval, align 4
1238468e674SAndrey Tretyakov  ret i32 %24
1248468e674SAndrey Tretyakov}
125