[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / cfg-stackify-eh.mir
blob0386410d1b6120ccdcc9611971e8f77f2e216512
1 # RUN: llc -mtriple=wasm32-unknown-unknown -exception-model=wasm -mattr=+exception-handling -run-pass wasm-cfg-stackify %s -o - | FileCheck %s
3 --- |
4   target triple = "wasm32-unknown-unknown"
6   declare i32 @__gxx_wasm_personality_v0(...)
7   declare void @foo()
8   define void @rethrow_arg_test() personality ptr @__gxx_wasm_personality_v0 {
9     ret void
10   }
11   define i32 @fix_end_function_test() personality ptr @__gxx_wasm_personality_v0 {
12     ret i32 0
13   }
14 ...
16 ---
17 # CHECK-LABEL: name: rethrow_arg_test
18 name: rethrow_arg_test
19 liveins:
20   - { reg: '$arguments' }
21 body: |
22   bb.0:
23     successors: %bb.1, %bb.3
24     ; CHECK: bb.0:
25     ; CHECK: TRY
26     EH_LABEL <mcsymbol .Ltmp0>
27     CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
28     EH_LABEL <mcsymbol .Ltmp1>
29     BR %bb.3, implicit-def dead $arguments
31   bb.1 (landing-pad):
32     successors: %bb.2
33     ; CHECK: bb.1 (landing-pad):
34     ; CHECK: CATCH
35     ; CHECK: TRY
36     ; This RETHROW rethrows the exception caught by this BB's CATCH, but after
37     ; CFGStackify a TRY is placed between the CATCH and this RETHROW, so after
38     ; CFGStackify its immediate argument should become not 0, but 1.
39     ; CHECK: RETHROW 1
40     EH_LABEL <mcsymbol .Ltmp2>
41     %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments
42     RETHROW 0, implicit-def dead $arguments
44   bb.2 (landing-pad):
45     ; CHECK: bb.2 (landing-pad):
46     ; CHECK: CATCH
47     ; CHECK: RETHROW 0
48     EH_LABEL <mcsymbol .Ltmp3>
49     %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments
50     RETHROW 0, implicit-def dead $arguments
52   bb.3:
53     ; CHECK: bb.3:
54     ; CHECK: END_TRY
55     ; CHECK: END_TRY
56     RETURN implicit-def dead $arguments
57 ...
59 ---
60 # This function has i32 return type and the end of the function is unreachable,
61 # so CFGStackify's fixEndsAtEndOfFunction() propagates the return type while
62 # they encounter 'end' or 'delegate'. This is a regression test for a bug that
63 # we only handled 'end' but not 'delegate'.
64 # CHECK-LABEL: name: fix_end_function_test
65 name: fix_end_function_test
66 liveins:
67   - { reg: '$arguments' }
68 machineFunctionInfo:
69   params:          [  ]
70   results:         [ i32 ]
71   wasmEHFuncInfo:
72     3:               4
73 body: |
74   ; CHECK: TRY 127
75   ; CHECK:   TRY 127
76   ; CHECK:     CALL @foo
77   ; CHECK:     TRY 64
78   ; CHECK:       CALL @foo
79   ; CHECK:     DELEGATE
80   ; CHECK:     RETURN
81   ; CHECK:   CATCH
82   ;; This TRY should have the return type i32 (127)
83   ; CHECK:     TRY 127
84   ; CHECK:       RETHROW
85   ; CHECK:     DELEGATE
86   ; CHECK:   END_TRY
87   ; CHECK: CATCH
88   ; CHECK:   RETHROW
89   ; CHECK: END_TRY
90   bb.0:
91     successors: %bb.1, %bb.3
92     EH_LABEL <mcsymbol .Ltmp0>
93     CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
94     EH_LABEL <mcsymbol .Ltmp1>
96   bb.1:
97     successors: %bb.2, %bb.4
98     EH_LABEL <mcsymbol .Ltmp2>
99     CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
100     EH_LABEL <mcsymbol .Ltmp3>
102   bb.2:
103     %0:i32 = CONST_I32 3, implicit-def dead $arguments
104     RETURN %0:i32, implicit-def dead $arguments
106   bb.3 (landing-pad):
107     EH_LABEL <mcsymbol .Ltmp4>
108     %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments
109     RETHROW 0, implicit-def dead $arguments
111   bb.4 (landing-pad):
112     EH_LABEL <mcsymbol .Ltmp5>
113     %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments
114     RETHROW 0, implicit-def dead $arguments