aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/LoopUtils.cpp
diff options
context:
space:
mode:
authorDehao Chen <dehao@google.com>2016-11-17 01:17:02 +0000
committerDehao Chen <dehao@google.com>2016-11-17 01:17:02 +0000
commit41d72a8632605ad9366b9bfcd12fe80a177b80ca (patch)
tree8c52313d46859c2c91ec359ae6d57836f7e70379 /llvm/lib/Transforms/Utils/LoopUtils.cpp
parent9103036f5ffadf7a881e8dca42ff862570d1e79f (diff)
downloadllvm-41d72a8632605ad9366b9bfcd12fe80a177b80ca.zip
llvm-41d72a8632605ad9366b9bfcd12fe80a177b80ca.tar.gz
llvm-41d72a8632605ad9366b9bfcd12fe80a177b80ca.tar.bz2
Use profile info to adjust loop unroll threshold.
Summary: For flat loop, even if it is hot, it is not a good idea to unroll in runtime, thus we set a lower partial unroll threshold. For hot loop, we set a higher unroll threshold and allows expensive tripcount computation to allow more aggressive unrolling. Reviewers: davidxl, mzolotukhin Subscribers: sanjoy, mehdi_amini, llvm-commits Differential Revision: https://reviews.llvm.org/D26527 llvm-svn: 287186
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/LoopUtils.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp
index 824bc14..d3817ee 100644
--- a/llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -1067,3 +1067,39 @@ bool llvm::isGuaranteedToExecute(const Instruction &Inst,
// just a special case of this.)
return true;
}
+
+Optional<unsigned> llvm::getLoopEstimatedTripCount(Loop *L) {
+ // Only support loops with a unique exiting block, and a latch.
+ if (!L->getExitingBlock())
+ return None;
+
+ // Get the branch weights for the the loop's backedge.
+ BranchInst *LatchBR =
+ dyn_cast<BranchInst>(L->getLoopLatch()->getTerminator());
+ if (!LatchBR || LatchBR->getNumSuccessors() != 2)
+ return None;
+
+ assert((LatchBR->getSuccessor(0) == L->getHeader() ||
+ LatchBR->getSuccessor(1) == L->getHeader()) &&
+ "At least one edge out of the latch must go to the header");
+
+ // To estimate the number of times the loop body was executed, we want to
+ // know the number of times the backedge was taken, vs. the number of times
+ // we exited the loop.
+ // The branch weights give us almost what we want, since they were adjusted
+ // from the raw counts to provide a better probability estimate. Remove
+ // the adjustment by subtracting 1 from both weights.
+ uint64_t TrueVal, FalseVal;
+ if (!LatchBR->extractProfMetadata(TrueVal, FalseVal) || (TrueVal <= 1) ||
+ (FalseVal <= 1))
+ return None;
+
+ TrueVal -= 1;
+ FalseVal -= 1;
+
+ // Divide the count of the backedge by the count of the edge exiting the loop.
+ if (LatchBR->getSuccessor(0) == L->getHeader())
+ return TrueVal / FalseVal;
+ else
+ return FalseVal / TrueVal;
+}