12bf1955fSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*acdc419cSBjorn Pettersson; RUN: opt -passes=instcombine -S < %s | FileCheck %s
32bf1955fSFlorian Hahn
42bf1955fSFlorian Hahndefine void @test_bitcast_1(i1 %c, i32* %ptr) {
52bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_1(
62bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
72bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
82bf1955fSFlorian Hahn; CHECK:       b0:
992da5b71SFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
102bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
112bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
122bf1955fSFlorian Hahn; CHECK:       b1:
132bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
142bf1955fSFlorian Hahn; CHECK:       end:
1592da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[PTR]] to i8*
162bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
172bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
182bf1955fSFlorian Hahn;
192bf1955fSFlorian Hahnentry:
202bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr to i8*
212bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr to i8*
222bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
232bf1955fSFlorian Hahn
242bf1955fSFlorian Hahnb0:
252bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
262bf1955fSFlorian Hahn  br label %end
272bf1955fSFlorian Hahn
282bf1955fSFlorian Hahnb1:
292bf1955fSFlorian Hahn  br label %end
302bf1955fSFlorian Hahn
312bf1955fSFlorian Hahnend:
322bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
332bf1955fSFlorian Hahn  store i8 0, i8* %p
342bf1955fSFlorian Hahn  ret void
352bf1955fSFlorian Hahn}
362bf1955fSFlorian Hahn
372bf1955fSFlorian Hahndefine void @test_bitcast_2(i1 %c, i32* %ptr) {
382bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_2(
392bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
402bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
412bf1955fSFlorian Hahn; CHECK:       b0:
422bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
432bf1955fSFlorian Hahn; CHECK:       b1:
4492da5b71SFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
452bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
462bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
472bf1955fSFlorian Hahn; CHECK:       end:
4892da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[PTR]] to i8*
492bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
502bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
512bf1955fSFlorian Hahn;
522bf1955fSFlorian Hahnentry:
532bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
542bf1955fSFlorian Hahn
552bf1955fSFlorian Hahnb0:
562bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr to i8*
572bf1955fSFlorian Hahn  br label %end
582bf1955fSFlorian Hahn
592bf1955fSFlorian Hahnb1:
602bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr to i8*
612bf1955fSFlorian Hahn  call void @use(i8* %cast.1)
622bf1955fSFlorian Hahn  br label %end
632bf1955fSFlorian Hahn
642bf1955fSFlorian Hahnend:
652bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
662bf1955fSFlorian Hahn  store i8 0, i8* %p
672bf1955fSFlorian Hahn  ret void
682bf1955fSFlorian Hahn}
692bf1955fSFlorian Hahn
702bf1955fSFlorian Hahn
712bf1955fSFlorian Hahndefine void @test_bitcast_3(i1 %c, i32** %ptr) {
722bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_3(
732bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
742bf1955fSFlorian Hahn; CHECK-NEXT:    [[LOAD_PTR:%.*]] = load i32*, i32** [[PTR:%.*]], align 8
752bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
762bf1955fSFlorian Hahn; CHECK:       b0:
772bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
782bf1955fSFlorian Hahn; CHECK:       b1:
792bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[LOAD_PTR]] to i8*
802bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
812bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
822bf1955fSFlorian Hahn; CHECK:       end:
8392da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[LOAD_PTR]] to i8*
842bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
852bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
862bf1955fSFlorian Hahn;
872bf1955fSFlorian Hahnentry:
882bf1955fSFlorian Hahn  %load.ptr = load i32*, i32** %ptr
892bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
902bf1955fSFlorian Hahn
912bf1955fSFlorian Hahnb0:
922bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %load.ptr to i8*
932bf1955fSFlorian Hahn  br label %end
942bf1955fSFlorian Hahn
952bf1955fSFlorian Hahnb1:
962bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %load.ptr to i8*
972bf1955fSFlorian Hahn  call void @use(i8* %cast.1)
982bf1955fSFlorian Hahn  br label %end
992bf1955fSFlorian Hahn
1002bf1955fSFlorian Hahnend:
1012bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
1022bf1955fSFlorian Hahn  store i8 0, i8* %p
1032bf1955fSFlorian Hahn  ret void
1042bf1955fSFlorian Hahn}
1052bf1955fSFlorian Hahn
1062bf1955fSFlorian Hahndefine void @test_bitcast_loads_in_different_bbs(i1 %c, i32** %ptr.0, i32** %ptr.1) {
1072bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_loads_in_different_bbs(
1082bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
1092bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
1102bf1955fSFlorian Hahn; CHECK:       b0:
1112bf1955fSFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32** [[PTR_0:%.*]] to i8**
1122bf1955fSFlorian Hahn; CHECK-NEXT:    [[LOAD_PTR_02:%.*]] = load i8*, i8** [[TMP0]], align 8
1132bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[LOAD_PTR_02]])
1142bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
1152bf1955fSFlorian Hahn; CHECK:       b1:
1162bf1955fSFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32** [[PTR_1:%.*]] to i8**
1172bf1955fSFlorian Hahn; CHECK-NEXT:    [[LOAD_PTR_11:%.*]] = load i8*, i8** [[TMP1]], align 8
1182bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
1192bf1955fSFlorian Hahn; CHECK:       end:
1202bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[LOAD_PTR_02]], [[B0]] ], [ [[LOAD_PTR_11]], [[B1]] ]
1212bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
1222bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
1232bf1955fSFlorian Hahn;
1242bf1955fSFlorian Hahnentry:
1252bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
1262bf1955fSFlorian Hahn
1272bf1955fSFlorian Hahnb0:
1282bf1955fSFlorian Hahn  %load.ptr.0 = load i32*, i32** %ptr.0
1292bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %load.ptr.0 to i8*
1302bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
1312bf1955fSFlorian Hahn  br label %end
1322bf1955fSFlorian Hahn
1332bf1955fSFlorian Hahnb1:
1342bf1955fSFlorian Hahn  %load.ptr.1 = load i32*, i32** %ptr.1
1352bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %load.ptr.1 to i8*
1362bf1955fSFlorian Hahn  br label %end
1372bf1955fSFlorian Hahn
1382bf1955fSFlorian Hahnend:
1392bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
1402bf1955fSFlorian Hahn  store i8 0, i8* %p
1412bf1955fSFlorian Hahn  ret void
1422bf1955fSFlorian Hahn}
1432bf1955fSFlorian Hahn
1442bf1955fSFlorian Hahndefine void @test_gep_1(i1 %c, i32* %ptr) {
1452bf1955fSFlorian Hahn; CHECK-LABEL: @test_gep_1(
1462bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
1472bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
1482bf1955fSFlorian Hahn; CHECK:       b0:
1492bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32* [[PTR:%.*]])
1502bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
1512bf1955fSFlorian Hahn; CHECK:       b1:
1522bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
1532bf1955fSFlorian Hahn; CHECK:       end:
1542bf1955fSFlorian Hahn; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 4
1552bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
1562bf1955fSFlorian Hahn;
1572bf1955fSFlorian Hahnentry:
1582bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
1592bf1955fSFlorian Hahn
1602bf1955fSFlorian Hahnb0:
1612bf1955fSFlorian Hahn  %cast.0 = getelementptr i32, i32* %ptr, i32 0
1622bf1955fSFlorian Hahn  call void @use.i32(i32* %cast.0)
1632bf1955fSFlorian Hahn  br label %end
1642bf1955fSFlorian Hahn
1652bf1955fSFlorian Hahnb1:
1662bf1955fSFlorian Hahn  %cast.1 = getelementptr i32, i32* %ptr, i32 0
1672bf1955fSFlorian Hahn  br label %end
1682bf1955fSFlorian Hahn
1692bf1955fSFlorian Hahnend:
1702bf1955fSFlorian Hahn  %p = phi i32* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
1712bf1955fSFlorian Hahn  store i32 0, i32* %p
1722bf1955fSFlorian Hahn  ret void
1732bf1955fSFlorian Hahn}
1742bf1955fSFlorian Hahn
1752bf1955fSFlorian Hahndefine void @test_bitcast_not_foldable(i1 %c, i32* %ptr.0, i32* %ptr.1) {
1762bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_not_foldable(
1772bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
1782bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
1792bf1955fSFlorian Hahn; CHECK:       b0:
1802bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
1812bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
1822bf1955fSFlorian Hahn; CHECK:       b1:
1832bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
1842bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
1852bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
1862bf1955fSFlorian Hahn; CHECK:       end:
1872bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
1882bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
1892bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
1902bf1955fSFlorian Hahn;
1912bf1955fSFlorian Hahnentry:
1922bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
1932bf1955fSFlorian Hahn
1942bf1955fSFlorian Hahnb0:
1952bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr.0 to i8*
1962bf1955fSFlorian Hahn  br label %end
1972bf1955fSFlorian Hahn
1982bf1955fSFlorian Hahnb1:
1992bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr.1 to i8*
2002bf1955fSFlorian Hahn  call void @use(i8* %cast.1)
2012bf1955fSFlorian Hahn  br label %end
2022bf1955fSFlorian Hahn
2032bf1955fSFlorian Hahnend:
2042bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
2052bf1955fSFlorian Hahn  store i8 0, i8* %p
2062bf1955fSFlorian Hahn  ret void
2072bf1955fSFlorian Hahn}
2082bf1955fSFlorian Hahn
2092bf1955fSFlorian Hahndefine void @test_bitcast_with_extra_use(i1 %c, i32* %ptr) {
2102bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_with_extra_use(
2112bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
2122bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
2132bf1955fSFlorian Hahn; CHECK:       b0:
2142bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
2152bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
2162bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
2172bf1955fSFlorian Hahn; CHECK:       b1:
2182bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
2192bf1955fSFlorian Hahn; CHECK:       end:
22092da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[PTR]] to i8*
2212bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
2222bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
2232bf1955fSFlorian Hahn;
2242bf1955fSFlorian Hahnentry:
2252bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
2262bf1955fSFlorian Hahn
2272bf1955fSFlorian Hahnb0:
2282bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr to i8*
2292bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
2302bf1955fSFlorian Hahn  br label %end
2312bf1955fSFlorian Hahn
2322bf1955fSFlorian Hahnb1:
2332bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr to i8*
2342bf1955fSFlorian Hahn  br label %end
2352bf1955fSFlorian Hahn
2362bf1955fSFlorian Hahnend:
2372bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
2382bf1955fSFlorian Hahn  store i8 0, i8* %p
2392bf1955fSFlorian Hahn  ret void
2402bf1955fSFlorian Hahn}
2412bf1955fSFlorian Hahn
2422bf1955fSFlorian Hahndefine void @test_bitcast_different_bases(i1 %c, i32* %ptr.0, i32* %ptr.1) {
2432bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_different_bases(
2442bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
2452bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
2462bf1955fSFlorian Hahn; CHECK:       b0:
2472bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
2482bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
2492bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
2502bf1955fSFlorian Hahn; CHECK:       b1:
2512bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
2522bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
2532bf1955fSFlorian Hahn; CHECK:       end:
2542bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_1]], [[B1]] ]
2552bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
2562bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
2572bf1955fSFlorian Hahn;
2582bf1955fSFlorian Hahnentry:
2592bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
2602bf1955fSFlorian Hahn
2612bf1955fSFlorian Hahnb0:
2622bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr.0 to i8*
2632bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
2642bf1955fSFlorian Hahn  br label %end
2652bf1955fSFlorian Hahn
2662bf1955fSFlorian Hahnb1:
2672bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr.1 to i8*
2682bf1955fSFlorian Hahn  br label %end
2692bf1955fSFlorian Hahn
2702bf1955fSFlorian Hahnend:
2712bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
2722bf1955fSFlorian Hahn  store i8 0, i8* %p
2732bf1955fSFlorian Hahn  ret void
2742bf1955fSFlorian Hahn}
2752bf1955fSFlorian Hahn
2762bf1955fSFlorian Hahndefine void @test_bitcast_gep_chains(i1 %c, i32* %ptr) {
2772bf1955fSFlorian Hahn; CHECK-LABEL: @test_bitcast_gep_chains(
2782bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
2792bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
2802bf1955fSFlorian Hahn; CHECK:       b0:
2812bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
2822bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
2832bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
2842bf1955fSFlorian Hahn; CHECK:       b1:
2852bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32* [[PTR]])
2862bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
2872bf1955fSFlorian Hahn; CHECK:       end:
28892da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[PTR]] to i8*
2892bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
2902bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
2912bf1955fSFlorian Hahn;
2922bf1955fSFlorian Hahnentry:
2932bf1955fSFlorian Hahn  %gep = getelementptr i32, i32* %ptr, i32 0
2942bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
2952bf1955fSFlorian Hahn
2962bf1955fSFlorian Hahnb0:
2972bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %gep to i8*
2982bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
2992bf1955fSFlorian Hahn  br label %end
3002bf1955fSFlorian Hahn
3012bf1955fSFlorian Hahnb1:
3022bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr to i8*
3032bf1955fSFlorian Hahn  %cast.2 = bitcast i8* %cast.1 to i32*
3042bf1955fSFlorian Hahn  call void @use.i32(i32* %cast.2)
3052bf1955fSFlorian Hahn  %cast.3 = bitcast i32* %cast.2 to i8*
3062bf1955fSFlorian Hahn  br label %end
3072bf1955fSFlorian Hahn
3082bf1955fSFlorian Hahnend:
3092bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ]
3102bf1955fSFlorian Hahn  store i8 0, i8* %p
3112bf1955fSFlorian Hahn  ret void
3122bf1955fSFlorian Hahn}
3132bf1955fSFlorian Hahn
3142bf1955fSFlorian Hahndefine void @test_4_incoming_values_different_bases_1(i32 %c, i32* %ptr.0, i32* %ptr.1) {
3152bf1955fSFlorian Hahn; CHECK-LABEL: @test_4_incoming_values_different_bases_1(
3162bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
3172bf1955fSFlorian Hahn; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
3182bf1955fSFlorian Hahn; CHECK-NEXT:    i32 0, label [[B0:%.*]]
3192bf1955fSFlorian Hahn; CHECK-NEXT:    i32 1, label [[B1:%.*]]
3202bf1955fSFlorian Hahn; CHECK-NEXT:    i32 2, label [[B2:%.*]]
3212bf1955fSFlorian Hahn; CHECK-NEXT:    i32 3, label [[B3:%.*]]
3222bf1955fSFlorian Hahn; CHECK-NEXT:    ]
3232bf1955fSFlorian Hahn; CHECK:       b0:
3242bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
3252bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_0]])
3262bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
3272bf1955fSFlorian Hahn; CHECK:       b1:
3282bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_3:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
3292bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3302bf1955fSFlorian Hahn; CHECK:       b2:
3312bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_4:%.*]] = bitcast i32* [[PTR_0]] to i8*
3322bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3332bf1955fSFlorian Hahn; CHECK:       b3:
3342bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_5:%.*]] = bitcast i32* [[PTR_0]] to i8*
3352bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3362bf1955fSFlorian Hahn; CHECK:       end:
3372bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_3]], [[B1]] ], [ [[CAST_4]], [[B2]] ], [ [[CAST_5]], [[B3]] ]
3382bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
3392bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
3402bf1955fSFlorian Hahn; CHECK:       end.2:
3412bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
3422bf1955fSFlorian Hahn;
3432bf1955fSFlorian Hahnentry:
3442bf1955fSFlorian Hahn  %gep = getelementptr i32, i32* %ptr.0, i32 0
3452bf1955fSFlorian Hahn  switch i32 %c, label %end.2 [ i32 0, label %b0
3462bf1955fSFlorian Hahn  i32 1, label %b1
3472bf1955fSFlorian Hahn  i32 2, label %b2
3482bf1955fSFlorian Hahn  i32 3, label %b3]
3492bf1955fSFlorian Hahn
3502bf1955fSFlorian Hahnb0:
3512bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %gep to i8*
3522bf1955fSFlorian Hahn  call void @use(i8* %cast.0)
3532bf1955fSFlorian Hahn  br label %end
3542bf1955fSFlorian Hahn
3552bf1955fSFlorian Hahnb1:
3562bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr.1 to i8*
3572bf1955fSFlorian Hahn  %cast.2 = bitcast i8* %cast.1 to i64*
3582bf1955fSFlorian Hahn  %cast.3 = bitcast i64* %cast.2 to i8*
3592bf1955fSFlorian Hahn  br label %end
3602bf1955fSFlorian Hahn
3612bf1955fSFlorian Hahnb2:
3622bf1955fSFlorian Hahn  %cast.4 = bitcast i32* %gep to i8*
3632bf1955fSFlorian Hahn  br label %end
3642bf1955fSFlorian Hahn
3652bf1955fSFlorian Hahnb3:
3662bf1955fSFlorian Hahn  %cast.5 = bitcast i32 * %ptr.0 to i8*
3672bf1955fSFlorian Hahn  br label %end
3682bf1955fSFlorian Hahn
3692bf1955fSFlorian Hahnend:
3702bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
3712bf1955fSFlorian Hahn  store i8 0, i8* %p
3722bf1955fSFlorian Hahn  ret void
3732bf1955fSFlorian Hahn
3742bf1955fSFlorian Hahnend.2:
3752bf1955fSFlorian Hahn  ret void
3762bf1955fSFlorian Hahn}
3772bf1955fSFlorian Hahn
3782bf1955fSFlorian Hahndefine void @test_4_incoming_values_different_bases_2(i32 %c, i32* %ptr.0, i32* %ptr.1) {
3792bf1955fSFlorian Hahn; CHECK-LABEL: @test_4_incoming_values_different_bases_2(
3802bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
3812bf1955fSFlorian Hahn; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
3822bf1955fSFlorian Hahn; CHECK-NEXT:    i32 0, label [[B0:%.*]]
3832bf1955fSFlorian Hahn; CHECK-NEXT:    i32 1, label [[B1:%.*]]
3842bf1955fSFlorian Hahn; CHECK-NEXT:    i32 2, label [[B2:%.*]]
3852bf1955fSFlorian Hahn; CHECK-NEXT:    i32 3, label [[B3:%.*]]
3862bf1955fSFlorian Hahn; CHECK-NEXT:    ]
3872bf1955fSFlorian Hahn; CHECK:       b0:
3882bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
3892bf1955fSFlorian Hahn; CHECK:       b1:
3902bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
3912bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_1]])
3922bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3932bf1955fSFlorian Hahn; CHECK:       b2:
3942bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3952bf1955fSFlorian Hahn; CHECK:       b3:
3962bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
3972bf1955fSFlorian Hahn; CHECK:       end:
3982bf1955fSFlorian Hahn; CHECK-NEXT:    [[P_IN:%.*]] = phi i32* [ [[PTR_1:%.*]], [[B0]] ], [ [[PTR_0]], [[B1]] ], [ [[PTR_0]], [[B2]] ], [ [[PTR_0]], [[B3]] ]
3992bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = bitcast i32* [[P_IN]] to i8*
4002bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
4012bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
4022bf1955fSFlorian Hahn; CHECK:       end.2:
4032bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
4042bf1955fSFlorian Hahn;
4052bf1955fSFlorian Hahnentry:
4062bf1955fSFlorian Hahn  %gep = getelementptr i32, i32* %ptr.0, i32 0
4072bf1955fSFlorian Hahn  switch i32 %c, label %end.2 [ i32 0, label %b0
4082bf1955fSFlorian Hahn  i32 1, label %b1
4092bf1955fSFlorian Hahn  i32 2, label %b2
4102bf1955fSFlorian Hahn  i32 3, label %b3]
4112bf1955fSFlorian Hahn
4122bf1955fSFlorian Hahnb0:
4132bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr.1 to i8*
4142bf1955fSFlorian Hahn  br label %end
4152bf1955fSFlorian Hahn
4162bf1955fSFlorian Hahnb1:
4172bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr.0 to i8*
4182bf1955fSFlorian Hahn  call void @use(i8* %cast.1)
4192bf1955fSFlorian Hahn  %cast.2 = bitcast i8* %cast.1 to i64*
4202bf1955fSFlorian Hahn  %cast.3 = bitcast i64* %cast.2 to i8*
4212bf1955fSFlorian Hahn  br label %end
4222bf1955fSFlorian Hahn
4232bf1955fSFlorian Hahnb2:
4242bf1955fSFlorian Hahn  %cast.4 = bitcast i32* %gep to i8*
4252bf1955fSFlorian Hahn  br label %end
4262bf1955fSFlorian Hahn
4272bf1955fSFlorian Hahnb3:
4282bf1955fSFlorian Hahn  %cast.5 = bitcast i32 * %ptr.0 to i8*
4292bf1955fSFlorian Hahn  br label %end
4302bf1955fSFlorian Hahn
4312bf1955fSFlorian Hahnend:
4322bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
4332bf1955fSFlorian Hahn  store i8 0, i8* %p
4342bf1955fSFlorian Hahn  ret void
4352bf1955fSFlorian Hahn
4362bf1955fSFlorian Hahnend.2:
4372bf1955fSFlorian Hahn  ret void
4382bf1955fSFlorian Hahn}
4392bf1955fSFlorian Hahn
4402bf1955fSFlorian Hahndefine void @test_4_incoming_values_different_bases_3(i32 %c, i32* %ptr.0, i32* %ptr.1) {
4412bf1955fSFlorian Hahn; CHECK-LABEL: @test_4_incoming_values_different_bases_3(
4422bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
4432bf1955fSFlorian Hahn; CHECK-NEXT:    switch i32 [[C:%.*]], label [[END_2:%.*]] [
4442bf1955fSFlorian Hahn; CHECK-NEXT:    i32 0, label [[B0:%.*]]
4452bf1955fSFlorian Hahn; CHECK-NEXT:    i32 1, label [[B1:%.*]]
4462bf1955fSFlorian Hahn; CHECK-NEXT:    i32 2, label [[B2:%.*]]
4472bf1955fSFlorian Hahn; CHECK-NEXT:    i32 3, label [[B3:%.*]]
4482bf1955fSFlorian Hahn; CHECK-NEXT:    ]
4492bf1955fSFlorian Hahn; CHECK:       b0:
4502bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_0:%.*]] = bitcast i32* [[PTR_0:%.*]] to i8*
4512bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
4522bf1955fSFlorian Hahn; CHECK:       b1:
4532bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_3:%.*]] = bitcast i32* [[PTR_0]] to i8*
4542bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
4552bf1955fSFlorian Hahn; CHECK:       b2:
4562bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_4:%.*]] = bitcast i32* [[PTR_0]] to i8*
4572bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use(i8* [[CAST_4]])
4582bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
4592bf1955fSFlorian Hahn; CHECK:       b3:
4602bf1955fSFlorian Hahn; CHECK-NEXT:    [[CAST_5:%.*]] = bitcast i32* [[PTR_1:%.*]] to i8*
4612bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
4622bf1955fSFlorian Hahn; CHECK:       end:
4632bf1955fSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i8* [ [[CAST_0]], [[B0]] ], [ [[CAST_3]], [[B1]] ], [ [[CAST_4]], [[B2]] ], [ [[CAST_5]], [[B3]] ]
4642bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8* [[P]], align 1
4652bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
4662bf1955fSFlorian Hahn; CHECK:       end.2:
4672bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
4682bf1955fSFlorian Hahn;
4692bf1955fSFlorian Hahnentry:
4702bf1955fSFlorian Hahn  %gep = getelementptr i32, i32* %ptr.0, i32 0
4712bf1955fSFlorian Hahn  switch i32 %c, label %end.2 [ i32 0, label %b0
4722bf1955fSFlorian Hahn  i32 1, label %b1
4732bf1955fSFlorian Hahn  i32 2, label %b2
4742bf1955fSFlorian Hahn  i32 3, label %b3]
4752bf1955fSFlorian Hahn
4762bf1955fSFlorian Hahnb0:
4772bf1955fSFlorian Hahn  %cast.0 = bitcast i32* %ptr.0 to i8*
4782bf1955fSFlorian Hahn  br label %end
4792bf1955fSFlorian Hahn
4802bf1955fSFlorian Hahnb1:
4812bf1955fSFlorian Hahn  %cast.1 = bitcast i32* %ptr.0 to i8*
4822bf1955fSFlorian Hahn  %cast.2 = bitcast i8* %cast.1 to i64*
4832bf1955fSFlorian Hahn  %cast.3 = bitcast i64* %cast.2 to i8*
4842bf1955fSFlorian Hahn  br label %end
4852bf1955fSFlorian Hahn
4862bf1955fSFlorian Hahnb2:
4872bf1955fSFlorian Hahn  %cast.4 = bitcast i32* %gep to i8*
4882bf1955fSFlorian Hahn  call void @use(i8* %cast.4)
4892bf1955fSFlorian Hahn  br label %end
4902bf1955fSFlorian Hahn
4912bf1955fSFlorian Hahnb3:
4922bf1955fSFlorian Hahn  %cast.5 = bitcast i32 * %ptr.1 to i8*
4932bf1955fSFlorian Hahn  br label %end
4942bf1955fSFlorian Hahn
4952bf1955fSFlorian Hahnend:
4962bf1955fSFlorian Hahn  %p = phi i8* [ %cast.0, %b0 ], [ %cast.3, %b1 ], [ %cast.4, %b2 ], [ %cast.5, %b3]
4972bf1955fSFlorian Hahn  store i8 0, i8* %p
4982bf1955fSFlorian Hahn  ret void
4992bf1955fSFlorian Hahn
5002bf1955fSFlorian Hahnend.2:
5012bf1955fSFlorian Hahn  ret void
5022bf1955fSFlorian Hahn}
5032bf1955fSFlorian Hahn
5042bf1955fSFlorian Hahndefine void @test_addrspacecast_1(i1 %c, i32* %ptr) {
5052bf1955fSFlorian Hahn; CHECK-LABEL: @test_addrspacecast_1(
5062bf1955fSFlorian Hahn; CHECK-NEXT:  entry:
5072bf1955fSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[B0:%.*]], label [[B1:%.*]]
5082bf1955fSFlorian Hahn; CHECK:       b0:
5092bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END:%.*]]
5102bf1955fSFlorian Hahn; CHECK:       b1:
51192da5b71SFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[PTR:%.*]] to i8*
51292da5b71SFlorian Hahn; CHECK-NEXT:    [[CAST_1:%.*]] = addrspacecast i8* [[TMP0]] to i8 addrspace(1)*
5132bf1955fSFlorian Hahn; CHECK-NEXT:    call void @use.i8.addrspace1(i8 addrspace(1)* [[CAST_1]])
5142bf1955fSFlorian Hahn; CHECK-NEXT:    br label [[END]]
5152bf1955fSFlorian Hahn; CHECK:       end:
51692da5b71SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[PTR]] to i8*
51792da5b71SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = addrspacecast i8* [[TMP1]] to i8 addrspace(1)*
5182bf1955fSFlorian Hahn; CHECK-NEXT:    store i8 0, i8 addrspace(1)* [[P]], align 1
5192bf1955fSFlorian Hahn; CHECK-NEXT:    ret void
5202bf1955fSFlorian Hahn;
5212bf1955fSFlorian Hahnentry:
5222bf1955fSFlorian Hahn  %cast.0 = addrspacecast i32* %ptr to i8 addrspace(1)*
5232bf1955fSFlorian Hahn  %cast.1 = addrspacecast i32* %ptr to i8 addrspace(1)*
5242bf1955fSFlorian Hahn  br i1 %c, label %b0, label %b1
5252bf1955fSFlorian Hahn
5262bf1955fSFlorian Hahnb0:
5272bf1955fSFlorian Hahn  br label %end
5282bf1955fSFlorian Hahn
5292bf1955fSFlorian Hahnb1:
5302bf1955fSFlorian Hahn  call void @use.i8.addrspace1(i8 addrspace(1)* %cast.1)
5312bf1955fSFlorian Hahn  br label %end
5322bf1955fSFlorian Hahn
5332bf1955fSFlorian Hahnend:
5342bf1955fSFlorian Hahn  %p = phi i8 addrspace(1)* [ %cast.0, %b0 ], [ %cast.1, %b1 ]
5352bf1955fSFlorian Hahn  store i8 0, i8 addrspace(1)* %p
5362bf1955fSFlorian Hahn  ret void
5372bf1955fSFlorian Hahn}
5382bf1955fSFlorian Hahn
5392bf1955fSFlorian Hahndeclare void @use(i8*)
5402bf1955fSFlorian Hahndeclare void @use.i32(i32*)
5412bf1955fSFlorian Hahndeclare void @use.i8.addrspace1(i8 addrspace(1)*)
542