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' }
24frameInfo:
25  hasCalls: true
26body: |
27  bb.0:
28    ; TRY should be before EH_LABEL wrappers of throwing calls
29    ; CHECK:      bb.0
30    ; CHECK:      TRY
31    ; CHECK-NEXT: EH_LABEL
32    ; CHECK-NEXT: CALL @foo
33    ; CHECK-NEXT: EH_LABEL
34    successors: %bb.1, %bb.2
35    EH_LABEL <mcsymbol .Ltmp0>
36    CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
37    EH_LABEL <mcsymbol .Ltmp1>
38    BR %bb.2, implicit-def dead $arguments
39
40  bb.1 (landing-pad):
41  ; predecessors: %bb.0
42    successors: %bb.2
43    ; CATCH_ALL should be after EH_LABELs in the beginning of an EH pad.
44    ; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests
45    ; that.) GLOBAL_SET should follow right after that.
46    ; CHECK:      bb.1
47    ; CHECK:      EH_LABEL
48    ; CHECK:      EH_LABEL
49    ; CHECK-NEXT: CATCH_ALL
50    ; CHECK-NEXT: GLOBAL_SET_I32
51    EH_LABEL <mcsymbol .Ltmp2>
52    EH_LABEL <mcsymbol .Ltmp2>
53    CATCHRET %bb.2, %bb.1, implicit-def dead $arguments
54
55  bb.2:
56  ; predecessors: %bb.0, %bb.1
57    RETURN implicit-def dead $arguments
58...
59
60---
61# Unreachable EH pads should be removed by LateEHPrepare.
62# CHECK-LABEL: name: unreachable_ehpad_test
63name: unreachable_ehpad_test
64liveins:
65  - { reg: '$arguments' }
66body: |
67  ; CHECK: bb.0
68  bb.0:
69    successors: %bb.2
70    BR %bb.2, implicit-def dead $arguments
71
72  ; This EH pad is unreachable, so it should be removed by LateEHPrepare
73  ; CHECK-NOT: bb.1 (landing-pad)
74  bb.1 (landing-pad):
75    successors: %bb.2
76    EH_LABEL <mcsymbol .Ltmp2>
77    CATCHRET %bb.2, %bb.1, implicit-def dead $arguments
78
79  ; CHECK: bb.2
80  bb.2:
81  ; predecessors: %bb.0, %bb.1
82    RETURN implicit-def dead $arguments
83...
84