summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSerguei Katkov <serguei.katkov@azul.com>2019-08-22 10:06:46 +0000
committerSerguei Katkov <serguei.katkov@azul.com>2019-08-22 10:06:46 +0000
commit036e636aa7fc6d367ac19197936f3320f28214b0 (patch)
tree8348f329b6b0433ba45f5716b6ce1773e597c922 /llvm
parentcd53ff6c0df5f75c4c15abffa18755a8768fc6b3 (diff)
downloadbcm5719-llvm-036e636aa7fc6d367ac19197936f3320f28214b0.tar.gz
bcm5719-llvm-036e636aa7fc6d367ac19197936f3320f28214b0.zip
[Loop Peeling] Fix silly bug in metadata update.
We must update loop metedata before we moved to parent loop if it is present. llvm-svn: 369637
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp12
-rw-r--r--llvm/test/Transforms/LoopUnroll/peel-loop-inner.ll50
2 files changed, 56 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp
index 3fad421f58f..58e42074f96 100644
--- a/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUnrollPeel.cpp
@@ -741,6 +741,12 @@ bool llvm::peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI,
fixupBranchWeights(Header, LatchBR, ExitWeight, FallThroughWeight);
+ // Update Metadata for count of peeled off iterations.
+ unsigned AlreadyPeeled = 0;
+ if (auto Peeled = getOptionalIntLoopAttribute(L, PeeledCountMetaData))
+ AlreadyPeeled = *Peeled;
+ addStringMetadataToLoop(L, PeeledCountMetaData, AlreadyPeeled + PeelCount);
+
if (Loop *ParentLoop = L->getParentLoop())
L = ParentLoop;
@@ -755,11 +761,5 @@ bool llvm::peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI,
NumPeeled++;
- // Update Metadata for count of peeled off iterations.
- unsigned AlreadyPeeled = 0;
- if (auto Peeled = getOptionalIntLoopAttribute(L, PeeledCountMetaData))
- AlreadyPeeled = *Peeled;
- addStringMetadataToLoop(L, PeeledCountMetaData, AlreadyPeeled + PeelCount);
-
return true;
}
diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-inner.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-inner.ll
new file mode 100644
index 00000000000..a83f3bfb935
--- /dev/null
+++ b/llvm/test/Transforms/LoopUnroll/peel-loop-inner.ll
@@ -0,0 +1,50 @@
+; RUN: opt < %s -S -passes='require<opt-remark-emit>,unroll<peeling;no-runtime>,simplify-cfg,instcombine' -unroll-force-peel-count=3 -verify-dom-info | FileCheck %s
+
+define void @basic(i32 %K, i32 %N) {
+; CHECK-LABEL: @basic(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[OUTER:%.*]]
+; CHECK: outer:
+; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_INC:%.*]], [[OUTER_BACKEDGE:%.*]] ]
+; CHECK-NEXT: [[CMP_INNER_PEEL:%.*]] = icmp sgt i32 [[K:%.*]], 1
+; CHECK-NEXT: br i1 [[CMP_INNER_PEEL]], label [[INNER_PEEL2:%.*]], label [[OUTER_BACKEDGE]]
+; CHECK: inner.peel2:
+; CHECK-NEXT: [[CMP_INNER_PEEL4:%.*]] = icmp eq i32 [[K]], 2
+; CHECK-NEXT: br i1 [[CMP_INNER_PEEL4]], label [[OUTER_BACKEDGE]], label [[INNER_PEEL6:%.*]]
+; CHECK: inner.peel6:
+; CHECK-NEXT: [[CMP_INNER_PEEL8:%.*]] = icmp sgt i32 [[K]], 3
+; CHECK-NEXT: br i1 [[CMP_INNER_PEEL8]], label [[INNER:%.*]], label [[OUTER_BACKEDGE]]
+; CHECK: inner:
+; CHECK-NEXT: [[J:%.*]] = phi i32 [ [[J_INC:%.*]], [[INNER]] ], [ 3, [[INNER_PEEL6]] ]
+; CHECK-NEXT: [[J_INC]] = add nuw nsw i32 [[J]], 1
+; CHECK-NEXT: [[CMP_INNER:%.*]] = icmp slt i32 [[J_INC]], [[K]]
+; CHECK-NEXT: br i1 [[CMP_INNER]], label [[INNER]], label [[OUTER_BACKEDGE]], !llvm.loop !0
+; CHECK: outer.backedge:
+; CHECK-NEXT: [[I_INC]] = add i32 [[I]], 1
+; CHECK-NEXT: [[CMP_OUTER:%.*]] = icmp slt i32 [[I_INC]], [[N:%.*]]
+; CHECK-NOT: !llvm.loop
+; CHECK: end:
+;
+entry:
+ br label %outer
+
+outer:
+ %i = phi i32 [ 0, %entry ], [ %i.inc, %outer.backedge ]
+ br label %inner
+
+inner:
+ %j = phi i32 [ 0, %outer ], [ %j.inc, %inner ]
+ %j.inc = add i32 %j, 1
+ %cmp.inner = icmp slt i32 %j.inc, %K
+ br i1 %cmp.inner, label %inner, label %outer.backedge, !llvm.loop !1
+
+outer.backedge:
+ %i.inc = add i32 %i, 1
+ %cmp.outer = icmp slt i32 %i.inc, %N
+ br i1 %cmp.outer, label %outer, label %end
+
+end:
+ ret void
+}
+
+!1 = distinct !{!1}
OpenPOWER on IntegriCloud