xref: /llvm-project/llvm/test/Transforms/LoopUnrollAndJam/innerloop.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
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