| # 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 | |
| --- | | |
| target triple = "wasm32-unknown-unknown" | |
| declare i32 @__gxx_wasm_personality_v0(ptr) | |
| declare void @foo() | |
| define void @eh_label_test() personality ptr @__gxx_wasm_personality_v0 { | |
| ret void | |
| } | |
| define void @unreachable_ehpad_test() personality ptr @__gxx_wasm_personality_v0 { | |
| ret void | |
| } | |
| define void @empty_cleanuppad_test() personality ptr @__gxx_wasm_personality_v0 { | |
| ret void | |
| } | |
| ... | |
| --- | |
| # This tests 'catch' instructions are correctly placed with respect to | |
| # EH_LABEL instructions in the beginning of an EH pad. | |
| # CHECK-LABEL: name: eh_label_test | |
| name: eh_label_test | |
| liveins: | |
| - { reg: '$arguments' } | |
| frameInfo: | |
| hasCalls: true | |
| body: | | |
| bb.0: | |
| ; CHECK: bb.0 | |
| ; CHECK: TRY | |
| ; CHECK-NEXT: CALL @foo | |
| successors: %bb.1, %bb.2 | |
| CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 | |
| BR %bb.2, implicit-def dead $arguments | |
| bb.1 (landing-pad): | |
| ; predecessors: %bb.0 | |
| successors: %bb.2 | |
| ; CATCH_ALL_LEGACY should be after EH_LABELs in the beginning of an EH pad. | |
| ; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests | |
| ; that.) GLOBAL_SET should follow right after that. | |
| ; CHECK: bb.1 | |
| ; CHECK: EH_LABEL | |
| ; CHECK: EH_LABEL | |
| ; CHECK-NEXT: CATCH_ALL_LEGACY | |
| ; CHECK-NEXT: GLOBAL_SET_I32 | |
| EH_LABEL <mcsymbol .Ltmp2> | |
| EH_LABEL <mcsymbol .Ltmp2> | |
| CATCHRET %bb.2, %bb.1, implicit-def dead $arguments | |
| bb.2: | |
| ; predecessors: %bb.0, %bb.1 | |
| RETURN implicit-def dead $arguments | |
| ... | |
| --- | |
| # Unreachable EH pads should be removed by LateEHPrepare. | |
| # CHECK-LABEL: name: unreachable_ehpad_test | |
| name: unreachable_ehpad_test | |
| liveins: | |
| - { reg: '$arguments' } | |
| body: | | |
| ; CHECK: bb.0 | |
| bb.0: | |
| successors: %bb.2 | |
| BR %bb.2, implicit-def dead $arguments | |
| ; This EH pad is unreachable, so it should be removed by LateEHPrepare | |
| ; CHECK-NOT: bb.1 (landing-pad) | |
| bb.1 (landing-pad): | |
| successors: %bb.2 | |
| EH_LABEL <mcsymbol .Ltmp2> | |
| CATCHRET %bb.2, %bb.1, implicit-def dead $arguments | |
| ; This BB should remain (it will be renumbered to bb.1) | |
| ; CHECK: bb.1 | |
| bb.2: | |
| ; predecessors: %bb.0, %bb.1 | |
| RETURN implicit-def dead $arguments | |
| ... | |
| --- | |
| # Regression test for a bug that LateEHPrepare::addCatchAll didn't handle empty | |
| # cleanup pads. (It tried to get debug info from end() iterator.) | |
| name: empty_cleanuppad_test | |
| liveins: | |
| - { reg: '$arguments' } | |
| body: | | |
| bb.0: | |
| successors: %bb.1, %bb.3 | |
| CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 | |
| BR %bb.3, implicit-def dead $arguments | |
| ;; Empty cleanuppad | |
| bb.1 (landing-pad): | |
| successors: %bb.2 | |
| EH_LABEL <mcsymbol .Ltmp2> | |
| bb.2: | |
| successors: %bb.3 | |
| CLEANUPRET %bb.1, implicit-def dead $arguments | |
| bb.3: | |
| RETURN implicit-def dead $arguments | |
| ... |