1ec7baca1SMichal Paszkowski; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s 28468e674SAndrey Tretyakov 38468e674SAndrey Tretyakov%struct.ST = type { i32, i32, i32 } 48468e674SAndrey Tretyakov 5ec7baca1SMichal Paszkowski; CHECK-DAG: OpName %[[#struct:]] "struct.ST" 6ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0 7ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#struct]] = OpTypeStruct %[[#int]] %[[#int]] %[[#int]] 8ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#structP:]] = OpTypePointer Function %[[#struct]] 9*6c6f8b1aSNatalie Chouinard; CHECK-DAG: %[[#intP:]] = OpTypePointer Function %[[#int]] 10ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#zero:]] = OpConstant %[[#int]] 0 11ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#one:]] = OpConstant %[[#int]] 1 12ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#two:]] = OpConstant %[[#int]] 2 13ec7baca1SMichal Paszkowski; CHECK-DAG: %[[#three:]] = OpConstant %[[#int]] 3 148468e674SAndrey Tretyakov 158468e674SAndrey Tretyakovdefine dso_local spir_func i32 @func() { 168468e674SAndrey Tretyakoventry: 178468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#st:]] = OpVariable %[[#structP]] 188468e674SAndrey Tretyakov %st = alloca %struct.ST, align 4 198468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#zero]] 208468e674SAndrey Tretyakov; CHECK-SPIRV: OpStore %[[#a]] %[[#one]] 218468e674SAndrey Tretyakov %a = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 0 228468e674SAndrey Tretyakov store i32 1, i32* %a, align 4 238468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#one]] 248468e674SAndrey Tretyakov; CHECK-SPIRV: OpStore %[[#b]] %[[#two]] 258468e674SAndrey Tretyakov %b = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 1 268468e674SAndrey Tretyakov store i32 2, i32* %b, align 4 278468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#c:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#two]] 288468e674SAndrey Tretyakov; CHECK-SPIRV: OpStore %[[#c]] %[[#three]] 298468e674SAndrey Tretyakov %c = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 2 308468e674SAndrey Tretyakov store i32 3, i32* %c, align 4 318468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#a1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#zero]] 328468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#a1]] 338468e674SAndrey Tretyakov %a1 = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 0 348468e674SAndrey Tretyakov %0 = load i32, i32* %a1, align 4 358468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#b1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#one]] 368468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#b1]] 378468e674SAndrey Tretyakov %b2 = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 1 388468e674SAndrey Tretyakov %1 = load i32, i32* %b2, align 4 398468e674SAndrey Tretyakov %add = add nsw i32 %0, %1 408468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#c1:]] = OpInBoundsPtrAccessChain %[[#intP]] %[[#st]] %[[#zero]] %[[#two]] 418468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpLoad %[[#int]] %[[#c1]] 428468e674SAndrey Tretyakov %c3 = getelementptr inbounds %struct.ST, %struct.ST* %st, i32 0, i32 2 438468e674SAndrey Tretyakov %2 = load i32, i32* %c3, align 4 448468e674SAndrey Tretyakov %add4 = add nsw i32 %add, %2 458468e674SAndrey Tretyakov ret i32 %add4 468468e674SAndrey Tretyakov} 47