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