brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.6 KiB · dc128a4 Raw
1039 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='require<domtree>,loop(loop-simplifycfg),gvn' -enable-split-backedge-in-load-pre -S %s | FileCheck %s3 4define i32 @test_pointer_phi_select_same_object(ptr %ptr, ptr %end)  {5; CHECK-LABEL: @test_pointer_phi_select_same_object(6; CHECK-NEXT:  entry:7; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 18; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 49; CHECK-NEXT:    br label [[LOOP:%.*]]10; CHECK:       loop:11; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]12; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]13; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]14; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 415; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]16; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]17; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]18; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 119; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]20; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]21; CHECK:       exit:22; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 423; CHECK-NEXT:    ret i32 [[RES]]24;25entry:26  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 127  br label %loop28 29loop:30  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]31  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]32  %l.1 = load i32, ptr %ptr.iv, align 433  %l.2 = load i32, ptr %min.ptr, align 434  %cmp.i.i.i = icmp ult i32 %l.1, %l.235  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr36  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 137  %ec = icmp eq ptr %ptr.iv.next, %end38  br i1 %ec, label %exit, label %loop39 40exit:41  %res = load i32, ptr %min.select, align 442  ret i32 %res43}44 45define i32 @test_pointer_phi_select_same_object_lcssa(ptr %ptr, ptr %end)  {46; CHECK-LABEL: @test_pointer_phi_select_same_object_lcssa(47; CHECK-NEXT:  entry:48; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 149; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 450; CHECK-NEXT:    br label [[LOOP:%.*]]51; CHECK:       loop:52; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]53; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]54; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]55; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 456; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]57; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]58; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]59; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 160; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]61; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]62; CHECK:       exit:63; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 464; CHECK-NEXT:    ret i32 [[RES]]65;66entry:67  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 168  br label %loop69 70loop:71  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]72  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]73  %l.1 = load i32, ptr %ptr.iv, align 474  %l.2 = load i32, ptr %min.ptr, align 475  %cmp.i.i.i = icmp ult i32 %l.1, %l.276  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr77  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 178  %ec = icmp eq ptr %ptr.iv.next, %end79  br i1 %ec, label %exit, label %loop80 81exit:82  %lcssa.min = phi ptr [ %min.select, %loop ]83  %res = load i32, ptr %lcssa.min, align 484  ret i32 %res85}86 87define i32 @test_pointer_phi_select_different_objects(ptr %A, ptr %B, ptr %end)  {88; CHECK-LABEL: @test_pointer_phi_select_different_objects(89; CHECK-NEXT:  entry:90; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[B:%.*]], align 491; CHECK-NEXT:    br label [[LOOP:%.*]]92; CHECK:       loop:93; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]94; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]95; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[B]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]96; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 497; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]98; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]99; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]100; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1101; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]102; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]103; CHECK:       exit:104; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4105; CHECK-NEXT:    ret i32 [[RES]]106;107entry:108  br label %loop109 110loop:111  %ptr.iv = phi ptr [ %A, %entry ], [ %ptr.iv.next, %loop ]112  %min.ptr = phi ptr [ %B, %entry ], [ %min.select, %loop ]113  %l.1 = load i32, ptr %ptr.iv, align 4114  %l.2 = load i32, ptr %min.ptr, align 4115  %cmp.i.i.i = icmp ult i32 %l.1, %l.2116  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr117  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1118  %ec = icmp eq ptr %ptr.iv.next, %end119  br i1 %ec, label %exit, label %loop120 121exit:122  %res = load i32, ptr %min.select, align 4123  ret i32 %res124}125 126define i32 @test_pointer_phi_select_same_object_multiple_loads_1(ptr %ptr, ptr %end)  {127; CHECK-LABEL: @test_pointer_phi_select_same_object_multiple_loads_1(128; CHECK-NEXT:  entry:129; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1130; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4131; CHECK-NEXT:    br label [[LOOP:%.*]]132; CHECK:       loop:133; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]134; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]135; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]136; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4137; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]138; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]139; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]140; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1141; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]142; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]143; CHECK:       exit:144; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4145; CHECK-NEXT:    ret i32 [[RES]]146;147entry:148  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1149  br label %loop150 151loop:152  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]153  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]154  %l.1 = load i32, ptr %ptr.iv, align 4155  %l.2 = load i32, ptr %min.ptr, align 4156  %cmp.i.i.i = icmp ult i32 %l.1, %l.2157  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr158  %l.3 = load i32, ptr %min.ptr, align 4159  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1160  %ec = icmp eq ptr %ptr.iv.next, %end161  br i1 %ec, label %exit, label %loop162 163exit:164  %res = load i32, ptr %min.select, align 4165  ret i32 %res166}167 168define i32 @test_pointer_phi_select_same_object_multiple_loads_2(ptr %ptr, ptr %end)  {169; CHECK-LABEL: @test_pointer_phi_select_same_object_multiple_loads_2(170; CHECK-NEXT:  entry:171; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1172; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4173; CHECK-NEXT:    br label [[LOOP:%.*]]174; CHECK:       loop:175; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]176; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]177; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]178; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4179; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]180; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]181; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]182; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1183; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]184; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]185; CHECK:       exit:186; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4187; CHECK-NEXT:    ret i32 [[RES]]188;189entry:190  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1191  br label %loop192 193loop:194  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]195  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]196  %l.1 = load i32, ptr %ptr.iv, align 4197  %l.2 = load i32, ptr %min.ptr, align 4198  %cmp.i.i.i = icmp ult i32 %l.1, %l.2199  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr200  %l.3 = load i32, ptr %ptr.iv, align 4201  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1202  %ec = icmp eq ptr %ptr.iv.next, %end203  br i1 %ec, label %exit, label %loop204 205exit:206  %res = load i32, ptr %min.select, align 4207  ret i32 %res208}209 210define i32 @test_pointer_phi_select_load_after(ptr %A, ptr %B, ptr %end)  {211; CHECK-LABEL: @test_pointer_phi_select_load_after(212; CHECK-NEXT:  entry:213; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[B:%.*]], align 4214; CHECK-NEXT:    br label [[LOOP:%.*]]215; CHECK:       loop:216; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[L_3:%.*]], [[LOOP]] ]217; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]218; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[B]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]219; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4220; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]221; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]222; CHECK-NEXT:    [[L_3]] = load i32, ptr [[MIN_SELECT]], align 4223; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i32 [[L_3]]224; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]225; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]226; CHECK:       exit:227; CHECK-NEXT:    ret i32 [[L_3]]228;229entry:230  br label %loop231 232loop:233  %ptr.iv = phi ptr [ %A, %entry ], [ %ptr.iv.next, %loop ]234  %min.ptr = phi ptr [ %B, %entry ], [ %min.select, %loop ]235  %l.1 = load i32, ptr %ptr.iv, align 4236  %l.2 = load i32, ptr %min.ptr, align 4237  %cmp.i.i.i = icmp ult i32 %l.1, %l.2238  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr239  %l.3 = load i32, ptr %min.select, align 4240  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i32 %l.3241  %ec = icmp eq ptr %ptr.iv.next, %end242  br i1 %ec, label %exit, label %loop243 244exit:245  %res = load i32, ptr %min.select, align 4246  ret i32 %res247}248 249define i32 @test_pointer_phi_select_same_object_split_edge(ptr %ptr, ptr %end, i1 %c)  {250; CHECK-LABEL: @test_pointer_phi_select_same_object_split_edge(251; CHECK-NEXT:  entry:252; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1253; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP_PREHEADER:%.*]]254; CHECK:       loop.preheader:255; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4256; CHECK-NEXT:    br label [[LOOP:%.*]]257; CHECK:       loop:258; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[TMP0:%.*]], [[LOOP]] ], [ [[L_2_PRE]], [[LOOP_PREHEADER]] ]259; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ], [ [[START_PTR]], [[LOOP_PREHEADER]] ]260; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[MIN_SELECT:%.*]], [[LOOP]] ], [ [[PTR]], [[LOOP_PREHEADER]] ]261; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4262; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]263; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]264; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]265; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1266; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]267; CHECK-NEXT:    br i1 [[EC]], label [[LOOP_EXIT:%.*]], label [[LOOP]]268; CHECK:       loop.exit:269; CHECK-NEXT:    br label [[EXIT]]270; CHECK:       exit:271; CHECK-NEXT:    [[LCSSA_PHI_2:%.*]] = phi ptr [ [[END]], [[ENTRY:%.*]] ], [ [[MIN_SELECT]], [[LOOP_EXIT]] ]272; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[LCSSA_PHI_2]], align 4273; CHECK-NEXT:    ret i32 [[RES]]274;275entry:276  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1277  br i1 %c, label %exit, label %loop278 279loop:280  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]281  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]282  %l.1 = load i32, ptr %ptr.iv, align 4283  %l.2 = load i32, ptr %min.ptr, align 4284  %cmp.i.i.i = icmp ult i32 %l.1, %l.2285  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr286  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1287  %ec = icmp eq ptr %ptr.iv.next, %end288  br i1 %ec, label %loop.exit, label %loop289 290loop.exit:291  %lcssa.phi.1 = phi ptr [ %min.select, %loop ]292  br label %exit293 294exit:295  %lcssa.phi.2 = phi ptr [ %end, %entry ], [ %lcssa.phi.1, %loop.exit ]296  %res = load i32, ptr %lcssa.phi.2, align 4297  ret i32 %res298}299 300 301declare void @may_throw() readonly302 303define i32 @test_pointer_phi_select_load_may_not_execute_1(ptr %A, ptr %B, ptr %end)  {304; CHECK-LABEL: @test_pointer_phi_select_load_may_not_execute_1(305; CHECK-NEXT:  entry:306; CHECK-NEXT:    br label [[LOOP:%.*]]307; CHECK:       loop:308; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]309; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[B:%.*]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]310; CHECK-NEXT:    call void @may_throw()311; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4312; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4313; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]314; CHECK-NEXT:    [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]315; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]316; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1317; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]318; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]319; CHECK:       exit:320; CHECK-NEXT:    ret i32 [[TMP0]]321;322entry:323  br label %loop324 325loop:326  %ptr.iv = phi ptr [ %A, %entry ], [ %ptr.iv.next, %loop ]327  %min.ptr = phi ptr [ %B, %entry ], [ %min.select, %loop ]328  call void @may_throw()329  %l.1 = load i32, ptr %ptr.iv, align 4330  %l.2 = load i32, ptr %min.ptr, align 4331  %cmp.i.i.i = icmp ult i32 %l.1, %l.2332  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr333  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1334  %ec = icmp eq ptr %ptr.iv.next, %end335  br i1 %ec, label %exit, label %loop336 337exit:338  %res = load i32, ptr %min.select, align 4339  ret i32 %res340}341 342define i32 @test_pointer_phi_select_load_may_not_execute_2(ptr %A, ptr %B, ptr %end)  {343; CHECK-LABEL: @test_pointer_phi_select_load_may_not_execute_2(344; CHECK-NEXT:  entry:345; CHECK-NEXT:    br label [[LOOP:%.*]]346; CHECK:       loop:347; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]348; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[B:%.*]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]349; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4350; CHECK-NEXT:    call void @may_throw()351; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4352; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]353; CHECK-NEXT:    [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]354; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]355; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1356; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]357; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]358; CHECK:       exit:359; CHECK-NEXT:    ret i32 [[TMP0]]360;361entry:362  br label %loop363 364loop:365  %ptr.iv = phi ptr [ %A, %entry ], [ %ptr.iv.next, %loop ]366  %min.ptr = phi ptr [ %B, %entry ], [ %min.select, %loop ]367  %l.1 = load i32, ptr %ptr.iv, align 4368  call void @may_throw()369  %l.2 = load i32, ptr %min.ptr, align 4370  %cmp.i.i.i = icmp ult i32 %l.1, %l.2371  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr372  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1373  %ec = icmp eq ptr %ptr.iv.next, %end374  br i1 %ec, label %exit, label %loop375 376exit:377  %res = load i32, ptr %min.select, align 4378  ret i32 %res379}380 381define i32 @test_pointer_phi_select_same_object_store_1(ptr %ptr, ptr %end)  {382; CHECK-LABEL: @test_pointer_phi_select_same_object_store_1(383; CHECK-NEXT:  entry:384; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1385; CHECK-NEXT:    br label [[LOOP:%.*]]386; CHECK:       loop:387; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]388; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]389; CHECK-NEXT:    store i32 3, ptr [[MIN_PTR]], align 4390; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4391; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], 3392; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]393; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1394; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]395; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]396; CHECK:       exit:397; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4398; CHECK-NEXT:    ret i32 [[RES]]399;400entry:401  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1402  br label %loop403 404loop:405  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]406  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]407  store i32 3, ptr %min.ptr408  %l.1 = load i32, ptr %ptr.iv, align 4409  %l.2 = load i32, ptr %min.ptr, align 4410  %cmp.i.i.i = icmp ult i32 %l.1, %l.2411  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr412  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1413  %ec = icmp eq ptr %ptr.iv.next, %end414  br i1 %ec, label %exit, label %loop415 416exit:417  %res = load i32, ptr %min.select, align 4418  ret i32 %res419}420 421define i32 @test_pointer_phi_select_same_object_store_2(ptr %ptr, ptr %end)  {422; CHECK-LABEL: @test_pointer_phi_select_same_object_store_2(423; CHECK-NEXT:  entry:424; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1425; CHECK-NEXT:    br label [[LOOP:%.*]]426; CHECK:       loop:427; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]428; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]429; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4430; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4431; CHECK-NEXT:    store i32 3, ptr [[MIN_PTR]], align 4432; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]433; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]434; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1435; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]436; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]437; CHECK:       exit:438; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4439; CHECK-NEXT:    ret i32 [[RES]]440;441entry:442  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1443  br label %loop444 445loop:446  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]447  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]448  %l.1 = load i32, ptr %ptr.iv, align 4449  %l.2 = load i32, ptr %min.ptr, align 4450  store i32 3, ptr %min.ptr451  %cmp.i.i.i = icmp ult i32 %l.1, %l.2452  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr453  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1454  %ec = icmp eq ptr %ptr.iv.next, %end455  br i1 %ec, label %exit, label %loop456 457exit:458  %res = load i32, ptr %min.select, align 4459  ret i32 %res460}461 462define i32 @test_pointer_phi_select_same_object_store_3(ptr %ptr, ptr %end)  {463; CHECK-LABEL: @test_pointer_phi_select_same_object_store_3(464; CHECK-NEXT:  entry:465; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1466; CHECK-NEXT:    br label [[LOOP:%.*]]467; CHECK:       loop:468; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]469; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]470; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4471; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4472; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]473; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]474; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1475; CHECK-NEXT:    store i32 3, ptr [[MIN_PTR]], align 4476; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]477; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]478; CHECK:       exit:479; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4480; CHECK-NEXT:    ret i32 [[RES]]481;482entry:483  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1484  br label %loop485 486loop:487  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]488  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]489  %l.1 = load i32, ptr %ptr.iv, align 4490  %l.2 = load i32, ptr %min.ptr, align 4491  %cmp.i.i.i = icmp ult i32 %l.1, %l.2492  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr493  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1494  store i32 3, ptr %min.ptr495  %ec = icmp eq ptr %ptr.iv.next, %end496  br i1 %ec, label %exit, label %loop497 498exit:499  %res = load i32, ptr %min.select, align 4500  ret i32 %res501}502 503declare void @may_write()504 505define i32 @test_pointer_phi_select_same_object_may_write_call_1(ptr %ptr, ptr %end)  {506; CHECK-LABEL: @test_pointer_phi_select_same_object_may_write_call_1(507; CHECK-NEXT:  entry:508; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1509; CHECK-NEXT:    br label [[LOOP:%.*]]510; CHECK:       loop:511; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]512; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]513; CHECK-NEXT:    call void @may_write()514; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4515; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4516; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]517; CHECK-NEXT:    [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]518; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]519; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1520; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]521; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]522; CHECK:       exit:523; CHECK-NEXT:    ret i32 [[TMP0]]524;525entry:526  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1527  br label %loop528 529loop:530  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]531  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]532  call void @may_write()533  %l.1 = load i32, ptr %ptr.iv, align 4534  %l.2 = load i32, ptr %min.ptr, align 4535  %cmp.i.i.i = icmp ult i32 %l.1, %l.2536  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr537  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1538  %ec = icmp eq ptr %ptr.iv.next, %end539  br i1 %ec, label %exit, label %loop540 541exit:542  %res = load i32, ptr %min.select, align 4543  ret i32 %res544}545 546define i32 @test_pointer_phi_select_same_object_may_write_call_2(ptr %ptr, ptr %end)  {547; CHECK-LABEL: @test_pointer_phi_select_same_object_may_write_call_2(548; CHECK-NEXT:  entry:549; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1550; CHECK-NEXT:    br label [[LOOP:%.*]]551; CHECK:       loop:552; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]553; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]554; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4555; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4556; CHECK-NEXT:    call void @may_write()557; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]558; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]559; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1560; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]561; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]562; CHECK:       exit:563; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4564; CHECK-NEXT:    ret i32 [[RES]]565;566entry:567  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1568  br label %loop569 570loop:571  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]572  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]573  %l.1 = load i32, ptr %ptr.iv, align 4574  %l.2 = load i32, ptr %min.ptr, align 4575  call void @may_write()576  %cmp.i.i.i = icmp ult i32 %l.1, %l.2577  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr578  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1579  %ec = icmp eq ptr %ptr.iv.next, %end580  br i1 %ec, label %exit, label %loop581 582exit:583  %res = load i32, ptr %min.select, align 4584  ret i32 %res585}586 587define i32 @test_pointer_phi_select_same_object_may_write_call_3(ptr %ptr, ptr %end)  {588; CHECK-LABEL: @test_pointer_phi_select_same_object_may_write_call_3(589; CHECK-NEXT:  entry:590; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1591; CHECK-NEXT:    br label [[LOOP:%.*]]592; CHECK:       loop:593; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]594; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]595; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4596; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4597; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]598; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]599; CHECK-NEXT:    call void @may_write()600; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1601; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]602; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]603; CHECK:       exit:604; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4605; CHECK-NEXT:    ret i32 [[RES]]606;607entry:608  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1609  br label %loop610 611loop:612  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]613  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]614  %l.1 = load i32, ptr %ptr.iv, align 4615  %l.2 = load i32, ptr %min.ptr, align 4616  %cmp.i.i.i = icmp ult i32 %l.1, %l.2617  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr618  call void @may_write()619  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1620  %ec = icmp eq ptr %ptr.iv.next, %end621  br i1 %ec, label %exit, label %loop622 623exit:624  %res = load i32, ptr %min.select, align 4625  ret i32 %res626}627 628define i32 @test_pointer_phi_select_same_object_header_exit(ptr %ptr, ptr %end)  {629; CHECK-LABEL: @test_pointer_phi_select_same_object_header_exit(630; CHECK-NEXT:  entry:631; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1632; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]633; CHECK:       loop.header:634; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]635; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP_LATCH]] ]636; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1637; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]638; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_LATCH]]639; CHECK:       loop.latch:640; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4641; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 4642; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]643; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]644; CHECK-NEXT:    br label [[LOOP_HEADER]]645; CHECK:       exit:646; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_PTR]], align 4647; CHECK-NEXT:    ret i32 [[RES]]648;649entry:650  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1651  br label %loop.header652 653loop.header:654  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop.latch ]655  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop.latch ]656  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1657  %ec = icmp eq ptr %ptr.iv.next, %end658  br i1 %ec, label %exit, label %loop.latch659 660loop.latch:661  %l.1 = load i32, ptr %ptr.iv, align 4662  %l.2 = load i32, ptr %min.ptr, align 4663  %cmp.i.i.i = icmp ult i32 %l.1, %l.2664  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr665  br label %loop.header666 667exit:668  %res = load i32, ptr %min.ptr, align 4669  ret i32 %res670}671 672define i32 @test_pointer_phi_select_same_object_ptr_use_cycle(ptr %ptr, ptr %end)  {673; CHECK-LABEL: @test_pointer_phi_select_same_object_ptr_use_cycle(674; CHECK-NEXT:  entry:675; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1676; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4677; CHECK-NEXT:    br label [[LOOP:%.*]]678; CHECK:       loop:679; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]680; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]681; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]682; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4683; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]684; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]685; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]686; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1687; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]688; CHECK-NEXT:    br i1 [[EC]], label [[EXIT_PREHEADER:%.*]], label [[LOOP]]689; CHECK:       exit.preheader:690; CHECK-NEXT:    br label [[EXIT:%.*]]691; CHECK:       exit:692; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[P_NEXT:%.*]], [[EXIT]] ], [ [[MIN_SELECT]], [[EXIT_PREHEADER]] ]693; CHECK-NEXT:    store i32 0, ptr [[P]], align 4694; CHECK-NEXT:    [[P_NEXT]] = getelementptr inbounds i32, ptr [[P]], i64 1695; CHECK-NEXT:    br label [[EXIT]]696;697entry:698  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1699  br label %loop700 701loop:702  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]703  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]704  %l.1 = load i32, ptr %ptr.iv, align 4705  %l.2 = load i32, ptr %min.ptr, align 4706  %cmp.i.i.i = icmp ult i32 %l.1, %l.2707  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr708  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1709  %ec = icmp eq ptr %ptr.iv.next, %end710  br i1 %ec, label %exit, label %loop711 712exit:713  %p = phi ptr [ %min.select, %loop ], [ %p.next, %exit ]714  store i32 0, ptr %p715  %p.next = getelementptr inbounds i32, ptr %p, i64 1716  br label %exit717}718 719define i32 @test_pointer_phi_select_same_object_maybe_clobbered_in_exit(ptr %ptr, ptr %end)  {720; CHECK-LABEL: @test_pointer_phi_select_same_object_maybe_clobbered_in_exit(721; CHECK-NEXT:  entry:722; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1723; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4724; CHECK-NEXT:    br label [[LOOP:%.*]]725; CHECK:       loop:726; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]727; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]728; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]729; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4730; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]731; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]732; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]733; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1734; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]735; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]736; CHECK:       exit:737; CHECK-NEXT:    store i32 0, ptr [[START_PTR]], align 4738; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4739; CHECK-NEXT:    ret i32 [[RES]]740;741entry:742  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1743  br label %loop744 745loop:746  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]747  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]748  %l.1 = load i32, ptr %ptr.iv, align 4749  %l.2 = load i32, ptr %min.ptr, align 4750  %cmp.i.i.i = icmp ult i32 %l.1, %l.2751  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr752  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1753  %ec = icmp eq ptr %ptr.iv.next, %end754  br i1 %ec, label %exit, label %loop755 756exit:757  store i32 0, ptr %start.ptr758  %res = load i32, ptr %min.select, align 4759  ret i32 %res760}761 762define i32 @test_pointer_phi_select_same_object_maybe_clobbered_in_exit_2(ptr %ptr, ptr %end)  {763; CHECK-LABEL: @test_pointer_phi_select_same_object_maybe_clobbered_in_exit_2(764; CHECK-NEXT:  entry:765; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1766; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4767; CHECK-NEXT:    br label [[LOOP:%.*]]768; CHECK:       loop:769; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]770; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]771; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]772; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4773; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]774; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]775; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]776; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1777; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]778; CHECK-NEXT:    br i1 [[EC]], label [[EXIT_1:%.*]], label [[LOOP]]779; CHECK:       exit.1:780; CHECK-NEXT:    store i32 0, ptr [[START_PTR]], align 4781; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4782; CHECK-NEXT:    ret i32 [[RES]]783;784entry:785  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1786  br label %loop787 788loop:789  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]790  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]791  %l.1 = load i32, ptr %ptr.iv, align 4792  %l.2 = load i32, ptr %min.ptr, align 4793  %cmp.i.i.i = icmp ult i32 %l.1, %l.2794  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr795  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1796  %ec = icmp eq ptr %ptr.iv.next, %end797  br i1 %ec, label %exit.1, label %loop798 799exit.1:800  %lcssa.min = phi ptr [ %min.select, %loop ]801  store i32 0, ptr %start.ptr802  br label %exit.2803 804exit.2:805  %res = load i32, ptr %lcssa.min, align 4806  ret i32 %res807}808 809declare i32 @__CxxFrameHandler3(...)810 811define i32 @test_pointer_phi_select_same_object_invoke_in_chain(ptr %ptr, ptr %end)  personality ptr @__CxxFrameHandler3 {812; CHECK-LABEL: @test_pointer_phi_select_same_object_invoke_in_chain(813; CHECK-NEXT:  entry:814; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1815; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4816; CHECK-NEXT:    br label [[LOOP:%.*]]817; CHECK:       loop:818; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]819; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]820; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]821; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4822; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]823; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]824; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]825; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 1826; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]827; CHECK-NEXT:    br i1 [[EC]], label [[EXIT_1:%.*]], label [[LOOP]]828; CHECK:       exit.1:829; CHECK-NEXT:    store i32 0, ptr [[START_PTR]], align 4830; CHECK-NEXT:    invoke void @may_throw()831; CHECK-NEXT:    to label [[EXIT_2:%.*]] unwind label [[CATCH_OBJECT:%.*]]832; CHECK:       exit.2:833; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4834; CHECK-NEXT:    ret i32 [[RES]]835; CHECK:       catch.object:836; CHECK-NEXT:    [[LP:%.*]] = landingpad { ptr, i32 }837; CHECK-NEXT:    catch ptr null838; CHECK-NEXT:    unreachable839;840entry:841  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1842  br label %loop843 844loop:845  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]846  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]847  %l.1 = load i32, ptr %ptr.iv, align 4848  %l.2 = load i32, ptr %min.ptr, align 4849  %cmp.i.i.i = icmp ult i32 %l.1, %l.2850  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr851  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 1852  %ec = icmp eq ptr %ptr.iv.next, %end853  br i1 %ec, label %exit.1, label %loop854 855exit.1:856  %lcssa.min = phi ptr [ %min.select, %loop ]857  store i32 0, ptr %start.ptr858  invoke void @may_throw()859  to label %exit.2 unwind label %catch.object860 861exit.2:862  %res = load i32, ptr %lcssa.min, align 4863  ret i32 %res864 865catch.object:866  %lp = landingpad { ptr, i32 }867  catch ptr null868  unreachable869}870 871define i32 @test_pointer_phi_select_used_by_others_in_loop(ptr %ptr, ptr %end)  {872; CHECK-LABEL: @test_pointer_phi_select_used_by_others_in_loop(873; CHECK-NEXT:  entry:874; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1875; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4876; CHECK-NEXT:    br label [[LOOP:%.*]]877; CHECK:       loop:878; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[L_3:%.*]], [[LOOP]] ]879; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]880; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]881; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4882; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]883; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]884; CHECK-NEXT:    [[L_3]] = load i32, ptr [[MIN_SELECT]], align 4885; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i32 [[L_3]]886; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]887; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]888; CHECK:       exit:889; CHECK-NEXT:    ret i32 [[L_3]]890;891entry:892  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1893  br label %loop894 895loop:896  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]897  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]898  %l.1 = load i32, ptr %ptr.iv, align 4899  %l.2 = load i32, ptr %min.ptr, align 4900  %cmp.i.i.i = icmp ult i32 %l.1, %l.2901  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr902  %l.3 = load i32, ptr %min.select, align 4903  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i32 %l.3904  %ec = icmp eq ptr %ptr.iv.next, %end905  br i1 %ec, label %exit, label %loop906 907exit:908  %res = load i32, ptr %min.select, align 4909  ret i32 %res910}911 912define i32 @test_pointer_phi_used_by_others_in_loop_1(ptr %ptr, ptr %end)  {913; CHECK-LABEL: @test_pointer_phi_used_by_others_in_loop_1(914; CHECK-NEXT:  entry:915; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1916; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4917; CHECK-NEXT:    br label [[LOOP:%.*]]918; CHECK:       loop:919; CHECK-NEXT:    [[L_3:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[L_3_PRE:%.*]], [[LOOP_LOOP_CRIT_EDGE:%.*]] ]920; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY]] ], [ [[TMP0:%.*]], [[LOOP_LOOP_CRIT_EDGE]] ]921; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LOOP_CRIT_EDGE]] ]922; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP_LOOP_CRIT_EDGE]] ]923; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4924; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]925; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]926; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]927; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i32 [[L_3]]928; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]929; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_LOOP_CRIT_EDGE]]930; CHECK:       loop.loop_crit_edge:931; CHECK-NEXT:    [[L_3_PRE]] = load i32, ptr [[MIN_SELECT]], align 4932; CHECK-NEXT:    br label [[LOOP]]933; CHECK:       exit:934; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4935; CHECK-NEXT:    ret i32 [[RES]]936;937entry:938  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1939  br label %loop940 941loop:942  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]943  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]944  %l.1 = load i32, ptr %ptr.iv, align 4945  %l.2 = load i32, ptr %min.ptr, align 4946  %cmp.i.i.i = icmp ult i32 %l.1, %l.2947  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr948  %l.3 = load i32, ptr %min.ptr, align 4949  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i32 %l.3950  %ec = icmp eq ptr %ptr.iv.next, %end951  br i1 %ec, label %exit, label %loop952 953exit:954  %res = load i32, ptr %min.select, align 4955  ret i32 %res956}957 958define i32 @test_pointer_phi_used_by_others_in_loop_2(ptr %ptr, ptr %end)  {959; CHECK-LABEL: @test_pointer_phi_used_by_others_in_loop_2(960; CHECK-NEXT:  entry:961; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1962; CHECK-NEXT:    [[L_2_PRE:%.*]] = load i32, ptr [[PTR]], align 4963; CHECK-NEXT:    br label [[LOOP:%.*]]964; CHECK:       loop:965; CHECK-NEXT:    [[L_2:%.*]] = phi i32 [ [[L_2_PRE]], [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]966; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]967; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]968; CHECK-NEXT:    [[L_1:%.*]] = load i32, ptr [[PTR_IV]], align 4969; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]970; CHECK-NEXT:    [[TMP0]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]971; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]972; CHECK-NEXT:    [[GEP_MIN_PTR:%.*]] = getelementptr inbounds i32, ptr [[MIN_PTR]], i32 1973; CHECK-NEXT:    [[L_3:%.*]] = load i32, ptr [[GEP_MIN_PTR]], align 4974; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i32 [[L_3]]975; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]976; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]977; CHECK:       exit:978; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 4979; CHECK-NEXT:    ret i32 [[RES]]980;981entry:982  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 1983  br label %loop984 985loop:986  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]987  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]988  %l.1 = load i32, ptr %ptr.iv, align 4989  %l.2 = load i32, ptr %min.ptr, align 4990  %cmp.i.i.i = icmp ult i32 %l.1, %l.2991  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr992  %gep.min.ptr = getelementptr inbounds i32, ptr %min.ptr, i32 1993  %l.3 = load i32, ptr %gep.min.ptr, align 4994  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i32 %l.3995  %ec = icmp eq ptr %ptr.iv.next, %end996  br i1 %ec, label %exit, label %loop997 998exit:999  %res = load i32, ptr %min.select, align 41000  ret i32 %res1001}1002 1003define i32 @test_pointer_phi_select_no_iter_load(ptr %ptr, ptr %end)  {1004; CHECK-LABEL: @test_pointer_phi_select_no_iter_load(1005; CHECK-NEXT:  entry:1006; CHECK-NEXT:    [[START_PTR:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 11007; CHECK-NEXT:    br label [[LOOP:%.*]]1008; CHECK:       loop:1009; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START_PTR]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]1010; CHECK-NEXT:    [[MIN_PTR:%.*]] = phi ptr [ [[PTR]], [[ENTRY]] ], [ [[MIN_SELECT:%.*]], [[LOOP]] ]1011; CHECK-NEXT:    [[L_2:%.*]] = load i32, ptr [[MIN_PTR]], align 41012; CHECK-NEXT:    [[CMP_I_I_I:%.*]] = icmp ult i32 10, [[L_2]]1013; CHECK-NEXT:    [[MIN_SELECT]] = select i1 [[CMP_I_I_I]], ptr [[PTR_IV]], ptr [[MIN_PTR]]1014; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i64 11015; CHECK-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END:%.*]]1016; CHECK-NEXT:    br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]]1017; CHECK:       exit:1018; CHECK-NEXT:    [[RES:%.*]] = load i32, ptr [[MIN_SELECT]], align 41019; CHECK-NEXT:    ret i32 [[RES]]1020;1021entry:1022  %start.ptr = getelementptr inbounds i32, ptr %ptr, i64 11023  br label %loop1024 1025loop:1026  %ptr.iv = phi ptr [ %start.ptr, %entry ], [ %ptr.iv.next, %loop ]1027  %min.ptr = phi ptr [ %ptr, %entry ], [ %min.select, %loop ]1028  %l.2 = load i32, ptr %min.ptr, align 41029  %cmp.i.i.i = icmp ult i32 10, %l.21030  %min.select  = select i1 %cmp.i.i.i, ptr %ptr.iv, ptr %min.ptr1031  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i64 11032  %ec = icmp eq ptr %ptr.iv.next, %end1033  br i1 %ec, label %exit, label %loop1034 1035exit:1036  %res = load i32, ptr %min.select, align 41037  ret i32 %res1038}1039