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...
16
17---
18# This tests 'try' and 'catch' instructions are correctly placed with respect to
19# EH_LABEL instructions.
20# CHECK-LABEL: name: eh_label_test
21name: eh_label_test
22liveins:
23  - { reg: '$arguments' }
24body: |
25  bb.0:
26    ; TRY should be before EH_LABEL wrappers of throwing calls
27    ; CHECK:      TRY
28    ; CHECK-NEXT: EH_LABEL
29    ; CHECK-NEXT: CALL @foo
30    ; CHECK-NEXT: EH_LABEL
31    successors: %bb.1, %bb.2
32    EH_LABEL <mcsymbol .Ltmp0>
33    CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
34    EH_LABEL <mcsymbol .Ltmp1>
35    BR %bb.2, implicit-def dead $arguments
36
37  bb.1 (landing-pad):
38  ; predecessors: %bb.0
39    successors: %bb.2
40    ; CATCH_ALL should be after an EH_LABEL at the beginning of an EH pad
41    ; CHECK:      EH_LABEL
42    ; CHECK-NEXT: CATCH_ALL
43    EH_LABEL <mcsymbol .Ltmp2>
44    CATCHRET %bb.2, %bb.0, implicit-def dead $arguments
45
46  bb.2:
47  ; predecessors: %bb.0, %bb.1
48    RETURN implicit-def dead $arguments
49...
50---
51# Unreachable EH pads should be removed by LateEHPrepare.
52# CHECK-LABEL: name: unreachable_ehpad_test
53name: unreachable_ehpad_test
54liveins:
55  - { reg: '$arguments' }
56body: |
57  ; CHECK: bb.0
58  bb.0:
59    successors: %bb.2
60    BR %bb.2, implicit-def dead $arguments
61
62  ; This EH pad is unreachable, so it should be removed by LateEHPrepare
63  ; CHECK-NOT: bb.1 (landing-pad)
64  bb.1 (landing-pad):
65    successors: %bb.2
66    EH_LABEL <mcsymbol .Ltmp2>
67    CATCHRET %bb.2, %bb.0, implicit-def dead $arguments
68
69  ; CHECK: bb.2
70  bb.2:
71  ; predecessors: %bb.0, %bb.1
72    RETURN implicit-def dead $arguments
73...
74