brintos

brintos / llvm-project-archived public Read only

0
0
Text · 34.1 KiB · a0bd4a6 Raw
1000 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=dse -S | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i32, i1) nounwind6 7define void @test13(ptr noalias %P) {8; CHECK-LABEL: @test13(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    br label [[FOR:%.*]]11; CHECK:       for:12; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 413; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]14; CHECK:       end:15; CHECK-NEXT:    ret void16;17entry:18  br label %for19for:20  store i32 0, ptr %P21  br i1 false, label %for, label %end22end:23  ret void24}25 26 27define void @test14(ptr noalias %P) {28; CHECK-LABEL: @test14(29; CHECK-NEXT:  entry:30; CHECK-NEXT:    br label [[FOR:%.*]]31; CHECK:       for:32; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 433; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]34; CHECK:       end:35; CHECK-NEXT:    ret void36;37entry:38  store i32 1, ptr %P39  br label %for40for:41  store i32 0, ptr %P42  br i1 false, label %for, label %end43end:44  ret void45}46 47define void @test18(ptr noalias %P) {48; CHECK-LABEL: @test18(49; CHECK-NEXT:  entry:50; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 451; CHECK-NEXT:    br label [[FOR:%.*]]52; CHECK:       for:53; CHECK-NEXT:    store i8 1, ptr [[P]], align 154; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P]], align 455; CHECK-NEXT:    store i8 2, ptr [[P]], align 156; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]57; CHECK:       end:58; CHECK-NEXT:    ret void59;60entry:61  store i32 0, ptr %P62  br label %for63for:64  store i8 1, ptr %P65  %x = load i32, ptr %P66  store i8 2, ptr %P67  br i1 false, label %for, label %end68end:69  ret void70}71 72define void @test21(ptr noalias %P) {73; CHECK-LABEL: @test21(74; CHECK-NEXT:  entry:75; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 176; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 477; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false)78; CHECK-NEXT:    br label [[FOR:%.*]]79; CHECK:       for:80; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 181; CHECK-NEXT:    store i32 1, ptr [[ARRAYIDX1]], align 482; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]83; CHECK:       end:84; CHECK-NEXT:    ret void85;86entry:87  %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 188  call void @llvm.memset.p0.i64(ptr %arrayidx0, i8 0, i64 28, i32 4, i1 false)89  br label %for90for:91  %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 192  store i32 1, ptr %arrayidx1, align 493  br i1 false, label %for, label %end94end:95  ret void96}97 98define void @test_loop(i32 %N, ptr noalias nocapture readonly %A, ptr noalias nocapture readonly %x, ptr noalias nocapture %b) local_unnamed_addr {99; CHECK-LABEL: @test_loop(100; CHECK-NEXT:  entry:101; CHECK-NEXT:    [[CMP27:%.*]] = icmp sgt i32 [[N:%.*]], 0102; CHECK-NEXT:    br i1 [[CMP27]], label [[FOR_BODY4_LR_PH_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]103; CHECK:       for.body4.lr.ph.preheader:104; CHECK-NEXT:    br label [[FOR_BODY4_LR_PH:%.*]]105; CHECK:       for.cond.cleanup:106; CHECK-NEXT:    ret void107; CHECK:       for.body4.lr.ph:108; CHECK-NEXT:    [[I_028:%.*]] = phi i32 [ [[INC11:%.*]], [[FOR_COND_CLEANUP3:%.*]] ], [ 0, [[FOR_BODY4_LR_PH_PREHEADER]] ]109; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[I_028]]110; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[I_028]], [[N]]111; CHECK-NEXT:    br label [[FOR_BODY4:%.*]]112; CHECK:       for.body4:113; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ 0, [[FOR_BODY4_LR_PH]] ], [ [[ADD9:%.*]], [[FOR_BODY4]] ]114; CHECK-NEXT:    [[J_026:%.*]] = phi i32 [ 0, [[FOR_BODY4_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY4]] ]115; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[J_026]], [[MUL]]116; CHECK-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD]]117; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4118; CHECK-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i32 [[J_026]]119; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX6]], align 4120; CHECK-NEXT:    [[MUL7:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]121; CHECK-NEXT:    [[ADD9]] = add nsw i32 [[MUL7]], [[TMP0]]122; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[J_026]], 1123; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], [[N]]124; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP3]], label [[FOR_BODY4]]125; CHECK:       for.cond.cleanup3:126; CHECK-NEXT:    store i32 [[ADD9]], ptr [[ARRAYIDX]], align 4127; CHECK-NEXT:    [[INC11]] = add nuw nsw i32 [[I_028]], 1128; CHECK-NEXT:    [[EXITCOND29:%.*]] = icmp eq i32 [[INC11]], [[N]]129; CHECK-NEXT:    br i1 [[EXITCOND29]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY4_LR_PH]]130;131entry:132  %cmp27 = icmp sgt i32 %N, 0133  br i1 %cmp27, label %for.body4.lr.ph.preheader, label %for.cond.cleanup134 135for.body4.lr.ph.preheader:                        ; preds = %entry136  br label %for.body4.lr.ph137 138for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry139  ret void140 141for.body4.lr.ph:                                  ; preds = %for.body4.lr.ph.preheader, %for.cond.cleanup3142  %i.028 = phi i32 [ %inc11, %for.cond.cleanup3 ], [ 0, %for.body4.lr.ph.preheader ]143  %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.028144  store i32 0, ptr %arrayidx, align 4145  %mul = mul nsw i32 %i.028, %N146  br label %for.body4147 148for.body4:                                        ; preds = %for.body4, %for.body4.lr.ph149  %0 = phi i32 [ 0, %for.body4.lr.ph ], [ %add9, %for.body4 ]150  %j.026 = phi i32 [ 0, %for.body4.lr.ph ], [ %inc, %for.body4 ]151  %add = add nsw i32 %j.026, %mul152  %arrayidx5 = getelementptr inbounds i32, ptr %A, i32 %add153  %1 = load i32, ptr %arrayidx5, align 4154  %arrayidx6 = getelementptr inbounds i32, ptr %x, i32 %j.026155  %2 = load i32, ptr %arrayidx6, align 4156  %mul7 = mul nsw i32 %2, %1157  %add9 = add nsw i32 %mul7, %0158  %inc = add nuw nsw i32 %j.026, 1159  %exitcond = icmp eq i32 %inc, %N160  br i1 %exitcond, label %for.cond.cleanup3, label %for.body4161 162for.cond.cleanup3:                                ; preds = %for.body4163  store i32 %add9, ptr %arrayidx, align 4164  %inc11 = add nuw nsw i32 %i.028, 1165  %exitcond29 = icmp eq i32 %inc11, %N166  br i1 %exitcond29, label %for.cond.cleanup, label %for.body4.lr.ph167}168 169define i32 @test_if(i1 %c, ptr %p, i32 %i) {170; CHECK-LABEL: @test_if(171; CHECK-NEXT:  entry:172; CHECK-NEXT:    br label [[BB1:%.*]]173; CHECK:       bb1:174; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB3:%.*]] ]175; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1176; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i32 [[PH]]177; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2:%.*]], label [[BB3]]178; CHECK:       bb2:179; CHECK-NEXT:    br label [[BB3]]180; CHECK:       bb3:181; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4182; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10183; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]184; CHECK:       exit:185; CHECK-NEXT:    ret i32 0186;187entry:188  br label %bb1189bb1:190  %ph = phi i32 [ 0, %entry ], [ %inc, %bb3 ]191  %inc = add i32 %ph, 1192  %gep = getelementptr inbounds i32, ptr %p, i32 %ph193  store i32 %i, ptr %gep, align 4194  br i1 %c, label %bb2, label %bb3195bb2:196  br label %bb3197bb3:198  store i32 2, ptr %gep, align 4199  %c1 = icmp slt i32 %ph, 10200  br i1 %c1, label %bb1, label %exit201exit:202  ret i32 0203}204 205define i32 @test_if2(i1 %c, ptr %p, i32 %i) {206; CHECK-LABEL: @test_if2(207; CHECK-NEXT:  entry:208; CHECK-NEXT:    br label [[BB1:%.*]]209; CHECK:       bb1:210; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB2:%.*]] ], [ [[INC]], [[BB3:%.*]] ]211; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1212; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i32 [[PH]]213; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2]], label [[BB3]]214; CHECK:       bb2:215; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4216; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10217; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]218; CHECK:       bb3:219; CHECK-NEXT:    store i32 3, ptr [[GEP]], align 4220; CHECK-NEXT:    [[C2:%.*]] = icmp slt i32 [[PH]], 5221; CHECK-NEXT:    br i1 [[C2]], label [[BB1]], label [[EXIT]]222; CHECK:       exit:223; CHECK-NEXT:    ret i32 0224;225entry:226  br label %bb1227bb1:228  %ph = phi i32 [ 0, %entry ], [ %inc, %bb2 ], [ %inc, %bb3 ]229  %inc = add i32 %ph, 1230  %gep = getelementptr inbounds i32, ptr %p, i32 %ph231  store i32 %i, ptr %gep, align 4232  br i1 %c, label %bb2, label %bb3233bb2:234  store i32 2, ptr %gep, align 4235  %c1 = icmp slt i32 %ph, 10236  br i1 %c1, label %bb1, label %exit237bb3:238  store i32 3, ptr %gep, align 4239  %c2 = icmp slt i32 %ph, 5240  br i1 %c2, label %bb1, label %exit241exit:242  ret i32 0243}244 245define i32 @test_if3(i1 %c, ptr %p, i32 %i) {246; CHECK-LABEL: @test_if3(247; CHECK-NEXT:  entry:248; CHECK-NEXT:    br label [[BB1:%.*]]249; CHECK:       bb1:250; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB3:%.*]] ]251; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1252; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i32 [[PH]]253; CHECK-NEXT:    store i32 [[I:%.*]], ptr [[GEP]], align 4254; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2:%.*]], label [[BB3]]255; CHECK:       bb2:256; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4257; CHECK-NEXT:    br label [[BB3]]258; CHECK:       bb3:259; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10260; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]261; CHECK:       exit:262; CHECK-NEXT:    ret i32 0263;264entry:265  br label %bb1266bb1:267  %ph = phi i32 [ 0, %entry ], [ %inc, %bb3 ]268  %inc = add i32 %ph, 1269  %gep = getelementptr inbounds i32, ptr %p, i32 %ph270  store i32 %i, ptr %gep, align 4271  br i1 %c, label %bb2, label %bb3272bb2:273  store i32 2, ptr %gep, align 4274  br label %bb3275bb3:276  %c1 = icmp slt i32 %ph, 10277  br i1 %c1, label %bb1, label %exit278exit:279  ret i32 0280}281 282define i32 @test_if4(i1 %c, ptr %p, i32 %i) {283; CHECK-LABEL: @test_if4(284; CHECK-NEXT:  entry:285; CHECK-NEXT:    br label [[BB1:%.*]]286; CHECK:       bb1:287; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB1]] ], [ [[INC]], [[BB2:%.*]] ]288; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1289; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i32 [[PH]]290; CHECK-NEXT:    store i32 [[I:%.*]], ptr [[GEP]], align 4291; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2]], label [[BB1]]292; CHECK:       bb2:293; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4294; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10295; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]296; CHECK:       exit:297; CHECK-NEXT:    ret i32 0298;299entry:300  br label %bb1301bb1:302  %ph = phi i32 [ 0, %entry ], [ %inc, %bb1 ], [ %inc, %bb2 ]303  %inc = add i32 %ph, 1304  %gep = getelementptr inbounds i32, ptr %p, i32 %ph305  store i32 %i, ptr %gep, align 4306  br i1 %c, label %bb2, label %bb1307bb2:308  store i32 2, ptr %gep, align 4309  %c1 = icmp slt i32 %ph, 10310  br i1 %c1, label %bb1, label %exit311exit:312  ret i32 0313}314 315declare void @clobber()316define i32 @test_self(i1 %c, ptr %p, i32 %i) {317; CHECK-LABEL: @test_self(318; CHECK-NEXT:  entry:319; CHECK-NEXT:    br label [[BB1:%.*]]320; CHECK:       bb1:321; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB1]] ], [ [[INC]], [[BB2:%.*]] ]322; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1323; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i32 [[PH]]324; CHECK-NEXT:    store i32 1, ptr [[GEP]], align 4325; CHECK-NEXT:    call void @clobber()326; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4327; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2]], label [[BB1]]328; CHECK:       bb2:329; CHECK-NEXT:    store i32 3, ptr [[GEP]], align 4330; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10331; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]332; CHECK:       exit:333; CHECK-NEXT:    ret i32 0334;335entry:336  br label %bb1337bb1:338  %ph = phi i32 [ 0, %entry ], [ %inc, %bb1 ], [ %inc, %bb2 ]339  %inc = add i32 %ph, 1340  %gep = getelementptr inbounds i32, ptr %p, i32 %ph341  store i32 1, ptr %gep, align 4342  call void @clobber()343  store i32 2, ptr %gep, align 4344  br i1 %c, label %bb2, label %bb1345bb2:346  store i32 3, ptr %gep, align 4347  %c1 = icmp slt i32 %ph, 10348  br i1 %c1, label %bb1, label %exit349exit:350  ret i32 0351}352 353define i32 @test_selfalloca(i1 %c, i32 %i) {354; CHECK-LABEL: @test_selfalloca(355; CHECK-NEXT:  entry:356; CHECK-NEXT:    [[P:%.*]] = alloca i32, align 4357; CHECK-NEXT:    br label [[BB1:%.*]]358; CHECK:       bb1:359; CHECK-NEXT:    [[PH:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[BB1]] ], [ [[INC]], [[BB2:%.*]] ]360; CHECK-NEXT:    [[INC]] = add i32 [[PH]], 1361; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 [[PH]]362; CHECK-NEXT:    call void @clobber()363; CHECK-NEXT:    store i32 2, ptr [[GEP]], align 4364; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB2]], label [[BB1]]365; CHECK:       bb2:366; CHECK-NEXT:    store i32 3, ptr [[GEP]], align 4367; CHECK-NEXT:    [[C1:%.*]] = icmp slt i32 [[PH]], 10368; CHECK-NEXT:    br i1 [[C1]], label [[BB1]], label [[EXIT:%.*]]369; CHECK:       exit:370; CHECK-NEXT:    [[PG:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 [[I:%.*]]371; CHECK-NEXT:    [[L:%.*]] = load i32, ptr [[PG]], align 4372; CHECK-NEXT:    ret i32 [[L]]373;374entry:375  %p = alloca i32, align 4376  br label %bb1377bb1:378  %ph = phi i32 [ 0, %entry ], [ %inc, %bb1 ], [ %inc, %bb2 ]379  %inc = add i32 %ph, 1380  %gep = getelementptr inbounds i32, ptr %p, i32 %ph381  store i32 1, ptr %gep, align 4382  call void @clobber()383  store i32 2, ptr %gep, align 4384  br i1 %c, label %bb2, label %bb1385bb2:386  store i32 3, ptr %gep, align 4387  %c1 = icmp slt i32 %ph, 10388  br i1 %c1, label %bb1, label %exit389exit:390  %pg = getelementptr inbounds i32, ptr %p, i32 %i391  %l = load i32, ptr %pg392  ret i32 %l393}394 395declare i1 @cond() readnone nounwind396 397define void @loop_multiple_def_uses(ptr noalias %P) {398; CHECK-LABEL: @loop_multiple_def_uses(399; CHECK-NEXT:  entry:400; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]401; CHECK:       for.header:402; CHECK-NEXT:    [[C1:%.*]] = call i1 @cond()403; CHECK-NEXT:    br i1 [[C1]], label [[FOR_BODY:%.*]], label [[END:%.*]]404; CHECK:       for.body:405; CHECK-NEXT:    store i32 2, ptr [[P:%.*]], align 4406; CHECK-NEXT:    [[LV:%.*]] = load i32, ptr [[P]], align 4407; CHECK-NEXT:    br label [[FOR_HEADER]]408; CHECK:       end:409; CHECK-NEXT:    store i32 3, ptr [[P]], align 4410; CHECK-NEXT:    ret void411;412entry:413  br label %for.header414 415for.header:416  store i32 1, ptr %P, align 4417  %c1 = call i1 @cond()418  br i1 %c1, label %for.body, label %end419 420for.body:421  store i32 2, ptr %P, align 4422  %lv = load i32, ptr %P423  br label %for.header424 425end:426  store i32 3, ptr %P, align 4427  ret void428}429 430; We cannot eliminate the store in for.header, as it is only partially431; overwritten in for.body and read afterwards.432define void @loop_multiple_def_uses_partial_write(ptr noalias %p) {433; CHECK-LABEL: @loop_multiple_def_uses_partial_write(434; CHECK-NEXT:  entry:435; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]436; CHECK:       for.header:437; CHECK-NEXT:    store i32 1239297, ptr [[P:%.*]], align 4438; CHECK-NEXT:    [[C1:%.*]] = call i1 @cond()439; CHECK-NEXT:    br i1 [[C1]], label [[FOR_BODY:%.*]], label [[END:%.*]]440; CHECK:       for.body:441; CHECK-NEXT:    [[LV:%.*]] = load i32, ptr [[P]], align 4442; CHECK-NEXT:    br label [[FOR_HEADER]]443; CHECK:       end:444; CHECK-NEXT:    store i32 3, ptr [[P]], align 4445; CHECK-NEXT:    ret void446;447entry:448  br label %for.header449 450for.header:451  store i32 1239491, ptr %p, align 4452  %c1 = call i1 @cond()453  br i1 %c1, label %for.body, label %end454 455for.body:456  store i8 1, ptr %p, align 4457  %lv = load i32, ptr %p458  br label %for.header459 460end:461  store i32 3, ptr %p, align 4462  ret void463}464 465; We cannot eliminate the store in for.header, as the location is not overwritten466; in for.body and read afterwards.467define void @loop_multiple_def_uses_mayalias_write(ptr %p, ptr %q) {468; CHECK-LABEL: @loop_multiple_def_uses_mayalias_write(469; CHECK-NEXT:  entry:470; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]471; CHECK:       for.header:472; CHECK-NEXT:    store i32 1239491, ptr [[P:%.*]], align 4473; CHECK-NEXT:    [[C1:%.*]] = call i1 @cond()474; CHECK-NEXT:    br i1 [[C1]], label [[FOR_BODY:%.*]], label [[END:%.*]]475; CHECK:       for.body:476; CHECK-NEXT:    store i32 1, ptr [[Q:%.*]], align 4477; CHECK-NEXT:    [[LV:%.*]] = load i32, ptr [[P]], align 4478; CHECK-NEXT:    br label [[FOR_HEADER]]479; CHECK:       end:480; CHECK-NEXT:    store i32 3, ptr [[P]], align 4481; CHECK-NEXT:    ret void482;483entry:484  br label %for.header485 486for.header:487  store i32 1239491, ptr %p, align 4488  %c1 = call i1 @cond()489  br i1 %c1, label %for.body, label %end490 491for.body:492  store i32 1, ptr %q, align 4493  %lv = load i32, ptr %p494  br label %for.header495 496end:497  store i32 3, ptr %p, align 4498  ret void499}500 501%struct.hoge = type { i32, i32 }502 503@global = external local_unnamed_addr global ptr, align 8504 505define void @widget(ptr %tmp) {506; CHECK-LABEL: @widget(507; CHECK-NEXT:  bb:508; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP:%.*]], ptr nonnull align 16 undef, i64 64, i1 false)509; CHECK-NEXT:    br label [[BB1:%.*]]510; CHECK:       bb1:511; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr @global, align 8512; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_HOGE:%.*]], ptr [[TMP2]], i64 undef, i32 1513; CHECK-NEXT:    store i32 0, ptr [[TMP3]], align 4514; CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr @global, align 8515; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_HOGE]], ptr [[TMP4]], i64 undef, i32 1516; CHECK-NEXT:    store i32 10, ptr [[TMP5]], align 4517; CHECK-NEXT:    br label [[BB1]]518;519bb:520  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %tmp, ptr nonnull align 16 undef, i64 64, i1 false)521  br label %bb1522 523bb1:                                              ; preds = %bb1, %bb524  %tmp2 = load ptr, ptr @global, align 8525  %tmp3 = getelementptr inbounds %struct.hoge, ptr %tmp2, i64 undef, i32 1526  store i32 0, ptr %tmp3, align 4527  %tmp4 = load ptr, ptr @global, align 8528  %tmp5 = getelementptr inbounds %struct.hoge, ptr %tmp4, i64 undef, i32 1529  store i32 10, ptr %tmp5, align 4530  br label %bb1531}532 533declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)534 535@x = global [10 x i16] zeroinitializer, align 1536 537; Make sure we do not eliminate the store in %do.body, because it writes to538; multiple locations in the loop and the store in %if.end10 only stores to539; the last one.540define i16 @test_loop_carried_dep() {541; CHECK-LABEL: @test_loop_carried_dep(542; CHECK-NEXT:  entry:543; CHECK-NEXT:    br label [[DO_BODY:%.*]]544; CHECK:       do.body:545; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]546; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]547; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX2]], align 1548; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4549; CHECK-NEXT:    br i1 [[EXITCOND]], label [[IF_END10:%.*]], label [[IF_END]]550; CHECK:       if.end:551; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1552; CHECK-NEXT:    br label [[DO_BODY]]553; CHECK:       if.end10:554; CHECK-NEXT:    store i16 1, ptr [[ARRAYIDX2]], align 1555; CHECK-NEXT:    ret i16 0556;557entry:558  br label %do.body559 560do.body:                                          ; preds = %if.end, %entry561  %i.0 = phi i16 [ 0, %entry ], [ %inc, %if.end ]562  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0563  store i16 2, ptr %arrayidx2, align 1564  %exitcond = icmp eq i16 %i.0, 4565  br i1 %exitcond, label %if.end10, label %if.end566 567if.end:                                           ; preds = %do.body568  %inc = add nuw nsw i16 %i.0, 1569  br label %do.body570 571if.end10:                                         ; preds = %do.body572  store i16 1, ptr %arrayidx2, align 1573  ret i16 0574}575 576; Similar to above, but with an irreducible loop. The stores should not be removed.577define i16 @irreducible(i1 %c) {578; CHECK-LABEL: @irreducible(579; CHECK-NEXT:  entry:580; CHECK-NEXT:    br i1 [[C:%.*]], label [[A:%.*]], label [[B:%.*]]581; CHECK:       A:582; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[B]] ]583; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]584; CHECK-NEXT:    br label [[B]]585; CHECK:       B:586; CHECK-NEXT:    [[J_0:%.*]] = phi i16 [ 0, [[ENTRY]] ], [ [[I_0]], [[A]] ]587; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[J_0]]588; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX]], align 1589; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[J_0]], 1590; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[J_0]], 4591; CHECK-NEXT:    br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[A]]592; CHECK:       exit:593; CHECK-NEXT:    store i16 1, ptr [[ARRAYIDX]], align 1594; CHECK-NEXT:    ret i16 0595;596entry:597  br i1 %c, label %A, label %B598 599A:600  %i.0 = phi i16 [ 0, %entry ], [ %inc, %B ]601  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0602  br label %B603 604B:605  %j.0 = phi i16 [ 0, %entry ], [ %i.0, %A ]606  %arrayidx = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %j.0607  store i16 2, ptr %arrayidx, align 1608  %inc = add nuw nsw i16 %j.0, 1609  %exitcond = icmp eq i16 %j.0, 4610  br i1 %exitcond, label %exit, label %A611 612exit:613  store i16 1, ptr %arrayidx, align 1614  ret i16 0615}616 617define i16 @irreducible_entryblock_def(i1 %c) {618; CHECK-LABEL: @irreducible_entryblock_def(619; CHECK-NEXT:  entry:620; CHECK-NEXT:    br i1 [[C:%.*]], label [[A:%.*]], label [[B:%.*]]621; CHECK:       A:622; CHECK-NEXT:    br label [[B]]623; CHECK:       B:624; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[A]]625; CHECK:       exit:626; CHECK-NEXT:    ret i16 0627;628entry:629  %obj = alloca i32, align 4630  br i1 %c, label %A, label %B631 632A:633  store i32 1, ptr %obj, align 4634  br label %B635 636B:637  br i1 %c, label %exit, label %A638 639exit:640  ret i16 0641}642 643; An irreducible loop inside another loop.644define i16 @irreducible_nested() {645; CHECK-LABEL: @irreducible_nested(646; CHECK-NEXT:  entry:647; CHECK-NEXT:    br label [[OUTER:%.*]]648; CHECK:       outer:649; CHECK-NEXT:    [[X:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INCX:%.*]], [[OUTERL:%.*]] ]650; CHECK-NEXT:    [[C:%.*]] = icmp sgt i16 [[X]], 2651; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]652; CHECK:       A:653; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[OUTER]] ], [ [[INC:%.*]], [[B]] ]654; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]655; CHECK-NEXT:    br label [[B]]656; CHECK:       B:657; CHECK-NEXT:    [[J_0:%.*]] = phi i16 [ 0, [[OUTER]] ], [ [[I_0]], [[A]] ]658; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[J_0]]659; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX]], align 1660; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[J_0]], 1661; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[J_0]], 4662; CHECK-NEXT:    br i1 [[EXITCOND]], label [[OUTERL]], label [[A]]663; CHECK:       outerl:664; CHECK-NEXT:    store i16 1, ptr [[ARRAYIDX]], align 1665; CHECK-NEXT:    [[INCX]] = add nuw nsw i16 [[X]], 1666; CHECK-NEXT:    [[EXITCONDX:%.*]] = icmp eq i16 [[X]], 4667; CHECK-NEXT:    br i1 [[EXITCONDX]], label [[END:%.*]], label [[OUTER]]668; CHECK:       end:669; CHECK-NEXT:    ret i16 0670;671entry:672  br label %outer673 674outer:675  %x = phi i16 [ 0, %entry ], [ %incx, %outerl ]676  %c = icmp sgt i16 %x, 2677  br i1 %c, label %A, label %B678 679A:680  %i.0 = phi i16 [ 0, %outer ], [ %inc, %B ]681  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0682  br label %B683 684B:685  %j.0 = phi i16 [ 0, %outer ], [ %i.0, %A ]686  %arrayidx = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %j.0687  store i16 2, ptr %arrayidx, align 1688  %inc = add nuw nsw i16 %j.0, 1689  %exitcond = icmp eq i16 %j.0, 4690  br i1 %exitcond, label %outerl, label %A691 692outerl:693  store i16 1, ptr %arrayidx, align 1694  %incx = add nuw nsw i16 %x, 1695  %exitcondx = icmp eq i16 %x, 4696  br i1 %exitcondx, label %end, label %outer697 698end:699  ret i16 0700}701 702define i16 @multi_overwrite(i1 %cond) {703; CHECK-LABEL: @multi_overwrite(704; CHECK-NEXT:  entry:705; CHECK-NEXT:    br label [[DO_BODY:%.*]]706; CHECK:       do.body:707; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END2:%.*]] ]708; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]709; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX2]], align 1710; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4711; CHECK-NEXT:    br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[IF_END:%.*]]712; CHECK:       if.end:713; CHECK-NEXT:    br i1 [[COND:%.*]], label [[DO_STORE:%.*]], label [[IF_END2]]714; CHECK:       do.store:715; CHECK-NEXT:    store i16 3, ptr [[ARRAYIDX2]], align 1716; CHECK-NEXT:    br label [[IF_END2]]717; CHECK:       if.end2:718; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1719; CHECK-NEXT:    br label [[DO_BODY]]720; CHECK:       exit:721; CHECK-NEXT:    store i16 1, ptr [[ARRAYIDX2]], align 1722; CHECK-NEXT:    ret i16 0723;724entry:725  br label %do.body726 727do.body:728  %i.0 = phi i16 [ 0, %entry ], [ %inc, %if.end2 ]729  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0730  store i16 2, ptr %arrayidx2, align 1731  %exitcond = icmp eq i16 %i.0, 4732  br i1 %exitcond, label %exit, label %if.end733 734if.end:735  br i1 %cond, label %do.store, label %if.end2736 737do.store:738  store i16 3, ptr %arrayidx2, align 1739  br label %if.end2740 741if.end2:742  %inc = add nuw nsw i16 %i.0, 1743  br label %do.body744 745exit:746  store i16 1, ptr %arrayidx2, align 1747  ret i16 0748}749 750define void @test(ptr noalias %data1, ptr %data2, ptr %data3, i32 %i1)751; CHECK-LABEL: @test(752; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[I1:%.*]], 0753; CHECK-NEXT:    br label [[PH0:%.*]]754; CHECK:       ph0:755; CHECK-NEXT:    br label [[HEADER0:%.*]]756; CHECK:       header0:757; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 0, [[PH0]] ], [ [[PN1:%.*]], [[END1:%.*]] ]758; CHECK-NEXT:    [[PN1]] = add i32 [[P1]], 1759; CHECK-NEXT:    [[PC1:%.*]] = icmp slt i32 [[PN1]], 5760; CHECK-NEXT:    [[V2:%.*]] = getelementptr [10 x i16], ptr @x, i32 0, i32 [[P1]]761; CHECK-NEXT:    store i16 1, ptr [[V2]], align 2762; CHECK-NEXT:    br i1 [[C]], label [[THEN1:%.*]], label [[ELSE1:%.*]]763; CHECK:       then1:764; CHECK-NEXT:    store i16 2, ptr [[V2]], align 2765; CHECK-NEXT:    br label [[END1]]766; CHECK:       else1:767; CHECK-NEXT:    br label [[END1]]768; CHECK:       end1:769; CHECK-NEXT:    br i1 [[PC1]], label [[HEADER0]], label [[END0:%.*]]770; CHECK:       end0:771; CHECK-NEXT:    br label [[HEADER2:%.*]]772; CHECK:       header2:773; CHECK-NEXT:    [[P3:%.*]] = phi i32 [ 0, [[END0]] ], [ [[PN3:%.*]], [[HEADER2]] ]774; CHECK-NEXT:    [[PN3]] = add i32 [[P3]], 1775; CHECK-NEXT:    [[PC3:%.*]] = icmp slt i32 [[PN3]], 5776; CHECK-NEXT:    store i16 4, ptr [[V2]], align 2777; CHECK-NEXT:    br i1 [[PC3]], label [[HEADER2]], label [[END2:%.*]]778; CHECK:       end2:779; CHECK-NEXT:    ret void780;781{782  %c = icmp eq i32 %i1, 0783  br label %ph0784ph0:785  br label %header0786header0:787  %p1 = phi i32 [0, %ph0], [%pn1, %end1]788  %pn1 = add i32 %p1, 1789  %pc1 = icmp slt i32 %pn1, 5790  %v2 = getelementptr [10 x i16], ptr @x, i32 0, i32 %p1791  store i16 1, ptr %v2792  br i1 %c, label %then1, label %else1793then1:794  store i16 2, ptr %v2795  br label %end1796else1:797  br label %end1798end1:799  br i1 %pc1, label %header0, label %end0800end0:801  br label %header2802header2:803  %p3 = phi i32 [0, %end0], [%pn3, %header2]804  %pn3 = add i32 %p3, 1805  %pc3 = icmp slt i32 %pn3, 5806  store i16 4, ptr %v2807  br i1 %pc3, label %header2, label %end2808end2:809  ret void810}811 812; Similar to above, but with multiple partial overlaps813define i16 @partial_override_fromloop(i1 %c, i32 %i) {814; CHECK-LABEL: @partial_override_fromloop(815; CHECK-NEXT:  entry:816; CHECK-NEXT:    br label [[DO_BODY:%.*]]817; CHECK:       do.body:818; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END2:%.*]] ]819; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]820; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX2]], align 1821; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4822; CHECK-NEXT:    br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[IF_END:%.*]]823; CHECK:       if.end:824; CHECK-NEXT:    br i1 [[C:%.*]], label [[DO_STORE:%.*]], label [[IF_END2]]825; CHECK:       do.store:826; CHECK-NEXT:    store i16 3, ptr [[ARRAYIDX2]], align 1827; CHECK-NEXT:    br label [[IF_END2]]828; CHECK:       if.end2:829; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1830; CHECK-NEXT:    br label [[DO_BODY]]831; CHECK:       exit:832; CHECK-NEXT:    [[BC2:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX2]], i32 1833; CHECK-NEXT:    store i8 10, ptr [[ARRAYIDX2]], align 1834; CHECK-NEXT:    store i8 11, ptr [[BC2]], align 1835; CHECK-NEXT:    ret i16 0836;837entry:838  br label %do.body839 840do.body:841  %i.0 = phi i16 [ 0, %entry ], [ %inc, %if.end2 ]842  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0843  store i16 2, ptr %arrayidx2, align 1844  %exitcond = icmp eq i16 %i.0, 4845  br i1 %exitcond, label %exit, label %if.end846 847if.end:848  br i1 %c, label %do.store, label %if.end2849 850do.store:851  store i16 3, ptr %arrayidx2, align 1852  br label %if.end2853 854if.end2:855  %inc = add nuw nsw i16 %i.0, 1856  br label %do.body857 858exit:859  %bc2 = getelementptr inbounds i8, ptr %arrayidx2, i32 1860  store i8 10, ptr %arrayidx2, align 1861  store i8 11, ptr %bc2, align 1862  ret i16 0863}864 865 866define i16 @partial_override_overloop(i1 %c, i32 %i) {867; CHECK-LABEL: @partial_override_overloop(868; CHECK-NEXT:  entry:869; CHECK-NEXT:    br label [[FIRST:%.*]]870; CHECK:       first:871; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i32 [[I:%.*]]872; CHECK-NEXT:    br label [[DO_BODY:%.*]]873; CHECK:       do.body:874; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[FIRST]] ], [ [[INC:%.*]], [[DO_BODY]] ]875; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]876; CHECK-NEXT:    store i16 2, ptr [[ARRAYIDX2]], align 1877; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4878; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1879; CHECK-NEXT:    br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[DO_BODY]]880; CHECK:       exit:881; CHECK-NEXT:    [[BC2:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX]], i32 1882; CHECK-NEXT:    store i8 10, ptr [[ARRAYIDX]], align 1883; CHECK-NEXT:    store i8 11, ptr [[BC2]], align 1884; CHECK-NEXT:    ret i16 0885;886entry:887  ; Branch to first so MemoryLoc is not in the entry block.888  br label %first889 890first:891  %arrayidx = getelementptr inbounds [10 x i16], ptr @x, i16 0, i32 %i892  store i16 1, ptr %arrayidx, align 1893  br label %do.body894 895do.body:896  %i.0 = phi i16 [ 0, %first ], [ %inc, %do.body ]897  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0898  store i16 2, ptr %arrayidx2, align 1899  %exitcond = icmp eq i16 %i.0, 4900  %inc = add nuw nsw i16 %i.0, 1901  br i1 %exitcond, label %exit, label %do.body902 903exit:904  %bc2 = getelementptr inbounds i8, ptr %arrayidx, i32 1905  store i8 10, ptr %arrayidx, align 1906  store i8 11, ptr %bc2, align 1907  ret i16 0908}909 910define i16 @partial_override_multi(i1 %c, i32 %i) {911; CHECK-LABEL: @partial_override_multi(912; CHECK-NEXT:  entry:913; CHECK-NEXT:    br label [[DO_BODY:%.*]]914; CHECK:       do.body:915; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[DO_BODY]] ]916; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 [[I_0]]917; CHECK-NEXT:    store i16 10, ptr [[ARRAYIDX2]], align 1918; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4919; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1920; CHECK-NEXT:    br i1 [[EXITCOND]], label [[EXIT:%.*]], label [[DO_BODY]]921; CHECK:       exit:922; CHECK-NEXT:    [[BC2:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX2]], i32 1923; CHECK-NEXT:    store i8 11, ptr [[BC2]], align 1924; CHECK-NEXT:    ret i16 0925;926entry:927  br label %do.body928 929do.body:930  %i.0 = phi i16 [ 0, %entry ], [ %inc, %do.body ]931  %arrayidx2 = getelementptr inbounds [10 x i16], ptr @x, i16 0, i16 %i.0932  store i16 2, ptr %arrayidx2, align 1933  store i8 10, ptr %arrayidx2, align 1934  %exitcond = icmp eq i16 %i.0, 4935  %inc = add nuw nsw i16 %i.0, 1936  br i1 %exitcond, label %exit, label %do.body937 938exit:939  %bc2 = getelementptr inbounds i8, ptr %arrayidx2, i32 1940  store i8 11, ptr %bc2, align 1941  ret i16 0942}943 944define void @InitializeMasks(ptr %p) {945; CHECK-LABEL: @InitializeMasks(946; CHECK-NEXT:  entry:947; CHECK-NEXT:    br label [[FOR_BODY98:%.*]]948; CHECK:       for.body98:949; CHECK-NEXT:    [[INDVARS_IV377:%.*]] = phi i64 [ 8, [[ENTRY:%.*]] ], [ [[INC2:%.*]], [[FOR_INC140:%.*]] ], [ [[INC1:%.*]], [[FOR_INC140_THREAD:%.*]] ]950; CHECK-NEXT:    [[ARRAYIDX106:%.*]] = getelementptr inbounds i64, ptr [[P:%.*]], i64 [[INDVARS_IV377]]951; CHECK-NEXT:    store i64 1, ptr [[ARRAYIDX106]], align 8952; CHECK-NEXT:    [[CMP107:%.*]] = icmp ugt i64 [[INDVARS_IV377]], 15953; CHECK-NEXT:    br i1 [[CMP107]], label [[IF_END:%.*]], label [[IF_END_THREAD:%.*]]954; CHECK:       if.end.thread:955; CHECK-NEXT:    br label [[FOR_INC140_THREAD]]956; CHECK:       if.end:957; CHECK-NEXT:    store i64 2, ptr [[ARRAYIDX106]], align 8958; CHECK-NEXT:    [[CMP127:%.*]] = icmp ult i64 [[INDVARS_IV377]], 48959; CHECK-NEXT:    br i1 [[CMP127]], label [[FOR_INC140_THREAD]], label [[FOR_INC140]]960; CHECK:       for.inc140.thread:961; CHECK-NEXT:    [[INC1]] = add i64 [[INDVARS_IV377]], 1962; CHECK-NEXT:    br label [[FOR_BODY98]]963; CHECK:       for.inc140:964; CHECK-NEXT:    [[INC2]] = add i64 [[INDVARS_IV377]], 1965; CHECK-NEXT:    [[EXITCOND384_NOT:%.*]] = icmp eq i64 [[INDVARS_IV377]], 56966; CHECK-NEXT:    br i1 [[EXITCOND384_NOT]], label [[FOR_INC177:%.*]], label [[FOR_BODY98]]967; CHECK:       for.inc177:968; CHECK-NEXT:    ret void969;970entry:971  br label %for.body98972 973for.body98:                                       ; preds = %for.inc140, %for.inc140.thread, %entry974  %indvars.iv377 = phi i64 [ 8, %entry ], [ %inc2, %for.inc140 ], [ %inc1, %for.inc140.thread ]975  %arrayidx106 = getelementptr inbounds i64, ptr %p, i64 %indvars.iv377976  store i64 1, ptr %arrayidx106, align 8977  %cmp107 = icmp ugt i64 %indvars.iv377, 15978  br i1 %cmp107, label %if.end, label %if.end.thread979 980if.end.thread:                                    ; preds = %for.body98981  br label %for.inc140.thread982 983if.end:                                           ; preds = %for.body98984  store i64 2, ptr %arrayidx106, align 8985  %cmp127 = icmp ult i64 %indvars.iv377, 48986  br i1 %cmp127, label %for.inc140.thread, label %for.inc140987 988for.inc140.thread:                                ; preds = %if.end, %if.end.thread989  %inc1 = add i64 %indvars.iv377, 1990  br label %for.body98991 992for.inc140:                                       ; preds = %if.end993  %inc2 = add i64 %indvars.iv377, 1994  %exitcond384.not = icmp eq i64 %indvars.iv377, 56995  br i1 %exitcond384.not, label %for.inc177, label %for.body98996 997for.inc177:                                       ; preds = %for.inc140998  ret void999}1000