1; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s 2 3; CHECK-DAG: OpName [[FUN:%.+]] "fun" 4; CHECK-DAG: OpName [[FOO:%.+]] "foo" 5; CHECK-DAG: OpName [[GOO:%.+]] "goo" 6 7; CHECK-NOT: DAG-FENCE 8 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]] 19 20 21declare i32 @fun(i32 %value) 22 23; Check for @fun declaration 24; CHECK: [[FUN]] = OpFunction [[I32]] None [[FN1]] 25; CHECK-NEXT: OpFunctionParameter [[I32]] 26; CHECK-NEXT: OpFunctionEnd 27 28 29define 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 33} 34 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 44 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 52 53define 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 58} 59 60; TODO: test tailcall? 61