1865d88d4SRoman Lebedev; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -verify-loop-info < %s -S | FileCheck %s 209e92c60Smaekawatoshiki; RUN: opt -passes='loop(loop-unroll-and-jam),verify<loops>' -allow-unroll-and-jam < %s -S | FileCheck %s 370d4a202SDavid Green 470d4a202SDavid Green; Check that the newly created loops to not fail to be added to LI 570d4a202SDavid Green; This test deliberately disables UnJ on the middle loop, performing it instead on the 670d4a202SDavid Green; outer of 3 nested loops. The (new) inner loops need to be added to LI. 770d4a202SDavid Green 870d4a202SDavid Greentarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 970d4a202SDavid Green 1070d4a202SDavid Greendefine i32 @test() { 1170d4a202SDavid Green; CHECK-LABEL: test 1270d4a202SDavid Green; CHECK: for.cond17.preheader: 1370d4a202SDavid Green; CHECK: br label %for.cond20.preheader 1470d4a202SDavid Green; CHECK: for.cond20.preheader: 1570d4a202SDavid Green; CHECK: br label %for.cond23.preheader 1670d4a202SDavid Green; CHECK: for.cond23.preheader: 1770d4a202SDavid Green; CHECK: br label %for.body25 1870d4a202SDavid Green; CHECK: for.body25: 1970d4a202SDavid Green; CHECK: br i1 [[CMP24:%.*]], label %for.body25, label %for.inc45 2070d4a202SDavid Green; CHECK: for.inc45: 2170d4a202SDavid Green; CHECK: br label %for.body25.1 2270d4a202SDavid Green; CHECK: for.inc48: 2370d4a202SDavid Green; CHECK: br i1 [[CMP18_3:%.*]], label %for.cond20.preheader, label %for.end50 2470d4a202SDavid Green; CHECK: for.end50: 2570d4a202SDavid Green; CHECK: ret i32 0 2670d4a202SDavid Green; CHECK: for.body25.1: 2770d4a202SDavid Green; CHECK: br i1 [[CMP24_1:%.*]], label %for.body25.1, label %for.inc45.1 2870d4a202SDavid Green; CHECK: for.inc45.1: 2970d4a202SDavid Green; CHECK: br label %for.body25.2 3070d4a202SDavid Green; CHECK: for.body25.2: 3170d4a202SDavid Green; CHECK: br i1 [[CMP24_2:%.*]], label %for.body25.2, label %for.inc45.2 3270d4a202SDavid Green; CHECK: for.inc45.2: 3370d4a202SDavid Green; CHECK: br label %for.body25.3 3470d4a202SDavid Green; CHECK: for.body25.3: 3570d4a202SDavid Green; CHECK: br i1 [[CMP24_3:%.*]], label %for.body25.3, label %for.inc45.3 3670d4a202SDavid Green; CHECK: for.inc45.3: 3770d4a202SDavid Green; CHECK: br i1 [[CMP21_3:%.*]], label %for.cond23.preheader, label %for.inc48 3870d4a202SDavid Green; 3970d4a202SDavid Greenentry: 4070d4a202SDavid Green %A = alloca [8 x [8 x i32]], align 16 4170d4a202SDavid Green %B = alloca [8 x [8 x i32]], align 16 4270d4a202SDavid Green %C = alloca [8 x [8 x i32]], align 16 4370d4a202SDavid Green br label %for.cond17.preheader 4470d4a202SDavid Green 4570d4a202SDavid Greenfor.cond17.preheader: ; preds = %for.inc14 4670d4a202SDavid Green br label %for.cond20.preheader 4770d4a202SDavid Green 4870d4a202SDavid Greenfor.cond20.preheader: ; preds = %for.cond17.preheader, %for.inc48 4970d4a202SDavid Green %i.13 = phi i32 [ 0, %for.cond17.preheader ], [ %inc49, %for.inc48 ] 5070d4a202SDavid Green br label %for.cond23.preheader 5170d4a202SDavid Green 5270d4a202SDavid Greenfor.cond23.preheader: ; preds = %for.cond20.preheader, %for.inc45 5370d4a202SDavid Green %j.12 = phi i32 [ 0, %for.cond20.preheader ], [ %inc46, %for.inc45 ] 5470d4a202SDavid Green br label %for.body25 5570d4a202SDavid Green 5670d4a202SDavid Greenfor.body25: ; preds = %for.cond23.preheader, %for.body25 5770d4a202SDavid Green %k.01 = phi i32 [ 0, %for.cond23.preheader ], [ %inc43, %for.body25 ] 5870d4a202SDavid Green %idxprom26 = zext i32 %i.13 to i64 5970d4a202SDavid Green %idxprom28 = zext i32 %j.12 to i64 60*055fb779SNikita Popov %arrayidx29 = getelementptr inbounds [8 x [8 x i32]], ptr %C, i64 0, i64 %idxprom26, i64 %idxprom28 61*055fb779SNikita Popov %0 = load i32, ptr %arrayidx29, align 4 6270d4a202SDavid Green %idxprom30 = zext i32 %i.13 to i64 6370d4a202SDavid Green %idxprom32 = zext i32 %k.01 to i64 64*055fb779SNikita Popov %arrayidx33 = getelementptr inbounds [8 x [8 x i32]], ptr %A, i64 0, i64 %idxprom30, i64 %idxprom32 65*055fb779SNikita Popov %1 = load i32, ptr %arrayidx33, align 4 6670d4a202SDavid Green %idxprom34 = zext i32 %k.01 to i64 6770d4a202SDavid Green %idxprom36 = zext i32 %j.12 to i64 68*055fb779SNikita Popov %arrayidx37 = getelementptr inbounds [8 x [8 x i32]], ptr %B, i64 0, i64 %idxprom34, i64 %idxprom36 69*055fb779SNikita Popov %2 = load i32, ptr %arrayidx37, align 4 7070d4a202SDavid Green %mul = mul nsw i32 %1, %2 7170d4a202SDavid Green %add = add nsw i32 %0, %mul 7270d4a202SDavid Green %idxprom38 = zext i32 %i.13 to i64 7370d4a202SDavid Green %idxprom40 = zext i32 %j.12 to i64 74*055fb779SNikita Popov %arrayidx41 = getelementptr inbounds [8 x [8 x i32]], ptr %C, i64 0, i64 %idxprom38, i64 %idxprom40 75*055fb779SNikita Popov store i32 %add, ptr %arrayidx41, align 4 7670d4a202SDavid Green %inc43 = add nuw nsw i32 %k.01, 1 7770d4a202SDavid Green %cmp24 = icmp ult i32 %k.01, 7 7870d4a202SDavid Green br i1 %cmp24, label %for.body25, label %for.inc45 7970d4a202SDavid Green 8070d4a202SDavid Greenfor.inc45: ; preds = %for.body25 8170d4a202SDavid Green %inc46 = add nuw nsw i32 %j.12, 1 8270d4a202SDavid Green %cmp21 = icmp ult i32 %j.12, 7 8370d4a202SDavid Green br i1 %cmp21, label %for.cond23.preheader, label %for.inc48, !llvm.loop !7 8470d4a202SDavid Green 8570d4a202SDavid Greenfor.inc48: ; preds = %for.inc45 8670d4a202SDavid Green %inc49 = add nuw nsw i32 %i.13, 1 8770d4a202SDavid Green %cmp18 = icmp ult i32 %i.13, 7 8870d4a202SDavid Green br i1 %cmp18, label %for.cond20.preheader, label %for.end50, !llvm.loop !5 8970d4a202SDavid Green 9070d4a202SDavid Greenfor.end50: ; preds = %for.inc48 9170d4a202SDavid Green ret i32 0 9270d4a202SDavid Green} 9370d4a202SDavid Green 9470d4a202SDavid Green!5 = distinct !{!5, !6} 9570d4a202SDavid Green!6 = !{!"llvm.loop.unroll_and_jam.count", i32 4} 9670d4a202SDavid Green!7 = distinct !{!7, !8} 9770d4a202SDavid Green!8 = !{!"llvm.loop.unroll_and_jam.disable"} 98