xref: /llvm-project/llvm/test/CodeGen/SPIRV/instructions/ret-type.ll (revision b5132b7d044a5bc83eba9b09bd158cd77a511403)
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