114 lines · plain
1# RUN: llc -mtriple=wasm32-unknown-unknown -wasm-use-legacy-eh -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling -run-pass wasm-late-eh-prepare -run-pass wasm-cfg-stackify %s -o - | FileCheck %s2 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 void10 }11 define void @unreachable_ehpad_test() personality ptr @__gxx_wasm_personality_v0 {12 ret void13 }14 define void @empty_cleanuppad_test() personality ptr @__gxx_wasm_personality_v0 {15 ret void16 }17...18 19---20# This tests 'try' and 'catch' instructions are correctly placed with respect to21# EH_LABEL instructions.22# CHECK-LABEL: name: eh_label_test23name: eh_label_test24liveins:25 - { reg: '$arguments' }26frameInfo:27 hasCalls: true28body: |29 bb.0:30 ; TRY should be before EH_LABEL wrappers of throwing calls31 ; CHECK: bb.032 ; CHECK: TRY33 ; CHECK-NEXT: EH_LABEL34 ; CHECK-NEXT: CALL @foo35 ; CHECK-NEXT: EH_LABEL36 successors: %bb.1, %bb.237 EH_LABEL <mcsymbol .Ltmp0>38 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp6439 EH_LABEL <mcsymbol .Ltmp1>40 BR %bb.2, implicit-def dead $arguments41 42 bb.1 (landing-pad):43 ; predecessors: %bb.044 successors: %bb.245 ; 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 tests47 ; that.) GLOBAL_SET should follow right after that.48 ; CHECK: bb.149 ; CHECK: EH_LABEL50 ; CHECK: EH_LABEL51 ; CHECK-NEXT: CATCH_ALL_LEGACY52 ; CHECK-NEXT: GLOBAL_SET_I3253 EH_LABEL <mcsymbol .Ltmp2>54 EH_LABEL <mcsymbol .Ltmp2>55 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments56 57 bb.2:58 ; predecessors: %bb.0, %bb.159 RETURN implicit-def dead $arguments60...61 62---63# Unreachable EH pads should be removed by LateEHPrepare.64# CHECK-LABEL: name: unreachable_ehpad_test65name: unreachable_ehpad_test66liveins:67 - { reg: '$arguments' }68body: |69 ; CHECK: bb.070 bb.0:71 successors: %bb.272 BR %bb.2, implicit-def dead $arguments73 74 ; This EH pad is unreachable, so it should be removed by LateEHPrepare75 ; CHECK-NOT: bb.1 (landing-pad)76 bb.1 (landing-pad):77 successors: %bb.278 EH_LABEL <mcsymbol .Ltmp2>79 CATCHRET %bb.2, %bb.1, implicit-def dead $arguments80 81 ; This BB should remain (it will be renumbered to bb.1)82 ; CHECK: bb.183 bb.2:84 ; predecessors: %bb.0, %bb.185 RETURN implicit-def dead $arguments86...87 88---89# Regression test for a bug that LateEHPrepare::addCatchAll didn't handle empty90# cleanup pads. (It tried to get debug info from end() iterator.)91name: empty_cleanuppad_test92liveins:93 - { reg: '$arguments' }94body: |95 bb.0:96 successors: %bb.1, %bb.397 EH_LABEL <mcsymbol .Ltmp0>98 CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp6499 EH_LABEL <mcsymbol .Ltmp1>100 BR %bb.3, implicit-def dead $arguments101 102 ;; Empty cleanuppad103 bb.1 (landing-pad):104 successors: %bb.2105 EH_LABEL <mcsymbol .Ltmp2>106 107 bb.2:108 successors: %bb.3109 CLEANUPRET %bb.1, implicit-def dead $arguments110 111 bb.3:112 RETURN implicit-def dead $arguments113...114