]> granicus.if.org Git - llvm/commitdiff
[LoopPeeling] Fix condition for phi-eliminating peeling
authorMax Kazantsev <max.kazantsev@azul.com>
Mon, 17 Apr 2017 05:38:28 +0000 (05:38 +0000)
committerMax Kazantsev <max.kazantsev@azul.com>
Mon, 17 Apr 2017 05:38:28 +0000 (05:38 +0000)
When peeling loops basing on phis becoming invariants, we make a wrong loop size check.
UP.Threshold should be compared against the total numbers of instructions after the transformation,
which is equal to 2 * LoopSize in case of peeling one iteration.
We should also check that the maximum allowed number of peeled iterations is not zero.

Reviewers: sanjoy, anna, reames, mkuper

Reviewed By: mkuper

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D31753

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300441 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LoopUnrollPeel.cpp
test/Transforms/LoopUnroll/peel-loop-negative.ll [new file with mode: 0644]
test/Transforms/LoopUnroll/peel-loop-not-forced.ll

index 73c14f5606b73035e2f046136ddd03ec191ac5ea..a5f2765e1a3e19b1ef39ba62e5d9afcdb0d8252b 100644 (file)
@@ -82,7 +82,8 @@ void llvm::computePeelCount(Loop *L, unsigned LoopSize,
   // its only back edge. If there is such Phi, peeling 1 iteration from the
   // loop is profitable, because starting from 2nd iteration we will have an
   // invariant instead of this Phi.
-  if (LoopSize <= UP.Threshold) {
+  // First, check that we can peel at least one iteration.
+  if (2 * LoopSize <= UP.Threshold && UnrollPeelMaxCount > 0) {
     BasicBlock *BackEdge = L->getLoopLatch();
     assert(BackEdge && "Loop is not in simplified form?");
     BasicBlock *Header = L->getHeader();
diff --git a/test/Transforms/LoopUnroll/peel-loop-negative.ll b/test/Transforms/LoopUnroll/peel-loop-negative.ll
new file mode 100644 (file)
index 0000000..eab609a
--- /dev/null
@@ -0,0 +1,28 @@
+; RUN: opt < %s -S -loop-unroll -unroll-threshold=800 -unroll-peel-max-count=0 | FileCheck %s
+
+; We should not peel this loop even though we can, because the max count is set
+; to zero.
+define i32 @invariant_backedge_neg_1(i32 %a, i32 %b) {
+; CHECK-LABEL: @invariant_backedge_neg_1
+; CHECK-NOT    loop.peel{{.*}}:
+; CHECK:       loop:
+; CHECK:         %i = phi
+; CHECK:         %sum = phi
+; CHECK:         %plus = phi
+entry:
+  br label %loop
+
+loop:
+  %i = phi i32 [ 0, %entry ], [ %inc, %loop ]
+  %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]
+  %plus = phi i32 [ %a, %entry ], [ %b, %loop ]
+
+  %incsum = add i32 %sum, %plus
+  %inc = add i32 %i, 1
+  %cmp = icmp slt i32 %i, 1000
+
+  br i1 %cmp, label %loop, label %exit
+
+exit:
+  ret i32 %sum
+}
index 3dcac87f8242fb8249e6833eddbed022ff55c904..c3cbbf1ca0ce95b403548bb532c659f3aea16a00 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: opt < %s -S -loop-unroll -unroll-threshold=4 | FileCheck %s
+; RUN: opt < %s -S -loop-unroll -unroll-threshold=8 | FileCheck %s
 
 define i32 @invariant_backedge_1(i32 %a, i32 %b) {
 ; CHECK-LABEL: @invariant_backedge_1