xref: /llvm-project/llvm/test/CodeGen/AArch64/convertphitype.ll (revision dd116369f646d023a2e7e5c145a1bed5dcf9a45c)
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
3
4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5target triple = "aarch64--linux-gnu"
6
7define 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]]
23;
24entry:
25  %cmp15 = icmp sgt i32 %n, 0
26  br i1 %cmp15, label %then, label %else
27
28then:
29  %ls = load i32, ptr %s, align 4
30  br label %end
31
32else:
33  %ld = load i32, ptr %d, align 4
34  br label %end
35
36end:
37  %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
38  %b = bitcast i32 %phi to float
39  ret float %b
40}
41
42define 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]]
54;
55entry:
56  %cmp15 = icmp sgt i32 %n, 0
57  br i1 %cmp15, label %then, label %end
58
59then:
60  %ls = load i32, ptr %s, align 4
61  br label %end
62
63end:
64  %phi = phi i32 [ %ls, %then ], [ undef, %entry ]
65  %b = bitcast i32 %phi to float
66  ret float %b
67}
68
69define 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]]
81;
82entry:
83  %cmp15 = icmp sgt i32 %n, 0
84  %fb = bitcast float %f to i32
85  br i1 %cmp15, label %then, label %end
86
87then:
88  %ls = load i32, ptr %s, align 4
89  br label %end
90
91end:
92  %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
93  %b = bitcast i32 %phi to float
94  ret float %b
95}
96
97define 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
111;
112entry:
113  %cmp15 = icmp sgt i32 %n, 0
114  %fb = bitcast float %f to i32
115  br i1 %cmp15, label %then, label %end
116
117then:
118  %ls = load i32, ptr %s, align 4
119  br label %end
120
121end:
122  %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
123  store i32 %phi, ptr %d
124  ret void
125}
126
127define 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]]
143;
144entry:
145  %cmp15 = icmp sgt i32 %n, 0
146  br i1 %cmp15, label %then, label %else
147
148then:
149  %ls = load double, ptr %s, align 4
150  br label %end
151
152else:
153  %ld = load double, ptr %d, align 4
154  br label %end
155
156end:
157  %phi = phi double [ %ls, %then ], [ %ld, %else ]
158  %b = bitcast double %phi to i64
159  ret i64 %b
160}
161
162define 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]]
178;
179entry:
180  %cmp15 = icmp sgt i32 %n, 0
181  br i1 %cmp15, label %then, label %else
182
183then:
184  %ls = load float, ptr %s, align 4
185  br label %end
186
187else:
188  %ld = load float, ptr %d, align 4
189  br label %end
190
191end:
192  %phi = phi float [ %ls, %then ], [ %ld, %else ]
193  %b = bitcast float %phi to i32
194  ret i32 %b
195}
196
197define 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]]
213;
214entry:
215  %cmp15 = icmp sgt i32 %n, 0
216  br i1 %cmp15, label %then, label %else
217
218then:
219  %ls = load half, ptr %s, align 4
220  br label %end
221
222else:
223  %ld = load half, ptr %d, align 4
224  br label %end
225
226end:
227  %phi = phi half [ %ls, %then ], [ %ld, %else ]
228  %b = bitcast half %phi to i16
229  ret i16 %b
230}
231
232define 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]]
248;
249entry:
250  %cmp15 = icmp sgt i32 %n, 0
251  br i1 %cmp15, label %then, label %else
252
253then:
254  %ls = load fp128, ptr %s, align 4
255  br label %end
256
257else:
258  %ld = load fp128, ptr %d, align 4
259  br label %end
260
261end:
262  %phi = phi fp128 [ %ls, %then ], [ %ld, %else ]
263  %b = bitcast fp128 %phi to i128
264  ret i128 %b
265}
266
267define <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]]
282;
283entry:
284  %cmp15 = icmp sgt i32 %n, 0
285  br i1 %cmp15, label %then, label %else
286
287then:
288  %ls = load <4 x float>, ptr %s, align 4
289  br label %end
290
291else:
292  %ld = load <4 x float>, ptr %d, align 4
293  br label %end
294
295end:
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
299}
300
301define 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]]
319;
320entry:
321  %cmp15 = icmp sgt i64 %n, 0
322  %ls = load i32, ptr %s, align 4
323  br i1 %cmp15, label %loop, label %end
324
325loop:
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
332
333end:
334  %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ]
335  %b = bitcast i32 %phi to float
336  ret float %b
337}
338
339define 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]]
355;
356entry:
357  %cmp15 = icmp sgt i64 %n, 0
358  %ls = load i32, ptr %s, align 4
359  br i1 %cmp15, label %loop, label %end
360
361loop:
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
368
369end:
370  %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ]
371  %b = bitcast i32 %phi to float
372  ret float %b
373}
374
375define 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]]
394;
395entry:
396  %cmp15 = icmp sgt i64 %n, 0
397  %ls = load i32, ptr %s, align 4
398  br i1 %cmp15, label %loop, label %end
399
400loop:
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
408
409end:
410  %phi = phi i32 [ undef, %entry ], [ %lphi2, %loop ]
411  %b = bitcast i32 %phi to float
412  ret float %b
413}
414
415define 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]]
447;
448entry:
449  %cmp = icmp eq i64 %n, 1
450  %ls = load i32, ptr %s, align 4
451  br i1 %cmp, label %then, label %ifend
452
453then:
454  %ld = load i32, ptr %d, align 4
455  br label %ifend
456
457ifend:
458  %phi1 = phi i32 [ %ld, %then ], [ %ls, %entry ]
459  %cmp15 = icmp sgt i64 %n, 0
460  br i1 %cmp15, label %loop, label %end
461
462loop:
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
466
467loopthen:
468  %ll = load i32, ptr %d, align 4
469  br label %loopend
470
471loopend:
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
476
477end:
478  %phi = phi i32 [ %phi1, %ifend ], [ %phi3, %loopend ]
479  %b = bitcast i32 %phi to float
480  ret float %b
481}
482
483define 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
499;
500entry:
501  %cmp15 = icmp sgt i32 %n, 0
502  br i1 %cmp15, label %then, label %else
503
504then:
505  %ls = load i32, ptr %s, align 4
506  br label %end
507
508else:
509  %ld = load i32, ptr %d, align 4
510  br label %end
511
512end:
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
517}
518
519define 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
536;
537entry:
538  %cmp15 = icmp sgt i32 %n, 0
539  br i1 %cmp15, label %then, label %else
540
541then:
542  %ls = load i32, ptr %s, align 4
543  %lsb = bitcast i32 %ls to float
544  br label %end
545
546else:
547  %ld = load i32, ptr %d, align 4
548  %ldb = bitcast i32 %ld to float
549  br label %end
550
551end:
552  %phi = phi float [ %lsb, %then ], [ %ldb, %else ]
553  store float %phi, ptr %e, align 4
554  ret void
555}
556
557define 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]]
574;
575entry:
576  %cmp15 = icmp sgt i32 %n, 0
577  br i1 %cmp15, label %then, label %else
578
579then:
580  %ls = load i32, ptr %s, align 4
581  br label %end
582
583else:
584  %ld = load i32, ptr %d, align 4
585  br label %end
586
587end:
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
592}
593
594define 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
618;
619entry:
620  %cmp15 = icmp sgt i32 %n, 0
621  %ld = load i32, ptr %d, align 4
622  br i1 %cmp15, label %then, label %end
623
624then:
625  %ls = load i32, ptr %s, align 4
626  br label %end
627
628end:
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
633
634then2:
635  %lf = load float, ptr %e, align 4
636  br label %end2
637
638end2:
639  %phi2 = phi float [ %phib, %end ], [ %lf, %then2 ]
640  store float %phi2, ptr %e, align 4
641  ret void
642}
643
644define 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]]
661;
662entry:
663  %cmp15 = icmp sgt i32 %n, 0
664  br i1 %cmp15, label %then, label %else
665
666then:
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
671
672else:
673  %ld = load i32, ptr %d, align 4
674  br label %end
675
676end:
677  %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
678  %b = bitcast i32 %phi to float
679  ret float %b
680}
681
682define 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]]
697;
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
717entry:
718  %cmp15 = icmp sgt i32 %n, 0
719  br i1 %cmp15, label %then, label %else
720
721then:
722  %ls = load volatile i32, ptr %s, align 4
723  br label %end
724
725else:
726  %ld = load i32, ptr %d, align 4
727  br label %end
728
729end:
730  %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
731  %b = bitcast i32 %phi to float
732  ret float %b
733}
734
735define 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
748;
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
765entry:
766  %cmp15 = icmp sgt i32 %n, 0
767  %fb = bitcast float %f to i32
768  br i1 %cmp15, label %then, label %end
769
770then:
771  %ls = load i32, ptr %s, align 4
772  br label %end
773
774end:
775  %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
776  store volatile i32 %phi, ptr %d
777  ret void
778}
779
780define 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]]
795;
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
815entry:
816  %cmp15 = icmp sgt i32 %n, 0
817  br i1 %cmp15, label %then, label %else
818
819then:
820  %ls = load atomic i32, ptr %s acquire, align 4
821  br label %end
822
823else:
824  %ld = load i32, ptr %d, align 4
825  br label %end
826
827end:
828  %phi = phi i32 [ %ls, %then ], [ %ld, %else ]
829  %b = bitcast i32 %phi to float
830  ret float %b
831}
832
833define 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
846;
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
863entry:
864  %cmp15 = icmp sgt i32 %n, 0
865  %fb = bitcast float %f to i32
866  br i1 %cmp15, label %then, label %end
867
868then:
869  %ls = load i32, ptr %s, align 4
870  br label %end
871
872end:
873  %phi = phi i32 [ %ls, %then ], [ %fb, %entry ]
874  store atomic i32 %phi, ptr %d release, align 4
875  ret void
876}
877
878define 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]]
890;
891entry:
892  %cmp15 = icmp sgt i32 %n, 0
893  br i1 %cmp15, label %then, label %end
894
895then:
896  %ls = load i32, ptr %s, align 4
897  br label %end
898
899end:
900  %phi = phi i32 [ %ls, %then ], [ 0, %entry ]
901  %b = bitcast i32 %phi to float
902  ret float %b
903}
904
905define 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]]
917;
918entry:
919  %cmp15 = icmp sgt i32 %n, 0
920  br i1 %cmp15, label %then, label %end
921
922then:
923  %ls = load float, ptr %s, align 4
924  br label %end
925
926end:
927  %phi = phi float [ %ls, %then ], [ 0.0, %entry ]
928  %b = bitcast float %phi to i32
929  ret i32 %b
930}
931
932define 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]]
944;
945entry:
946  %cmp15 = icmp sgt i32 %n, 0
947  br i1 %cmp15, label %then, label %end
948
949then:
950  %ls = load i32, ptr %s, align 4
951  br label %end
952
953end:
954  %phi = phi i32 [ %ls, %then ], [ 10, %entry ]
955  %b = bitcast i32 %phi to float
956  ret float %b
957}
958
959define 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]]
971;
972entry:
973  %cmp15 = icmp sgt i32 %n, 0
974  br i1 %cmp15, label %then, label %end
975
976then:
977  %ls = load float, ptr %s, align 4
978  br label %end
979
980end:
981  %phi = phi float [ %ls, %then ], [ 10.0, %entry ]
982  %b = bitcast float %phi to i32
983  ret i32 %b
984}
985