1# RUN: llc -mtriple=wasm32-unknown-unknown -wasm-use-legacy-eh -exception-model=wasm -mattr=+exception-handling -run-pass wasm-late-eh-prepare -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 @eh_label_test() personality ptr @__gxx_wasm_personality_v0 { 9 ret void 10 } 11 define void @unreachable_ehpad_test() personality ptr @__gxx_wasm_personality_v0 { 12 ret void 13 } 14 define void @empty_cleanuppad_test() personality ptr @__gxx_wasm_personality_v0 { 15 ret void 16 } 17... 18 19--- 20# This tests 'try' and 'catch' instructions are correctly placed with respect to 21# EH_LABEL instructions. 22# CHECK-LABEL: name: eh_label_test 23name: eh_label_test 24liveins: 25 - { reg: '$arguments' } 26frameInfo: 27 hasCalls: true 28body: | 29 bb.0: 30 ; TRY should be before EH_LABEL wrappers of throwing calls 31 ; CHECK: bb.0 32 ; CHECK: TRY 33 ; CHECK-NEXT: EH_LABEL 34 ; CHECK-NEXT: CALL @foo 35 ; CHECK-NEXT: EH_LABEL 36 successors: %bb.1, %bb.2 37 EH_LABEL <mcsymbol .Ltmp0> 38 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 39 EH_LABEL <mcsymbol .Ltmp1> 40 BR %bb.2, implicit-def dead $arguments 41 42 bb.1 (landing-pad): 43 ; predecessors: %bb.0 44 successors: %bb.2 45 ; CATCH_ALL_LEGACY should be after EH_LABELs in the beginning of an EH pad. 46 ; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests 47 ; that.) GLOBAL_SET should follow right after that. 48 ; CHECK: bb.1 49 ; CHECK: EH_LABEL 50 ; CHECK: EH_LABEL 51 ; CHECK-NEXT: CATCH_ALL_LEGACY 52 ; CHECK-NEXT: GLOBAL_SET_I32 53 EH_LABEL <mcsymbol .Ltmp2> 54 EH_LABEL <mcsymbol .Ltmp2> 55 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments 56 57 bb.2: 58 ; predecessors: %bb.0, %bb.1 59 RETURN implicit-def dead $arguments 60... 61 62--- 63# Unreachable EH pads should be removed by LateEHPrepare. 64# CHECK-LABEL: name: unreachable_ehpad_test 65name: unreachable_ehpad_test 66liveins: 67 - { reg: '$arguments' } 68body: | 69 ; CHECK: bb.0 70 bb.0: 71 successors: %bb.2 72 BR %bb.2, implicit-def dead $arguments 73 74 ; This EH pad is unreachable, so it should be removed by LateEHPrepare 75 ; CHECK-NOT: bb.1 (landing-pad) 76 bb.1 (landing-pad): 77 successors: %bb.2 78 EH_LABEL <mcsymbol .Ltmp2> 79 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments 80 81 ; This BB should remain (it will be renumbered to bb.1) 82 ; CHECK: bb.1 83 bb.2: 84 ; predecessors: %bb.0, %bb.1 85 RETURN implicit-def dead $arguments 86... 87 88--- 89# Regression test for a bug that LateEHPrepare::addCatchAll didn't handle empty 90# cleanup pads. (It tried to get debug info from end() iterator.) 91name: empty_cleanuppad_test 92liveins: 93 - { reg: '$arguments' } 94body: | 95 bb.0: 96 successors: %bb.1, %bb.3 97 EH_LABEL <mcsymbol .Ltmp0> 98 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 99 EH_LABEL <mcsymbol .Ltmp1> 100 BR %bb.3, implicit-def dead $arguments 101 102 ;; Empty cleanuppad 103 bb.1 (landing-pad): 104 successors: %bb.2 105 EH_LABEL <mcsymbol .Ltmp2> 106 107 bb.2: 108 successors: %bb.3 109 CLEANUPRET %bb.1, implicit-def dead $arguments 110 111 bb.3: 112 RETURN implicit-def dead $arguments 113... 114