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 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 @eh_label_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 10 ret void 11 } 12 define void @unreachable_ehpad_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 13 ret void 14 } 15 define void @empty_cleanuppad_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { 16 ret void 17 } 18... 19 20--- 21# This tests 'try' and 'catch' instructions are correctly placed with respect to 22# EH_LABEL instructions. 23# CHECK-LABEL: name: eh_label_test 24name: eh_label_test 25liveins: 26 - { reg: '$arguments' } 27frameInfo: 28 hasCalls: true 29body: | 30 bb.0: 31 ; TRY should be before EH_LABEL wrappers of throwing calls 32 ; CHECK: bb.0 33 ; CHECK: TRY 34 ; CHECK-NEXT: EH_LABEL 35 ; CHECK-NEXT: CALL @foo 36 ; CHECK-NEXT: EH_LABEL 37 successors: %bb.1, %bb.2 38 EH_LABEL <mcsymbol .Ltmp0> 39 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 40 EH_LABEL <mcsymbol .Ltmp1> 41 BR %bb.2, implicit-def dead $arguments 42 43 bb.1 (landing-pad): 44 ; predecessors: %bb.0 45 successors: %bb.2 46 ; CATCH_ALL should be after EH_LABELs in the beginning of an EH pad. 47 ; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests 48 ; that.) GLOBAL_SET should follow right after that. 49 ; CHECK: bb.1 50 ; CHECK: EH_LABEL 51 ; CHECK: EH_LABEL 52 ; CHECK-NEXT: CATCH_ALL 53 ; CHECK-NEXT: GLOBAL_SET_I32 54 EH_LABEL <mcsymbol .Ltmp2> 55 EH_LABEL <mcsymbol .Ltmp2> 56 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments 57 58 bb.2: 59 ; predecessors: %bb.0, %bb.1 60 RETURN implicit-def dead $arguments 61... 62 63--- 64# Unreachable EH pads should be removed by LateEHPrepare. 65# CHECK-LABEL: name: unreachable_ehpad_test 66name: unreachable_ehpad_test 67liveins: 68 - { reg: '$arguments' } 69body: | 70 ; CHECK: bb.0 71 bb.0: 72 successors: %bb.2 73 BR %bb.2, implicit-def dead $arguments 74 75 ; This EH pad is unreachable, so it should be removed by LateEHPrepare 76 ; CHECK-NOT: bb.1 (landing-pad) 77 bb.1 (landing-pad): 78 successors: %bb.2 79 EH_LABEL <mcsymbol .Ltmp2> 80 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments 81 82 ; CHECK: bb.2 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 implicit-def dead $arguments 110 111 bb.3: 112 RETURN implicit-def dead $arguments 113... 114