1; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s 2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown --translator-compatibility-mode %s -o - -filetype=obj | spirv-val %} 3; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} 4 5; CHECK-DAG: OpName %[[Test1:.*]] "test1" 6; CHECK-DAG: OpName %[[Foo:.*]] "foo" 7; CHECK-DAG: OpName %[[Bar:.*]] "bar" 8; CHECK-DAG: OpName %[[Test2:.*]] "test2" 9 10; CHECK-DAG: %[[Long:.*]] = OpTypeInt 64 0 11; CHECK-DAG: %[[Array:.*]] = OpTypeArray %[[Long]] %[[#]] 12; CHECK-DAG: %[[Struct1:.*]] = OpTypeStruct %[[Array]] 13; CHECK-DAG: %[[Struct2:.*]] = OpTypeStruct %[[Struct1]] 14; CHECK-DAG: %[[StructPtr:.*]] = OpTypePointer Function %[[Struct2]] 15; CHECK-DAG: %[[Bool:.*]] = OpTypeBool 16; CHECK-DAG: %[[FooType:.*]] = OpTypeFunction %[[StructPtr]] %[[StructPtr]] %[[StructPtr]] %[[Bool]] 17; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 0 18; CHECK-DAG: %[[CharPtr:.*]] = OpTypePointer Function %[[Char]] 19 20; CHECK: %[[Test1]] = OpFunction 21; CHECK: OpFunctionCall %[[StructPtr]] %[[Foo]] 22; CHECK: OpFunctionCall %[[CharPtr]] %[[Bar]] 23; CHECK: OpFunctionEnd 24 25; CHECK: %[[Foo]] = OpFunction %[[StructPtr]] None %[[FooType]] 26; CHECK: %[[Arg1:.*]] = OpFunctionParameter %[[StructPtr]] 27; CHECK: %[[Arg2:.*]] = OpFunctionParameter 28; CHECK: %[[Sw:.*]] = OpFunctionParameter 29; CHECK: %[[Res:.*]] = OpInBoundsPtrAccessChain %[[StructPtr]] %[[Arg1]] %[[#]] 30; CHECK: OpReturnValue %[[Res]] 31; CHECK: OpReturnValue %[[Arg2]] 32 33; CHECK: %[[Bar]] = OpFunction %[[CharPtr]] None %[[#]] 34; CHECK: %[[BarArg:.*]] = OpFunctionParameter %[[StructPtr]] 35; CHECK: %[[BarArgCasted:.*]] = OpBitcast %[[CharPtr]] %[[BarArg]] 36; CHECK: %[[BarRes:.*]] = OpInBoundsPtrAccessChain %[[CharPtr]] %[[BarArgCasted]] %[[#]] 37; CHECK: %[[BarResStruct:.*]] = OpInBoundsPtrAccessChain %[[StructPtr]] %[[#]] %[[#]] 38; CHECK: %[[BarResStructCasted:.*]] = OpBitcast %[[CharPtr]] %[[BarResStruct]] 39; CHECK: OpReturnValue %[[BarResStructCasted]] 40; CHECK: OpReturnValue %[[BarRes]] 41 42; CHECK: %[[Test2]] = OpFunction 43; CHECK: OpFunctionCall %[[StructPtr]] %[[Foo]] 44; CHECK: OpFunctionCall %[[CharPtr]] %[[Bar]] 45; CHECK: OpFunctionEnd 46 47%struct = type { %array } 48%array = type { [1 x i64] } 49 50define spir_func void @test1(ptr %arg1, ptr %arg2, i1 %sw) { 51entry: 52 %r1 = call ptr @foo(ptr %arg1, ptr %arg2, i1 %sw) 53 %r2 = call ptr @bar(ptr %arg1, i1 %sw) 54 ret void 55} 56 57define spir_func ptr @foo(ptr %arg1, ptr %arg2, i1 %sw) { 58entry: 59 br i1 %sw, label %exit, label %sw1 60sw1: 61 %result = getelementptr inbounds %struct, ptr %arg1, i64 100 62 ret ptr %result 63exit: 64 ret ptr %arg2 65} 66 67define spir_func ptr @bar(ptr %arg1, i1 %sw) { 68entry: 69 %charptr = getelementptr inbounds i8, ptr %arg1, i64 0 70 br i1 %sw, label %exit, label %sw1 71sw1: 72 %result = getelementptr inbounds %struct, ptr %arg1, i64 100 73 ret ptr %result 74exit: 75 ret ptr %charptr 76} 77 78define spir_func void @test2(ptr %arg1, ptr %arg2, i1 %sw) { 79entry: 80 %r1 = call ptr @foo(ptr %arg1, ptr %arg2, i1 %sw) 81 %r2 = call ptr @bar(ptr %arg1, i1 %sw) 82 ret void 83} 84