137e34b74SCongzhe Cao; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*b941857bSCongzhe Cao; RUN: opt < %s --basic-aa -loop-interchange -cache-line-size=64 -verify-dom-info -verify-loop-info -verify-scev -verify-loop-lcssa -S | FileCheck %s 337e34b74SCongzhe Cao 437e34b74SCongzhe Cao@b = constant [200 x [100 x i32]] zeroinitializer, align 4 537e34b74SCongzhe Cao@a = constant i32 0, align 4 637e34b74SCongzhe Cao 737e34b74SCongzhe Cao; // Loop wth two outer indvars. 837e34b74SCongzhe Cao; int a, c, d, e; 937e34b74SCongzhe Cao; int b[200][100]; 1037e34b74SCongzhe Cao; void test1() { 1137e34b74SCongzhe Cao; for (c = 0, e = 1; c < 100 && e < 150; c++, e++) { 1237e34b74SCongzhe Cao; d = 5; 1337e34b74SCongzhe Cao; for (; d; d--) 1437e34b74SCongzhe Cao; a |= b[d][c + 9]; 1537e34b74SCongzhe Cao; } 1637e34b74SCongzhe Cao; } 1737e34b74SCongzhe Caodefine void @test1() { 1837e34b74SCongzhe Cao; CHECK-LABEL: @test1( 1937e34b74SCongzhe Cao; CHECK-NEXT: entry: 2037e34b74SCongzhe Cao; CHECK-NEXT: [[A:%.*]] = load i32, i32* @a, align 4 2137e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_PREHEADER:%.*]] 2237e34b74SCongzhe Cao; CHECK: for.cond2.preheader.preheader: 2337e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER:%.*]] 2437e34b74SCongzhe Cao; CHECK: for.cond2.preheader: 2537e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0:%.*]] = phi i64 [ [[INDVAR0_NEXT:%.*]], [[FOR_INC7:%.*]] ], [ 0, [[FOR_COND2_PREHEADER_PREHEADER:%.*]] ] 2637e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1:%.*]] = phi i32 [ [[INDVAR1_NEXT:%.*]], [[FOR_INC7]] ], [ 1, [[FOR_COND2_PREHEADER_PREHEADER]] ] 2737e34b74SCongzhe Cao; CHECK-NEXT: [[OR13:%.*]] = phi i32 [ [[OR:%.*]], [[FOR_INC7]] ], [ [[OR_REDUCTION:%.*]], [[FOR_COND2_PREHEADER_PREHEADER]] ] 2837e34b74SCongzhe Cao; CHECK-NEXT: [[INDEX:%.*]] = add nsw i64 [[INDVAR0]], 9 2937e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_SPLIT1:%.*]] 3037e34b74SCongzhe Cao; CHECK: for.body4.preheader: 3137e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4:%.*]] 3237e34b74SCongzhe Cao; CHECK: for.body4: 3337e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[TMP0:%.*]], [[FOR_BODY4_SPLIT:%.*]] ], [ 5, [[FOR_BODY4_PREHEADER]] ] 3437e34b74SCongzhe Cao; CHECK-NEXT: [[OR_REDUCTION]] = phi i32 [ [[OR_LCSSA:%.*]], [[FOR_BODY4_SPLIT]] ], [ [[A]], [[FOR_BODY4_PREHEADER]] ] 3537e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER_PREHEADER]] 3637e34b74SCongzhe Cao; CHECK: for.body4.split1: 3737e34b74SCongzhe Cao; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 [[INDVARS_IV]], i64 [[INDEX]] 3837e34b74SCongzhe Cao; CHECK-NEXT: [[LOAD_VAL:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4 3937e34b74SCongzhe Cao; CHECK-NEXT: [[OR]] = or i32 [[OR13]], [[LOAD_VAL]] 4037e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV]], -1 4137e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], 0 4237e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_INC7]] 4337e34b74SCongzhe Cao; CHECK: for.body4.split: 4437e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA]] = phi i32 [ [[OR]], [[FOR_INC7]] ] 4537e34b74SCongzhe Cao; CHECK-NEXT: [[TMP0]] = add nsw i64 [[INDVARS_IV]], -1 4637e34b74SCongzhe Cao; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 0 4737e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_COND_FOR_END9_CRIT_EDGE:%.*]], label [[FOR_BODY4]] 4837e34b74SCongzhe Cao; CHECK: for.inc7: 4937e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0_NEXT]] = add nsw i64 [[INDVAR0]], 1 5037e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1_NEXT]] = add nsw i32 [[INDVAR1]], 1 5137e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0_NEXT_TRUNC:%.*]] = trunc i64 [[INDVAR0_NEXT]] to i32 5237e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[INDVAR0_NEXT_TRUNC]], 100 5337e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp ne i32 [[INDVAR1_NEXT]], 150 5437e34b74SCongzhe Cao; CHECK-NEXT: [[OUTER_COND:%.*]] = and i1 [[TOBOOL]], [[TOBOOL1]] 5537e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[OUTER_COND]], label [[FOR_COND2_PREHEADER]], label [[FOR_BODY4_SPLIT]] 5637e34b74SCongzhe Cao; CHECK: for.cond.for.end9_crit_edge: 5737e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA_LCSSA:%.*]] = phi i32 [ [[OR_LCSSA]], [[FOR_BODY4_SPLIT]] ] 5837e34b74SCongzhe Cao; CHECK-NEXT: store i32 [[OR_LCSSA_LCSSA]], i32* @a, align 4 5937e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_END9:%.*]] 6037e34b74SCongzhe Cao; CHECK: for.end9: 6137e34b74SCongzhe Cao; CHECK-NEXT: ret void 6237e34b74SCongzhe Cao; 6337e34b74SCongzhe Cao 6437e34b74SCongzhe Cao 6537e34b74SCongzhe Caoentry: 6637e34b74SCongzhe Cao %a = load i32, i32* @a, align 4 6737e34b74SCongzhe Cao br label %for.cond2.preheader 6837e34b74SCongzhe Cao 6937e34b74SCongzhe Caofor.cond2.preheader: ; preds = %entry, %for.inc7 7037e34b74SCongzhe Cao %indvar0 = phi i64 [ 0, %entry ], [ %indvar0.next, %for.inc7 ] 7137e34b74SCongzhe Cao %or.reduction = phi i32 [ %a, %entry ], [ %or.lcssa, %for.inc7 ] 7237e34b74SCongzhe Cao %indvar1 = phi i32 [ 1, %entry ], [ %indvar1.next, %for.inc7 ] 7337e34b74SCongzhe Cao %index = add nsw i64 %indvar0, 9 7437e34b74SCongzhe Cao br label %for.body4 7537e34b74SCongzhe Cao 7637e34b74SCongzhe Caofor.body4: ; preds = %for.cond2.preheader, %for.body4 7737e34b74SCongzhe Cao %indvars.iv = phi i64 [ 5, %for.cond2.preheader ], [ %indvars.iv.next, %for.body4 ] 7837e34b74SCongzhe Cao %or13 = phi i32 [ %or.reduction, %for.cond2.preheader ], [ %or, %for.body4 ] 7937e34b74SCongzhe Cao %arrayidx6 = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 %indvars.iv, i64 %index 8037e34b74SCongzhe Cao %load.val = load i32, i32* %arrayidx6, align 4 8137e34b74SCongzhe Cao %or = or i32 %or13, %load.val 8237e34b74SCongzhe Cao %indvars.iv.next = add nsw i64 %indvars.iv, -1 8337e34b74SCongzhe Cao %tobool3 = icmp eq i64 %indvars.iv.next, 0 8437e34b74SCongzhe Cao br i1 %tobool3, label %for.inc7, label %for.body4 8537e34b74SCongzhe Cao 8637e34b74SCongzhe Caofor.inc7: ; preds = %for.body4 8737e34b74SCongzhe Cao %or.lcssa = phi i32 [ %or, %for.body4 ] 8837e34b74SCongzhe Cao %indvar0.next = add nsw i64 %indvar0, 1 8937e34b74SCongzhe Cao %indvar1.next = add nsw i32 %indvar1, 1 9037e34b74SCongzhe Cao %indvar0.next.trunc = trunc i64 %indvar0.next to i32 9137e34b74SCongzhe Cao %tobool = icmp ne i32 %indvar0.next.trunc, 100 9237e34b74SCongzhe Cao %tobool1 = icmp ne i32 %indvar1.next, 150 9337e34b74SCongzhe Cao %outer.cond = and i1 %tobool, %tobool1 9437e34b74SCongzhe Cao br i1 %outer.cond, label %for.cond2.preheader, label %for.cond.for.end9_crit_edge 9537e34b74SCongzhe Cao 9637e34b74SCongzhe Caofor.cond.for.end9_crit_edge: ; preds = %for.inc7 9737e34b74SCongzhe Cao %or.lcssa.lcssa = phi i32 [ %or.lcssa, %for.inc7 ] 9837e34b74SCongzhe Cao store i32 %or.lcssa.lcssa, i32* @a, align 4 9937e34b74SCongzhe Cao br label %for.end9 10037e34b74SCongzhe Cao 10137e34b74SCongzhe Caofor.end9: ; preds = %for.cond.for.end9_crit_edge, %entry 10237e34b74SCongzhe Cao ret void 10337e34b74SCongzhe Cao} 10437e34b74SCongzhe Cao 10537e34b74SCongzhe Cao; // Both two outer indvars are involved in array accesses 10637e34b74SCongzhe Cao; // inside the inner loop. 10737e34b74SCongzhe Cao; int a, c, d, e; 10837e34b74SCongzhe Cao; int b[200][100]; 10937e34b74SCongzhe Cao; void test2() { 11037e34b74SCongzhe Cao; for (c = 0, e = 1; c < 100 && e < 150; c++, e++) { 11137e34b74SCongzhe Cao; d = 5; 11237e34b74SCongzhe Cao; for (; d; d--) 11337e34b74SCongzhe Cao; a |= b[d + e][c + 9]; 11437e34b74SCongzhe Cao; } 11537e34b74SCongzhe Cao; } 11637e34b74SCongzhe Cao 11737e34b74SCongzhe Caodefine void @test2() { 11837e34b74SCongzhe Cao; CHECK-LABEL: @test2( 11937e34b74SCongzhe Cao; CHECK-NEXT: entry: 12037e34b74SCongzhe Cao; CHECK-NEXT: [[A:%.*]] = load i32, i32* @a, align 4 12137e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_PREHEADER:%.*]] 12237e34b74SCongzhe Cao; CHECK: for.cond2.preheader.preheader: 12337e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER:%.*]] 12437e34b74SCongzhe Cao; CHECK: for.cond2.preheader: 12537e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0:%.*]] = phi i64 [ [[INDVAR0_NEXT:%.*]], [[FOR_INC7:%.*]] ], [ 0, [[FOR_COND2_PREHEADER_PREHEADER:%.*]] ] 12637e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1:%.*]] = phi i64 [ [[INDVAR1_NEXT:%.*]], [[FOR_INC7]] ], [ 1, [[FOR_COND2_PREHEADER_PREHEADER]] ] 12737e34b74SCongzhe Cao; CHECK-NEXT: [[OR13:%.*]] = phi i32 [ [[OR:%.*]], [[FOR_INC7]] ], [ [[OR_REDUCTION:%.*]], [[FOR_COND2_PREHEADER_PREHEADER]] ] 12837e34b74SCongzhe Cao; CHECK-NEXT: [[INDEX0:%.*]] = add nsw i64 [[INDVAR0]], 9 12937e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_SPLIT1:%.*]] 13037e34b74SCongzhe Cao; CHECK: for.body4.preheader: 13137e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4:%.*]] 13237e34b74SCongzhe Cao; CHECK: for.body4: 13337e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[TMP0:%.*]], [[FOR_BODY4_SPLIT:%.*]] ], [ 5, [[FOR_BODY4_PREHEADER]] ] 13437e34b74SCongzhe Cao; CHECK-NEXT: [[OR_REDUCTION]] = phi i32 [ [[OR_LCSSA:%.*]], [[FOR_BODY4_SPLIT]] ], [ [[A]], [[FOR_BODY4_PREHEADER]] ] 13537e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER_PREHEADER]] 13637e34b74SCongzhe Cao; CHECK: for.body4.split1: 13737e34b74SCongzhe Cao; CHECK-NEXT: [[INDEX1:%.*]] = add nsw i64 [[INDVARS_IV]], [[INDVAR1]] 13837e34b74SCongzhe Cao; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 [[INDEX1]], i64 [[INDEX0]] 13937e34b74SCongzhe Cao; CHECK-NEXT: [[LOAD_VAL:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4 14037e34b74SCongzhe Cao; CHECK-NEXT: [[OR]] = or i32 [[OR13]], [[LOAD_VAL]] 14137e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV]], -1 14237e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], 0 14337e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_INC7]] 14437e34b74SCongzhe Cao; CHECK: for.body4.split: 14537e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA]] = phi i32 [ [[OR]], [[FOR_INC7]] ] 14637e34b74SCongzhe Cao; CHECK-NEXT: [[TMP0]] = add nsw i64 [[INDVARS_IV]], -1 14737e34b74SCongzhe Cao; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 0 14837e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_COND_FOR_END9_CRIT_EDGE:%.*]], label [[FOR_BODY4]] 14937e34b74SCongzhe Cao; CHECK: for.inc7: 15037e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0_NEXT]] = add nsw i64 [[INDVAR0]], 1 15137e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1_NEXT]] = add nsw i64 [[INDVAR1]], 1 15237e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i64 [[INDVAR0_NEXT]], 100 15337e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp ne i64 [[INDVAR1_NEXT]], 150 15437e34b74SCongzhe Cao; CHECK-NEXT: [[OUTER_COND:%.*]] = and i1 [[TOBOOL]], [[TOBOOL1]] 15537e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[OUTER_COND]], label [[FOR_COND2_PREHEADER]], label [[FOR_BODY4_SPLIT]] 15637e34b74SCongzhe Cao; CHECK: for.cond.for.end9_crit_edge: 15737e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA_LCSSA:%.*]] = phi i32 [ [[OR_LCSSA]], [[FOR_BODY4_SPLIT]] ] 15837e34b74SCongzhe Cao; CHECK-NEXT: store i32 [[OR_LCSSA_LCSSA]], i32* @a, align 4 15937e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_END9:%.*]] 16037e34b74SCongzhe Cao; CHECK: for.end9: 16137e34b74SCongzhe Cao; CHECK-NEXT: ret void 16237e34b74SCongzhe Cao; 16337e34b74SCongzhe Caoentry: 16437e34b74SCongzhe Cao %a = load i32, i32* @a, align 4 16537e34b74SCongzhe Cao br label %for.cond2.preheader 16637e34b74SCongzhe Cao 16737e34b74SCongzhe Caofor.cond2.preheader: ; preds = %entry, %for.inc7 16837e34b74SCongzhe Cao %indvar0 = phi i64 [ 0, %entry ], [ %indvar0.next, %for.inc7 ] 16937e34b74SCongzhe Cao %or.reduction = phi i32 [ %a, %entry ], [ %or.lcssa, %for.inc7 ] 17037e34b74SCongzhe Cao %indvar1 = phi i64 [ 1, %entry ], [ %indvar1.next, %for.inc7 ] 17137e34b74SCongzhe Cao %index0 = add nsw i64 %indvar0, 9 17237e34b74SCongzhe Cao br label %for.body4 17337e34b74SCongzhe Cao 17437e34b74SCongzhe Caofor.body4: ; preds = %for.cond2.preheader, %for.body4 17537e34b74SCongzhe Cao %indvars.iv = phi i64 [ 5, %for.cond2.preheader ], [ %indvars.iv.next, %for.body4 ] 17637e34b74SCongzhe Cao %or13 = phi i32 [ %or.reduction, %for.cond2.preheader ], [ %or, %for.body4 ] 17737e34b74SCongzhe Cao %index1 = add nsw i64 %indvars.iv, %indvar1 17837e34b74SCongzhe Cao %arrayidx6 = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 %index1, i64 %index0 17937e34b74SCongzhe Cao %load.val = load i32, i32* %arrayidx6, align 4 18037e34b74SCongzhe Cao %or = or i32 %or13, %load.val 18137e34b74SCongzhe Cao %indvars.iv.next = add nsw i64 %indvars.iv, -1 18237e34b74SCongzhe Cao %tobool3 = icmp eq i64 %indvars.iv.next, 0 18337e34b74SCongzhe Cao br i1 %tobool3, label %for.inc7, label %for.body4 18437e34b74SCongzhe Cao 18537e34b74SCongzhe Caofor.inc7: ; preds = %for.body4 18637e34b74SCongzhe Cao %or.lcssa = phi i32 [ %or, %for.body4 ] 18737e34b74SCongzhe Cao %indvar0.next = add nsw i64 %indvar0, 1 18837e34b74SCongzhe Cao %indvar1.next = add nsw i64 %indvar1, 1 18937e34b74SCongzhe Cao %tobool = icmp ne i64 %indvar0.next, 100 19037e34b74SCongzhe Cao %tobool1 = icmp ne i64 %indvar1.next, 150 19137e34b74SCongzhe Cao %outer.cond = and i1 %tobool, %tobool1 19237e34b74SCongzhe Cao br i1 %outer.cond, label %for.cond2.preheader, label %for.cond.for.end9_crit_edge 19337e34b74SCongzhe Cao 19437e34b74SCongzhe Caofor.cond.for.end9_crit_edge: ; preds = %for.inc7 19537e34b74SCongzhe Cao %or.lcssa.lcssa = phi i32 [ %or.lcssa, %for.inc7 ] 19637e34b74SCongzhe Cao store i32 %or.lcssa.lcssa, i32* @a, align 4 19737e34b74SCongzhe Cao br label %for.end9 19837e34b74SCongzhe Cao 19937e34b74SCongzhe Caofor.end9: ; preds = %for.cond.for.end9_crit_edge, %entry 20037e34b74SCongzhe Cao ret void 20137e34b74SCongzhe Cao} 20237e34b74SCongzhe Cao 20337e34b74SCongzhe Cao 20437e34b74SCongzhe Cao; // Both two outer indvars are involved in a single 20537e34b74SCongzhe Cao; // outer loop exit condition. 20637e34b74SCongzhe Cao; int a, c, d, e; 20737e34b74SCongzhe Cao; int b[200][100]; 20837e34b74SCongzhe Cao; void test3() { 20937e34b74SCongzhe Cao; for (c = 0, e = 1; c + e < 150; c++, e++) { 21037e34b74SCongzhe Cao; d = 5; 21137e34b74SCongzhe Cao; for (; d; d--) 21237e34b74SCongzhe Cao; a |= b[d + e][c + 9]; 21337e34b74SCongzhe Cao; } 21437e34b74SCongzhe Cao; } 21537e34b74SCongzhe Cao 21637e34b74SCongzhe Caodefine void @test3() { 21737e34b74SCongzhe Cao; CHECK-LABEL: @test3( 21837e34b74SCongzhe Cao; CHECK-NEXT: entry: 21937e34b74SCongzhe Cao; CHECK-NEXT: [[A:%.*]] = load i32, i32* @a, align 4 22037e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_PREHEADER:%.*]] 22137e34b74SCongzhe Cao; CHECK: for.cond2.preheader.preheader: 22237e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER:%.*]] 22337e34b74SCongzhe Cao; CHECK: for.cond2.preheader: 22437e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0:%.*]] = phi i64 [ [[INDVAR0_NEXT:%.*]], [[FOR_INC7:%.*]] ], [ 0, [[FOR_COND2_PREHEADER_PREHEADER:%.*]] ] 22537e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1:%.*]] = phi i64 [ [[INDVAR1_NEXT:%.*]], [[FOR_INC7]] ], [ 1, [[FOR_COND2_PREHEADER_PREHEADER]] ] 22637e34b74SCongzhe Cao; CHECK-NEXT: [[OR13:%.*]] = phi i32 [ [[OR:%.*]], [[FOR_INC7]] ], [ [[OR_REDUCTION:%.*]], [[FOR_COND2_PREHEADER_PREHEADER]] ] 22737e34b74SCongzhe Cao; CHECK-NEXT: [[INDEX0:%.*]] = add nsw i64 [[INDVAR0]], 9 22837e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4_SPLIT1:%.*]] 22937e34b74SCongzhe Cao; CHECK: for.body4.preheader: 23037e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_BODY4:%.*]] 23137e34b74SCongzhe Cao; CHECK: for.body4: 23237e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[TMP0:%.*]], [[FOR_BODY4_SPLIT:%.*]] ], [ 5, [[FOR_BODY4_PREHEADER]] ] 23337e34b74SCongzhe Cao; CHECK-NEXT: [[OR_REDUCTION]] = phi i32 [ [[OR_LCSSA:%.*]], [[FOR_BODY4_SPLIT]] ], [ [[A]], [[FOR_BODY4_PREHEADER]] ] 23437e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_COND2_PREHEADER_PREHEADER]] 23537e34b74SCongzhe Cao; CHECK: for.body4.split1: 23637e34b74SCongzhe Cao; CHECK-NEXT: [[INDEX1:%.*]] = add nsw i64 [[INDVARS_IV]], [[INDVAR1]] 23737e34b74SCongzhe Cao; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 [[INDEX1]], i64 [[INDEX0]] 23837e34b74SCongzhe Cao; CHECK-NEXT: [[LOAD_VAL:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4 23937e34b74SCongzhe Cao; CHECK-NEXT: [[OR]] = or i32 [[OR13]], [[LOAD_VAL]] 24037e34b74SCongzhe Cao; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV]], -1 24137e34b74SCongzhe Cao; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], 0 24237e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_INC7]] 24337e34b74SCongzhe Cao; CHECK: for.body4.split: 24437e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA]] = phi i32 [ [[OR]], [[FOR_INC7]] ] 24537e34b74SCongzhe Cao; CHECK-NEXT: [[TMP0]] = add nsw i64 [[INDVARS_IV]], -1 24637e34b74SCongzhe Cao; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 0 24737e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_COND_FOR_END9_CRIT_EDGE:%.*]], label [[FOR_BODY4]] 24837e34b74SCongzhe Cao; CHECK: for.inc7: 24937e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR0_NEXT]] = add nsw i64 [[INDVAR0]], 1 25037e34b74SCongzhe Cao; CHECK-NEXT: [[INDVAR1_NEXT]] = add nsw i64 [[INDVAR1]], 1 25137e34b74SCongzhe Cao; CHECK-NEXT: [[OUTER_INDVAR_ADD:%.*]] = add nsw i64 [[INDVAR0_NEXT]], [[INDVAR1_NEXT]] 25237e34b74SCongzhe Cao; CHECK-NEXT: [[OUTER_COND:%.*]] = icmp slt i64 [[OUTER_INDVAR_ADD]], 150 25337e34b74SCongzhe Cao; CHECK-NEXT: br i1 [[OUTER_COND]], label [[FOR_COND2_PREHEADER]], label [[FOR_BODY4_SPLIT]] 25437e34b74SCongzhe Cao; CHECK: for.cond.for.end9_crit_edge: 25537e34b74SCongzhe Cao; CHECK-NEXT: [[OR_LCSSA_LCSSA:%.*]] = phi i32 [ [[OR_LCSSA]], [[FOR_BODY4_SPLIT]] ] 25637e34b74SCongzhe Cao; CHECK-NEXT: store i32 [[OR_LCSSA_LCSSA]], i32* @a, align 4 25737e34b74SCongzhe Cao; CHECK-NEXT: br label [[FOR_END9:%.*]] 25837e34b74SCongzhe Cao; CHECK: for.end9: 25937e34b74SCongzhe Cao; CHECK-NEXT: ret void 26037e34b74SCongzhe Cao; 26137e34b74SCongzhe Caoentry: 26237e34b74SCongzhe Cao %a = load i32, i32* @a, align 4 26337e34b74SCongzhe Cao br label %for.cond2.preheader 26437e34b74SCongzhe Cao 26537e34b74SCongzhe Caofor.cond2.preheader: ; preds = %entry, %for.inc7 26637e34b74SCongzhe Cao %indvar0 = phi i64 [ 0, %entry ], [ %indvar0.next, %for.inc7 ] 26737e34b74SCongzhe Cao %or.reduction = phi i32 [ %a, %entry ], [ %or.lcssa, %for.inc7 ] 26837e34b74SCongzhe Cao %indvar1 = phi i64 [ 1, %entry ], [ %indvar1.next, %for.inc7 ] 26937e34b74SCongzhe Cao %index0 = add nsw i64 %indvar0, 9 27037e34b74SCongzhe Cao br label %for.body4 27137e34b74SCongzhe Cao 27237e34b74SCongzhe Caofor.body4: ; preds = %for.cond2.preheader, %for.body4 27337e34b74SCongzhe Cao %indvars.iv = phi i64 [ 5, %for.cond2.preheader ], [ %indvars.iv.next, %for.body4 ] 27437e34b74SCongzhe Cao %or13 = phi i32 [ %or.reduction, %for.cond2.preheader ], [ %or, %for.body4 ] 27537e34b74SCongzhe Cao %index1 = add nsw i64 %indvars.iv, %indvar1 27637e34b74SCongzhe Cao %arrayidx6 = getelementptr inbounds [200 x [100 x i32]], [200 x [100 x i32]]* @b, i64 0, i64 %index1, i64 %index0 27737e34b74SCongzhe Cao %load.val = load i32, i32* %arrayidx6, align 4 27837e34b74SCongzhe Cao %or = or i32 %or13, %load.val 27937e34b74SCongzhe Cao %indvars.iv.next = add nsw i64 %indvars.iv, -1 28037e34b74SCongzhe Cao %tobool3 = icmp eq i64 %indvars.iv.next, 0 28137e34b74SCongzhe Cao br i1 %tobool3, label %for.inc7, label %for.body4 28237e34b74SCongzhe Cao 28337e34b74SCongzhe Caofor.inc7: ; preds = %for.body4 28437e34b74SCongzhe Cao %or.lcssa = phi i32 [ %or, %for.body4 ] 28537e34b74SCongzhe Cao %indvar0.next = add nsw i64 %indvar0, 1 28637e34b74SCongzhe Cao %indvar1.next = add nsw i64 %indvar1, 1 28737e34b74SCongzhe Cao %outer.indvar.add = add nsw i64 %indvar0.next, %indvar1.next 28837e34b74SCongzhe Cao %outer.cond = icmp slt i64 %outer.indvar.add, 150 28937e34b74SCongzhe Cao br i1 %outer.cond, label %for.cond2.preheader, label %for.cond.for.end9_crit_edge 29037e34b74SCongzhe Cao 29137e34b74SCongzhe Caofor.cond.for.end9_crit_edge: ; preds = %for.inc7 29237e34b74SCongzhe Cao %or.lcssa.lcssa = phi i32 [ %or.lcssa, %for.inc7 ] 29337e34b74SCongzhe Cao store i32 %or.lcssa.lcssa, i32* @a, align 4 29437e34b74SCongzhe Cao br label %for.end9 29537e34b74SCongzhe Cao 29637e34b74SCongzhe Caofor.end9: ; preds = %for.cond.for.end9_crit_edge, %entry 29737e34b74SCongzhe Cao ret void 29837e34b74SCongzhe Cao} 299