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