1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -instcombine -S < %s | FileCheck %s
3
4define void @test_bitcast_1(i1 %c, i32* %ptr) {
5; CHECK-LABEL: @test_bitcast_1(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
8; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
9; CHECK:       b0:
10; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
11; CHECK-NEXT:    br label [[END:%.*]]
12; CHECK:       b1:
13; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR]] to i8*
14; CHECK-NEXT:    br label [[END]]
15; CHECK:       end:
16; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
17; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
18; CHECK-NEXT:    ret void
19;
20entry:
21  %cast.0 = bitcast i32* %ptr to i8*
22  %cast.1 = bitcast i32* %ptr to i8*
23  br i1 %c, label %b0, label %b1
24
25b0:
26  call void @use(i8* %cast.0)
27  br label %end
28
29b1:
30  br label %end
31
32end:
33  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
34  store i8 0, i8* %p
35  ret void
36}
37
38define void @test_bitcast_2(i1 %c, i32* %ptr) {
39; CHECK-LABEL: @test_bitcast_2(
40; CHECK-NEXT:  entry:
41; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
42; CHECK:       b0:
43; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
44; CHECK-NEXT:    br label [[END:%.*]]
45; CHECK:       b1:
46; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR]] to i8*
47; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
48; CHECK-NEXT:    br label [[END]]
49; CHECK:       end:
50; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
51; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
52; CHECK-NEXT:    ret void
53;
54entry:
55  br i1 %c, label %b0, label %b1
56
57b0:
58  %cast.0 = bitcast i32* %ptr to i8*
59  br label %end
60
61b1:
62  %cast.1 = bitcast i32* %ptr to i8*
63  call void @use(i8* %cast.1)
64  br label %end
65
66end:
67  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
68  store i8 0, i8* %p
69  ret void
70}
71
72
73define void @test_bitcast_3(i1 %c, i32** %ptr) {
74; CHECK-LABEL: @test_bitcast_3(
75; CHECK-NEXT:  entry:
76; CHECK-NEXT:    [[LOAD_PTR:%.*]] = load i32*, i32** [[PTR:%.*]], align 8
77; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
78; CHECK:       b0:
79; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[LOAD_PTR]] to i8*
80; CHECK-NEXT:    br label [[END:%.*]]
81; CHECK:       b1:
82; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[LOAD_PTR]] to i8*
83; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
84; CHECK-NEXT:    br label [[END]]
85; CHECK:       end:
86; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
87; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
88; CHECK-NEXT:    ret void
89;
90entry:
91  %load.ptr = load i32*, i32** %ptr
92  br i1 %c, label %b0, label %b1
93
94b0:
95  %cast.0 = bitcast i32* %load.ptr to i8*
96  br label %end
97
98b1:
99  %cast.1 = bitcast i32* %load.ptr to i8*
100  call void @use(i8* %cast.1)
101  br label %end
102
103end:
104  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
105  store i8 0, i8* %p
106  ret void
107}
108
109define void @test_bitcast_loads_in_different_bbs(i1 %c, i32** %ptr.0, i32** %ptr.1) {
110; CHECK-LABEL: @test_bitcast_loads_in_different_bbs(
111; CHECK-NEXT:  entry:
112; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
113; CHECK:       b0:
114; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32** [[PTR_0:%.*]] to i8**
115; CHECK-NEXT:    [[LOAD_PTR_02:%.*]] = load i8*, i8** [[TMP0]], align 8
116; CHECK-NEXT:    call void @use(i8* [[LOAD_PTR_02]])
117; CHECK-NEXT:    br label [[END:%.*]]
118; CHECK:       b1:
119; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32** [[PTR_1:%.*]] to i8**
120; CHECK-NEXT:    [[LOAD_PTR_11:%.*]] = load i8*, i8** [[TMP1]], align 8
121; CHECK-NEXT:    br label [[END]]
122; CHECK:       end:
123; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[LOAD_PTR_02]], [[B0]] ], [ [[LOAD_PTR_11]], [[B1]] ]
124; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
125; CHECK-NEXT:    ret void
126;
127entry:
128  br i1 %c, label %b0, label %b1
129
130b0:
131  %load.ptr.0 = load i32*, i32** %ptr.0
132  %cast.0 = bitcast i32* %load.ptr.0 to i8*
133  call void @use(i8* %cast.0)
134  br label %end
135
136b1:
137  %load.ptr.1 = load i32*, i32** %ptr.1
138  %cast.1 = bitcast i32* %load.ptr.1 to i8*
139  br label %end
140
141end:
142  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
143  store i8 0, i8* %p
144  ret void
145}
146
147define void @test_gep_1(i1 %c, i32* %ptr) {
148; CHECK-LABEL: @test_gep_1(
149; CHECK-NEXT:  entry:
150; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
151; CHECK:       b0:
152; CHECK-NEXT:    call void @use.i32(i32* [[PTR:%.*]])
153; CHECK-NEXT:    br label [[END:%.*]]
154; CHECK:       b1:
155; CHECK-NEXT:    br label [[END]]
156; CHECK:       end:
157; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 4
158; CHECK-NEXT:    ret void
159;
160entry:
161  br i1 %c, label %b0, label %b1
162
163b0:
164  %cast.0 = getelementptr i32, i32* %ptr, i32 0
165  call void @use.i32(i32* %cast.0)
166  br label %end
167
168b1:
169  %cast.1 = getelementptr i32, i32* %ptr, i32 0
170  br label %end
171
172end:
173  %p = phi i32* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
174  store i32 0, i32* %p
175  ret void
176}
177
178define void @test_bitcast_not_foldable(i1 %c, i32* %ptr.0, i32* %ptr.1) {
179; CHECK-LABEL: @test_bitcast_not_foldable(
180; CHECK-NEXT:  entry:
181; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
182; CHECK:       b0:
183; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
184; CHECK-NEXT:    br label [[END:%.*]]
185; CHECK:       b1:
186; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
187; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
188; CHECK-NEXT:    br label [[END]]
189; CHECK:       end:
190; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
191; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
192; CHECK-NEXT:    ret void
193;
194entry:
195  br i1 %c, label %b0, label %b1
196
197b0:
198  %cast.0 = bitcast i32* %ptr.0 to i8*
199  br label %end
200
201b1:
202  %cast.1 = bitcast i32* %ptr.1 to i8*
203  call void @use(i8* %cast.1)
204  br label %end
205
206end:
207  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
208  store i8 0, i8* %p
209  ret void
210}
211
212define void @test_bitcast_with_extra_use(i1 %c, i32* %ptr) {
213; CHECK-LABEL: @test_bitcast_with_extra_use(
214; CHECK-NEXT:  entry:
215; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
216; CHECK:       b0:
217; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
218; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
219; CHECK-NEXT:    br label [[END:%.*]]
220; CHECK:       b1:
221; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR]] to i8*
222; CHECK-NEXT:    br label [[END]]
223; CHECK:       end:
224; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
225; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
226; CHECK-NEXT:    ret void
227;
228entry:
229  br i1 %c, label %b0, label %b1
230
231b0:
232  %cast.0 = bitcast i32* %ptr to i8*
233  call void @use(i8* %cast.0)
234  br label %end
235
236b1:
237  %cast.1 = bitcast i32* %ptr to i8*
238  br label %end
239
240end:
241  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
242  store i8 0, i8* %p
243  ret void
244}
245
246define void @test_bitcast_different_bases(i1 %c, i32* %ptr.0, i32* %ptr.1) {
247; CHECK-LABEL: @test_bitcast_different_bases(
248; CHECK-NEXT:  entry:
249; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
250; CHECK:       b0:
251; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
252; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
253; CHECK-NEXT:    br label [[END:%.*]]
254; CHECK:       b1:
255; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
256; CHECK-NEXT:    br label [[END]]
257; CHECK:       end:
258; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
259; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
260; CHECK-NEXT:    ret void
261;
262entry:
263  br i1 %c, label %b0, label %b1
264
265b0:
266  %cast.0 = bitcast i32* %ptr.0 to i8*
267  call void @use(i8* %cast.0)
268  br label %end
269
270b1:
271  %cast.1 = bitcast i32* %ptr.1 to i8*
272  br label %end
273
274end:
275  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
276  store i8 0, i8* %p
277  ret void
278}
279
280define void @test_bitcast_gep_chains(i1 %c, i32* %ptr) {
281; CHECK-LABEL: @test_bitcast_gep_chains(
282; CHECK-NEXT:  entry:
283; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
284; CHECK:       b0:
285; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
286; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
287; CHECK-NEXT:    br label [[END:%.*]]
288; CHECK:       b1:
289; CHECK-NEXT:    call void @use.i32(i32* [[PTR]])
290; CHECK-NEXT:    [[CAST_3:%.*]] = bitcast i32* [[PTR]] to i8*
291; CHECK-NEXT:    br label [[END]]
292; CHECK:       end:
293; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_3]], [[B1]] ]
294; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
295; CHECK-NEXT:    ret void
296;
297entry:
298  %gep = getelementptr i32, i32* %ptr, i32 0
299  br i1 %c, label %b0, label %b1
300
301b0:
302  %cast.0 = bitcast i32* %gep to i8*
303  call void @use(i8* %cast.0)
304  br label %end
305
306b1:
307  %cast.1 = bitcast i32* %ptr to i8*
308  %cast.2 = bitcast i8* %cast.1 to i32*
309  call void @use.i32(i32* %cast.2)
310  %cast.3 = bitcast i32* %cast.2 to i8*
311  br label %end
312
313end:
314  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ]
315  store i8 0, i8* %p
316  ret void
317}
318
319define void @test_4_incoming_values_different_bases_1(i32 %c, i32* %ptr.0, i32* %ptr.1) {
320; CHECK-LABEL: @test_4_incoming_values_different_bases_1(
321; CHECK-NEXT:  entry:
322; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
323; CHECK-NEXT:    i32 0, label [[B0:%.*]]
324; CHECK-NEXT:    i32 1, label [[B1:%.*]]
325; CHECK-NEXT:    i32 2, label [[B2:%.*]]
326; CHECK-NEXT:    i32 3, label [[B3:%.*]]
327; CHECK-NEXT:    ]
328; CHECK:       b0:
329; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
330; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
331; CHECK-NEXT:    br label [[END:%.*]]
332; CHECK:       b1:
333; CHECK-NEXT:    [[CAST_3:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
334; CHECK-NEXT:    br label [[END]]
335; CHECK:       b2:
336; CHECK-NEXT:    [[CAST_4:%.*]] = bitcast i32* [[PTR_0]] to i8*
337; CHECK-NEXT:    br label [[END]]
338; CHECK:       b3:
339; CHECK-NEXT:    [[CAST_5:%.*]] = bitcast i32* [[PTR_0]] to i8*
340; CHECK-NEXT:    br label [[END]]
341; CHECK:       end:
342; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_3]], [[B1]] ], [ [[CAST_4]], [[B2]] ], [ [[CAST_5]], [[B3]] ]
343; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
344; CHECK-NEXT:    ret void
345; CHECK:       end.2:
346; CHECK-NEXT:    ret void
347;
348entry:
349  %gep = getelementptr i32, i32* %ptr.0, i32 0
350  switch i32 %c, label %end.2 [ i32 0, label %b0
351  i32 1, label %b1
352  i32 2, label %b2
353  i32 3, label %b3]
354
355b0:
356  %cast.0 = bitcast i32* %gep to i8*
357  call void @use(i8* %cast.0)
358  br label %end
359
360b1:
361  %cast.1 = bitcast i32* %ptr.1 to i8*
362  %cast.2 = bitcast i8* %cast.1 to i64*
363  %cast.3 = bitcast i64* %cast.2 to i8*
364  br label %end
365
366b2:
367  %cast.4 = bitcast i32* %gep to i8*
368  br label %end
369
370b3:
371  %cast.5 = bitcast i32 * %ptr.0 to i8*
372  br label %end
373
374end:
375  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
376  store i8 0, i8* %p
377  ret void
378
379end.2:
380  ret void
381}
382
383define void @test_4_incoming_values_different_bases_2(i32 %c, i32* %ptr.0, i32* %ptr.1) {
384; CHECK-LABEL: @test_4_incoming_values_different_bases_2(
385; CHECK-NEXT:  entry:
386; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
387; CHECK-NEXT:    i32 0, label [[B0:%.*]]
388; CHECK-NEXT:    i32 1, label [[B1:%.*]]
389; CHECK-NEXT:    i32 2, label [[B2:%.*]]
390; CHECK-NEXT:    i32 3, label [[B3:%.*]]
391; CHECK-NEXT:    ]
392; CHECK:       b0:
393; CHECK-NEXT:    br label [[END:%.*]]
394; CHECK:       b1:
395; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
396; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
397; CHECK-NEXT:    br label [[END]]
398; CHECK:       b2:
399; CHECK-NEXT:    br label [[END]]
400; CHECK:       b3:
401; CHECK-NEXT:    br label [[END]]
402; CHECK:       end:
403; CHECK-NEXT:    [[P_IN:%.*]] = phi i32* [ [[PTR_1:%.*]], [[B0]] ], [ [[PTR_0]], [[B1]] ], [ [[PTR_0]], [[B2]] ], [ [[PTR_0]], [[B3]] ]
404; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[P_IN]] to i8*
405; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
406; CHECK-NEXT:    ret void
407; CHECK:       end.2:
408; CHECK-NEXT:    ret void
409;
410entry:
411  %gep = getelementptr i32, i32* %ptr.0, i32 0
412  switch i32 %c, label %end.2 [ i32 0, label %b0
413  i32 1, label %b1
414  i32 2, label %b2
415  i32 3, label %b3]
416
417b0:
418  %cast.0 = bitcast i32* %ptr.1 to i8*
419  br label %end
420
421b1:
422  %cast.1 = bitcast i32* %ptr.0 to i8*
423  call void @use(i8* %cast.1)
424  %cast.2 = bitcast i8* %cast.1 to i64*
425  %cast.3 = bitcast i64* %cast.2 to i8*
426  br label %end
427
428b2:
429  %cast.4 = bitcast i32* %gep to i8*
430  br label %end
431
432b3:
433  %cast.5 = bitcast i32 * %ptr.0 to i8*
434  br label %end
435
436end:
437  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
438  store i8 0, i8* %p
439  ret void
440
441end.2:
442  ret void
443}
444
445define void @test_4_incoming_values_different_bases_3(i32 %c, i32* %ptr.0, i32* %ptr.1) {
446; CHECK-LABEL: @test_4_incoming_values_different_bases_3(
447; CHECK-NEXT:  entry:
448; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
449; CHECK-NEXT:    i32 0, label [[B0:%.*]]
450; CHECK-NEXT:    i32 1, label [[B1:%.*]]
451; CHECK-NEXT:    i32 2, label [[B2:%.*]]
452; CHECK-NEXT:    i32 3, label [[B3:%.*]]
453; CHECK-NEXT:    ]
454; CHECK:       b0:
455; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
456; CHECK-NEXT:    br label [[END:%.*]]
457; CHECK:       b1:
458; CHECK-NEXT:    [[CAST_3:%.*]] = bitcast i32* [[PTR_0]] to i8*
459; CHECK-NEXT:    br label [[END]]
460; CHECK:       b2:
461; CHECK-NEXT:    [[CAST_4:%.*]] = bitcast i32* [[PTR_0]] to i8*
462; CHECK-NEXT:    call void @use(i8* [[CAST_4]])
463; CHECK-NEXT:    br label [[END]]
464; CHECK:       b3:
465; CHECK-NEXT:    [[CAST_5:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
466; CHECK-NEXT:    br label [[END]]
467; CHECK:       end:
468; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_3]], [[B1]] ], [ [[CAST_4]], [[B2]] ], [ [[CAST_5]], [[B3]] ]
469; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
470; CHECK-NEXT:    ret void
471; CHECK:       end.2:
472; CHECK-NEXT:    ret void
473;
474entry:
475  %gep = getelementptr i32, i32* %ptr.0, i32 0
476  switch i32 %c, label %end.2 [ i32 0, label %b0
477  i32 1, label %b1
478  i32 2, label %b2
479  i32 3, label %b3]
480
481b0:
482  %cast.0 = bitcast i32* %ptr.0 to i8*
483  br label %end
484
485b1:
486  %cast.1 = bitcast i32* %ptr.0 to i8*
487  %cast.2 = bitcast i8* %cast.1 to i64*
488  %cast.3 = bitcast i64* %cast.2 to i8*
489  br label %end
490
491b2:
492  %cast.4 = bitcast i32* %gep to i8*
493  call void @use(i8* %cast.4)
494  br label %end
495
496b3:
497  %cast.5 = bitcast i32 * %ptr.1 to i8*
498  br label %end
499
500end:
501  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
502  store i8 0, i8* %p
503  ret void
504
505end.2:
506  ret void
507}
508
509define void @test_addrspacecast_1(i1 %c, i32* %ptr) {
510; CHECK-LABEL: @test_addrspacecast_1(
511; CHECK-NEXT:  entry:
512; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
513; CHECK-NEXT:    [[CAST_1:%.*]] = addrspacecast i8* [[TMP0]] to i8 addrspace(1)*
514; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
515; CHECK:       b0:
516; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[PTR]] to i8*
517; CHECK-NEXT:    [[CAST_0:%.*]] = addrspacecast i8* [[TMP1]] to i8 addrspace(1)*
518; CHECK-NEXT:    br label [[END:%.*]]
519; CHECK:       b1:
520; CHECK-NEXT:    call void @use.i8.addrspace1(i8 addrspace(1)* [[CAST_1]])
521; CHECK-NEXT:    br label [[END]]
522; CHECK:       end:
523; CHECK-NEXT:    [[P:%.*]] = phi i8 addrspace(1)* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
524; CHECK-NEXT:    store i8 0, i8 addrspace(1)* [[P]], align 1
525; CHECK-NEXT:    ret void
526;
527entry:
528  %cast.0 = addrspacecast i32* %ptr to i8 addrspace(1)*
529  %cast.1 = addrspacecast i32* %ptr to i8 addrspace(1)*
530  br i1 %c, label %b0, label %b1
531
532b0:
533  br label %end
534
535b1:
536  call void @use.i8.addrspace1(i8 addrspace(1)* %cast.1)
537  br label %end
538
539end:
540  %p = phi i8 addrspace(1)* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
541  store i8 0, i8 addrspace(1)* %p
542  ret void
543}
544
545declare void @use(i8*)
546declare void @use.i32(i32*)
547declare void @use.i8.addrspace1(i8 addrspace(1)*)
548