xref: /llvm-project/llvm/test/CodeGen/WebAssembly/irreducible-cfg-exceptions.ll (revision 73856247eef35f5336e485dc009842a5b991c421)
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-block-placement -wasm-disable-explicit-locals -wasm-keep-registers -enable-emscripten-cxx-exceptions | FileCheck %s
2
3target triple = "wasm32-unknown-unknown"
4
5declare i32 @__gxx_personality_v0(...)
6
7; Check an interesting case of complex control flow due to exceptions CFG rewriting.
8; There should *not* be any irreducible control flow here.
9
10; CHECK-LABEL: crashy:
11; CHECK-NOT: br_table
12
13define void @crashy() personality ptr @__gxx_personality_v0 {
14entry:
15  invoke void undef()
16          to label %invoke.cont unwind label %lpad
17
18invoke.cont:                                      ; preds = %entry
19  invoke void undef()
20          to label %invoke.cont4 unwind label %lpad3
21
22invoke.cont4:                                     ; preds = %invoke.cont
23  %call.i82 = invoke ptr undef()
24          to label %invoke.cont6 unwind label %lpad3
25
26invoke.cont6:                                     ; preds = %invoke.cont4
27  invoke void undef()
28          to label %invoke.cont13 unwind label %lpad12
29
30invoke.cont13:                                    ; preds = %invoke.cont6
31  br label %for.cond
32
33for.cond:                                         ; preds = %for.cond.backedge, %invoke.cont13
34  br i1 undef, label %exit2, label %land.lhs
35
36land.lhs:                                         ; preds = %for.cond
37  %call.i.i.i.i92 = invoke i32 undef()
38          to label %exit1 unwind label %lpad16.loopexit
39
40exit1:                                            ; preds = %land.lhs
41  br label %exit2
42
43exit2:                                            ; preds = %exit1, %for.cond
44  %call.i.i12.i.i93 = invoke i32 undef()
45          to label %exit3 unwind label %lpad16.loopexit
46
47exit3:                                            ; preds = %exit2
48  invoke void undef()
49          to label %invoke.cont23 unwind label %lpad22
50
51invoke.cont23:                                    ; preds = %exit3
52  invoke void undef()
53          to label %invoke.cont25 unwind label %lpad22
54
55invoke.cont25:                                    ; preds = %invoke.cont23
56  %call.i.i137 = invoke i32 undef()
57          to label %invoke.cont29 unwind label %lpad16.loopexit
58
59lpad:                                             ; preds = %entry
60  %0 = landingpad { ptr, i32 }
61          cleanup
62  unreachable
63
64lpad3:                                            ; preds = %invoke.cont4, %invoke.cont
65  %1 = landingpad { ptr, i32 }
66          cleanup
67  unreachable
68
69lpad12:                                           ; preds = %invoke.cont6
70  %2 = landingpad { ptr, i32 }
71          cleanup
72  resume { ptr, i32 } undef
73
74lpad16.loopexit:                                  ; preds = %if.then, %invoke.cont29, %invoke.cont25, %exit2, %land.lhs
75  %lpad.loopexit = landingpad { ptr, i32 }
76          cleanup
77  unreachable
78
79lpad22:                                           ; preds = %invoke.cont23, %exit3
80  %3 = landingpad { ptr, i32 }
81          cleanup
82  unreachable
83
84invoke.cont29:                                    ; preds = %invoke.cont25
85  invoke void undef()
86          to label %invoke.cont33 unwind label %lpad16.loopexit
87
88invoke.cont33:                                    ; preds = %invoke.cont29
89  br label %for.inc
90
91for.inc:                                          ; preds = %invoke.cont33
92  %cmp.i.i141 = icmp eq ptr undef, undef
93  br i1 %cmp.i.i141, label %if.then, label %if.end.i.i146
94
95if.then:                                          ; preds = %for.inc
96  %call.i.i148 = invoke i32 undef()
97          to label %for.cond.backedge unwind label %lpad16.loopexit
98
99for.cond.backedge:                                ; preds = %if.end.i.i146, %if.then
100  br label %for.cond
101
102if.end.i.i146:                                    ; preds = %for.inc
103  call void undef()
104  br label %for.cond.backedge
105}
106