Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / SPIRV / instructions / call-complex-function.ll
bloba5b40b2e72c8daa6335140ac52a3e9642bef154c
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"
7 ; CHECK-NOT: DAG-FENCE
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)
32   ret i32 %bar
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)
57   ret i32 %ret
60 ;; TODO: test tailcall?