931 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='require<domtree>,loop(loop-simplifycfg),gvn' -S %s | FileCheck %s3 4define i32 @test_pointer_phi_select_simp_1(ptr %a, ptr %b, i1 %cond) {5; CHECK-LABEL: @test_pointer_phi_select_simp_1(6; CHECK-NEXT: entry:7; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]8; CHECK: then:9; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 410; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 411; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]12; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]13; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]14; CHECK-NEXT: br label [[EXIT:%.*]]15; CHECK: else:16; CHECK-NEXT: [[RES_2_PRE:%.*]] = load i32, ptr [[A]], align 417; CHECK-NEXT: br label [[EXIT]]18; CHECK: exit:19; CHECK-NEXT: [[RES_2:%.*]] = phi i32 [ [[TMP0]], [[THEN]] ], [ [[RES_2_PRE]], [[ELSE]] ]20; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]21; CHECK-NEXT: ret i32 [[RES_2]]22;23entry:24 br i1 %cond, label %then, label %else25 26then:27 %l.1 = load i32, ptr %a, align 428 %l.2 = load i32, ptr %b, align 429 %cmp.i.i.i = icmp ult i32 %l.1, %l.230 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b31 br label %exit32 33else:34 br label %exit35 36exit:37 %p = phi ptr [ %min.select, %then ], [ %a, %else ]38 %res.2 = load i32, ptr %p, align 439 ret i32 %res.240}41 42define i32 @test_pointer_phi_select_simp_non_local(ptr %a, ptr %b, ptr %c) {43; CHECK-LABEL: @test_pointer_phi_select_simp_non_local(44; CHECK-NEXT: entry:45; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 446; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[L_1]], 047; CHECK-NEXT: br i1 [[COND]], label [[THEN:%.*]], label [[ELSE:%.*]]48; CHECK: then:49; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 450; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]51; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]52; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]53; CHECK-NEXT: br label [[EXIT:%.*]]54; CHECK: else:55; CHECK-NEXT: [[RES_2_PRE:%.*]] = load i32, ptr [[C:%.*]], align 456; CHECK-NEXT: br label [[EXIT]]57; CHECK: exit:58; CHECK-NEXT: [[RES_2:%.*]] = phi i32 [ [[TMP0]], [[THEN]] ], [ [[RES_2_PRE]], [[ELSE]] ]59; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[C]], [[ELSE]] ]60; CHECK-NEXT: ret i32 [[RES_2]]61;62entry:63 %l.1 = load i32, ptr %a, align 464 %cond = icmp sgt i32 %l.1, 065 br i1 %cond, label %then, label %else66 67then:68 %l.2 = load i32, ptr %b, align 469 %cmp.i.i.i = icmp ult i32 %l.1, %l.270 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b71 br label %exit72 73else:74 br label %exit75 76exit:77 %p = phi ptr [ %min.select, %then ], [ %c, %else ]78 %res.2 = load i32, ptr %p, align 479 ret i32 %res.280}81 82define i32 @test_pointer_phi_select_simp_non_local_mismatched_type(ptr %a, ptr %b, ptr %c) {83; CHECK-LABEL: @test_pointer_phi_select_simp_non_local_mismatched_type(84; CHECK-NEXT: entry:85; CHECK-NEXT: [[L_1:%.*]] = load float, ptr [[A:%.*]], align 486; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[L_1]] to i3287; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[CONV]], 088; CHECK-NEXT: br i1 [[COND]], label [[THEN:%.*]], label [[ELSE:%.*]]89; CHECK: then:90; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 491; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[CONV]], [[L_2]]92; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]93; CHECK-NEXT: br label [[EXIT:%.*]]94; CHECK: else:95; CHECK-NEXT: br label [[EXIT]]96; CHECK: exit:97; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[C:%.*]], [[ELSE]] ]98; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 499; CHECK-NEXT: ret i32 [[RES_2]]100;101entry:102 %l.1 = load float, ptr %a, align 4103 %conv = fptosi float %l.1 to i32104 %cond = icmp sgt i32 %conv, 0105 br i1 %cond, label %then, label %else106 107then:108 %l.2 = load i32, ptr %b, align 4109 %cmp.i.i.i = icmp ult i32 %conv, %l.2110 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b111 br label %exit112 113else:114 br label %exit115 116exit:117 %p = phi ptr [ %min.select, %then ], [ %c, %else ]118 %res.2 = load i32, ptr %p, align 4119 ret i32 %res.2120}121 122define i32 @test_pointer_phi_select_simp_no_load_for_select_op_1(ptr %a, ptr %b, ptr %c, i1 %cond) {123; CHECK-LABEL: @test_pointer_phi_select_simp_no_load_for_select_op_1(124; CHECK-NEXT: entry:125; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]126; CHECK: then:127; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[C:%.*]], align 4128; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4129; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]130; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A:%.*]], ptr [[B]]131; CHECK-NEXT: br label [[EXIT:%.*]]132; CHECK: else:133; CHECK-NEXT: br label [[EXIT]]134; CHECK: exit:135; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]136; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4137; CHECK-NEXT: ret i32 [[RES_2]]138;139entry:140 br i1 %cond, label %then, label %else141 142then:143 %l.1 = load i32, ptr %c, align 4144 %l.2 = load i32, ptr %b, align 4145 %cmp.i.i.i = icmp ult i32 %l.1, %l.2146 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b147 br label %exit148 149else:150 br label %exit151 152exit:153 %p = phi ptr [ %min.select, %then ], [ %a, %else ]154 %res.2 = load i32, ptr %p, align 4155 ret i32 %res.2156}157 158define i32 @test_pointer_phi_select_simp_no_load_for_select_op_2(ptr %a, ptr %b, ptr %c, i1 %cond) {159; CHECK-LABEL: @test_pointer_phi_select_simp_no_load_for_select_op_2(160; CHECK-NEXT: entry:161; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]162; CHECK: then:163; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4164; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[C:%.*]], align 4165; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]166; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B:%.*]]167; CHECK-NEXT: br label [[EXIT:%.*]]168; CHECK: else:169; CHECK-NEXT: br label [[EXIT]]170; CHECK: exit:171; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]172; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4173; CHECK-NEXT: ret i32 [[RES_2]]174;175entry:176 br i1 %cond, label %then, label %else177 178then:179 %l.1 = load i32, ptr %a, align 4180 %l.2 = load i32, ptr %c, align 4181 %cmp.i.i.i = icmp ult i32 %l.1, %l.2182 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b183 br label %exit184 185else:186 br label %exit187 188exit:189 %p = phi ptr [ %min.select, %then ], [ %a, %else ]190 %res.2 = load i32, ptr %p, align 4191 ret i32 %res.2192}193 194define i32 @test_pointer_phi_select_simp_store_noclobber(ptr %a, ptr %b, ptr noalias %c, i1 %cond) {195; CHECK-LABEL: @test_pointer_phi_select_simp_store_noclobber(196; CHECK-NEXT: entry:197; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]198; CHECK: then:199; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4200; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4201; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4202; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]203; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]204; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]205; CHECK-NEXT: br label [[EXIT:%.*]]206; CHECK: else:207; CHECK-NEXT: [[RES_2_PRE:%.*]] = load i32, ptr [[A]], align 4208; CHECK-NEXT: br label [[EXIT]]209; CHECK: exit:210; CHECK-NEXT: [[RES_2:%.*]] = phi i32 [ [[TMP0]], [[THEN]] ], [ [[RES_2_PRE]], [[ELSE]] ]211; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]212; CHECK-NEXT: ret i32 [[RES_2]]213;214entry:215 br i1 %cond, label %then, label %else216 217then:218 %l.1 = load i32, ptr %a, align 4219 %l.2 = load i32, ptr %b, align 4220 store i32 99, ptr %c221 %cmp.i.i.i = icmp ult i32 %l.1, %l.2222 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b223 br label %exit224 225else:226 br label %exit227 228exit:229 %p = phi ptr [ %min.select, %then ], [ %a, %else ]230 %res.2 = load i32, ptr %p, align 4231 ret i32 %res.2232}233 234define i32 @test_pointer_phi_select_simp_store_clobber_1(ptr %a, ptr %b, ptr %c, i1 %cond) {235; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_1(236; CHECK-NEXT: entry:237; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]238; CHECK: then:239; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4240; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4241; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4242; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]243; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]244; CHECK-NEXT: br label [[EXIT:%.*]]245; CHECK: else:246; CHECK-NEXT: br label [[EXIT]]247; CHECK: exit:248; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]249; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4250; CHECK-NEXT: ret i32 [[RES_2]]251;252entry:253 br i1 %cond, label %then, label %else254 255then:256 %l.1 = load i32, ptr %a, align 4257 %l.2 = load i32, ptr %b, align 4258 store i32 99, ptr %c259 %cmp.i.i.i = icmp ult i32 %l.1, %l.2260 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b261 br label %exit262 263else:264 br label %exit265 266exit:267 %p = phi ptr [ %min.select, %then ], [ %a, %else ]268 %res.2 = load i32, ptr %p, align 4269 ret i32 %res.2270}271 272define i32 @test_pointer_phi_select_simp_store_clobber_2(ptr %a, ptr %b, ptr %c, i1 %cond) {273; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_2(274; CHECK-NEXT: entry:275; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]276; CHECK: then:277; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4278; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4279; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4280; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]281; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]282; CHECK-NEXT: br label [[EXIT:%.*]]283; CHECK: else:284; CHECK-NEXT: br label [[EXIT]]285; CHECK: exit:286; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]287; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4288; CHECK-NEXT: ret i32 [[RES_2]]289;290entry:291 br i1 %cond, label %then, label %else292 293then:294 %l.1 = load i32, ptr %a, align 4295 store i32 99, ptr %c296 %l.2 = load i32, ptr %b, align 4297 %cmp.i.i.i = icmp ult i32 %l.1, %l.2298 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b299 br label %exit300 301else:302 br label %exit303 304exit:305 %p = phi ptr [ %min.select, %then ], [ %a, %else ]306 %res.2 = load i32, ptr %p, align 4307 ret i32 %res.2308}309 310define i32 @test_pointer_phi_select_simp_store_clobber_3(ptr %a, ptr %b, ptr %c, i1 %cond) {311; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_3(312; CHECK-NEXT: entry:313; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]314; CHECK: then:315; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4316; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4317; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4318; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]319; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]320; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]321; CHECK-NEXT: br label [[EXIT:%.*]]322; CHECK: else:323; CHECK-NEXT: [[RES_2_PRE:%.*]] = load i32, ptr [[A]], align 4324; CHECK-NEXT: br label [[EXIT]]325; CHECK: exit:326; CHECK-NEXT: [[RES_2:%.*]] = phi i32 [ [[TMP0]], [[THEN]] ], [ [[RES_2_PRE]], [[ELSE]] ]327; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]328; CHECK-NEXT: ret i32 [[RES_2]]329;330entry:331 br i1 %cond, label %then, label %else332 333then:334 store i32 99, ptr %c335 %l.1 = load i32, ptr %a, align 4336 %l.2 = load i32, ptr %b, align 4337 %cmp.i.i.i = icmp ult i32 %l.1, %l.2338 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b339 br label %exit340 341else:342 br label %exit343 344exit:345 %p = phi ptr [ %min.select, %then ], [ %a, %else ]346 %res.2 = load i32, ptr %p, align 4347 ret i32 %res.2348}349 350define i32 @test_pointer_phi_select_simp_store_clobber_4(ptr %a, ptr %b, ptr %c, i1 %cond) {351; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_4(352; CHECK-NEXT: entry:353; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]354; CHECK: then:355; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4356; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4357; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]358; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]359; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4360; CHECK-NEXT: br label [[EXIT:%.*]]361; CHECK: else:362; CHECK-NEXT: br label [[EXIT]]363; CHECK: exit:364; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]365; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4366; CHECK-NEXT: ret i32 [[RES_2]]367;368entry:369 br i1 %cond, label %then, label %else370 371then:372 %l.1 = load i32, ptr %a, align 4373 %l.2 = load i32, ptr %b, align 4374 %cmp.i.i.i = icmp ult i32 %l.1, %l.2375 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b376 store i32 99, ptr %c377 br label %exit378 379else:380 br label %exit381 382exit:383 %p = phi ptr [ %min.select, %then ], [ %a, %else ]384 %res.2 = load i32, ptr %p, align 4385 ret i32 %res.2386}387 388define i32 @test_pointer_phi_select_simp_store_clobber_5(ptr %a, ptr %b, ptr %c, i1 %cond) {389; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_5(390; CHECK-NEXT: entry:391; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]392; CHECK: then:393; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4394; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4395; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]396; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]397; CHECK-NEXT: br label [[EXIT:%.*]]398; CHECK: else:399; CHECK-NEXT: br label [[EXIT]]400; CHECK: exit:401; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]402; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4403; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4404; CHECK-NEXT: ret i32 [[RES_2]]405;406entry:407 br i1 %cond, label %then, label %else408 409then:410 %l.1 = load i32, ptr %a, align 4411 %l.2 = load i32, ptr %b, align 4412 %cmp.i.i.i = icmp ult i32 %l.1, %l.2413 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b414 br label %exit415 416else:417 br label %exit418 419exit:420 %p = phi ptr [ %min.select, %then ], [ %a, %else ]421 store i32 99, ptr %c422 %res.2 = load i32, ptr %p, align 4423 ret i32 %res.2424}425 426define i32 @test_pointer_phi_select_simp_store_clobber_6(ptr %a, ptr %b, ptr %c, i1 %cond) {427; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_6(428; CHECK-NEXT: entry:429; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]430; CHECK: then:431; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4432; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4433; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4434; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]435; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]436; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[MIN_SELECT]], align 4437; CHECK-NEXT: br label [[EXIT:%.*]]438; CHECK: else:439; CHECK-NEXT: [[RES_2_PRE:%.*]] = load i32, ptr [[A]], align 4440; CHECK-NEXT: br label [[EXIT]]441; CHECK: exit:442; CHECK-NEXT: [[RES_2:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ [[RES_2_PRE]], [[ELSE]] ]443; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]444; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]445; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]446; CHECK-NEXT: ret i32 [[RES_2]]447;448entry:449 br i1 %cond, label %then, label %else450 451then:452 %l.1 = load i32, ptr %a, align 4453 %l.2 = load i32, ptr %b, align 4454 store i32 99, ptr %c455 %cmp.i.i.i = icmp ult i32 %l.1, %l.2456 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b457 %res.0 = load i32, ptr %min.select, align 4458 br label %exit459 460else:461 br label %exit462 463exit:464 %p = phi ptr [ %min.select, %then ], [ %a, %else ]465 %v = phi i32 [ %res.0, %then ], [ 10, %else ]466 %res.2 = load i32, ptr %p, align 4467 %add = add i32 %res.2, %v468 ret i32 %res.2469}470 471define i32 @test_pointer_phi_select_simp_store_clobber_7(ptr %a, ptr %b, ptr %c, i1 %cond) {472; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_7(473; CHECK-NEXT: entry:474; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]475; CHECK: then:476; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4477; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4478; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4479; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]480; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]481; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[A]], align 4482; CHECK-NEXT: br label [[EXIT:%.*]]483; CHECK: else:484; CHECK-NEXT: br label [[EXIT]]485; CHECK: exit:486; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]487; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]488; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4489; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]490; CHECK-NEXT: ret i32 [[RES_2]]491;492entry:493 br i1 %cond, label %then, label %else494 495then:496 %l.1 = load i32, ptr %a, align 4497 %l.2 = load i32, ptr %b, align 4498 store i32 99, ptr %c499 %cmp.i.i.i = icmp ult i32 %l.1, %l.2500 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b501 %res.0 = load i32, ptr %a, align 4502 br label %exit503 504else:505 br label %exit506 507exit:508 %p = phi ptr [ %min.select, %then ], [ %a, %else ]509 %v = phi i32 [ %res.0, %then ], [ 10, %else ]510 %res.2 = load i32, ptr %p, align 4511 %add = add i32 %res.2, %v512 ret i32 %res.2513}514 515define i32 @test_pointer_phi_select_simp_store_clobber_8(ptr %a, ptr %b, ptr %c, i1 %cond) {516; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_8(517; CHECK-NEXT: entry:518; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]519; CHECK: then:520; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4521; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4522; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4523; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]524; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]525; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[B]], align 4526; CHECK-NEXT: br label [[EXIT:%.*]]527; CHECK: else:528; CHECK-NEXT: br label [[EXIT]]529; CHECK: exit:530; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]531; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]532; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4533; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]534; CHECK-NEXT: ret i32 [[RES_2]]535;536entry:537 br i1 %cond, label %then, label %else538 539then:540 %l.1 = load i32, ptr %a, align 4541 %l.2 = load i32, ptr %b, align 4542 store i32 99, ptr %c543 %cmp.i.i.i = icmp ult i32 %l.1, %l.2544 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b545 %res.0 = load i32, ptr %b, align 4546 br label %exit547 548else:549 br label %exit550 551exit:552 %p = phi ptr [ %min.select, %then ], [ %a, %else ]553 %v = phi i32 [ %res.0, %then ], [ 10, %else ]554 %res.2 = load i32, ptr %p, align 4555 %add = add i32 %res.2, %v556 ret i32 %res.2557}558 559define i32 @test_pointer_phi_select_simp_store_clobber_9(ptr %a, ptr %b, i1 %cond) {560; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_9(561; CHECK-NEXT: entry:562; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]563; CHECK: then:564; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4565; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4566; CHECK-NEXT: store i32 99, ptr [[A]], align 4567; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]568; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]569; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[B]], align 4570; CHECK-NEXT: br label [[EXIT:%.*]]571; CHECK: else:572; CHECK-NEXT: br label [[EXIT]]573; CHECK: exit:574; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]575; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]576; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4577; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]578; CHECK-NEXT: ret i32 [[RES_2]]579;580entry:581 br i1 %cond, label %then, label %else582 583then:584 %l.1 = load i32, ptr %a, align 4585 %l.2 = load i32, ptr %b, align 4586 store i32 99, ptr %a587 %cmp.i.i.i = icmp ult i32 %l.1, %l.2588 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b589 %res.0 = load i32, ptr %b, align 4590 br label %exit591 592else:593 br label %exit594 595exit:596 %p = phi ptr [ %min.select, %then ], [ %a, %else ]597 %v = phi i32 [ %res.0, %then ], [ 10, %else ]598 %res.2 = load i32, ptr %p, align 4599 %add = add i32 %res.2, %v600 ret i32 %res.2601}602 603define i32 @test_pointer_phi_select_simp_store_clobber_10(ptr %a, ptr %b, i1 %cond) {604; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_10(605; CHECK-NEXT: entry:606; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]607; CHECK: then:608; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4609; CHECK-NEXT: store i32 99, ptr [[A]], align 4610; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4611; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]612; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]613; CHECK-NEXT: br label [[EXIT:%.*]]614; CHECK: else:615; CHECK-NEXT: br label [[EXIT]]616; CHECK: exit:617; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]618; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[L_2]], [[THEN]] ], [ 10, [[ELSE]] ]619; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4620; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]621; CHECK-NEXT: ret i32 [[RES_2]]622;623entry:624 br i1 %cond, label %then, label %else625 626then:627 %l.1 = load i32, ptr %a, align 4628 store i32 99, ptr %a629 %l.2 = load i32, ptr %b, align 4630 %cmp.i.i.i = icmp ult i32 %l.1, %l.2631 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b632 %res.0 = load i32, ptr %b, align 4633 br label %exit634 635else:636 br label %exit637 638exit:639 %p = phi ptr [ %min.select, %then ], [ %a, %else ]640 %v = phi i32 [ %res.0, %then ], [ 10, %else ]641 %res.2 = load i32, ptr %p, align 4642 %add = add i32 %res.2, %v643 ret i32 %res.2644}645 646define i32 @test_pointer_phi_select_simp_store_clobber_11(ptr %a, ptr %b, i1 %cond) {647; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_11(648; CHECK-NEXT: entry:649; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]650; CHECK: then:651; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4652; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4653; CHECK-NEXT: store i32 99, ptr [[B]], align 4654; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]655; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]656; CHECK-NEXT: br label [[EXIT:%.*]]657; CHECK: else:658; CHECK-NEXT: br label [[EXIT]]659; CHECK: exit:660; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]661; CHECK-NEXT: [[V:%.*]] = phi i32 [ 99, [[THEN]] ], [ 10, [[ELSE]] ]662; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4663; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]664; CHECK-NEXT: ret i32 [[RES_2]]665;666entry:667 br i1 %cond, label %then, label %else668 669then:670 %l.1 = load i32, ptr %a, align 4671 %l.2 = load i32, ptr %b, align 4672 store i32 99, ptr %b673 %cmp.i.i.i = icmp ult i32 %l.1, %l.2674 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b675 %res.0 = load i32, ptr %b, align 4676 br label %exit677 678else:679 br label %exit680 681exit:682 %p = phi ptr [ %min.select, %then ], [ %a, %else ]683 %v = phi i32 [ %res.0, %then ], [ 10, %else ]684 %res.2 = load i32, ptr %p, align 4685 %add = add i32 %res.2, %v686 ret i32 %res.2687}688 689define i32 @test_pointer_phi_select_simp_store_clobber_12(ptr %a, ptr %b, i1 %cond) {690; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_12(691; CHECK-NEXT: entry:692; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]693; CHECK: then:694; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4695; CHECK-NEXT: store i32 99, ptr [[B:%.*]], align 4696; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], 99697; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]698; CHECK-NEXT: br label [[EXIT:%.*]]699; CHECK: else:700; CHECK-NEXT: br label [[EXIT]]701; CHECK: exit:702; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]703; CHECK-NEXT: [[V:%.*]] = phi i32 [ 99, [[THEN]] ], [ 10, [[ELSE]] ]704; CHECK-NEXT: [[RES_2:%.*]] = load i32, ptr [[P]], align 4705; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]706; CHECK-NEXT: ret i32 [[RES_2]]707;708entry:709 br i1 %cond, label %then, label %else710 711then:712 %l.1 = load i32, ptr %a, align 4713 store i32 99, ptr %b714 %l.2 = load i32, ptr %b, align 4715 %cmp.i.i.i = icmp ult i32 %l.1, %l.2716 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b717 %res.0 = load i32, ptr %b, align 4718 br label %exit719 720else:721 br label %exit722 723exit:724 %p = phi ptr [ %min.select, %then ], [ %a, %else ]725 %v = phi i32 [ %res.0, %then ], [ 10, %else ]726 %res.2 = load i32, ptr %p, align 4727 %add = add i32 %res.2, %v728 ret i32 %res.2729}730 731define i32 @test_pointer_phi_select_single_block_store(ptr %a, ptr %b) {732; CHECK-LABEL: @test_pointer_phi_select_single_block_store(733; CHECK-NEXT: entry:734; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4735; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4736; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]737; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]738; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]739; CHECK-NEXT: ret i32 [[TMP0]]740;741entry:742 %l.1 = load i32, ptr %a, align 4743 %l.2 = load i32, ptr %b, align 4744 %cmp.i.i.i = icmp ult i32 %l.1, %l.2745 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b746 %res.0 = load i32, ptr %min.select, align 4747 ret i32 %res.0748}749 750define i32 @test_pointer_phi_select_single_block_store_clobber_1(ptr %a, ptr %b, ptr %c) {751; CHECK-LABEL: @test_pointer_phi_select_single_block_store_clobber_1(752; CHECK-NEXT: entry:753; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4754; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4755; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4756; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]757; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]758; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[MIN_SELECT]], align 4759; CHECK-NEXT: ret i32 [[RES_0]]760;761entry:762 %l.1 = load i32, ptr %a, align 4763 %l.2 = load i32, ptr %b, align 4764 store i32 99, ptr %c765 %cmp.i.i.i = icmp ult i32 %l.1, %l.2766 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b767 %res.0 = load i32, ptr %min.select, align 4768 ret i32 %res.0769}770 771define i32 @test_pointer_phi_select_single_block_store_clobber_2(ptr %a, ptr %b, ptr %c) {772; CHECK-LABEL: @test_pointer_phi_select_single_block_store_clobber_2(773; CHECK-NEXT: entry:774; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4775; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4776; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]777; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]778; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4779; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[MIN_SELECT]], align 4780; CHECK-NEXT: ret i32 [[RES_0]]781;782entry:783 %l.1 = load i32, ptr %a, align 4784 %l.2 = load i32, ptr %b, align 4785 %cmp.i.i.i = icmp ult i32 %l.1, %l.2786 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b787 store i32 99, ptr %c788 %res.0 = load i32, ptr %min.select, align 4789 ret i32 %res.0790}791 792define i32 @test_pointer_phi_select_single_block_store_clobber_3(ptr %a, ptr %b, ptr %c) {793; CHECK-LABEL: @test_pointer_phi_select_single_block_store_clobber_3(794; CHECK-NEXT: entry:795; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4796; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4797; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4798; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]799; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]800; CHECK-NEXT: [[RES_0:%.*]] = load i32, ptr [[MIN_SELECT]], align 4801; CHECK-NEXT: ret i32 [[RES_0]]802;803entry:804 %l.1 = load i32, ptr %a, align 4805 store i32 99, ptr %c806 %l.2 = load i32, ptr %b, align 4807 %cmp.i.i.i = icmp ult i32 %l.1, %l.2808 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b809 %res.0 = load i32, ptr %min.select, align 4810 ret i32 %res.0811}812 813define i32 @test_pointer_phi_select_single_block_store_after(ptr %a, ptr %b, ptr %c) {814; CHECK-LABEL: @test_pointer_phi_select_single_block_store_after(815; CHECK-NEXT: entry:816; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[A:%.*]], align 4817; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[B:%.*]], align 4818; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]819; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP_I_I_I]], i32 [[L_1]], i32 [[L_2]]820; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], ptr [[A]], ptr [[B]]821; CHECK-NEXT: store i32 99, ptr [[C:%.*]], align 4822; CHECK-NEXT: ret i32 [[TMP0]]823;824entry:825 %l.1 = load i32, ptr %a, align 4826 %l.2 = load i32, ptr %b, align 4827 %cmp.i.i.i = icmp ult i32 %l.1, %l.2828 %min.select = select i1 %cmp.i.i.i, ptr %a, ptr %b829 %res.0 = load i32, ptr %min.select, align 4830 store i32 99, ptr %c831 ret i32 %res.0832}833 834define i32 @test_phi_select_index_non_local(ptr %A, i32 %N, i32 %i) {835; CHECK-LABEL: @test_phi_select_index_non_local(836; CHECK-NEXT: entry:837; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]]838; CHECK-NEXT: br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[IF_END:%.*]]839; CHECK: land.lhs.true:840; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64841; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[IDXPROM]]842; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4843; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[I]], 1844; CHECK-NEXT: [[IDXPROM1:%.*]] = sext i32 [[ADD]] to i64845; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM1]]846; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4847; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]848; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP3]], i32 [[ADD]], i32 [[I]]849; CHECK-NEXT: br label [[IF_END]]850; CHECK: if.end:851; CHECK-NEXT: [[I_ADDR_0:%.*]] = phi i32 [ [[I]], [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[LAND_LHS_TRUE]] ]852; CHECK-NEXT: [[IDXPROM5:%.*]] = sext i32 [[I_ADDR_0]] to i64853; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM5]]854; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4855; CHECK-NEXT: ret i32 [[TMP2]]856;857entry:858 %cmp = icmp slt i32 %i, %N859 br i1 %cmp, label %land.lhs.true, label %if.end860 861land.lhs.true:862 %idxprom = sext i32 %i to i64863 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %idxprom864 %0 = load i32, ptr %arrayidx, align 4865 %add = add nsw i32 %i, 1866 %idxprom1 = sext i32 %add to i64867 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %idxprom1868 %1 = load i32, ptr %arrayidx2, align 4869 %cmp3 = icmp slt i32 %0, %1870 %spec.select = select i1 %cmp3, i32 %add, i32 %i871 br label %if.end872 873if.end:874 %i.addr.0 = phi i32 [ %i, %entry ], [ %spec.select, %land.lhs.true ]875 %idxprom5 = sext i32 %i.addr.0 to i64876 %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %idxprom5877 %2 = load i32, ptr %arrayidx6, align 4878 ret i32 %2879}880 881define i32 @test_phi_select_index_loop(ptr %A, i32 %N) {882; CHECK-LABEL: @test_phi_select_index_loop(883; CHECK-NEXT: entry:884; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], 1885; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]886; CHECK: for.body.preheader:887; CHECK-NEXT: br label [[FOR_BODY:%.*]]888; CHECK: for.body:889; CHECK-NEXT: [[IDX:%.*]] = phi i32 [ [[IDX_NEXT:%.*]], [[FOR_BODY]] ], [ 1, [[FOR_BODY_PREHEADER]] ]890; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[SPEC_SELECT:%.*]], [[FOR_BODY]] ], [ 0, [[FOR_BODY_PREHEADER]] ]891; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64892; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[IDXPROM]]893; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4894; CHECK-NEXT: [[IDXPROM1:%.*]] = sext i32 [[RES]] to i64895; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[IDXPROM1]]896; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX1]], align 4897; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]898; CHECK-NEXT: [[SPEC_SELECT]] = select i1 [[CMP1]], i32 [[IDX]], i32 [[RES]]899; CHECK-NEXT: [[IDX_NEXT]] = add nsw i32 [[IDX]], 1900; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IDX_NEXT]], [[N]]901; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]]902; CHECK: for.cond.cleanup.loopexit:903; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]904; CHECK: for.cond.cleanup:905; CHECK-NEXT: [[RES_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[FOR_COND_CLEANUP_LOOPEXIT]] ]906; CHECK-NEXT: ret i32 [[RES_0_LCSSA]]907;908entry:909 %cmp = icmp sgt i32 %N, 1910 br i1 %cmp, label %for.body, label %for.cond.cleanup911 912for.body:913 %idx = phi i32 [ 1, %entry ], [ %idx.next, %for.body ]914 %res = phi i32 [ 0, %entry ], [ %spec.select, %for.body ]915 %idxprom = sext i32 %idx to i64916 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %idxprom917 %0 = load i32, ptr %arrayidx, align 4918 %idxprom1 = sext i32 %res to i64919 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %idxprom1920 %1 = load i32, ptr %arrayidx1, align 4921 %cmp1 = icmp slt i32 %0, %1922 %spec.select = select i1 %cmp1, i32 %idx, i32 %res923 %idx.next = add nsw i32 %idx, 1924 %exitcond.not = icmp eq i32 %idx.next, %N925 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body926 927 for.cond.cleanup:928 %res.0.lcssa = phi i32 [ 0, %entry ], [ %spec.select, %for.body ]929 ret i32 %res.0.lcssa930}931