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