1; RUN: llc < %s -asm-verbose=false -wasm-keep-registers | FileCheck %s --check-prefix=REG 2; RUN: llc < %s -asm-verbose=false | FileCheck %s 3 4target triple = "wasm32-unknown-unknown" 5 6; Test direct and indirect function call between mismatched signatures 7; CHECK-LABEL: foo: 8; CHECK-NEXT: .functype foo (i32, i32, i32, i32) -> () 9define swiftcc void @foo(i32, i32) { 10 ret void 11} 12@data = global i8* bitcast (void (i32, i32)* @foo to i8*) 13 14; CHECK-LABEL: bar: 15; CHECK-NEXT: .functype bar (i32, i32) -> () 16define swiftcc void @bar() { 17 %1 = load i8*, i8** @data 18; REG: call foo, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}} 19 call swiftcc void @foo(i32 1, i32 2) 20 21 %2 = bitcast i8* %1 to void (i32, i32)* 22; REG: call_indirect $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}} 23; CHECK: call_indirect (i32, i32, i32, i32) -> () 24 call swiftcc void %2(i32 1, i32 2) 25 26 %3 = bitcast i8* %1 to void (i32, i32, i32)* 27; REG: call_indirect $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}} 28; CHECK: call_indirect (i32, i32, i32, i32) -> () 29 call swiftcc void %3(i32 1, i32 2, i32 swiftself 3) 30 31 %err = alloca swifterror i32*, align 4 32 33 %4 = bitcast i8* %1 to void (i32, i32, i32**)* 34; REG: call_indirect $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}} 35; CHECK: call_indirect (i32, i32, i32, i32) -> () 36 call swiftcc void %4(i32 1, i32 2, i32** swifterror %err) 37 38 %5 = bitcast i8* %1 to void (i32, i32, i32, i32**)* 39; REG: call_indirect $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}} 40; CHECK: call_indirect (i32, i32, i32, i32) -> () 41 call swiftcc void %5(i32 1, i32 2, i32 swiftself 3, i32** swifterror %err) 42 43 ret void 44} 45