diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-25 04:38:09 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-25 04:38:09 +0000 |
commit | 3df8534be19d69a9309f7806f13bd56711aa1516 (patch) | |
tree | bee048618d538165c3780888aa2b10f1d15772ce | |
parent | 7e26181f6bbbf0868ad32b8fda2d07020bb28a95 (diff) | |
download | llvm-3df8534be19d69a9309f7806f13bd56711aa1516.tar.gz llvm-3df8534be19d69a9309f7806f13bd56711aa1516.tar.bz2 llvm-3df8534be19d69a9309f7806f13bd56711aa1516.tar.xz |
blockfreq: Store the header with the members
<rdar://problem/14292693>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207182 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Analysis/BlockFrequencyInfoImpl.h | 24 | ||||
-rw-r--r-- | lib/Analysis/BlockFrequencyInfoImpl.cpp | 4 |
2 files changed, 18 insertions, 10 deletions
diff --git a/include/llvm/Analysis/BlockFrequencyInfoImpl.h b/include/llvm/Analysis/BlockFrequencyInfoImpl.h index 797ebb7c03..f9978cc1c4 100644 --- a/include/llvm/Analysis/BlockFrequencyInfoImpl.h +++ b/include/llvm/Analysis/BlockFrequencyInfoImpl.h @@ -16,6 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/PostOrderIterator.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/IR/BasicBlock.h" #include "llvm/Support/BlockFrequency.h" #include "llvm/Support/BranchProbability.h" @@ -946,18 +947,25 @@ public: typedef SmallVector<std::pair<BlockNode, BlockMass>, 4> ExitMap; typedef SmallVector<BlockNode, 4> MemberList; LoopData *Parent; ///< The parent loop. - BlockNode Header; ///< Header. bool IsPackaged; ///< Whether this has been packaged. ExitMap Exits; ///< Successor edges (and weights). - MemberList Members; ///< Members of the loop. + MemberList Nodes; ///< Header and the members of the loop. BlockMass BackedgeMass; ///< Mass returned to loop header. BlockMass Mass; Float Scale; LoopData(LoopData *Parent, const BlockNode &Header) - : Parent(Parent), Header(Header), IsPackaged(false) {} - bool isHeader(const BlockNode &Node) const { return Node == Header; } - BlockNode getHeader() const { return Header; } + : Parent(Parent), IsPackaged(false), Nodes(1, Header) {} + bool isHeader(const BlockNode &Node) const { return Node == Nodes[0]; } + BlockNode getHeader() const { return Nodes[0]; } + + MemberList::const_iterator members_begin() const { + return Nodes.begin() + 1; + } + MemberList::const_iterator members_end() const { return Nodes.end(); } + iterator_range<MemberList::const_iterator> members() const { + return make_range(members_begin(), members_end()); + } }; /// \brief Index of loop information. @@ -1463,7 +1471,7 @@ template <class BT> void BlockFrequencyInfoImpl<BT>::initializeLoops() { if (Working[Index].isLoopHeader()) { LoopData *ContainingLoop = Working[Index].getContainingLoop(); if (ContainingLoop) - ContainingLoop->Members.push_back(Index); + ContainingLoop->Nodes.push_back(Index); continue; } @@ -1478,7 +1486,7 @@ template <class BT> void BlockFrequencyInfoImpl<BT>::initializeLoops() { assert(HeaderData.isLoopHeader()); Working[Index].Loop = HeaderData.Loop; - HeaderData.Loop->Members.push_back(Index); + HeaderData.Loop->Nodes.push_back(Index); DEBUG(dbgs() << " - loop = " << getBlockName(Header) << ": member = " << getBlockName(Index) << "\n"); } @@ -1499,7 +1507,7 @@ void BlockFrequencyInfoImpl<BT>::computeMassInLoop(LoopData &Loop) { Working[Loop.getHeader().Index].Mass = BlockMass::getFull(); propagateMassToSuccessors(&Loop, Loop.getHeader()); - for (const BlockNode &M : Loop.Members) + for (const BlockNode &M : Loop.members()) propagateMassToSuccessors(&Loop, M); computeLoopScale(Loop); diff --git a/lib/Analysis/BlockFrequencyInfoImpl.cpp b/lib/Analysis/BlockFrequencyInfoImpl.cpp index 90090d7e8f..761bda5aa9 100644 --- a/lib/Analysis/BlockFrequencyInfoImpl.cpp +++ b/lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -746,7 +746,7 @@ void BlockFrequencyInfoImplBase::packageLoop(LoopData &Loop) { DEBUG(dbgs() << "packaging-loop: " << getBlockName(Loop.getHeader()) << "\n"); Loop.IsPackaged = true; DEBUG(for (const BlockNode &M - : Loop.Members) { + : Loop.members()) { dbgs() << " - node: " << getBlockName(M.Index) << "\n"; }); } @@ -859,7 +859,7 @@ static void unwrapLoopPackage(BlockFrequencyInfoImplBase &BFI, // Propagate the head scale through the loop. Since members are visited in // RPO, the head scale will be updated by the loop scale first, and then the // final head scale will be used for updated the rest of the members. - for (const BlockNode &M : LoopPackage.Members) { + for (const BlockNode &M : LoopPackage.members()) { const FrequencyData &HeadData = BFI.Freqs[Head.Index]; FrequencyData &Freqs = BFI.Freqs[M.Index]; Float NewFreq = Freqs.Floating * HeadData.Floating; |