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