1# RUN: llc -mtriple=wasm32-unknown-unknown -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 i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 9 ret void 10 } 11 define void @unreachable_ehpad_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 12 ret void 13 } 14 define void @empty_cleanuppad_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 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 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 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 ; CHECK: bb.2 82 bb.2: 83 ; predecessors: %bb.0, %bb.1 84 RETURN implicit-def dead $arguments 85... 86 87--- 88# Regression test for a bug that LateEHPrepare::addCatchAll didn't handle empty 89# cleanup pads. (It tried to get debug info from end() iterator.) 90name: empty_cleanuppad_test 91liveins: 92 - { reg: '$arguments' } 93body: | 94 bb.0: 95 successors: %bb.1, %bb.3 96 EH_LABEL <mcsymbol .Ltmp0> 97 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 98 EH_LABEL <mcsymbol .Ltmp1> 99 BR %bb.3, implicit-def dead $arguments 100 101 ;; Empty cleanuppad 102 bb.1 (landing-pad): 103 successors: %bb.2 104 EH_LABEL <mcsymbol .Ltmp2> 105 106 bb.2: 107 successors: %bb.3 108 CLEANUPRET implicit-def dead $arguments 109 110 bb.3: 111 RETURN implicit-def dead $arguments 112... 113