| ; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -verify-loop-info < %s -S | FileCheck %s | |
| ; RUN: opt -passes='loop(loop-unroll-and-jam),verify<loops>' -allow-unroll-and-jam < %s -S | FileCheck %s | |
| ; Check that the newly created loops to not fail to be added to LI | |
| ; This test deliberately disables UnJ on the middle loop, performing it instead on the | |
| ; outer of 3 nested loops. The (new) inner loops need to be added to LI. | |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | |
| define i32 @test() { | |
| ; CHECK-LABEL: test | |
| ; CHECK: for.cond17.preheader: | |
| ; CHECK: br label %for.cond20.preheader | |
| ; CHECK: for.cond20.preheader: | |
| ; CHECK: br label %for.cond23.preheader | |
| ; CHECK: for.cond23.preheader: | |
| ; CHECK: br label %for.body25 | |
| ; CHECK: for.body25: | |
| ; CHECK: br i1 [[CMP24:%.*]], label %for.body25, label %for.inc45 | |
| ; CHECK: for.inc45: | |
| ; CHECK: br label %for.body25.1 | |
| ; CHECK: for.inc48: | |
| ; CHECK: br i1 [[CMP18_3:%.*]], label %for.cond20.preheader, label %for.end50 | |
| ; CHECK: for.end50: | |
| ; CHECK: ret i32 0 | |
| ; CHECK: for.body25.1: | |
| ; CHECK: br i1 [[CMP24_1:%.*]], label %for.body25.1, label %for.inc45.1 | |
| ; CHECK: for.inc45.1: | |
| ; CHECK: br label %for.body25.2 | |
| ; CHECK: for.body25.2: | |
| ; CHECK: br i1 [[CMP24_2:%.*]], label %for.body25.2, label %for.inc45.2 | |
| ; CHECK: for.inc45.2: | |
| ; CHECK: br label %for.body25.3 | |
| ; CHECK: for.body25.3: | |
| ; CHECK: br i1 [[CMP24_3:%.*]], label %for.body25.3, label %for.inc45.3 | |
| ; CHECK: for.inc45.3: | |
| ; CHECK: br i1 [[CMP21_3:%.*]], label %for.cond23.preheader, label %for.inc48 | |
| ; | |
| entry: | |
| %A = alloca [8 x [8 x i32]], align 16 | |
| %B = alloca [8 x [8 x i32]], align 16 | |
| %C = alloca [8 x [8 x i32]], align 16 | |
| br label %for.cond17.preheader | |
| for.cond17.preheader: ; preds = %for.inc14 | |
| br label %for.cond20.preheader | |
| for.cond20.preheader: ; preds = %for.cond17.preheader, %for.inc48 | |
| %i.13 = phi i32 [ 0, %for.cond17.preheader ], [ %inc49, %for.inc48 ] | |
| br label %for.cond23.preheader | |
| for.cond23.preheader: ; preds = %for.cond20.preheader, %for.inc45 | |
| %j.12 = phi i32 [ 0, %for.cond20.preheader ], [ %inc46, %for.inc45 ] | |
| br label %for.body25 | |
| for.body25: ; preds = %for.cond23.preheader, %for.body25 | |
| %k.01 = phi i32 [ 0, %for.cond23.preheader ], [ %inc43, %for.body25 ] | |
| %idxprom26 = zext i32 %i.13 to i64 | |
| %idxprom28 = zext i32 %j.12 to i64 | |
| %arrayidx29 = getelementptr inbounds [8 x [8 x i32]], ptr %C, i64 0, i64 %idxprom26, i64 %idxprom28 | |
| %0 = load i32, ptr %arrayidx29, align 4 | |
| %idxprom30 = zext i32 %i.13 to i64 | |
| %idxprom32 = zext i32 %k.01 to i64 | |
| %arrayidx33 = getelementptr inbounds [8 x [8 x i32]], ptr %A, i64 0, i64 %idxprom30, i64 %idxprom32 | |
| %1 = load i32, ptr %arrayidx33, align 4 | |
| %idxprom34 = zext i32 %k.01 to i64 | |
| %idxprom36 = zext i32 %j.12 to i64 | |
| %arrayidx37 = getelementptr inbounds [8 x [8 x i32]], ptr %B, i64 0, i64 %idxprom34, i64 %idxprom36 | |
| %2 = load i32, ptr %arrayidx37, align 4 | |
| %mul = mul nsw i32 %1, %2 | |
| %add = add nsw i32 %0, %mul | |
| %idxprom38 = zext i32 %i.13 to i64 | |
| %idxprom40 = zext i32 %j.12 to i64 | |
| %arrayidx41 = getelementptr inbounds [8 x [8 x i32]], ptr %C, i64 0, i64 %idxprom38, i64 %idxprom40 | |
| store i32 %add, ptr %arrayidx41, align 4 | |
| %inc43 = add nuw nsw i32 %k.01, 1 | |
| %cmp24 = icmp ult i32 %k.01, 7 | |
| br i1 %cmp24, label %for.body25, label %for.inc45 | |
| for.inc45: ; preds = %for.body25 | |
| %inc46 = add nuw nsw i32 %j.12, 1 | |
| %cmp21 = icmp ult i32 %j.12, 7 | |
| br i1 %cmp21, label %for.cond23.preheader, label %for.inc48, !llvm.loop !7 | |
| for.inc48: ; preds = %for.inc45 | |
| %inc49 = add nuw nsw i32 %i.13, 1 | |
| %cmp18 = icmp ult i32 %i.13, 7 | |
| br i1 %cmp18, label %for.cond20.preheader, label %for.end50, !llvm.loop !5 | |
| for.end50: ; preds = %for.inc48 | |
| ret i32 0 | |
| } | |
| !5 = distinct !{!5, !6} | |
| !6 = !{!"llvm.loop.unroll_and_jam.count", i32 4} | |
| !7 = distinct !{!7, !8} | |
| !8 = !{!"llvm.loop.unroll_and_jam.disable"} |