[Transforms] Silence a warning in SROA.cpp (NFC)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / convertphitype.ll
blobe690653237a2dcea6cefa7cd3784351f413760b1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -cgp-optimize-phi-types %s -S | FileCheck %s
4 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5 target triple = "aarch64--linux-gnu"
7 define float @convphi1(ptr %s, ptr %d, i32 %n) {
8 ; CHECK-LABEL: @convphi1(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
11 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
12 ; CHECK:       then:
13 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
14 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
15 ; CHECK-NEXT:    br label [[END:%.*]]
16 ; CHECK:       else:
17 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
18 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast i32 [[LD]] to float
19 ; CHECK-NEXT:    br label [[END]]
20 ; CHECK:       end:
21 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
22 ; CHECK-NEXT:    ret float [[PHI_TC]]
24 entry:
25   %cmp15 = icmp sgt i32 %n, 0
26   br i1 %cmp15, label %then, label %else
28 then:
29   %ls = load i32, ptr %s, align 4
30   br label %end
32 else:
33   %ld = load i32, ptr %d, align 4
34   br label %end
36 end:
37   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
38   %b = bitcast i32 %phi to float
39   ret float %b
42 define float @convphi2(ptr %s, ptr %d, i32 %n) {
43 ; CHECK-LABEL: @convphi2(
44 ; CHECK-NEXT:  entry:
45 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
46 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
47 ; CHECK:       then:
48 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
49 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
50 ; CHECK-NEXT:    br label [[END]]
51 ; CHECK:       end:
52 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ undef, [[ENTRY:%.*]] ]
53 ; CHECK-NEXT:    ret float [[PHI_TC]]
55 entry:
56   %cmp15 = icmp sgt i32 %n, 0
57   br i1 %cmp15, label %then, label %end
59 then:
60   %ls = load i32, ptr %s, align 4
61   br label %end
63 end:
64   %phi = phi i32 [ %ls, %then ], [ undef, %entry ]
65   %b = bitcast i32 %phi to float
66   ret float %b
69 define float @convphi3(ptr %s, ptr %d, i32 %n, float %f) {
70 ; CHECK-LABEL: @convphi3(
71 ; CHECK-NEXT:  entry:
72 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
73 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
74 ; CHECK:       then:
75 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
76 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
77 ; CHECK-NEXT:    br label [[END]]
78 ; CHECK:       end:
79 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[F:%.*]], [[ENTRY:%.*]] ]
80 ; CHECK-NEXT:    ret float [[PHI_TC]]
82 entry:
83   %cmp15 = icmp sgt i32 %n, 0
84   %fb = bitcast float %f to i32
85   br i1 %cmp15, label %then, label %end
87 then:
88   %ls = load i32, ptr %s, align 4
89   br label %end
91 end:
92   %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
93   %b = bitcast i32 %phi to float
94   ret float %b
97 define void @convphi4(ptr %s, ptr %d, i32 %n, float %f) {
98 ; CHECK-LABEL: @convphi4(
99 ; CHECK-NEXT:  entry:
100 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
101 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
102 ; CHECK:       then:
103 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
104 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
105 ; CHECK-NEXT:    br label [[END]]
106 ; CHECK:       end:
107 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[F:%.*]], [[ENTRY:%.*]] ]
108 ; CHECK-NEXT:    [[BC:%.*]] = bitcast float [[PHI_TC]] to i32
109 ; CHECK-NEXT:    store i32 [[BC]], ptr [[D:%.*]], align 4
110 ; CHECK-NEXT:    ret void
112 entry:
113   %cmp15 = icmp sgt i32 %n, 0
114   %fb = bitcast float %f to i32
115   br i1 %cmp15, label %then, label %end
117 then:
118   %ls = load i32, ptr %s, align 4
119   br label %end
121 end:
122   %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
123   store i32 %phi, ptr %d
124   ret void
127 define i64 @convphi_d2i(ptr %s, ptr %d, i32 %n) {
128 ; CHECK-LABEL: @convphi_d2i(
129 ; CHECK-NEXT:  entry:
130 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
131 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
132 ; CHECK:       then:
133 ; CHECK-NEXT:    [[LS:%.*]] = load double, ptr [[S:%.*]], align 4
134 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast double [[LS]] to i64
135 ; CHECK-NEXT:    br label [[END:%.*]]
136 ; CHECK:       else:
137 ; CHECK-NEXT:    [[LD:%.*]] = load double, ptr [[D:%.*]], align 4
138 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast double [[LD]] to i64
139 ; CHECK-NEXT:    br label [[END]]
140 ; CHECK:       end:
141 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i64 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
142 ; CHECK-NEXT:    ret i64 [[PHI_TC]]
144 entry:
145   %cmp15 = icmp sgt i32 %n, 0
146   br i1 %cmp15, label %then, label %else
148 then:
149   %ls = load double, ptr %s, align 4
150   br label %end
152 else:
153   %ld = load double, ptr %d, align 4
154   br label %end
156 end:
157   %phi = phi double [ %ls, %then ], [ %ld, %else ]
158   %b = bitcast double %phi to i64
159   ret i64 %b
162 define i32 @convphi_f2i(ptr %s, ptr %d, i32 %n) {
163 ; CHECK-LABEL: @convphi_f2i(
164 ; CHECK-NEXT:  entry:
165 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
166 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
167 ; CHECK:       then:
168 ; CHECK-NEXT:    [[LS:%.*]] = load float, ptr [[S:%.*]], align 4
169 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast float [[LS]] to i32
170 ; CHECK-NEXT:    br label [[END:%.*]]
171 ; CHECK:       else:
172 ; CHECK-NEXT:    [[LD:%.*]] = load float, ptr [[D:%.*]], align 4
173 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast float [[LD]] to i32
174 ; CHECK-NEXT:    br label [[END]]
175 ; CHECK:       end:
176 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
177 ; CHECK-NEXT:    ret i32 [[PHI_TC]]
179 entry:
180   %cmp15 = icmp sgt i32 %n, 0
181   br i1 %cmp15, label %then, label %else
183 then:
184   %ls = load float, ptr %s, align 4
185   br label %end
187 else:
188   %ld = load float, ptr %d, align 4
189   br label %end
191 end:
192   %phi = phi float [ %ls, %then ], [ %ld, %else ]
193   %b = bitcast float %phi to i32
194   ret i32 %b
197 define i16 @convphi_h2i(ptr %s, ptr %d, i32 %n) {
198 ; CHECK-LABEL: @convphi_h2i(
199 ; CHECK-NEXT:  entry:
200 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
201 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
202 ; CHECK:       then:
203 ; CHECK-NEXT:    [[LS:%.*]] = load half, ptr [[S:%.*]], align 4
204 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast half [[LS]] to i16
205 ; CHECK-NEXT:    br label [[END:%.*]]
206 ; CHECK:       else:
207 ; CHECK-NEXT:    [[LD:%.*]] = load half, ptr [[D:%.*]], align 4
208 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast half [[LD]] to i16
209 ; CHECK-NEXT:    br label [[END]]
210 ; CHECK:       end:
211 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i16 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
212 ; CHECK-NEXT:    ret i16 [[PHI_TC]]
214 entry:
215   %cmp15 = icmp sgt i32 %n, 0
216   br i1 %cmp15, label %then, label %else
218 then:
219   %ls = load half, ptr %s, align 4
220   br label %end
222 else:
223   %ld = load half, ptr %d, align 4
224   br label %end
226 end:
227   %phi = phi half [ %ls, %then ], [ %ld, %else ]
228   %b = bitcast half %phi to i16
229   ret i16 %b
232 define i128 @convphi_ld2i(ptr %s, ptr %d, i32 %n) {
233 ; CHECK-LABEL: @convphi_ld2i(
234 ; CHECK-NEXT:  entry:
235 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
236 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
237 ; CHECK:       then:
238 ; CHECK-NEXT:    [[LS:%.*]] = load fp128, ptr [[S:%.*]], align 4
239 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast fp128 [[LS]] to i128
240 ; CHECK-NEXT:    br label [[END:%.*]]
241 ; CHECK:       else:
242 ; CHECK-NEXT:    [[LD:%.*]] = load fp128, ptr [[D:%.*]], align 4
243 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast fp128 [[LD]] to i128
244 ; CHECK-NEXT:    br label [[END]]
245 ; CHECK:       end:
246 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i128 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
247 ; CHECK-NEXT:    ret i128 [[PHI_TC]]
249 entry:
250   %cmp15 = icmp sgt i32 %n, 0
251   br i1 %cmp15, label %then, label %else
253 then:
254   %ls = load fp128, ptr %s, align 4
255   br label %end
257 else:
258   %ld = load fp128, ptr %d, align 4
259   br label %end
261 end:
262   %phi = phi fp128 [ %ls, %then ], [ %ld, %else ]
263   %b = bitcast fp128 %phi to i128
264   ret i128 %b
267 define <4 x i32> @convphi_4xf2i(ptr %s, ptr %d, i32 %n) {
268 ; CHECK-LABEL: @convphi_4xf2i(
269 ; CHECK-NEXT:  entry:
270 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
271 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
272 ; CHECK:       then:
273 ; CHECK-NEXT:    [[LS:%.*]] = load <4 x float>, ptr [[S:%.*]], align 4
274 ; CHECK-NEXT:    br label [[END:%.*]]
275 ; CHECK:       else:
276 ; CHECK-NEXT:    [[LD:%.*]] = load <4 x float>, ptr [[D:%.*]], align 4
277 ; CHECK-NEXT:    br label [[END]]
278 ; CHECK:       end:
279 ; CHECK-NEXT:    [[PHI:%.*]] = phi <4 x float> [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ]
280 ; CHECK-NEXT:    [[B:%.*]] = bitcast <4 x float> [[PHI]] to <4 x i32>
281 ; CHECK-NEXT:    ret <4 x i32> [[B]]
283 entry:
284   %cmp15 = icmp sgt i32 %n, 0
285   br i1 %cmp15, label %then, label %else
287 then:
288   %ls = load <4 x float>, ptr %s, align 4
289   br label %end
291 else:
292   %ld = load <4 x float>, ptr %d, align 4
293   br label %end
295 end:
296   %phi = phi <4 x float> [ %ls, %then ], [ %ld, %else ]
297   %b = bitcast <4 x float> %phi to <4 x i32>
298   ret <4 x i32> %b
301 define float @convphi_loop(ptr %s, ptr %d, i64 %n) {
302 ; CHECK-LABEL: @convphi_loop(
303 ; CHECK-NEXT:  entry:
304 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0
305 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
306 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
307 ; CHECK-NEXT:    br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]]
308 ; CHECK:       loop:
309 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
310 ; CHECK-NEXT:    [[LPHI_TC:%.*]] = phi float [ [[LS_BC]], [[ENTRY]] ], [ [[LD_BC:%.*]], [[LOOP]] ]
311 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
312 ; CHECK-NEXT:    [[LD_BC]] = bitcast i32 [[LD]] to float
313 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
314 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
315 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[LOOP]]
316 ; CHECK:       end:
317 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI_TC]], [[LOOP]] ]
318 ; CHECK-NEXT:    ret float [[PHI_TC]]
320 entry:
321   %cmp15 = icmp sgt i64 %n, 0
322   %ls = load i32, ptr %s, align 4
323   br i1 %cmp15, label %loop, label %end
325 loop:
326   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
327   %lphi = phi i32 [ %ls, %entry ], [ %ld, %loop ]
328   %ld = load i32, ptr %d, align 4
329   %iv.next = add nuw nsw i64 %iv, 1
330   %exitcond = icmp eq i64 %iv.next, %n
331   br i1 %exitcond, label %end, label %loop
333 end:
334   %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ]
335   %b = bitcast i32 %phi to float
336   ret float %b
339 define float @convphi_loopdelayed(ptr %s, ptr %d, i64 %n) {
340 ; CHECK-LABEL: @convphi_loopdelayed(
341 ; CHECK-NEXT:  entry:
342 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0
343 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
344 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
345 ; CHECK-NEXT:    br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]]
346 ; CHECK:       loop:
347 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
348 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
349 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
350 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
351 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[LOOP]]
352 ; CHECK:       end:
353 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LS_BC]], [[LOOP]] ]
354 ; CHECK-NEXT:    ret float [[PHI_TC]]
356 entry:
357   %cmp15 = icmp sgt i64 %n, 0
358   %ls = load i32, ptr %s, align 4
359   br i1 %cmp15, label %loop, label %end
361 loop:
362   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
363   %lphi = phi i32 [ %ls, %entry ], [ %lphi, %loop ]
364   %ld = load i32, ptr %d, align 4
365   %iv.next = add nuw nsw i64 %iv, 1
366   %exitcond = icmp eq i64 %iv.next, %n
367   br i1 %exitcond, label %end, label %loop
369 end:
370   %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ]
371   %b = bitcast i32 %phi to float
372   ret float %b
375 define float @convphi_loopdelayed2(ptr %s, ptr %d, i64 %n) {
376 ; CHECK-LABEL: @convphi_loopdelayed2(
377 ; CHECK-NEXT:  entry:
378 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0
379 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
380 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
381 ; CHECK-NEXT:    br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]]
382 ; CHECK:       loop:
383 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
384 ; CHECK-NEXT:    [[LPHI_TC:%.*]] = phi float [ [[LS_BC]], [[ENTRY]] ], [ [[LD_BC:%.*]], [[LOOP]] ]
385 ; CHECK-NEXT:    [[LPHI2_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI_TC]], [[LOOP]] ]
386 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
387 ; CHECK-NEXT:    [[LD_BC]] = bitcast i32 [[LD]] to float
388 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
389 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
390 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[LOOP]]
391 ; CHECK:       end:
392 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI2_TC]], [[LOOP]] ]
393 ; CHECK-NEXT:    ret float [[PHI_TC]]
395 entry:
396   %cmp15 = icmp sgt i64 %n, 0
397   %ls = load i32, ptr %s, align 4
398   br i1 %cmp15, label %loop, label %end
400 loop:
401   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
402   %lphi = phi i32 [ %ls, %entry ], [ %ld, %loop ]
403   %lphi2 = phi i32 [ undef, %entry ], [ %lphi, %loop ]
404   %ld = load i32, ptr %d, align 4
405   %iv.next = add nuw nsw i64 %iv, 1
406   %exitcond = icmp eq i64 %iv.next, %n
407   br i1 %exitcond, label %end, label %loop
409 end:
410   %phi = phi i32 [ undef, %entry ], [ %lphi2, %loop ]
411   %b = bitcast i32 %phi to float
412   ret float %b
415 define float @convphi_loopmore(ptr %s, ptr %d, i64 %n) {
416 ; CHECK-LABEL: @convphi_loopmore(
417 ; CHECK-NEXT:  entry:
418 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 1
419 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
420 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
421 ; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[IFEND:%.*]]
422 ; CHECK:       then:
423 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
424 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast i32 [[LD]] to float
425 ; CHECK-NEXT:    br label [[IFEND]]
426 ; CHECK:       ifend:
427 ; CHECK-NEXT:    [[PHI1_TC:%.*]] = phi float [ [[LD_BC]], [[THEN]] ], [ [[LS_BC]], [[ENTRY:%.*]] ]
428 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i64 [[N]], 0
429 ; CHECK-NEXT:    br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]]
430 ; CHECK:       loop:
431 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[IFEND]] ], [ [[IV_NEXT:%.*]], [[LOOPEND:%.*]] ]
432 ; CHECK-NEXT:    [[PHI2_TC:%.*]] = phi float [ [[PHI1_TC]], [[IFEND]] ], [ [[PHI3_TC:%.*]], [[LOOPEND]] ]
433 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[N]], 1
434 ; CHECK-NEXT:    br i1 [[TMP0]], label [[LOOPTHEN:%.*]], label [[LOOPEND]]
435 ; CHECK:       loopthen:
436 ; CHECK-NEXT:    [[LL:%.*]] = load i32, ptr [[D]], align 4
437 ; CHECK-NEXT:    [[LL_BC:%.*]] = bitcast i32 [[LL]] to float
438 ; CHECK-NEXT:    br label [[LOOPEND]]
439 ; CHECK:       loopend:
440 ; CHECK-NEXT:    [[PHI3_TC]] = phi float [ [[LL_BC]], [[LOOPTHEN]] ], [ [[PHI2_TC]], [[LOOP]] ]
441 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
442 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
443 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[END]], label [[LOOP]]
444 ; CHECK:       end:
445 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[PHI1_TC]], [[IFEND]] ], [ [[PHI3_TC]], [[LOOPEND]] ]
446 ; CHECK-NEXT:    ret float [[PHI_TC]]
448 entry:
449   %cmp = icmp eq i64 %n, 1
450   %ls = load i32, ptr %s, align 4
451   br i1 %cmp, label %then, label %ifend
453 then:
454   %ld = load i32, ptr %d, align 4
455   br label %ifend
457 ifend:
458   %phi1 = phi i32 [ %ld, %then ], [ %ls, %entry ]
459   %cmp15 = icmp sgt i64 %n, 0
460   br i1 %cmp15, label %loop, label %end
462 loop:
463   %iv = phi i64 [ 0, %ifend ], [ %iv.next, %loopend ]
464   %phi2 = phi i32 [ %phi1, %ifend ], [ %phi3, %loopend ]
465   br i1 %cmp, label %loopthen, label %loopend
467 loopthen:
468   %ll = load i32, ptr %d, align 4
469   br label %loopend
471 loopend:
472   %phi3 = phi i32 [ %ll, %loopthen ], [ %phi2, %loop ]
473   %iv.next = add nuw nsw i64 %iv, 1
474   %exitcond = icmp eq i64 %iv.next, %n
475   br i1 %exitcond, label %end, label %loop
477 end:
478   %phi = phi i32 [ %phi1, %ifend ], [ %phi3, %loopend ]
479   %b = bitcast i32 %phi to float
480   ret float %b
483 define void @convphi_stop(ptr %s, ptr %d, ptr %e, i32 %n) {
484 ; CHECK-LABEL: @convphi_stop(
485 ; CHECK-NEXT:  entry:
486 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
487 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
488 ; CHECK:       then:
489 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
490 ; CHECK-NEXT:    br label [[END:%.*]]
491 ; CHECK:       else:
492 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
493 ; CHECK-NEXT:    br label [[END]]
494 ; CHECK:       end:
495 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ]
496 ; CHECK-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float
497 ; CHECK-NEXT:    store float [[B]], ptr [[E:%.*]], align 4
498 ; CHECK-NEXT:    ret void
500 entry:
501   %cmp15 = icmp sgt i32 %n, 0
502   br i1 %cmp15, label %then, label %else
504 then:
505   %ls = load i32, ptr %s, align 4
506   br label %end
508 else:
509   %ld = load i32, ptr %d, align 4
510   br label %end
512 end:
513   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
514   %b = bitcast i32 %phi to float
515   store float %b, ptr %e, align 4
516   ret void
519 define void @convphi_stop2(ptr %s, ptr %d, ptr %e, i32 %n) {
520 ; CHECK-LABEL: @convphi_stop2(
521 ; CHECK-NEXT:  entry:
522 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
523 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
524 ; CHECK:       then:
525 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
526 ; CHECK-NEXT:    [[LSB:%.*]] = bitcast i32 [[LS]] to float
527 ; CHECK-NEXT:    br label [[END:%.*]]
528 ; CHECK:       else:
529 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
530 ; CHECK-NEXT:    [[LDB:%.*]] = bitcast i32 [[LD]] to float
531 ; CHECK-NEXT:    br label [[END]]
532 ; CHECK:       end:
533 ; CHECK-NEXT:    [[PHI:%.*]] = phi float [ [[LSB]], [[THEN]] ], [ [[LDB]], [[ELSE]] ]
534 ; CHECK-NEXT:    store float [[PHI]], ptr [[E:%.*]], align 4
535 ; CHECK-NEXT:    ret void
537 entry:
538   %cmp15 = icmp sgt i32 %n, 0
539   br i1 %cmp15, label %then, label %else
541 then:
542   %ls = load i32, ptr %s, align 4
543   %lsb = bitcast i32 %ls to float
544   br label %end
546 else:
547   %ld = load i32, ptr %d, align 4
548   %ldb = bitcast i32 %ld to float
549   br label %end
551 end:
552   %phi = phi float [ %lsb, %then ], [ %ldb, %else ]
553   store float %phi, ptr %e, align 4
554   ret void
557 define float @convphi_stop3(ptr %s, ptr %d, ptr %e, i32 %n) {
558 ; CHECK-LABEL: @convphi_stop3(
559 ; CHECK-NEXT:  entry:
560 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
561 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
562 ; CHECK:       then:
563 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
564 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
565 ; CHECK-NEXT:    br label [[END:%.*]]
566 ; CHECK:       else:
567 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
568 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast i32 [[LD]] to float
569 ; CHECK-NEXT:    br label [[END]]
570 ; CHECK:       end:
571 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ]
572 ; CHECK-NEXT:    store float [[PHI_TC]], ptr [[E:%.*]], align 4
573 ; CHECK-NEXT:    ret float [[PHI_TC]]
575 entry:
576   %cmp15 = icmp sgt i32 %n, 0
577   br i1 %cmp15, label %then, label %else
579 then:
580   %ls = load i32, ptr %s, align 4
581   br label %end
583 else:
584   %ld = load i32, ptr %d, align 4
585   br label %end
587 end:
588   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
589   %b = bitcast i32 %phi to float
590   store float %b, ptr %e, align 4
591   ret float %b
594 define void @convphi_stop4(ptr %s, ptr %d, ptr %e, i32 %n) {
595 ; CHECK-LABEL: @convphi_stop4(
596 ; CHECK-NEXT:  entry:
597 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
598 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
599 ; CHECK-NEXT:    [[LD_BC:%.*]] = bitcast i32 [[LD]] to float
600 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
601 ; CHECK:       then:
602 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
603 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
604 ; CHECK-NEXT:    br label [[END]]
605 ; CHECK:       end:
606 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ENTRY:%.*]] ]
607 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp sgt i32 [[N]], 0
608 ; CHECK-NEXT:    [[BC:%.*]] = bitcast float [[PHI_TC]] to i32
609 ; CHECK-NEXT:    store i32 [[BC]], ptr [[S]], align 4
610 ; CHECK-NEXT:    br i1 [[TMP0]], label [[THEN2:%.*]], label [[END2:%.*]]
611 ; CHECK:       then2:
612 ; CHECK-NEXT:    [[LF:%.*]] = load float, ptr [[E:%.*]], align 4
613 ; CHECK-NEXT:    br label [[END2]]
614 ; CHECK:       end2:
615 ; CHECK-NEXT:    [[PHI2:%.*]] = phi float [ [[PHI_TC]], [[END]] ], [ [[LF]], [[THEN2]] ]
616 ; CHECK-NEXT:    store float [[PHI2]], ptr [[E]], align 4
617 ; CHECK-NEXT:    ret void
619 entry:
620   %cmp15 = icmp sgt i32 %n, 0
621   %ld = load i32, ptr %d, align 4
622   br i1 %cmp15, label %then, label %end
624 then:
625   %ls = load i32, ptr %s, align 4
626   br label %end
628 end:
629   %phi = phi i32 [ %ls, %then ], [ %ld, %entry ]
630   %phib = bitcast i32 %phi to float
631   store i32 %phi, ptr %s, align 4
632   br i1 %cmp15, label %then2, label %end2
634 then2:
635   %lf = load float, ptr %e, align 4
636   br label %end2
638 end2:
639   %phi2 = phi float [ %phib, %end ], [ %lf, %then2 ]
640   store float %phi2, ptr %e, align 4
641   ret void
644 define float @multiuse(ptr %s, ptr %d, i32 %n) {
645 ; CHECK-LABEL: @multiuse(
646 ; CHECK-NEXT:  entry:
647 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
648 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
649 ; CHECK:       then:
650 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
651 ; CHECK-NEXT:    [[A:%.*]] = add i32 [[LS]], 2
652 ; CHECK-NEXT:    store i32 [[A]], ptr [[D:%.*]], align 4
653 ; CHECK-NEXT:    br label [[END:%.*]]
654 ; CHECK:       else:
655 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D]], align 4
656 ; CHECK-NEXT:    br label [[END]]
657 ; CHECK:       end:
658 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ]
659 ; CHECK-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float
660 ; CHECK-NEXT:    ret float [[B]]
662 entry:
663   %cmp15 = icmp sgt i32 %n, 0
664   br i1 %cmp15, label %then, label %else
666 then:
667   %ls = load i32, ptr %s, align 4
668   %a = add i32 %ls, 2
669   store i32 %a, ptr %d, align 4
670   br label %end
672 else:
673   %ld = load i32, ptr %d, align 4
674   br label %end
676 end:
677   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
678   %b = bitcast i32 %phi to float
679   ret float %b
682 define float @convphi_volatile(ptr %s, ptr %d, i32 %n) {
683 ; CHECK-LABEL: @convphi_volatile(
684 ; CHECK-NEXT:  entry:
685 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
686 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
687 ; CHECK:       then:
688 ; CHECK-NEXT:    [[LS:%.*]] = load volatile i32, ptr [[S:%.*]], align 4
689 ; CHECK-NEXT:    br label [[END:%.*]]
690 ; CHECK:       else:
691 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
692 ; CHECK-NEXT:    br label [[END]]
693 ; CHECK:       end:
694 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ]
695 ; CHECK-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float
696 ; CHECK-NEXT:    ret float [[B]]
698 ; DEBUG-LABEL: @convphi_volatile(
699 ; DEBUG-NEXT:  entry:
700 ; DEBUG-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !358
701 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !353, metadata !DIExpression()), !dbg !358
702 ; DEBUG-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]], !dbg !359
703 ; DEBUG:       then:
704 ; DEBUG-NEXT:    [[LS:%.*]] = load volatile i32, ptr [[S:%.*]], align 4, !dbg !360
705 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LS]], metadata !354, metadata !DIExpression()), !dbg !360
706 ; DEBUG-NEXT:    br label [[END:%.*]], !dbg !361
707 ; DEBUG:       else:
708 ; DEBUG-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4, !dbg !362
709 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LD]], metadata !355, metadata !DIExpression()), !dbg !362
710 ; DEBUG-NEXT:    br label [[END]], !dbg !363
711 ; DEBUG:       end:
712 ; DEBUG-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ], !dbg !364
713 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !356, metadata !DIExpression()), !dbg !364
714 ; DEBUG-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float, !dbg !365
715 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata float [[B]], metadata !357, metadata !DIExpression()), !dbg !365
716 ; DEBUG-NEXT:    ret float [[B]], !dbg !366
717 entry:
718   %cmp15 = icmp sgt i32 %n, 0
719   br i1 %cmp15, label %then, label %else
721 then:
722   %ls = load volatile i32, ptr %s, align 4
723   br label %end
725 else:
726   %ld = load i32, ptr %d, align 4
727   br label %end
729 end:
730   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
731   %b = bitcast i32 %phi to float
732   ret float %b
735 define void @convphi_volatile2(ptr %s, ptr %d, i32 %n, float %f) {
736 ; CHECK-LABEL: @convphi_volatile2(
737 ; CHECK-NEXT:  entry:
738 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
739 ; CHECK-NEXT:    [[FB:%.*]] = bitcast float [[F:%.*]] to i32
740 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
741 ; CHECK:       then:
742 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
743 ; CHECK-NEXT:    br label [[END]]
744 ; CHECK:       end:
745 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ]
746 ; CHECK-NEXT:    store volatile i32 [[PHI]], ptr [[D:%.*]], align 4
747 ; CHECK-NEXT:    ret void
749 ; DEBUG-LABEL: @convphi_volatile2(
750 ; DEBUG-NEXT:  entry:
751 ; DEBUG-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !373
752 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !369, metadata !DIExpression()), !dbg !373
753 ; DEBUG-NEXT:    [[FB:%.*]] = bitcast float [[F:%.*]] to i32, !dbg !374
754 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[FB]], metadata !370, metadata !DIExpression()), !dbg !374
755 ; DEBUG-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]], !dbg !375
756 ; DEBUG:       then:
757 ; DEBUG-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4, !dbg !376
758 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LS]], metadata !371, metadata !DIExpression()), !dbg !376
759 ; DEBUG-NEXT:    br label [[END]], !dbg !377
760 ; DEBUG:       end:
761 ; DEBUG-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ], !dbg !378
762 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !372, metadata !DIExpression()), !dbg !378
763 ; DEBUG-NEXT:    store volatile i32 [[PHI]], ptr [[D:%.*]], align 4, !dbg !379
764 ; DEBUG-NEXT:    ret void, !dbg !380
765 entry:
766   %cmp15 = icmp sgt i32 %n, 0
767   %fb = bitcast float %f to i32
768   br i1 %cmp15, label %then, label %end
770 then:
771   %ls = load i32, ptr %s, align 4
772   br label %end
774 end:
775   %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
776   store volatile i32 %phi, ptr %d
777   ret void
780 define float @convphi_atomic(ptr %s, ptr %d, i32 %n) {
781 ; CHECK-LABEL: @convphi_atomic(
782 ; CHECK-NEXT:  entry:
783 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
784 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]]
785 ; CHECK:       then:
786 ; CHECK-NEXT:    [[LS:%.*]] = load atomic i32, ptr [[S:%.*]] acquire, align 4
787 ; CHECK-NEXT:    br label [[END:%.*]]
788 ; CHECK:       else:
789 ; CHECK-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4
790 ; CHECK-NEXT:    br label [[END]]
791 ; CHECK:       end:
792 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ]
793 ; CHECK-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float
794 ; CHECK-NEXT:    ret float [[B]]
796 ; DEBUG-LABEL: @convphi_atomic(
797 ; DEBUG-NEXT:  entry:
798 ; DEBUG-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !388
799 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !383, metadata !DIExpression()), !dbg !388
800 ; DEBUG-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]], !dbg !389
801 ; DEBUG:       then:
802 ; DEBUG-NEXT:    [[LS:%.*]] = load atomic i32, ptr [[S:%.*]] acquire, align 4, !dbg !390
803 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LS]], metadata !384, metadata !DIExpression()), !dbg !390
804 ; DEBUG-NEXT:    br label [[END:%.*]], !dbg !391
805 ; DEBUG:       else:
806 ; DEBUG-NEXT:    [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4, !dbg !392
807 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LD]], metadata !385, metadata !DIExpression()), !dbg !392
808 ; DEBUG-NEXT:    br label [[END]], !dbg !393
809 ; DEBUG:       end:
810 ; DEBUG-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ], !dbg !394
811 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !386, metadata !DIExpression()), !dbg !394
812 ; DEBUG-NEXT:    [[B:%.*]] = bitcast i32 [[PHI]] to float, !dbg !395
813 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata float [[B]], metadata !387, metadata !DIExpression()), !dbg !395
814 ; DEBUG-NEXT:    ret float [[B]], !dbg !396
815 entry:
816   %cmp15 = icmp sgt i32 %n, 0
817   br i1 %cmp15, label %then, label %else
819 then:
820   %ls = load atomic i32, ptr %s acquire, align 4
821   br label %end
823 else:
824   %ld = load i32, ptr %d, align 4
825   br label %end
827 end:
828   %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
829   %b = bitcast i32 %phi to float
830   ret float %b
833 define void @convphi_atomic2(ptr %s, ptr %d, i32 %n, float %f) {
834 ; CHECK-LABEL: @convphi_atomic2(
835 ; CHECK-NEXT:  entry:
836 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
837 ; CHECK-NEXT:    [[FB:%.*]] = bitcast float [[F:%.*]] to i32
838 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
839 ; CHECK:       then:
840 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
841 ; CHECK-NEXT:    br label [[END]]
842 ; CHECK:       end:
843 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ]
844 ; CHECK-NEXT:    store atomic i32 [[PHI]], ptr [[D:%.*]] release, align 4
845 ; CHECK-NEXT:    ret void
847 ; DEBUG-LABEL: @convphi_atomic2(
848 ; DEBUG-NEXT:  entry:
849 ; DEBUG-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !403
850 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !399, metadata !DIExpression()), !dbg !403
851 ; DEBUG-NEXT:    [[FB:%.*]] = bitcast float [[F:%.*]] to i32, !dbg !404
852 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[FB]], metadata !400, metadata !DIExpression()), !dbg !404
853 ; DEBUG-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]], !dbg !405
854 ; DEBUG:       then:
855 ; DEBUG-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4, !dbg !406
856 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[LS]], metadata !401, metadata !DIExpression()), !dbg !406
857 ; DEBUG-NEXT:    br label [[END]], !dbg !407
858 ; DEBUG:       end:
859 ; DEBUG-NEXT:    [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ], !dbg !408
860 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !402, metadata !DIExpression()), !dbg !408
861 ; DEBUG-NEXT:    store atomic i32 [[PHI]], ptr [[D:%.*]] release, align 4, !dbg !409
862 ; DEBUG-NEXT:    ret void, !dbg !410
863 entry:
864   %cmp15 = icmp sgt i32 %n, 0
865   %fb = bitcast float %f to i32
866   br i1 %cmp15, label %then, label %end
868 then:
869   %ls = load i32, ptr %s, align 4
870   br label %end
872 end:
873   %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
874   store atomic i32 %phi, ptr %d release, align 4
875   ret void
878 define float @convphi2_zero(ptr %s, ptr %d, i32 %n) {
879 ; CHECK-LABEL: @convphi2_zero(
880 ; CHECK-NEXT:  entry:
881 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
882 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
883 ; CHECK:       then:
884 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
885 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
886 ; CHECK-NEXT:    br label [[END]]
887 ; CHECK:       end:
888 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
889 ; CHECK-NEXT:    ret float [[PHI_TC]]
891 entry:
892   %cmp15 = icmp sgt i32 %n, 0
893   br i1 %cmp15, label %then, label %end
895 then:
896   %ls = load i32, ptr %s, align 4
897   br label %end
899 end:
900   %phi = phi i32 [ %ls, %then ], [ 0, %entry ]
901   %b = bitcast i32 %phi to float
902   ret float %b
905 define i32 @convphi2f_zero(ptr %s, ptr %d, i32 %n) {
906 ; CHECK-LABEL: @convphi2f_zero(
907 ; CHECK-NEXT:  entry:
908 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
909 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
910 ; CHECK:       then:
911 ; CHECK-NEXT:    [[LS:%.*]] = load float, ptr [[S:%.*]], align 4
912 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast float [[LS]] to i32
913 ; CHECK-NEXT:    br label [[END]]
914 ; CHECK:       end:
915 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ]
916 ; CHECK-NEXT:    ret i32 [[PHI_TC]]
918 entry:
919   %cmp15 = icmp sgt i32 %n, 0
920   br i1 %cmp15, label %then, label %end
922 then:
923   %ls = load float, ptr %s, align 4
924   br label %end
926 end:
927   %phi = phi float [ %ls, %then ], [ 0.0, %entry ]
928   %b = bitcast float %phi to i32
929   ret i32 %b
932 define float @convphi2_ten(ptr %s, ptr %d, i32 %n) {
933 ; CHECK-LABEL: @convphi2_ten(
934 ; CHECK-NEXT:  entry:
935 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
936 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
937 ; CHECK:       then:
938 ; CHECK-NEXT:    [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4
939 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
940 ; CHECK-NEXT:    br label [[END]]
941 ; CHECK:       end:
942 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0x36D4000000000000, [[ENTRY:%.*]] ]
943 ; CHECK-NEXT:    ret float [[PHI_TC]]
945 entry:
946   %cmp15 = icmp sgt i32 %n, 0
947   br i1 %cmp15, label %then, label %end
949 then:
950   %ls = load i32, ptr %s, align 4
951   br label %end
953 end:
954   %phi = phi i32 [ %ls, %then ], [ 10, %entry ]
955   %b = bitcast i32 %phi to float
956   ret float %b
959 define i32 @convphi2f_ten(ptr %s, ptr %d, i32 %n) {
960 ; CHECK-LABEL: @convphi2f_ten(
961 ; CHECK-NEXT:  entry:
962 ; CHECK-NEXT:    [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0
963 ; CHECK-NEXT:    br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
964 ; CHECK:       then:
965 ; CHECK-NEXT:    [[LS:%.*]] = load float, ptr [[S:%.*]], align 4
966 ; CHECK-NEXT:    [[LS_BC:%.*]] = bitcast float [[LS]] to i32
967 ; CHECK-NEXT:    br label [[END]]
968 ; CHECK:       end:
969 ; CHECK-NEXT:    [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 1092616192, [[ENTRY:%.*]] ]
970 ; CHECK-NEXT:    ret i32 [[PHI_TC]]
972 entry:
973   %cmp15 = icmp sgt i32 %n, 0
974   br i1 %cmp15, label %then, label %end
976 then:
977   %ls = load float, ptr %s, align 4
978   br label %end
980 end:
981   %phi = phi float [ %ls, %then ], [ 10.0, %entry ]
982   %b = bitcast float %phi to i32
983   ret i32 %b