Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / fold-branch-to-common-dest-phis.ll
blob150bdfcff92a16ac0c623d58e89a79f42f2ac245
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -bonus-inst-threshold=1 | FileCheck %s --check-prefixes=ALL,CHEAP
3 ; RUN: opt < %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -bonus-inst-threshold=10 | FileCheck %s --check-prefixes=ALL,COSTLY
5 declare void @sideeffect0(i8)
6 declare void @sideeffect1(i8)
7 declare void @sideeffect1.vec(<2 x i8>)
8 declare void @sideeffect2(i8)
9 declare void @use1(i1)
11 define void @incompatible_ivs_of_single_phi.falsedest.falsedest(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
12 ; ALL-LABEL: @incompatible_ivs_of_single_phi.falsedest.falsedest(
13 ; ALL-NEXT:  pred:
14 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
15 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
16 ; ALL:       dispatch:
17 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
18 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
19 ; ALL:       common.ret:
20 ; ALL-NEXT:    ret void
21 ; ALL:       final_left:
22 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
23 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
24 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
25 ; ALL:       final_right:
26 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
27 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
28 ; ALL-NEXT:    br label [[COMMON_RET]]
30 pred:
31   %c0 = icmp eq i8 %v0, 0
32   br i1 %c0, label %dispatch, label %final_right
33 dispatch:
34   %c1 = icmp eq i8 %v1, 0
35   br i1 %c1, label %final_left, label %final_right
36 final_left:
37   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
38   call void @sideeffect0(i8 %final_left.phi)
39   ret void
40 final_right:
41   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
42   call void @sideeffect1(i8 %final_right.phi)
43   ret void
46 define void @incompatible_ivs_of_single_phi.falsedest.falsedest.extrause(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
47 ; ALL-LABEL: @incompatible_ivs_of_single_phi.falsedest.falsedest.extrause(
48 ; ALL-NEXT:  pred:
49 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
50 ; ALL-NEXT:    call void @use1(i1 [[C0]])
51 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
52 ; ALL:       dispatch:
53 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
54 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
55 ; ALL:       common.ret:
56 ; ALL-NEXT:    ret void
57 ; ALL:       final_left:
58 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
59 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
60 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
61 ; ALL:       final_right:
62 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
63 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
64 ; ALL-NEXT:    br label [[COMMON_RET]]
66 pred:
67   %c0 = icmp eq i8 %v0, 0
68   call void @use1(i1 %c0)
69   br i1 %c0, label %dispatch, label %final_right
70 dispatch:
71   %c1 = icmp eq i8 %v1, 0
72   br i1 %c1, label %final_left, label %final_right
73 final_left:
74   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
75   call void @sideeffect0(i8 %final_left.phi)
76   ret void
77 final_right:
78   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
79   call void @sideeffect1(i8 %final_right.phi)
80   ret void
83 define void @incompatible_ivs_of_single_phi.falsedest.truedest(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
84 ; ALL-LABEL: @incompatible_ivs_of_single_phi.falsedest.truedest(
85 ; ALL-NEXT:  pred:
86 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
87 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
88 ; ALL:       dispatch:
89 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
90 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_RIGHT]], label [[FINAL_LEFT:%.*]]
91 ; ALL:       common.ret:
92 ; ALL-NEXT:    ret void
93 ; ALL:       final_left:
94 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
95 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
96 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
97 ; ALL:       final_right:
98 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
99 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
100 ; ALL-NEXT:    br label [[COMMON_RET]]
102 pred:
103   %c0 = icmp eq i8 %v0, 0
104   br i1 %c0, label %dispatch, label %final_right
105 dispatch:
106   %c1 = icmp eq i8 %v1, 0
107   br i1 %c1, label %final_right, label %final_left
108 final_left:
109   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
110   call void @sideeffect0(i8 %final_left.phi)
111   ret void
112 final_right:
113   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
114   call void @sideeffect1(i8 %final_right.phi)
115   ret void
118 define void @incompatible_ivs_of_single_phi.falsedest.truedest.extrause(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
119 ; ALL-LABEL: @incompatible_ivs_of_single_phi.falsedest.truedest.extrause(
120 ; ALL-NEXT:  pred:
121 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
122 ; ALL-NEXT:    call void @use1(i1 [[C0]])
123 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
124 ; ALL:       dispatch:
125 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
126 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_RIGHT]], label [[FINAL_LEFT:%.*]]
127 ; ALL:       common.ret:
128 ; ALL-NEXT:    ret void
129 ; ALL:       final_left:
130 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
131 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
132 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
133 ; ALL:       final_right:
134 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
135 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
136 ; ALL-NEXT:    br label [[COMMON_RET]]
138 pred:
139   %c0 = icmp eq i8 %v0, 0
140   call void @use1(i1 %c0)
141   br i1 %c0, label %dispatch, label %final_right
142 dispatch:
143   %c1 = icmp eq i8 %v1, 0
144   br i1 %c1, label %final_right, label %final_left
145 final_left:
146   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
147   call void @sideeffect0(i8 %final_left.phi)
148   ret void
149 final_right:
150   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
151   call void @sideeffect1(i8 %final_right.phi)
152   ret void
155 define void @incompatible_ivs_of_single_phi.truedest.falsedest(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
156 ; ALL-LABEL: @incompatible_ivs_of_single_phi.truedest.falsedest(
157 ; ALL-NEXT:  pred:
158 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
159 ; ALL-NEXT:    br i1 [[C0]], label [[FINAL_RIGHT:%.*]], label [[DISPATCH:%.*]]
160 ; ALL:       dispatch:
161 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
162 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
163 ; ALL:       common.ret:
164 ; ALL-NEXT:    ret void
165 ; ALL:       final_left:
166 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
167 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
168 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
169 ; ALL:       final_right:
170 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
171 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
172 ; ALL-NEXT:    br label [[COMMON_RET]]
174 pred:
175   %c0 = icmp eq i8 %v0, 0
176   br i1 %c0, label %final_right, label %dispatch
177 dispatch:
178   %c1 = icmp eq i8 %v1, 0
179   br i1 %c1, label %final_left, label %final_right
180 final_left:
181   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
182   call void @sideeffect0(i8 %final_left.phi)
183   ret void
184 final_right:
185   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
186   call void @sideeffect1(i8 %final_right.phi)
187   ret void
190 define void @incompatible_ivs_of_single_phi.truedest.falsedest.extrause(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
191 ; ALL-LABEL: @incompatible_ivs_of_single_phi.truedest.falsedest.extrause(
192 ; ALL-NEXT:  pred:
193 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
194 ; ALL-NEXT:    call void @use1(i1 [[C0]])
195 ; ALL-NEXT:    br i1 [[C0]], label [[FINAL_RIGHT:%.*]], label [[DISPATCH:%.*]]
196 ; ALL:       dispatch:
197 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
198 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
199 ; ALL:       common.ret:
200 ; ALL-NEXT:    ret void
201 ; ALL:       final_left:
202 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
203 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
204 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
205 ; ALL:       final_right:
206 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
207 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
208 ; ALL-NEXT:    br label [[COMMON_RET]]
210 pred:
211   %c0 = icmp eq i8 %v0, 0
212   call void @use1(i1 %c0)
213   br i1 %c0, label %final_right, label %dispatch
214 dispatch:
215   %c1 = icmp eq i8 %v1, 0
216   br i1 %c1, label %final_left, label %final_right
217 final_left:
218   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
219   call void @sideeffect0(i8 %final_left.phi)
220   ret void
221 final_right:
222   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
223   call void @sideeffect1(i8 %final_right.phi)
224   ret void
227 define void @incompatible_ivs_of_single_phi.truedest.truedest(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
228 ; ALL-LABEL: @incompatible_ivs_of_single_phi.truedest.truedest(
229 ; ALL-NEXT:  pred:
230 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
231 ; ALL-NEXT:    br i1 [[C0]], label [[FINAL_RIGHT:%.*]], label [[DISPATCH:%.*]]
232 ; ALL:       dispatch:
233 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
234 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_RIGHT]], label [[FINAL_LEFT:%.*]]
235 ; ALL:       common.ret:
236 ; ALL-NEXT:    ret void
237 ; ALL:       final_left:
238 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
239 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
240 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
241 ; ALL:       final_right:
242 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
243 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
244 ; ALL-NEXT:    br label [[COMMON_RET]]
246 pred:
247   %c0 = icmp eq i8 %v0, 0
248   br i1 %c0, label %final_right, label %dispatch
249 dispatch:
250   %c1 = icmp eq i8 %v1, 0
251   br i1 %c1, label %final_right, label %final_left
252 final_left:
253   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
254   call void @sideeffect0(i8 %final_left.phi)
255   ret void
256 final_right:
257   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
258   call void @sideeffect1(i8 %final_right.phi)
259   ret void
262 define void @incompatible_ivs_of_single_phi.truedest.truedest.extrause(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
263 ; ALL-LABEL: @incompatible_ivs_of_single_phi.truedest.truedest.extrause(
264 ; ALL-NEXT:  pred:
265 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
266 ; ALL-NEXT:    call void @use1(i1 [[C0]])
267 ; ALL-NEXT:    br i1 [[C0]], label [[FINAL_RIGHT:%.*]], label [[DISPATCH:%.*]]
268 ; ALL:       dispatch:
269 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
270 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_RIGHT]], label [[FINAL_LEFT:%.*]]
271 ; ALL:       common.ret:
272 ; ALL-NEXT:    ret void
273 ; ALL:       final_left:
274 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
275 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
276 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
277 ; ALL:       final_right:
278 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
279 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
280 ; ALL-NEXT:    br label [[COMMON_RET]]
282 pred:
283   %c0 = icmp eq i8 %v0, 0
284   call void @use1(i1 %c0)
285   br i1 %c0, label %final_right, label %dispatch
286 dispatch:
287   %c1 = icmp eq i8 %v1, 0
288   br i1 %c1, label %final_right, label %final_left
289 final_left:
290   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
291   call void @sideeffect0(i8 %final_left.phi)
292   ret void
293 final_right:
294   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
295   call void @sideeffect1(i8 %final_right.phi)
296   ret void
299 ;; -----------------------------------------------------------------------------
301 define void @incompatible_ivs_of_single_phi.insertpos(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, ptr dereferenceable(1) %src0, ptr dereferenceable(1) %src1) {
302 ; ALL-LABEL: @incompatible_ivs_of_single_phi.insertpos(
303 ; ALL-NEXT:  pred:
304 ; ALL-NEXT:    [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]] = load i8, ptr [[SRC0:%.*]], align 1
305 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
306 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
307 ; ALL:       dispatch:
308 ; ALL-NEXT:    [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]] = load i8, ptr [[SRC1:%.*]], align 1
309 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
310 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
311 ; ALL:       common.ret:
312 ; ALL-NEXT:    ret void
313 ; ALL:       final_left:
314 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
315 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
316 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
317 ; ALL:       final_right:
318 ; ALL-NEXT:    [[FINAL_RIGHT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH]], [[DISPATCH]] ]
319 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI]])
320 ; ALL-NEXT:    br label [[COMMON_RET]]
322 pred:
323   %iv.of.final_right.from.pred = load i8, ptr %src0
324   %c0 = icmp eq i8 %v0, 0
325   br i1 %c0, label %dispatch, label %final_right
326 dispatch:
327   %iv.of.final_right.from.dispatch = load i8, ptr %src1
328   %c1 = icmp eq i8 %v1, 0
329   br i1 %c1, label %final_left, label %final_right
330 final_left:
331   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
332   call void @sideeffect0(i8 %final_left.phi)
333   ret void
334 final_right:
335   %final_right.phi = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
336   call void @sideeffect1(i8 %final_right.phi)
337   ret void
340 define void @incompatible_ivs_of_one_of_two_phis(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv.of.final_right.from.pred, i8 %iv.of.final_right.from.dispatch) {
341 ; ALL-LABEL: @incompatible_ivs_of_one_of_two_phis(
342 ; ALL-NEXT:  pred:
343 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
344 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
345 ; ALL:       dispatch:
346 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
347 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
348 ; ALL:       common.ret:
349 ; ALL-NEXT:    ret void
350 ; ALL:       final_left:
351 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
352 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
353 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
354 ; ALL:       final_right:
355 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_0:%.*]] = phi i8 [ [[IV_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
356 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_1:%.*]] = phi i8 [ 42, [[PRED]] ], [ 42, [[DISPATCH]] ]
357 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI_0]])
358 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI_1]])
359 ; ALL-NEXT:    br label [[COMMON_RET]]
361 pred:
362   %c0 = icmp eq i8 %v0, 0
363   br i1 %c0, label %dispatch, label %final_right
364 dispatch:
365   %c1 = icmp eq i8 %v1, 0
366   br i1 %c1, label %final_left, label %final_right
367 final_left:
368   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
369   call void @sideeffect0(i8 %final_left.phi)
370   ret void
371 final_right:
372   %final_right.phi.0 = phi i8 [ %iv.of.final_right.from.pred, %pred ], [ %iv.of.final_right.from.dispatch, %dispatch ]
373   %final_right.phi.1 = phi i8 [ 42, %pred ], [ 42, %dispatch ]
374   call void @sideeffect1(i8 %final_right.phi.0)
375   call void @sideeffect1(i8 %final_right.phi.1)
376   ret void
379 define void @incompatible_ivs_of_two_phis(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, i8 %iv0.of.final_right.from.pred, i8 %iv0.of.final_right.from.dispatch, i8 %iv1.of.final_right.from.pred, i8 %iv1.of.final_right.from.dispatch) {
380 ; ALL-LABEL: @incompatible_ivs_of_two_phis(
381 ; ALL-NEXT:  pred:
382 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
383 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
384 ; ALL:       dispatch:
385 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
386 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
387 ; ALL:       common.ret:
388 ; ALL-NEXT:    ret void
389 ; ALL:       final_left:
390 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
391 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
392 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
393 ; ALL:       final_right:
394 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_0:%.*]] = phi i8 [ [[IV0_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV0_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
395 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_1:%.*]] = phi i8 [ [[IV1_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED]] ], [ [[IV1_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
396 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI_0]])
397 ; ALL-NEXT:    call void @sideeffect1(i8 [[FINAL_RIGHT_PHI_1]])
398 ; ALL-NEXT:    br label [[COMMON_RET]]
400 pred:
401   %c0 = icmp eq i8 %v0, 0
402   br i1 %c0, label %dispatch, label %final_right
403 dispatch:
404   %c1 = icmp eq i8 %v1, 0
405   br i1 %c1, label %final_left, label %final_right
406 final_left:
407   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
408   call void @sideeffect0(i8 %final_left.phi)
409   ret void
410 final_right:
411   %final_right.phi.0 = phi i8 [ %iv0.of.final_right.from.pred, %pred ], [ %iv0.of.final_right.from.dispatch, %dispatch ]
412   %final_right.phi.1 = phi i8 [ %iv1.of.final_right.from.pred, %pred ], [ %iv1.of.final_right.from.dispatch, %dispatch ]
413   call void @sideeffect1(i8 %final_right.phi.0)
414   call void @sideeffect1(i8 %final_right.phi.1)
415   ret void
418 define void @incompatible_ivs_of_two_phis.vec(i8 %v0, i8 %v1, i8 %iv.of.final_left.from.dispatch, <2 x i8> %iv0.of.final_right.from.pred, <2 x i8> %iv0.of.final_right.from.dispatch, <2 x i8> %iv1.of.final_right.from.pred, <2 x i8> %iv1.of.final_right.from.dispatch) {
419 ; ALL-LABEL: @incompatible_ivs_of_two_phis.vec(
420 ; ALL-NEXT:  pred:
421 ; ALL-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
422 ; ALL-NEXT:    br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]]
423 ; ALL:       dispatch:
424 ; ALL-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
425 ; ALL-NEXT:    br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]]
426 ; ALL:       common.ret:
427 ; ALL-NEXT:    ret void
428 ; ALL:       final_left:
429 ; ALL-NEXT:    [[FINAL_LEFT_PHI:%.*]] = phi i8 [ [[IV_OF_FINAL_LEFT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
430 ; ALL-NEXT:    call void @sideeffect0(i8 [[FINAL_LEFT_PHI]])
431 ; ALL-NEXT:    br label [[COMMON_RET:%.*]]
432 ; ALL:       final_right:
433 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_0:%.*]] = phi <2 x i8> [ [[IV0_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED:%.*]] ], [ [[IV0_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
434 ; ALL-NEXT:    [[FINAL_RIGHT_PHI_1:%.*]] = phi <2 x i8> [ [[IV1_OF_FINAL_RIGHT_FROM_PRED:%.*]], [[PRED]] ], [ [[IV1_OF_FINAL_RIGHT_FROM_DISPATCH:%.*]], [[DISPATCH]] ]
435 ; ALL-NEXT:    call void @sideeffect1.vec(<2 x i8> [[FINAL_RIGHT_PHI_0]])
436 ; ALL-NEXT:    call void @sideeffect1.vec(<2 x i8> [[FINAL_RIGHT_PHI_1]])
437 ; ALL-NEXT:    br label [[COMMON_RET]]
439 pred:
440   %c0 = icmp eq i8 %v0, 0
441   br i1 %c0, label %dispatch, label %final_right
442 dispatch:
443   %c1 = icmp eq i8 %v1, 0
444   br i1 %c1, label %final_left, label %final_right
445 final_left:
446   %final_left.phi = phi i8 [ %iv.of.final_left.from.dispatch, %dispatch ]
447   call void @sideeffect0(i8 %final_left.phi)
448   ret void
449 final_right:
450   %final_right.phi.0 = phi <2 x i8> [ %iv0.of.final_right.from.pred, %pred ], [ %iv0.of.final_right.from.dispatch, %dispatch ]
451   %final_right.phi.1 = phi <2 x i8> [ %iv1.of.final_right.from.pred, %pred ], [ %iv1.of.final_right.from.dispatch, %dispatch ]
452   call void @sideeffect1.vec(<2 x i8> %final_right.phi.0)
453   call void @sideeffect1.vec(<2 x i8> %final_right.phi.1)
454   ret void
457 ; From https://reviews.llvm.org/D139275#4001580
458 define float @D139275_c4001580(float %val) {
459 ; ALL-LABEL: @D139275_c4001580(
460 ; ALL-NEXT:  entry:
461 ; ALL-NEXT:    [[CMP:%.*]] = fcmp ugt float [[VAL:%.*]], 0.000000e+00
462 ; ALL-NEXT:    br i1 [[CMP]], label [[IF_END:%.*]], label [[RETURN:%.*]]
463 ; ALL:       if.end:
464 ; ALL-NEXT:    [[CMP1:%.*]] = fcmp ult float [[VAL]], 1.000000e+00
465 ; ALL-NEXT:    br i1 [[CMP1]], label [[IF_END3:%.*]], label [[RETURN]]
466 ; ALL:       if.end3:
467 ; ALL-NEXT:    [[CMP4:%.*]] = fcmp olt float [[VAL]], 0x3FC99999A0000000
468 ; ALL-NEXT:    br i1 [[CMP4]], label [[RETURN]], label [[IF_END6:%.*]]
469 ; ALL:       if.end6:
470 ; ALL-NEXT:    [[SUB:%.*]] = fadd float [[VAL]], 0xBFB99999A0000000
471 ; ALL-NEXT:    br label [[RETURN]]
472 ; ALL:       return:
473 ; ALL-NEXT:    [[RETVAL_0:%.*]] = phi float [ [[SUB]], [[IF_END6]] ], [ 0.000000e+00, [[ENTRY:%.*]] ], [ 0x3FB99999A0000000, [[IF_END]] ], [ 0.000000e+00, [[IF_END3]] ]
474 ; ALL-NEXT:    ret float [[RETVAL_0]]
476 entry:
477   %cmp = fcmp ugt float %val, 0.000000e+00
478   br i1 %cmp, label %if.end, label %return
480 if.end:
481   %cmp1 = fcmp ult float %val, 1.000000e+00
482   br i1 %cmp1, label %if.end3, label %return
484 if.end3:
485   %cmp4 = fcmp olt float %val, 0x3FC99999A0000000
486   br i1 %cmp4, label %return, label %if.end6
488 if.end6:
489   %sub = fadd float %val, 0xBFB99999A0000000
490   br label %return
492 return:
493   %retval.0 = phi float [ %sub, %if.end6 ], [ 0.000000e+00, %entry ], [ 0x3FB99999A0000000, %if.end ], [ 0.000000e+00, %if.end3 ]
494   ret float %retval.0
497 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
498 ; CHEAP: {{.*}}
499 ; COSTLY: {{.*}}