Skip to content

Commit 7a41a6f

Browse files
author
Marek Sedlacek
committed
Removed cpu specification from .ll test; Added check for simplify form of loop before rotation
1 parent 9d8cd0b commit 7a41a6f

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

llvm/lib/Transforms/Utils/LoopUnroll.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,11 +487,14 @@ llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
487487

488488
LoopUnrollResult Result = LoopUnrollResult::Unmodified;
489489

490-
if (ULO.Runtime && SE) {
490+
// Rotate loop if it makes the exit count from the latch computable (for
491+
// later unrolling).
492+
// The check for LoopSimplify form is done so that after the rotation this
493+
// check does not fail in UnrollRuntimeLoopRemainder and the rotation is not
494+
// redundant.
495+
if (ULO.Runtime && SE && L->isLoopSimplifyForm()) {
491496
BasicBlock *OrigHeader = L->getHeader();
492497
BranchInst *BI = dyn_cast<BranchInst>(OrigHeader->getTerminator());
493-
// Rotate loop if it makes the exit count from the latch computable (for
494-
// later unrolling).
495498
if (BI && !BI->isUnconditional() &&
496499
isa<SCEVCouldNotCompute>(SE->getExitCount(L, L->getLoopLatch())) &&
497500
!isa<SCEVCouldNotCompute>(SE->getExitCount(L, OrigHeader))) {

llvm/test/Transforms/LoopUnroll/X86/runtime-unroll-after-rotate.ll renamed to llvm/test/Transforms/LoopUnroll/runtime-unroll-after-rotate.ll

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt --passes=loop-unroll -unroll-runtime-other-exit-predictable=1 -S %s | FileCheck %s
2+
; RUN: opt --passes=loop-unroll -unroll-runtime=true -unroll-runtime-other-exit-predictable=1 -S %s | FileCheck %s
33
target triple = "x86_64-unknown-linux-gnu"
44

55
define void @test(i64 %0, ptr %1) #0 {
66
; CHECK-LABEL: define void @test(
7-
; CHECK-SAME: i64 [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-SAME: i64 [[TMP0:%.*]], ptr [[TMP1:%.*]]) {
88
; CHECK-NEXT: [[ENTRY:.*:]]
99
; CHECK-NEXT: [[B1:%.*]] = icmp eq i64 [[TMP0]], 0
1010
; CHECK-NEXT: br i1 [[B1]], label %[[AFTER:.*]], label %[[BODY_LR_PH:.*]]
1111
; CHECK: [[BODY_LR_PH]]:
1212
; CHECK-NEXT: [[TMP5:%.*]] = sub i64 0, [[TMP0]]
1313
; CHECK-NEXT: [[TMP2:%.*]] = freeze i64 [[TMP5]]
1414
; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], -1
15-
; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP2]], 3
15+
; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP2]], 7
1616
; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0
1717
; CHECK-NEXT: br i1 [[LCMP_MOD]], label %[[BODY_PROL_PREHEADER:.*]], label %[[BODY_PROL_LOOPEXIT:.*]]
1818
; CHECK: [[BODY_PROL_PREHEADER]]:
@@ -35,22 +35,30 @@ define void @test(i64 %0, ptr %1) #0 {
3535
; CHECK-NEXT: br label %[[BODY_PROL_LOOPEXIT]]
3636
; CHECK: [[BODY_PROL_LOOPEXIT]]:
3737
; CHECK-NEXT: [[A2_UNR:%.*]] = phi i64 [ [[TMP0]], %[[BODY_LR_PH]] ], [ [[A2_UNR_PH]], %[[BODY_PROL_LOOPEXIT_UNR_LCSSA]] ]
38-
; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 3
39-
; CHECK-NEXT: br i1 [[TMP4]], label %[[HEADER_AFTER_CRIT_EDGE:.*]], label %[[BODY_LR_PH_NEW:.*]]
38+
; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i64 [[TMP3]], 7
39+
; CHECK-NEXT: br i1 [[TMP6]], label %[[HEADER_AFTER_CRIT_EDGE:.*]], label %[[BODY_LR_PH_NEW:.*]]
4040
; CHECK: [[BODY_LR_PH_NEW]]:
4141
; CHECK-NEXT: br label %[[BODY:.*]]
4242
; CHECK: [[HEADER:.*]]:
4343
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT:.*]], label %[[HEADER_1:.*]]
4444
; CHECK: [[HEADER_1]]:
4545
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_2:.*]]
4646
; CHECK: [[HEADER_2]]:
47-
; CHECK-NEXT: [[C_7:%.*]] = add i64 [[A2:%.*]], 4
4847
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_3:.*]]
4948
; CHECK: [[HEADER_3]]:
49+
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_4:.*]]
50+
; CHECK: [[HEADER_4]]:
51+
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_5:.*]]
52+
; CHECK: [[HEADER_5]]:
53+
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_6:.*]]
54+
; CHECK: [[HEADER_6]]:
55+
; CHECK-NEXT: [[C_7:%.*]] = add i64 [[A2:%.*]], 8
56+
; CHECK-NEXT: br i1 false, label %[[END_LOOPEXIT]], label %[[HEADER_7:.*]]
57+
; CHECK: [[HEADER_7]]:
5058
; CHECK-NEXT: [[B_7:%.*]] = icmp eq i64 [[C_7]], 0
5159
; CHECK-NEXT: br i1 [[B_7]], label %[[HEADER_AFTER_CRIT_EDGE_UNR_LCSSA:.*]], label %[[BODY]]
5260
; CHECK: [[BODY]]:
53-
; CHECK-NEXT: [[A2]] = phi i64 [ [[A2_UNR]], %[[BODY_LR_PH_NEW]] ], [ [[C_7]], %[[HEADER_3]] ]
61+
; CHECK-NEXT: [[A2]] = phi i64 [ [[A2_UNR]], %[[BODY_LR_PH_NEW]] ], [ [[C_7]], %[[HEADER_7]] ]
5462
; CHECK-NEXT: [[D:%.*]] = load i32, ptr [[TMP1]], align 4
5563
; CHECK-NEXT: [[E:%.*]] = icmp eq i32 [[D]], 0
5664
; CHECK-NEXT: br i1 [[E]], label %[[END_LOOPEXIT]], label %[[HEADER]]
@@ -92,7 +100,6 @@ after:
92100

93101
declare void @foo()
94102

95-
attributes #0 = { "tune-cpu"="generic" }
96103
;.
97104
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]}
98105
; CHECK: [[META1]] = !{!"llvm.loop.unroll.disable"}

0 commit comments

Comments
 (0)