xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll (revision 3a8e009f97d2ed4b751365e514e0bf7131c7ab11)
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
4
5declare void @sideeffect0(i8)
6declare void @sideeffect1(i8)
7declare void @sideeffect1.vec(<2 x i8>)
8declare void @sideeffect2(i8)
9declare void @use1(i1)
10
11define 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]]
29;
30pred:
31  %c0 = icmp eq i8 %v0, 0
32  br i1 %c0, label %dispatch, label %final_right
33dispatch:
34  %c1 = icmp eq i8 %v1, 0
35  br i1 %c1, label %final_left, label %final_right
36final_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
40final_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
44}
45
46define 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]]
65;
66pred:
67  %c0 = icmp eq i8 %v0, 0
68  call void @use1(i1 %c0)
69  br i1 %c0, label %dispatch, label %final_right
70dispatch:
71  %c1 = icmp eq i8 %v1, 0
72  br i1 %c1, label %final_left, label %final_right
73final_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
77final_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
81}
82
83define 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]]
101;
102pred:
103  %c0 = icmp eq i8 %v0, 0
104  br i1 %c0, label %dispatch, label %final_right
105dispatch:
106  %c1 = icmp eq i8 %v1, 0
107  br i1 %c1, label %final_right, label %final_left
108final_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
112final_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
116}
117
118define 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]]
137;
138pred:
139  %c0 = icmp eq i8 %v0, 0
140  call void @use1(i1 %c0)
141  br i1 %c0, label %dispatch, label %final_right
142dispatch:
143  %c1 = icmp eq i8 %v1, 0
144  br i1 %c1, label %final_right, label %final_left
145final_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
149final_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
153}
154
155define 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]]
173;
174pred:
175  %c0 = icmp eq i8 %v0, 0
176  br i1 %c0, label %final_right, label %dispatch
177dispatch:
178  %c1 = icmp eq i8 %v1, 0
179  br i1 %c1, label %final_left, label %final_right
180final_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
184final_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
188}
189
190define 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]]
209;
210pred:
211  %c0 = icmp eq i8 %v0, 0
212  call void @use1(i1 %c0)
213  br i1 %c0, label %final_right, label %dispatch
214dispatch:
215  %c1 = icmp eq i8 %v1, 0
216  br i1 %c1, label %final_left, label %final_right
217final_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
221final_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
225}
226
227define 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]]
245;
246pred:
247  %c0 = icmp eq i8 %v0, 0
248  br i1 %c0, label %final_right, label %dispatch
249dispatch:
250  %c1 = icmp eq i8 %v1, 0
251  br i1 %c1, label %final_right, label %final_left
252final_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
256final_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
260}
261
262define 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]]
281;
282pred:
283  %c0 = icmp eq i8 %v0, 0
284  call void @use1(i1 %c0)
285  br i1 %c0, label %final_right, label %dispatch
286dispatch:
287  %c1 = icmp eq i8 %v1, 0
288  br i1 %c1, label %final_right, label %final_left
289final_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
293final_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
297}
298
299;; -----------------------------------------------------------------------------
300
301define 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]]
321;
322pred:
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
326dispatch:
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
330final_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
334final_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
338}
339
340define 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]]
360;
361pred:
362  %c0 = icmp eq i8 %v0, 0
363  br i1 %c0, label %dispatch, label %final_right
364dispatch:
365  %c1 = icmp eq i8 %v1, 0
366  br i1 %c1, label %final_left, label %final_right
367final_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
371final_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
377}
378
379define 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]]
399;
400pred:
401  %c0 = icmp eq i8 %v0, 0
402  br i1 %c0, label %dispatch, label %final_right
403dispatch:
404  %c1 = icmp eq i8 %v1, 0
405  br i1 %c1, label %final_left, label %final_right
406final_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
410final_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
416}
417
418define 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]]
438;
439pred:
440  %c0 = icmp eq i8 %v0, 0
441  br i1 %c0, label %dispatch, label %final_right
442dispatch:
443  %c1 = icmp eq i8 %v1, 0
444  br i1 %c1, label %final_left, label %final_right
445final_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
449final_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
455}
456
457; From https://reviews.llvm.org/D139275#4001580
458define 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]]
475;
476entry:
477  %cmp = fcmp ugt float %val, 0.000000e+00
478  br i1 %cmp, label %if.end, label %return
479
480if.end:
481  %cmp1 = fcmp ult float %val, 1.000000e+00
482  br i1 %cmp1, label %if.end3, label %return
483
484if.end3:
485  %cmp4 = fcmp olt float %val, 0x3FC99999A0000000
486  br i1 %cmp4, label %return, label %if.end6
487
488if.end6:
489  %sub = fadd float %val, 0xBFB99999A0000000
490  br label %return
491
492return:
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
495}
496
497;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
498; CHEAP: {{.*}}
499; COSTLY: {{.*}}
500