summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorGeoff Berry <gberry@codeaurora.org>2017-11-01 15:16:50 +0000
committerGeoff Berry <gberry@codeaurora.org>2017-11-01 15:16:50 +0000
commit4bf7c62ec4e8337dacb3dc46d421ff702fca32cb (patch)
tree76b81fb541da8617e7b7cc314b309543b14a39e2 /include
parent697969187cd6d8ed03eabbe1198ee7892d872953 (diff)
[BranchProbabilityInfo] Handle irreducible loops.
Summary: Compute the strongly connected components of the CFG and fall back to use these for blocks that are in loops that are not detected by LoopInfo when computing loop back-edge and exit branch probabilities. Reviewers: dexonsmith, davidxl Subscribers: mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D39385 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@317094 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Analysis/BranchProbabilityInfo.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/include/llvm/Analysis/BranchProbabilityInfo.h b/include/llvm/Analysis/BranchProbabilityInfo.h
index 88ce6b4bd94..417b6497881 100644
--- a/include/llvm/Analysis/BranchProbabilityInfo.h
+++ b/include/llvm/Analysis/BranchProbabilityInfo.h
@@ -137,6 +137,15 @@ public:
/// Forget analysis results for the given basic block.
void eraseBlock(const BasicBlock *BB);
+ // Use to track SCCs for handling irreducible loops.
+ using SccMap = DenseMap<const BasicBlock *, int>;
+ using SccHeaderMap = DenseMap<const BasicBlock *, bool>;
+ using SccHeaderMaps = std::vector<SccHeaderMap>;
+ struct SccInfo {
+ SccMap SccNums;
+ SccHeaderMaps SccHeaders;
+ };
+
private:
// We need to store CallbackVH's in order to correctly handle basic block
// removal.
@@ -185,7 +194,8 @@ private:
bool calcMetadataWeights(const BasicBlock *BB);
bool calcColdCallHeuristics(const BasicBlock *BB);
bool calcPointerHeuristics(const BasicBlock *BB);
- bool calcLoopBranchHeuristics(const BasicBlock *BB, const LoopInfo &LI);
+ bool calcLoopBranchHeuristics(const BasicBlock *BB, const LoopInfo &LI,
+ SccInfo &SccI);
bool calcZeroHeuristics(const BasicBlock *BB, const TargetLibraryInfo *TLI);
bool calcFloatingPointHeuristics(const BasicBlock *BB);
bool calcInvokeHeuristics(const BasicBlock *BB);