110 lines · plain
1; RUN: llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s2 3; CHECK-DAG: [[uint:%[0-9]+]] = OpTypeInt 32 04 5%A = type {6 i32,7 i328}9; CHECK-DAG: [[A:%[0-9]+]] = OpTypeStruct [[uint]] [[uint]]10 11%B = type {12 %A,13 i32,14 %A15}16; CHECK-DAG: [[B:%[0-9]+]] = OpTypeStruct [[A]] [[uint]] [[A]]17 18; CHECK-DAG: [[uint_0:%[0-9]+]] = OpConstant [[uint]] 019; CHECK-DAG: [[uint_1:%[0-9]+]] = OpConstant [[uint]] 120; CHECK-DAG: [[uint_2:%[0-9]+]] = OpConstant [[uint]] 221 22; CHECK-DAG: [[ptr_uint:%[0-9]+]] = OpTypePointer Function [[uint]]23; CHECK-DAG: [[ptr_A:%[0-9]+]] = OpTypePointer Function [[A]]24; CHECK-DAG: [[ptr_B:%[0-9]+]] = OpTypePointer Function [[B]]25 26define internal ptr @gep_B_0(ptr %base) {27; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]28; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_A]] [[tmp]] [[uint_0]]29 %res = getelementptr %B, ptr %base, i32 0, i32 030 ret ptr %res31}32 33define internal ptr @gep_inbounds_B_0(ptr %base) {34; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]35; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_A]] [[tmp]] [[uint_0]]36 %res = getelementptr inbounds %B, ptr %base, i32 0, i32 037 ret ptr %res38}39 40define internal ptr @gep_B_1(ptr %base) {41; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]42; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[tmp]] [[uint_1]]43 %res = getelementptr %B, ptr %base, i32 0, i32 144 ret ptr %res45}46 47define internal ptr @gep_inbounds_B_1(ptr %base) {48; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]49; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_uint]] [[tmp]] [[uint_1]]50 %res = getelementptr inbounds %B, ptr %base, i32 0, i32 151 ret ptr %res52}53 54define internal ptr @gep_B_2(ptr %base) {55; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]56; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_A]] [[tmp]] [[uint_2]]57 %res = getelementptr %B, ptr %base, i32 0, i32 258 ret ptr %res59}60 61define internal ptr @gep_inbounds_B_2(ptr %base) {62; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]63; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_A]] [[tmp]] [[uint_2]]64 %res = getelementptr inbounds %B, ptr %base, i32 0, i32 265 ret ptr %res66}67 68define internal ptr @gep_B_2_1(ptr %base) {69; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]70; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[tmp]] [[uint_2]] [[uint_1]]71 %res = getelementptr %B, ptr %base, i32 0, i32 2, i32 172 ret ptr %res73}74 75define internal ptr @gep_inbounds_B_2_1(ptr %base) {76; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]77; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_uint]] [[tmp]] [[uint_2]] [[uint_1]]78 %res = getelementptr inbounds %B, ptr %base, i32 0, i32 2, i32 179 ret ptr %res80}81 82define internal ptr @gep_B_2_A_1(ptr %base) {83; CHECK: [[tmp:%[0-9]+]] = OpFunctionParameter [[ptr_B]]84; CHECK: [[x:%[0-9]+]] = OpAccessChain [[ptr_A]] [[tmp]] [[uint_2]]85; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[x]] [[uint_1]]86 %x = getelementptr %B, ptr %base, i32 0, i32 287 %res = getelementptr %A, ptr %x, i32 0, i32 188 ret ptr %res89}90 91define void @main() #1 {92entry:93 %0 = alloca %B, align 494; CHECK: [[tmp:%[0-9]+]] = OpVariable [[ptr_B]] Function95 96 %1 = call ptr @gep_B_0(ptr %0)97 %2 = call ptr @gep_inbounds_B_0(ptr %0)98 %3 = call ptr @gep_B_1(ptr %0)99 %4 = call ptr @gep_inbounds_B_1(ptr %0)100 %5 = call ptr @gep_B_2(ptr %0)101 %6 = call ptr @gep_inbounds_B_2(ptr %0)102 %7 = call ptr @gep_B_2_1(ptr %0)103 %8 = call ptr @gep_inbounds_B_2_1(ptr %0)104 %10 = call ptr @gep_B_2_A_1(ptr %0)105 106 ret void107}108 109attributes #1 = { "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" }110