brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.6 KiB · 1d80724 Raw
867 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='instcombine<no-verify-fixpoint>' < %s | FileCheck %s3 4; In the indexed_compare test the comparison is only converted int a form5; from which we can infer non-negativity after the GEP has already been sunk6; and revisited.7 8define ptr @bitcast_opaque_to_opaque(ptr %a) {9; CHECK-LABEL: @bitcast_opaque_to_opaque(10; CHECK-NEXT:    ret ptr [[A:%.*]]11;12  ret ptr %a13}14 15define ptr @bitcast_typed_to_opaque(ptr %a) {16; CHECK-LABEL: @bitcast_typed_to_opaque(17; CHECK-NEXT:    ret ptr [[A:%.*]]18;19  ret ptr %a20}21 22define ptr @bitcast_opaque_to_typed(ptr %a) {23; CHECK-LABEL: @bitcast_opaque_to_typed(24; CHECK-NEXT:    ret ptr [[A:%.*]]25;26  ret ptr %a27}28 29@g = global i8 030define ptr @bitcast_typed_to_opaque_constexpr() {31; CHECK-LABEL: @bitcast_typed_to_opaque_constexpr(32; CHECK-NEXT:    ret ptr @g33;34  ret ptr @g35}36 37define ptr @addrspacecast_opaque_to_opaque(ptr addrspace(1) %a) {38; CHECK-LABEL: @addrspacecast_opaque_to_opaque(39; CHECK-NEXT:    [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr40; CHECK-NEXT:    ret ptr [[B]]41;42  %b = addrspacecast ptr addrspace(1) %a to ptr43  ret ptr %b44}45 46define ptr @addrspacecast_typed_to_opaque(ptr addrspace(1) %a) {47; CHECK-LABEL: @addrspacecast_typed_to_opaque(48; CHECK-NEXT:    [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr49; CHECK-NEXT:    ret ptr [[B]]50;51  %b = addrspacecast ptr addrspace(1) %a to ptr52  ret ptr %b53}54 55define ptr @addrspacecast_opaque_to_typed(ptr addrspace(1) %a) {56; CHECK-LABEL: @addrspacecast_opaque_to_typed(57; CHECK-NEXT:    [[B:%.*]] = addrspacecast ptr addrspace(1) [[A:%.*]] to ptr58; CHECK-NEXT:    ret ptr [[B]]59;60  %b = addrspacecast ptr addrspace(1) %a to ptr61  ret ptr %b62}63 64define ptr addrspace(1) @bitcast_and_addrspacecast_eliminable(ptr %a) {65; CHECK-LABEL: @bitcast_and_addrspacecast_eliminable(66; CHECK-NEXT:    [[C:%.*]] = addrspacecast ptr [[A:%.*]] to ptr addrspace(1)67; CHECK-NEXT:    ret ptr addrspace(1) [[C]]68;69  %c = addrspacecast ptr %a to ptr addrspace(1)70  ret ptr addrspace(1) %c71}72 73define ptr addrspace(1) @addrspacecast_typed_to_opaque_constexpr() {74; CHECK-LABEL: @addrspacecast_typed_to_opaque_constexpr(75; CHECK-NEXT:    ret ptr addrspace(1) addrspacecast (ptr @g to ptr addrspace(1))76;77  ret ptr addrspace(1) addrspacecast (ptr @g to ptr addrspace(1))78}79 80define ptr @gep_constexpr_1(ptr %a) {81; CHECK-LABEL: @gep_constexpr_1(82; CHECK-NEXT:    ret ptr inttoptr (i64 6 to ptr)83;84  ret ptr getelementptr (i16, ptr null, i32 3)85}86 87define ptr @gep_constexpr_2(ptr %a) {88; CHECK-LABEL: @gep_constexpr_2(89; CHECK-NEXT:    ret ptr getelementptr (i8, ptr @g, i64 3)90;91  ret ptr getelementptr (i8, ptr @g, i32 3)92}93 94define ptr addrspace(1) @gep_constexpr_3(ptr %a) {95; CHECK-LABEL: @gep_constexpr_3(96; CHECK-NEXT:    ret ptr addrspace(1) getelementptr (i8, ptr addrspace(1) addrspacecast (ptr @g to ptr addrspace(1)), i64 3)97;98  ret ptr addrspace(1) getelementptr ([0 x i8], ptr addrspace(1) addrspacecast (ptr @g to ptr addrspace(1)), i64 0, i32 3)99}100 101define ptr @load_bitcast_1(ptr %a) {102; CHECK-LABEL: @load_bitcast_1(103; CHECK-NEXT:    [[B:%.*]] = load ptr, ptr [[A:%.*]], align 8104; CHECK-NEXT:    ret ptr [[B]]105;106  %b = load ptr, ptr %a107  ret ptr %b108}109 110define ptr @load_bitcast_2(ptr %a) {111; CHECK-LABEL: @load_bitcast_2(112; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[A:%.*]], align 8113; CHECK-NEXT:    ret ptr [[C]]114;115  %c = load ptr, ptr %a116  ret ptr %c117}118 119define void @call(ptr %a) {120; CHECK-LABEL: @call(121; CHECK-NEXT:    call void [[A:%.*]]()122; CHECK-NEXT:    ret void123;124  call void %a()125  ret void126}127 128declare void @varargs(...)129define void @varargs_cast_typed_to_opaque_same_type(ptr %a) {130; CHECK-LABEL: @varargs_cast_typed_to_opaque_same_type(131; CHECK-NEXT:    call void (...) @varargs(ptr byval(i32) [[A:%.*]])132; CHECK-NEXT:    ret void133;134  call void (...) @varargs(ptr byval(i32) %a)135  ret void136}137 138define void @varargs_cast_typed_to_opaque_different_type(ptr %a) {139; CHECK-LABEL: @varargs_cast_typed_to_opaque_different_type(140; CHECK-NEXT:    call void (...) @varargs(ptr byval(float) [[A:%.*]])141; CHECK-NEXT:    ret void142;143  call void (...) @varargs(ptr byval(float) %a)144  ret void145}146 147define void @varargs_cast_typed_to_opaque_different_size(ptr %a) {148; CHECK-LABEL: @varargs_cast_typed_to_opaque_different_size(149; CHECK-NEXT:    call void (...) @varargs(ptr byval(i64) [[A:%.*]])150; CHECK-NEXT:    ret void151;152  call void (...) @varargs(ptr byval(i64) %a)153  ret void154}155 156define void @varargs_cast_opaque_to_typed(ptr %a) {157; CHECK-LABEL: @varargs_cast_opaque_to_typed(158; CHECK-NEXT:    call void (...) @varargs(ptr byval(i8) [[A:%.*]])159; CHECK-NEXT:    ret void160;161  call void (...) @varargs(ptr byval(i8) %a)162  ret void163}164 165define ptr @geps_combinable(ptr %a) {166; CHECK-LABEL: @geps_combinable(167; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 8168; CHECK-NEXT:    ret ptr [[A3]]169;170  %a2 = getelementptr { i32, { i32, i32 } }, ptr %a, i32 0, i32 1171  %a3 = getelementptr { i32, i32 }, ptr %a2, i32 0, i32 1172  ret ptr %a3173}174 175define ptr @geps_combinable_different_elem_type1(ptr %a) {176; CHECK-LABEL: @geps_combinable_different_elem_type1(177; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 8178; CHECK-NEXT:    ret ptr [[A3]]179;180  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1181  %a3 = getelementptr { i32, i32 }, ptr %a2, i32 0, i32 1182  ret ptr %a3183}184 185define ptr @geps_combinable_different_elem_type2(ptr %a) {186; CHECK-LABEL: @geps_combinable_different_elem_type2(187; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 8188; CHECK-NEXT:    ret ptr [[A3]]189;190  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1191  %a3 = getelementptr i8, ptr %a2, i64 4192  ret ptr %a3193}194 195define ptr @geps_combinable_different_elem_type3(ptr %a) {196; CHECK-LABEL: @geps_combinable_different_elem_type3(197; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 12198; CHECK-NEXT:    ret ptr [[A3]]199;200  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1201  %a3 = getelementptr i8, ptr %a2, i64 8202  ret ptr %a3203}204 205define ptr @geps_combinable_different_elem_type4(ptr %a) {206; CHECK-LABEL: @geps_combinable_different_elem_type4(207; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 14208; CHECK-NEXT:    ret ptr [[A3]]209;210  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1211  %a3 = getelementptr i8, ptr %a2, i64 10212  ret ptr %a3213}214 215define ptr @geps_combinable_different_elem_type5(ptr %a) {216; CHECK-LABEL: @geps_combinable_different_elem_type5(217; CHECK-NEXT:    ret ptr [[A:%.*]]218;219  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1220  %a3 = getelementptr i8, ptr %a2, i64 -4221  ret ptr %a3222}223 224define ptr @geps_combinable_different_elem_type6(ptr %a, i64 %idx) {225; CHECK-LABEL: @geps_combinable_different_elem_type6(226; CHECK-NEXT:    [[A2:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]]227; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A2]], i64 4228; CHECK-NEXT:    ret ptr [[A3]]229;230  %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx231  %a3 = getelementptr i8, ptr %a2, i64 4232  ret ptr %a3233}234 235define ptr @geps_combinable_different_elem_type7(ptr %a, i64 %idx) {236; CHECK-LABEL: @geps_combinable_different_elem_type7(237; CHECK-NEXT:    [[A2_SPLIT:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]]238; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A2_SPLIT]], i64 8239; CHECK-NEXT:    ret ptr [[A3]]240;241  %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx, i32 1242  %a3 = getelementptr i8, ptr %a2, i64 4243  ret ptr %a3244}245 246define ptr @geps_combinable_different_elem_type8(ptr %a, i64 %idx) {247; CHECK-LABEL: @geps_combinable_different_elem_type8(248; CHECK-NEXT:    [[A2_SPLIT:%.*]] = getelementptr inbounds { { i32, i32 } }, ptr [[A:%.*]], i64 [[IDX:%.*]]249; CHECK-NEXT:    [[A3:%.*]] = getelementptr inbounds nuw i8, ptr [[A2_SPLIT]], i64 8250; CHECK-NEXT:    ret ptr [[A3]]251;252  %a2 = getelementptr inbounds { { i32, i32 } }, ptr %a, i64 %idx, i32 0, i32 1253  %a3 = getelementptr inbounds i8, ptr %a2, i32 4254  ret ptr %a3255}256 257define ptr @geps_combinable_different_elem_type9(ptr %a, i64 %idx) {258; CHECK-LABEL: @geps_combinable_different_elem_type9(259; CHECK-NEXT:    [[A3:%.*]] = getelementptr inbounds { { i32, i32 } }, ptr [[A:%.*]], i64 [[IDX:%.*]]260; CHECK-NEXT:    ret ptr [[A3]]261;262  %a2 = getelementptr inbounds { { i32, i32 } }, ptr %a, i64 %idx, i32 0, i32 1263  %a3 = getelementptr inbounds i8, ptr %a2, i32 -4264  ret ptr %a3265}266 267declare void @use(ptr)268 269define ptr @geps_combinable_different_elem_type_extra_use1(ptr %a) {270; CHECK-LABEL: @geps_combinable_different_elem_type_extra_use1(271; CHECK-NEXT:    [[A2:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 4272; CHECK-NEXT:    call void @use(ptr [[A2]])273; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A]], i64 8274; CHECK-NEXT:    ret ptr [[A3]]275;276  %a2 = getelementptr { i32, i32 }, ptr %a, i32 0, i32 1277  call void @use(ptr %a2)278  %a3 = getelementptr i8, ptr %a2, i64 4279  ret ptr %a3280}281 282define ptr @geps_combinable_different_elem_type_extra_use2(ptr %a, i64 %idx) {283; CHECK-LABEL: @geps_combinable_different_elem_type_extra_use2(284; CHECK-NEXT:    [[A2:%.*]] = getelementptr { i32, i32 }, ptr [[A:%.*]], i64 [[IDX:%.*]]285; CHECK-NEXT:    call void @use(ptr [[A2]])286; CHECK-NEXT:    [[A3:%.*]] = getelementptr i8, ptr [[A2]], i64 4287; CHECK-NEXT:    ret ptr [[A3]]288;289  %a2 = getelementptr { i32, i32 }, ptr %a, i64 %idx290  call void @use(ptr %a2)291  %a3 = getelementptr i8, ptr %a2, i64 4292  ret ptr %a3293}294 295define ptr @geps_combinable_scalable(ptr %a, i64 %idx) {296; CHECK-LABEL: @geps_combinable_scalable(297; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vscale.i64()298; CHECK-NEXT:    [[TMP2:%.*]] = shl nuw i64 [[TMP1]], 3299; CHECK-NEXT:    [[A2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[TMP2]]300; CHECK-NEXT:    [[A3:%.*]] = getelementptr inbounds nuw i8, ptr [[A2]], i64 4301; CHECK-NEXT:    ret ptr [[A3]]302;303  %a2 = getelementptr inbounds <vscale x 2 x i32>, ptr %a, i64 1304  %a3 = getelementptr inbounds i8, ptr %a2, i32 4305  ret ptr %a3306}307 308define ptr @geps_combinable_scalable_vector_array(ptr %a, i64 %idx) {309; CHECK-LABEL: @geps_combinable_scalable_vector_array(310; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vscale.i64()311; CHECK-NEXT:    [[TMP2:%.*]] = shl nuw i64 [[TMP1]], 5312; CHECK-NEXT:    [[A2:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[TMP2]]313; CHECK-NEXT:    [[A3:%.*]] = getelementptr inbounds nuw i8, ptr [[A2]], i64 4314; CHECK-NEXT:    ret ptr [[A3]]315;316  %a2 = getelementptr inbounds [4 x <vscale x 2 x i32>], ptr %a, i64 1317  %a3 = getelementptr inbounds i8, ptr %a2, i32 4318  ret ptr %a3319}320 321define i1 @compare_geps_same_indices(ptr %a, ptr %b, i64 %idx) {322; CHECK-LABEL: @compare_geps_same_indices(323; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[A:%.*]], [[B:%.*]]324; CHECK-NEXT:    ret i1 [[C]]325;326  %a2 = getelementptr i32, ptr %a, i64 %idx327  %b2 = getelementptr i32, ptr %b, i64 %idx328  %c = icmp eq ptr %a2, %b2329  ret i1 %c330}331 332define i1 @compare_geps_same_indices_different_types(ptr %a, ptr %b, i64 %idx) {333; CHECK-LABEL: @compare_geps_same_indices_different_types(334; CHECK-NEXT:    [[A2:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[IDX:%.*]]335; CHECK-NEXT:    [[B2:%.*]] = getelementptr i64, ptr [[B:%.*]], i64 [[IDX]]336; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[A2]], [[B2]]337; CHECK-NEXT:    ret i1 [[C]]338;339  %a2 = getelementptr i32, ptr %a, i64 %idx340  %b2 = getelementptr i64, ptr %b, i64 %idx341  %c = icmp eq ptr %a2, %b2342  ret i1 %c343}344 345define i1 @compare_gep_with_base(ptr %p, i64 %idx) {346; CHECK-LABEL: @compare_gep_with_base(347; CHECK-NEXT:    [[C:%.*]] = icmp eq i64 [[IDX:%.*]], 0348; CHECK-NEXT:    ret i1 [[C]]349;350  %gep = getelementptr inbounds i32, ptr %p, i64 %idx351  %c = icmp eq ptr %gep, %p352  ret i1 %c353}354 355define <2 x i1> @compare_gep_with_base_vector1(<2 x ptr> %p, i64 %idx) {356; CHECK-LABEL: @compare_gep_with_base_vector1(357; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[IDX:%.*]], i64 0358; CHECK-NEXT:    [[TMP1:%.*]] = shl <2 x i64> [[DOTSPLATINSERT]], <i64 2, i64 0>359; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i64> [[TMP1]], zeroinitializer360; CHECK-NEXT:    [[C:%.*]] = shufflevector <2 x i1> [[TMP2]], <2 x i1> poison, <2 x i32> zeroinitializer361; CHECK-NEXT:    ret <2 x i1> [[C]]362;363  %gep = getelementptr inbounds i32, <2 x ptr> %p, i64 %idx364  %c = icmp eq <2 x ptr> %gep, %p365  ret <2 x i1> %c366}367 368define <2 x i1> @compare_gep_with_base_vector2(<2 x ptr> %p, <2 x i64> %idx) {369; CHECK-LABEL: @compare_gep_with_base_vector2(370; CHECK-NEXT:    [[C:%.*]] = icmp eq <2 x i64> [[IDX:%.*]], zeroinitializer371; CHECK-NEXT:    ret <2 x i1> [[C]]372;373  %gep = getelementptr inbounds i32, <2 x ptr> %p, <2 x i64> %idx374  %c = icmp eq <2 x ptr> %gep, %p375  ret <2 x i1> %c376}377 378define <4 x i1> @compare_geps_same_indices_scalar_vector_base_mismatch(ptr %ptr, <4 x ptr> %ptrs) {379; CHECK-LABEL: @compare_geps_same_indices_scalar_vector_base_mismatch(380; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i16, <4 x ptr> [[PTRS:%.*]], <4 x i64> <i64 1, i64 2, i64 3, i64 4>381; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i16, ptr [[PTR:%.*]], <4 x i64> <i64 1, i64 2, i64 3, i64 4>382; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x ptr> [[GEP1]], [[GEP2]]383; CHECK-NEXT:    ret <4 x i1> [[CMP]]384;385  %gep1 = getelementptr i16, <4 x ptr> %ptrs, <4 x i64> <i64 1, i64 2, i64 3, i64 4>386  %gep2 = getelementptr i16, ptr %ptr, <4 x i64> <i64 1, i64 2, i64 3, i64 4>387  %cmp = icmp eq <4 x ptr> %gep1, %gep2388  ret <4 x i1> %cmp389}390 391define ptr @indexed_compare(ptr %A, i64 %offset) {392; CHECK-LABEL: @indexed_compare(393; CHECK-NEXT:  entry:394; CHECK-NEXT:    [[TMP_IDX:%.*]] = shl nsw i64 [[OFFSET:%.*]], 2395; CHECK-NEXT:    br label [[BB:%.*]]396; CHECK:       bb:397; CHECK-NEXT:    [[RHS_IDX:%.*]] = phi i64 [ [[RHS_ADD:%.*]], [[BB]] ], [ [[TMP_IDX]], [[ENTRY:%.*]] ]398; CHECK-NEXT:    [[RHS_ADD]] = add nsw i64 [[RHS_IDX]], 4399; CHECK-NEXT:    [[COND:%.*]] = icmp sgt i64 [[RHS_IDX]], 400400; CHECK-NEXT:    br i1 [[COND]], label [[BB2:%.*]], label [[BB]]401; CHECK:       bb2:402; CHECK-NEXT:    [[RHS_PTR:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[RHS_IDX]]403; CHECK-NEXT:    ret ptr [[RHS_PTR]]404;405entry:406  %tmp = getelementptr inbounds i32, ptr %A, i64 %offset407  br label %bb408 409bb:410  %RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]411  %LHS = getelementptr inbounds i32, ptr %A, i32 100412  %RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1413  %cond = icmp ult ptr %LHS, %RHS414  br i1 %cond, label %bb2, label %bb415 416bb2:417  ret ptr %RHS418}419 420define ptr @indexed_compare_different_types(ptr %A, i64 %offset) {421; CHECK-LABEL: @indexed_compare_different_types(422; CHECK-NEXT:  entry:423; CHECK-NEXT:    [[TMP_IDX:%.*]] = shl nsw i64 [[OFFSET:%.*]], 2424; CHECK-NEXT:    br label [[BB:%.*]]425; CHECK:       bb:426; CHECK-NEXT:    [[RHS_IDX:%.*]] = phi i64 [ [[RHS_ADD:%.*]], [[BB]] ], [ [[TMP_IDX]], [[ENTRY:%.*]] ]427; CHECK-NEXT:    [[RHS_ADD]] = add nsw i64 [[RHS_IDX]], 4428; CHECK-NEXT:    [[COND:%.*]] = icmp sgt i64 [[RHS_IDX]], 800429; CHECK-NEXT:    br i1 [[COND]], label [[BB2:%.*]], label [[BB]]430; CHECK:       bb2:431; CHECK-NEXT:    [[RHS_PTR:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i64 [[RHS_IDX]]432; CHECK-NEXT:    ret ptr [[RHS_PTR]]433;434entry:435  %tmp = getelementptr inbounds i32, ptr %A, i64 %offset436  br label %bb437 438bb:439  %RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]440  %LHS = getelementptr inbounds i64, ptr %A, i32 100441  %RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1442  %cond = icmp ult ptr %LHS, %RHS443  br i1 %cond, label %bb2, label %bb444 445bb2:446  ret ptr %RHS447}448 449define ptr addrspace(1) @gep_of_addrspace_cast(ptr %ptr) {450; CHECK-LABEL: @gep_of_addrspace_cast(451; CHECK-NEXT:    [[CAST1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(1)452; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(1) [[CAST1]], i64 4453; CHECK-NEXT:    ret ptr addrspace(1) [[GEP]]454;455  %cast1 = addrspacecast ptr %ptr to ptr addrspace(1)456  %gep = getelementptr inbounds i32, ptr addrspace(1) %cast1, i64 1457  ret ptr addrspace(1) %gep458}459 460define i1 @cmp_gep_same_base_same_type(ptr %ptr, i64 %idx1, i64 %idx2) {461; CHECK-LABEL: @cmp_gep_same_base_same_type(462; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[IDX1:%.*]], [[IDX2:%.*]]463; CHECK-NEXT:    ret i1 [[CMP]]464;465  %gep1 = getelementptr inbounds i32, ptr %ptr, i64 %idx1466  %gep2 = getelementptr inbounds i32, ptr %ptr, i64 %idx2467  %cmp = icmp ult ptr %gep1, %gep2468  ret i1 %cmp469}470 471define i1 @cmp_gep_same_base_same_type_maywrap(ptr %ptr, i64 %idx1, i64 %idx2) {472; CHECK-LABEL: @cmp_gep_same_base_same_type_maywrap(473; CHECK-NEXT:    [[CMP_UNSHIFTED:%.*]] = xor i64 [[IDX1:%.*]], [[IDX2:%.*]]474; CHECK-NEXT:    [[CMP_MASK:%.*]] = and i64 [[CMP_UNSHIFTED]], 4611686018427387903475; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[CMP_MASK]], 0476; CHECK-NEXT:    ret i1 [[CMP]]477;478  %gep1 = getelementptr i32, ptr %ptr, i64 %idx1479  %gep2 = getelementptr i32, ptr %ptr, i64 %idx2480  %cmp = icmp eq ptr %gep1, %gep2481  ret i1 %cmp482}483 484define i1 @cmp_gep_same_base_same_type_nuw(ptr %ptr, i64 %idx1, i64 %idx2) {485; CHECK-LABEL: @cmp_gep_same_base_same_type_nuw(486; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IDX1:%.*]], [[IDX2:%.*]]487; CHECK-NEXT:    ret i1 [[CMP]]488;489  %gep1 = getelementptr nuw i32, ptr %ptr, i64 %idx1490  %gep2 = getelementptr nuw i32, ptr %ptr, i64 %idx2491  %cmp = icmp eq ptr %gep1, %gep2492  ret i1 %cmp493}494 495define i1 @cmp_gep_same_base_same_type_nusw(ptr %ptr, i64 %idx1, i64 %idx2) {496; CHECK-LABEL: @cmp_gep_same_base_same_type_nusw(497; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IDX1:%.*]], [[IDX2:%.*]]498; CHECK-NEXT:    ret i1 [[CMP]]499;500  %gep1 = getelementptr nusw i32, ptr %ptr, i64 %idx1501  %gep2 = getelementptr nusw i32, ptr %ptr, i64 %idx2502  %cmp = icmp eq ptr %gep1, %gep2503  ret i1 %cmp504}505 506define i1 @cmp_gep_same_base_different_type(ptr %ptr, i64 %idx1, i64 %idx2) {507; CHECK-LABEL: @cmp_gep_same_base_different_type(508; CHECK-NEXT:    [[GEP1_IDX:%.*]] = shl nsw i64 [[IDX1:%.*]], 2509; CHECK-NEXT:    [[GEP2_IDX:%.*]] = shl nsw i64 [[IDX2:%.*]], 3510; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[GEP1_IDX]], [[GEP2_IDX]]511; CHECK-NEXT:    ret i1 [[CMP]]512;513  %gep1 = getelementptr inbounds i32, ptr %ptr, i64 %idx1514  %gep2 = getelementptr inbounds i64, ptr %ptr, i64 %idx2515  %cmp = icmp ult ptr %gep1, %gep2516  ret i1 %cmp517}518 519@ary = constant [4 x i8] [i8 1, i8 2, i8 3, i8 4]520 521define i1 @cmp_load_gep_global(i64 %idx) {522; CHECK-LABEL: @cmp_load_gep_global(523; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IDX:%.*]], 2524; CHECK-NEXT:    ret i1 [[CMP]]525;526  %gep = getelementptr [4 x i8], ptr @ary, i64 0, i64 %idx527  %load = load i8, ptr %gep528  %cmp = icmp eq i8 %load, 3529  ret i1 %cmp530}531 532define i1 @cmp_load_gep_global_different_load_type(i64 %idx) {533; CHECK-LABEL: @cmp_load_gep_global_different_load_type(534; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr @ary, i64 [[IDX:%.*]]535; CHECK-NEXT:    [[LOAD:%.*]] = load i16, ptr [[GEP]], align 2536; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[LOAD]], 3537; CHECK-NEXT:    ret i1 [[CMP]]538;539  %gep = getelementptr [4 x i8], ptr @ary, i64 0, i64 %idx540  %load = load i16, ptr %gep541  %cmp = icmp eq i16 %load, 3542  ret i1 %cmp543}544 545define i1 @cmp_load_gep_global_different_gep_type(i64 %idx) {546; CHECK-LABEL: @cmp_load_gep_global_different_gep_type(547; CHECK-NEXT:    ret i1 false548;549  %gep = getelementptr [4 x i16], ptr @ary, i64 0, i64 %idx550  %load = load i16, ptr %gep551  %cmp = icmp eq i16 %load, 3552  ret i1 %cmp553}554 555define ptr @phi_of_gep(i1 %c, ptr %p) {556; CHECK-LABEL: @phi_of_gep(557; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]558; CHECK:       if:559; CHECK-NEXT:    br label [[JOIN:%.*]]560; CHECK:       else:561; CHECK-NEXT:    br label [[JOIN]]562; CHECK:       join:563; CHECK-NEXT:    [[PHI:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4564; CHECK-NEXT:    ret ptr [[PHI]]565;566  br i1 %c, label %if, label %else567 568if:569  %gep1 = getelementptr i32, ptr %p, i64 1570  br label %join571 572else:573  %gep2 = getelementptr i32, ptr %p, i64 1574  br label %join575 576join:577  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]578  ret ptr %phi579}580 581define ptr @phi_of_gep_flags_1(i1 %c, ptr %p) {582; CHECK-LABEL: @phi_of_gep_flags_1(583; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]584; CHECK:       if:585; CHECK-NEXT:    br label [[JOIN:%.*]]586; CHECK:       else:587; CHECK-NEXT:    br label [[JOIN]]588; CHECK:       join:589; CHECK-NEXT:    [[PHI:%.*]] = getelementptr nusw nuw i8, ptr [[P:%.*]], i64 4590; CHECK-NEXT:    ret ptr [[PHI]]591;592  br i1 %c, label %if, label %else593 594if:595  %gep1 = getelementptr inbounds i32, ptr %p, i64 1596  br label %join597 598else:599  %gep2 = getelementptr nusw nuw i32, ptr %p, i64 1600  br label %join601 602join:603  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]604  ret ptr %phi605}606 607define ptr @phi_of_gep_flags_2(i1 %c, ptr %p) {608; CHECK-LABEL: @phi_of_gep_flags_2(609; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]610; CHECK:       if:611; CHECK-NEXT:    br label [[JOIN:%.*]]612; CHECK:       else:613; CHECK-NEXT:    br label [[JOIN]]614; CHECK:       join:615; CHECK-NEXT:    [[PHI:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 4616; CHECK-NEXT:    ret ptr [[PHI]]617;618  br i1 %c, label %if, label %else619 620if:621  %gep1 = getelementptr nusw nuw i32, ptr %p, i64 1622  br label %join623 624else:625  %gep2 = getelementptr nuw i32, ptr %p, i64 1626  br label %join627 628join:629  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]630  ret ptr %phi631}632 633define ptr @phi_of_gep_different_type(i1 %c, ptr %p) {634; CHECK-LABEL: @phi_of_gep_different_type(635; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]636; CHECK:       if:637; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 4638; CHECK-NEXT:    br label [[JOIN:%.*]]639; CHECK:       else:640; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[P]], i64 8641; CHECK-NEXT:    br label [[JOIN]]642; CHECK:       join:643; CHECK-NEXT:    [[PHI:%.*]] = phi ptr [ [[GEP1]], [[IF]] ], [ [[GEP2]], [[ELSE]] ]644; CHECK-NEXT:    ret ptr [[PHI]]645;646  br i1 %c, label %if, label %else647 648if:649  %gep1 = getelementptr i32, ptr %p, i64 1650  br label %join651 652else:653  %gep2 = getelementptr i64, ptr %p, i64 1654  br label %join655 656join:657  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]658  ret ptr %phi659}660 661define ptr @gep_of_phi_of_gep(i1 %c, ptr %p) {662; CHECK-LABEL: @gep_of_phi_of_gep(663; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]664; CHECK:       if:665; CHECK-NEXT:    br label [[JOIN:%.*]]666; CHECK:       else:667; CHECK-NEXT:    br label [[JOIN]]668; CHECK:       join:669; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ]670; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[TMP1]]671; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4672; CHECK-NEXT:    ret ptr [[GEP]]673;674  br i1 %c, label %if, label %else675 676if:677  %gep1 = getelementptr i32, ptr %p, i64 1678  br label %join679 680else:681  %gep2 = getelementptr i32, ptr %p, i64 2682  br label %join683 684join:685  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]686  %gep = getelementptr i32, ptr %phi, i64 1687  ret ptr %gep688}689 690define ptr @gep_of_phi_of_gep_flags1(i1 %c, ptr %p) {691; CHECK-LABEL: @gep_of_phi_of_gep_flags1(692; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]693; CHECK:       if:694; CHECK-NEXT:    br label [[JOIN:%.*]]695; CHECK:       else:696; CHECK-NEXT:    br label [[JOIN]]697; CHECK:       join:698; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ]699; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[TMP1]]700; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4701; CHECK-NEXT:    ret ptr [[GEP]]702;703  br i1 %c, label %if, label %else704 705if:706  %gep1 = getelementptr inbounds i32, ptr %p, i64 1707  br label %join708 709else:710  %gep2 = getelementptr i32, ptr %p, i64 2711  br label %join712 713join:714  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]715  %gep = getelementptr i32, ptr %phi, i64 1716  ret ptr %gep717}718 719define ptr @gep_of_phi_of_gep_flags2(i1 %c, ptr %p) {720; CHECK-LABEL: @gep_of_phi_of_gep_flags2(721; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]722; CHECK:       if:723; CHECK-NEXT:    br label [[JOIN:%.*]]724; CHECK:       else:725; CHECK-NEXT:    br label [[JOIN]]726; CHECK:       join:727; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ]728; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[TMP1]]729; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4730; CHECK-NEXT:    ret ptr [[GEP]]731;732  br i1 %c, label %if, label %else733 734if:735  %gep1 = getelementptr nuw i32, ptr %p, i64 1736  br label %join737 738else:739  %gep2 = getelementptr nuw i32, ptr %p, i64 2740  br label %join741 742join:743  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]744  %gep = getelementptr i32, ptr %phi, i64 1745  ret ptr %gep746}747 748define ptr @gep_of_phi_of_gep_different_type(i1 %c, ptr %p) {749; CHECK-LABEL: @gep_of_phi_of_gep_different_type(750; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]751; CHECK:       if:752; CHECK-NEXT:    br label [[JOIN:%.*]]753; CHECK:       else:754; CHECK-NEXT:    br label [[JOIN]]755; CHECK:       join:756; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 16, [[ELSE]] ]757; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[TMP1]]758; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4759; CHECK-NEXT:    ret ptr [[GEP]]760;761  br i1 %c, label %if, label %else762 763if:764  %gep1 = getelementptr i32, ptr %p, i64 1765  br label %join766 767else:768  %gep2 = getelementptr i64, ptr %p, i64 2769  br label %join770 771join:772  %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]773  %gep = getelementptr i32, ptr %phi, i64 1774  ret ptr %gep775}776 777define ptr @select_of_gep(i1 %c, ptr %p) {778; CHECK-LABEL: @select_of_gep(779; CHECK-NEXT:    [[S_V:%.*]] = select i1 [[C:%.*]], i64 4, i64 8780; CHECK-NEXT:    [[S:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[S_V]]781; CHECK-NEXT:    ret ptr [[S]]782;783  %gep1 = getelementptr i32, ptr %p, i64 1784  %gep2 = getelementptr i32, ptr %p, i64 2785  %s = select i1 %c, ptr %gep1, ptr %gep2786  ret ptr %s787}788 789define ptr @select_of_gep_flags_1(i1 %c, ptr %p) {790; CHECK-LABEL: @select_of_gep_flags_1(791; CHECK-NEXT:    [[S_V:%.*]] = select i1 [[C:%.*]], i64 4, i64 8792; CHECK-NEXT:    [[S:%.*]] = getelementptr nusw nuw i8, ptr [[P:%.*]], i64 [[S_V]]793; CHECK-NEXT:    ret ptr [[S]]794;795  %gep1 = getelementptr inbounds i32, ptr %p, i64 1796  %gep2 = getelementptr nusw nuw i32, ptr %p, i64 2797  %s = select i1 %c, ptr %gep1, ptr %gep2798  ret ptr %s799}800 801define ptr @select_of_gep_flags_2(i1 %c, ptr %p) {802; CHECK-LABEL: @select_of_gep_flags_2(803; CHECK-NEXT:    [[S_V:%.*]] = select i1 [[C:%.*]], i64 4, i64 8804; CHECK-NEXT:    [[S:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[S_V]]805; CHECK-NEXT:    ret ptr [[S]]806;807  %gep1 = getelementptr nuw i32, ptr %p, i64 1808  %gep2 = getelementptr nusw nuw i32, ptr %p, i64 2809  %s = select i1 %c, ptr %gep1, ptr %gep2810  ret ptr %s811}812 813define ptr @select_of_gep_different_type(i1 %c, ptr %p) {814; CHECK-LABEL: @select_of_gep_different_type(815; CHECK-NEXT:    [[S_V:%.*]] = select i1 [[C:%.*]], i64 4, i64 16816; CHECK-NEXT:    [[S:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[S_V]]817; CHECK-NEXT:    ret ptr [[S]]818;819  %gep1 = getelementptr i32, ptr %p, i64 1820  %gep2 = getelementptr i64, ptr %p, i64 2821  %s = select i1 %c, ptr %gep1, ptr %gep2822  ret ptr %s823}824 825define void @dse(ptr %p) {826; CHECK-LABEL: @dse(827; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4828; CHECK-NEXT:    store i8 1, ptr [[P]], align 1829; CHECK-NEXT:    ret void830;831  store i32 0, ptr %p832  store i8 1, ptr %p833  ret void834}835 836declare void @call_i64(i64)837declare void @call_byval(i64, ptr byval(i64))838 839define void @call_cast_ptr_to_int(ptr %p) {840; CHECK-LABEL: @call_cast_ptr_to_int(841; CHECK-NEXT:    call void @call_i64(ptr [[P:%.*]])842; CHECK-NEXT:    ret void843;844  call void @call_i64(ptr %p)845  ret void846}847 848define void @call_cast_byval(ptr %p, ptr %p2) {849; CHECK-LABEL: @call_cast_byval(850; CHECK-NEXT:    call void @call_byval(ptr [[P:%.*]], ptr byval(double) [[P2:%.*]])851; CHECK-NEXT:    ret void852;853  call void @call_byval(ptr %p, ptr byval(double) %p2)854  ret void855}856 857declare float @fmodf(float, float)858 859define i32 @const_fold_call_with_func_type_mismatch() {860; CHECK-LABEL: @const_fold_call_with_func_type_mismatch(861; CHECK-NEXT:    [[V:%.*]] = call i32 @fmodf(float 0x40091EB860000000, float 2.000000e+00)862; CHECK-NEXT:    ret i32 [[V]]863;864  %v = call i32 @fmodf(float 0x40091EB860000000, float 2.000000e+00)865  ret i32 %v866}867