1# RUN: llc -mtriple=wasm32-unknown-unknown -exception-model=wasm -mattr=+exception-handling -run-pass wasm-cfg-stackify %s -o - | FileCheck %s 2 3--- | 4 target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 5 target triple = "wasm32-unknown-unknown" 6 7 declare i32 @__gxx_wasm_personality_v0(...) 8 declare void @foo() 9 define void @rethrow_arg_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 10 ret void 11 } 12 define i32 @fix_end_function_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 13 ret i32 0 14 } 15... 16 17--- 18# CHECK-LABEL: name: rethrow_arg_test 19name: rethrow_arg_test 20liveins: 21 - { reg: '$arguments' } 22body: | 23 bb.0: 24 successors: %bb.1, %bb.3 25 ; CHECK: bb.0: 26 ; CHECK: TRY 27 EH_LABEL <mcsymbol .Ltmp0> 28 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 29 EH_LABEL <mcsymbol .Ltmp1> 30 BR %bb.3, implicit-def dead $arguments 31 32 bb.1 (landing-pad): 33 successors: %bb.2 34 ; CHECK: bb.1 (landing-pad): 35 ; CHECK: CATCH 36 ; CHECK: TRY 37 ; This RETHROW rethrows the exception caught by this BB's CATCH, but after 38 ; CFGStackify a TRY is placed between the CATCH and this RETHROW, so after 39 ; CFGStackify its immediate argument should become not 0, but 1. 40 ; CHECK: RETHROW 1 41 EH_LABEL <mcsymbol .Ltmp2> 42 %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments 43 RETHROW 0, implicit-def dead $arguments 44 45 bb.2 (landing-pad): 46 ; CHECK: bb.2 (landing-pad): 47 ; CHECK: CATCH 48 ; CHECK: RETHROW 0 49 EH_LABEL <mcsymbol .Ltmp3> 50 %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments 51 RETHROW 0, implicit-def dead $arguments 52 53 bb.3: 54 ; CHECK: bb.3: 55 ; CHECK: END_TRY 56 ; CHECK: END_TRY 57 RETURN implicit-def dead $arguments 58... 59 60--- 61# This function has i32 return type and the end of the function is unreachable, 62# so CFGStackify's fixEndsAtEndOfFunction() propagates the return type while 63# they encounter 'end' or 'delegate'. This is a regression test for a bug that 64# we only handled 'end' but not 'delegate'. 65# CHECK-LABEL: name: fix_end_function_test 66name: fix_end_function_test 67liveins: 68 - { reg: '$arguments' } 69machineFunctionInfo: 70 params: [ ] 71 results: [ i32 ] 72 wasmEHFuncInfo: 73 3: 4 74body: | 75 ; CHECK: TRY 127 76 ; CHECK: TRY 127 77 ; CHECK: CALL @foo 78 ; CHECK: TRY 64 79 ; CHECK: CALL @foo 80 ; CHECK: DELEGATE 81 ; CHECK: RETURN 82 ; CHECK: CATCH 83 ;; This TRY should have the return type i32 (127) 84 ; CHECK: TRY 127 85 ; CHECK: RETHROW 86 ; CHECK: DELEGATE 87 ; CHECK: END_TRY 88 ; CHECK: CATCH 89 ; CHECK: RETHROW 90 ; CHECK: END_TRY 91 bb.0: 92 successors: %bb.1, %bb.3 93 EH_LABEL <mcsymbol .Ltmp0> 94 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 95 EH_LABEL <mcsymbol .Ltmp1> 96 97 bb.1: 98 successors: %bb.2, %bb.4 99 EH_LABEL <mcsymbol .Ltmp2> 100 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 101 EH_LABEL <mcsymbol .Ltmp3> 102 103 bb.2: 104 %0:i32 = CONST_I32 3, implicit-def dead $arguments 105 RETURN %0:i32, implicit-def dead $arguments 106 107 bb.3 (landing-pad): 108 EH_LABEL <mcsymbol .Ltmp4> 109 %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments 110 RETHROW 0, implicit-def dead $arguments 111 112 bb.4 (landing-pad): 113 EH_LABEL <mcsymbol .Ltmp5> 114 %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments 115 RETHROW 0, implicit-def dead $arguments 116... 117