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