xref: /llvm-project/llvm/test/Transforms/LoopDeletion/irreducible-cfg.ll (revision 4931cacb9778bde3d8d2e04575ac162bb090d6be)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s
3; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s
4
5; Make sure we do not get the miscompile on this test with irreducible CFG.
6define i16 @test_01(i16 %j, i16 %k, i16 %recurs) {                 ; If we have %j: 1, %k: 1, %recurs: 0
7; CHECK-LABEL: @test_01(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i16 [[RECURS:%.*]], 0
10; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
11; CHECK:       if.then:
12; CHECK-NEXT:    [[CALL:%.*]] = tail call i16 @test_01(i16 0, i16 0, i16 0)
13; CHECK-NEXT:    br label [[IF_END]]
14; CHECK:       if.end:
15; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[J:%.*]], 0
16; CHECK-NEXT:    br label [[BB2:%.*]]
17; CHECK:       bb2:
18; CHECK-NEXT:    [[K_ADDR_0:%.*]] = phi i16 [ [[K:%.*]], [[IF_END]] ], [ [[K_ADDR_2:%.*]], [[BB12:%.*]] ]
19; CHECK-NEXT:    [[RESULT_0:%.*]] = phi i16 [ 0, [[IF_END]] ], [ 20, [[BB12]] ]
20; CHECK-NEXT:    br i1 [[CMP]], label [[BB12]], label [[BB4:%.*]]
21; CHECK:       bb4:
22; CHECK-NEXT:    [[K_ADDR_1:%.*]] = phi i16 [ [[K_ADDR_0]], [[BB2]] ], [ [[K_ADDR_2]], [[BB12]] ]
23; CHECK-NEXT:    [[X_1:%.*]] = phi i16 [ 0, [[BB2]] ], [ 1, [[BB12]] ]
24; CHECK-NEXT:    [[RESULT_1:%.*]] = phi i16 [ [[RESULT_0]], [[BB2]] ], [ 10, [[BB12]] ]
25; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i16 [[K_ADDR_1]], 0
26; CHECK-NEXT:    br i1 [[CMP2]], label [[BB13:%.*]], label [[BB12]]
27; CHECK:       bb12:
28; CHECK-NEXT:    [[K_ADDR_2]] = phi i16 [ [[K_ADDR_0]], [[BB2]] ], [ 0, [[BB4]] ]
29; CHECK-NEXT:    [[X_2:%.*]] = phi i16 [ 1, [[BB2]] ], [ [[X_1]], [[BB4]] ]
30; CHECK-NEXT:    [[CMP5:%.*]] = icmp eq i16 [[X_2]], 0
31; CHECK-NEXT:    br i1 [[CMP5]], label [[BB2]], label [[BB4]]
32; CHECK:       bb13:
33; CHECK-NEXT:    [[RESULT_1_LCSSA:%.*]] = phi i16 [ [[RESULT_1]], [[BB4]] ]
34; CHECK-NEXT:    ret i16 [[RESULT_1_LCSSA]]
35;
36entry:
37  %tobool.not = icmp eq i16 %recurs, 0                          ; 1
38  br i1 %tobool.not, label %if.end, label %if.then              ; -> if.end
39
40if.then:                                          ; preds = %entry
41  %call = tail call i16 @test_01(i16 0, i16 0, i16 0)
42  br label %if.end
43
44if.end:                                           ; preds = %if.then, %entry
45  %cmp = icmp eq i16 %j, 0                                      ; 0
46  br label %bb2                                                 ; -> bb2
47
48bb2:                                              ; preds = %bb12, %if.end
49  %k.addr.0 = phi i16 [ %k, %if.end ], [ %k.addr.2, %bb12 ]     ; 1
50  %result.0 = phi i16 [ 0, %if.end ], [ 20, %bb12 ]             ; 0
51  br i1 %cmp, label %bb12, label %bb4                           ; %cmp: 0 -> bb4
52
53bb4:                                              ; preds = %bb12, %bb2
54  %k.addr.1 = phi i16 [ %k.addr.0, %bb2 ], [ %k.addr.2, %bb12 ] ; 1
55  %x.1 = phi i16 [ 0, %bb2 ], [ 1, %bb12 ]                      ; 0
56  %result.1 = phi i16 [ %result.0, %bb2 ], [ 10, %bb12 ]
57  %cmp2 = icmp eq i16 %k.addr.1, 0                              ; 0
58  br i1 %cmp2, label %bb13, label %bb12                         ; -> bb12
59
60bb12:                                             ; preds = %bb4, %bb2
61  %k.addr.2 = phi i16 [ %k.addr.0, %bb2 ], [ 0, %bb4 ]          ; 0
62  %x.2 = phi i16 [ 1, %bb2 ], [ %x.1, %bb4 ]                    ; 0
63  %cmp5 = icmp eq i16 %x.2, 0                                   ; 1
64  br i1 %cmp5, label %bb2, label %bb4                           ; -> bb2
65
66bb13:                                             ; preds = %bb4
67  %result.1.lcssa = phi i16 [ %result.1, %bb4 ]
68  ret i16 %result.1.lcssa
69}
70
71; Another nasty case of irreducible CFG. Make sure we do not crash here.
72define void @test_02() {
73; CHECK-LABEL: @test_02(
74; CHECK-NEXT:  bb:
75; CHECK-NEXT:    br label [[BB17:%.*]]
76; CHECK:       bb1:
77; CHECK-NEXT:    ret void
78; CHECK:       bb2:
79; CHECK-NEXT:    unreachable
80; CHECK:       bb3:
81; CHECK-NEXT:    unreachable
82; CHECK:       bb4:
83; CHECK-NEXT:    unreachable
84; CHECK:       bb5:
85; CHECK-NEXT:    unreachable
86; CHECK:       bb6:
87; CHECK-NEXT:    unreachable
88; CHECK:       bb7:
89; CHECK-NEXT:    unreachable
90; CHECK:       bb8:
91; CHECK-NEXT:    unreachable
92; CHECK:       bb9:
93; CHECK-NEXT:    switch i8 undef, label [[BB13:%.*]] [
94; CHECK-NEXT:    i8 3, label [[BB10:%.*]]
95; CHECK-NEXT:    i8 43, label [[BB10]]
96; CHECK-NEXT:    i8 37, label [[BB11:%.*]]
97; CHECK-NEXT:    i8 2, label [[BB12:%.*]]
98; CHECK-NEXT:    i8 4, label [[BB12]]
99; CHECK-NEXT:    i8 20, label [[BB12]]
100; CHECK-NEXT:    i8 42, label [[BB12]]
101; CHECK-NEXT:    i8 44, label [[BB12]]
102; CHECK-NEXT:    i8 54, label [[BB12]]
103; CHECK-NEXT:    ]
104; CHECK:       bb10:
105; CHECK-NEXT:    unreachable
106; CHECK:       bb11:
107; CHECK-NEXT:    unreachable
108; CHECK:       bb12:
109; CHECK-NEXT:    br label [[BB19:%.*]]
110; CHECK:       bb13:
111; CHECK-NEXT:    unreachable
112; CHECK:       bb14:
113; CHECK-NEXT:    unreachable
114; CHECK:       bb15:
115; CHECK-NEXT:    unreachable
116; CHECK:       bb16:
117; CHECK-NEXT:    br label [[BB17]]
118; CHECK:       bb17:
119; CHECK-NEXT:    [[TMP:%.*]] = icmp sgt i32 0, 1
120; CHECK-NEXT:    br i1 [[TMP]], label [[BB18:%.*]], label [[BB19]]
121; CHECK:       bb18:
122; CHECK-NEXT:    br label [[BB20:%.*]]
123; CHECK:       bb19:
124; CHECK-NEXT:    br label [[BB20]]
125; CHECK:       bb20:
126; CHECK-NEXT:    switch i8 undef, label [[BB16:%.*]] [
127; CHECK-NEXT:    i8 0, label [[BB1:%.*]]
128; CHECK-NEXT:    i8 1, label [[BB1]]
129; CHECK-NEXT:    i8 8, label [[BB1]]
130; CHECK-NEXT:    i8 9, label [[BB1]]
131; CHECK-NEXT:    i8 12, label [[BB1]]
132; CHECK-NEXT:    i8 13, label [[BB1]]
133; CHECK-NEXT:    i8 40, label [[BB1]]
134; CHECK-NEXT:    i8 41, label [[BB1]]
135; CHECK-NEXT:    i8 52, label [[BB1]]
136; CHECK-NEXT:    i8 53, label [[BB1]]
137; CHECK-NEXT:    i8 55, label [[BB15:%.*]]
138; CHECK-NEXT:    i8 15, label [[BB14:%.*]]
139; CHECK-NEXT:    i8 29, label [[BB9:%.*]]
140; CHECK-NEXT:    i8 37, label [[BB8:%.*]]
141; CHECK-NEXT:    i8 69, label [[BB3:%.*]]
142; CHECK-NEXT:    i8 89, label [[BB7:%.*]]
143; CHECK-NEXT:    i8 85, label [[BB6:%.*]]
144; CHECK-NEXT:    i8 81, label [[BB5:%.*]]
145; CHECK-NEXT:    i8 65, label [[BB2:%.*]]
146; CHECK-NEXT:    i8 73, label [[BB4:%.*]]
147; CHECK-NEXT:    ]
148;
149bb:
150  br label %bb17
151
152bb1:                                              ; preds = %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20
153  ret void
154
155bb2:                                              ; preds = %bb20
156  unreachable
157
158bb3:                                              ; preds = %bb20
159  unreachable
160
161bb4:                                              ; preds = %bb20
162  unreachable
163
164bb5:                                              ; preds = %bb20
165  unreachable
166
167bb6:                                              ; preds = %bb20
168  unreachable
169
170bb7:                                              ; preds = %bb20
171  unreachable
172
173bb8:                                              ; preds = %bb20
174  unreachable
175
176bb9:                                              ; preds = %bb20
177  switch i8 undef, label %bb13 [
178  i8 3, label %bb10
179  i8 43, label %bb10
180  i8 37, label %bb11
181  i8 2, label %bb12
182  i8 4, label %bb12
183  i8 20, label %bb12
184  i8 42, label %bb12
185  i8 44, label %bb12
186  i8 54, label %bb12
187  ]
188
189bb10:                                             ; preds = %bb9, %bb9
190  unreachable
191
192bb11:                                             ; preds = %bb9
193  unreachable
194
195bb12:                                             ; preds = %bb9, %bb9, %bb9, %bb9, %bb9, %bb9
196  br label %bb19
197
198bb13:                                             ; preds = %bb9
199  unreachable
200
201bb14:                                             ; preds = %bb20
202  unreachable
203
204bb15:                                             ; preds = %bb20
205  unreachable
206
207bb16:                                             ; preds = %bb20
208  br label %bb17
209
210bb17:                                             ; preds = %bb16, %bb
211  %tmp = icmp sgt i32 0, 1
212  br i1 %tmp, label %bb18, label %bb19
213
214bb18:                                             ; preds = %bb17
215  br label %bb20
216
217bb19:                                             ; preds = %bb17, %bb12
218  br label %bb20
219
220bb20:                                             ; preds = %bb19, %bb18
221  switch i8 undef, label %bb16 [
222  i8 0, label %bb1
223  i8 1, label %bb1
224  i8 8, label %bb1
225  i8 9, label %bb1
226  i8 12, label %bb1
227  i8 13, label %bb1
228  i8 40, label %bb1
229  i8 41, label %bb1
230  i8 52, label %bb1
231  i8 53, label %bb1
232  i8 55, label %bb15
233  i8 15, label %bb14
234  i8 29, label %bb9
235  i8 37, label %bb8
236  i8 69, label %bb3
237  i8 89, label %bb7
238  i8 85, label %bb6
239  i8 81, label %bb5
240  i8 65, label %bb2
241  i8 73, label %bb4
242  ]
243}
244