1 ; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
3 ; CHECK-DAG: OpName [[FUN:%.+]] "fun"
4 ; CHECK-DAG: OpName [[FOO:%.+]] "foo"
5 ; CHECK-DAG: OpName [[GOO:%.+]] "goo"
9 ; CHECK-DAG: [[I16:%.+]] = OpTypeInt 16
10 ; CHECK-DAG: [[I32:%.+]] = OpTypeInt 32
11 ; CHECK-DAG: [[I64:%.+]] = OpTypeInt 64
12 ; CHECK-DAG: [[FN3:%.+]] = OpTypeFunction [[I32]] [[I32]] [[I16]] [[I64]]
13 ; CHECK-DAG: [[PAIR:%.+]] = OpTypeStruct [[I32]] [[I16]]
14 ; CHECK-DAG: [[FN1:%.+]] = OpTypeFunction [[I32]] [[I32]]
15 ; CHECK-DAG: [[FN2:%.+]] = OpTypeFunction [[I32]] [[PAIR]] [[I64]]
16 ;; According to the Specification, the OpUndef can be defined in Function.
17 ;; But the Specification also recommends defining it here. So we enforce that.
18 ; CHECK-DAG: [[UNDEF:%.+]] = OpUndef [[PAIR]]
21 declare i32 @fun(i32 %value)
23 ;; Check for @fun declaration
24 ; CHECK: [[FUN]] = OpFunction [[I32]] None [[FN1]]
25 ; CHECK-NEXT: OpFunctionParameter [[I32]]
26 ; CHECK-NEXT: OpFunctionEnd
29 define i32 @foo({i32, i16} %in, i64 %unused) {
30 %first = extractvalue {i32, i16} %in, 0
31 %bar = call i32 @fun(i32 %first)
35 ; CHECK: [[GOO]] = OpFunction [[I32]] None [[FN3]]
36 ; CHECK-NEXT: [[A:%.+]] = OpFunctionParameter [[I32]]
37 ; CHECK-NEXT: [[B:%.+]] = OpFunctionParameter [[I16]]
38 ; CHECK-NEXT: [[C:%.+]] = OpFunctionParameter [[I64]]
39 ; CHECK: [[AGG1:%.+]] = OpCompositeInsert [[PAIR]] [[A]] [[UNDEF]] 0
40 ; CHECK: [[AGG2:%.+]] = OpCompositeInsert [[PAIR]] [[B]] [[AGG1]] 1
41 ; CHECK: [[RET:%.+]] = OpFunctionCall [[I32]] [[FOO]] [[AGG2]] [[C]]
42 ; CHECK: OpReturnValue [[RET]]
43 ; CHECK: OpFunctionEnd
45 ; CHECK: [[FOO]] = OpFunction [[I32]] None [[FN2]]
46 ; CHECK-NEXT: [[IN:%.+]] = OpFunctionParameter [[PAIR]]
47 ; CHECK-NEXT: OpFunctionParameter [[I64]]
48 ; CHECK: [[FIRST:%.+]] = OpCompositeExtract [[I32]] [[IN]] 0
49 ; CHECK: [[BAR:%.+]] = OpFunctionCall [[I32]] [[FUN]] [[FIRST]]
50 ; CHECK: OpReturnValue [[BAR]]
51 ; CHECK: OpFunctionEnd
53 define i32 @goo(i32 %a, i16 %b, i64 %c) {
54 %agg1 = insertvalue {i32, i16} undef, i32 %a, 0
55 %agg2 = insertvalue {i32, i16} %agg1, i16 %b, 1
56 %ret = call i32 @foo({i32, i16} %agg2, i64 %c)
60 ;; TODO: test tailcall?