brintos

brintos / llvm-project-archived public Read only

0
0
Text · 34.5 KiB · 4de69cc Raw
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