1; RUN: llc < %s -asm-verbose=false -enable-emscripten-sjlj -wasm-keep-registers | FileCheck %s 2 3target triple = "wasm32-unknown-unknown" 4 5%struct.__jmp_buf_tag = type { [6 x i32], i32, [32 x i32] } 6 7declare i32 @setjmp(ptr) #0 8declare {i32, i32} @returns_struct() 9 10; Test the combination of backend legalization of large return types and the 11; Emscripten sjlj transformation 12define {i32, i32} @legalized_to_sret() { 13entry: 14 %env = alloca [1 x %struct.__jmp_buf_tag], align 16 15 %call = call i32 @setjmp(ptr %env) #0 16 ; This is the function pointer to pass to invoke. 17 ; It needs to be the first argument (that's what we're testing here) 18 ; CHECK: i32.const $push[[FPTR:[0-9]+]]=, returns_struct 19 ; This is the sret stack region (as an offset from the stack pointer local) 20 ; CHECK: call invoke_vi, $pop[[FPTR]] 21 %ret = call {i32, i32} @returns_struct() 22 ret {i32, i32} %ret 23} 24 25attributes #0 = { returns_twice } 26