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