Mercurial > hg > Members > tobaru > cbc > CbC_llvm
diff lib/Analysis/BlockFrequencyInfoImpl.cpp @ 120:1172e4bd9c6f
update 4.0.0
author | mir3636 |
---|---|
date | Fri, 25 Nov 2016 19:14:25 +0900 |
parents | 7d135dc70f03 |
children | 803732b1fca8 |
line wrap: on
line diff
--- a/lib/Analysis/BlockFrequencyInfoImpl.cpp Tue Jan 26 22:56:36 2016 +0900 +++ b/lib/Analysis/BlockFrequencyInfoImpl.cpp Fri Nov 25 19:14:25 2016 +0900 @@ -13,6 +13,7 @@ #include "llvm/Analysis/BlockFrequencyInfoImpl.h" #include "llvm/ADT/SCCIterator.h" +#include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" #include <numeric> @@ -27,7 +28,7 @@ return ScaledNumber<uint64_t>(getMass() + 1, -64); } -void BlockMass::dump() const { print(dbgs()); } +LLVM_DUMP_METHOD void BlockMass::dump() const { print(dbgs()); } static char getHexDigit(int N) { assert(N < 16); @@ -35,6 +36,7 @@ return '0' + N; return 'a' + N - 10; } + raw_ostream &BlockMass::print(raw_ostream &OS) const { for (int Digits = 0; Digits < 16; ++Digits) OS << getHexDigit(Mass >> (60 - Digits * 4) & 0xf); @@ -78,7 +80,7 @@ BlockMass takeMass(uint32_t Weight); }; -} // end namespace +} // end anonymous namespace DitheringDistributer::DitheringDistributer(Distribution &Dist, const BlockMass &Mass) { @@ -130,6 +132,7 @@ else W.Amount += OtherW.Amount; } + static void combineWeightsBySorting(WeightList &Weights) { // Sort so edges to the same node are adjacent. std::sort(Weights.begin(), Weights.end(), @@ -149,8 +152,8 @@ // Erase extra entries. Weights.erase(O, Weights.end()); - return; } + static void combineWeightsByHashing(WeightList &Weights) { // Collect weights into a DenseMap. typedef DenseMap<BlockNode::IndexType, Weight> HashTable; @@ -168,6 +171,7 @@ for (const auto &I : Combined) Weights.push_back(I.second); } + static void combineWeights(WeightList &Weights) { // Use a hash table for many successors to keep this linear. if (Weights.size() > 128) { @@ -177,6 +181,7 @@ combineWeightsBySorting(Weights); } + static uint64_t shiftRightAndRound(uint64_t N, int Shift) { assert(Shift >= 0); assert(Shift < 64); @@ -184,6 +189,7 @@ return N; return (N >> Shift) + (UINT64_C(1) & N >> (Shift - 1)); } + void Distribution::normalize() { // Early exit for termination nodes. if (Weights.empty()) @@ -345,7 +351,7 @@ // replaced to be the maximum of all computed scales plus 1. This would // appropriately describe the loop as having a large scale, without skewing // the final frequency computation. - const Scaled64 InifiniteLoopScale(1, 12); + const Scaled64 InfiniteLoopScale(1, 12); // LoopScale == 1 / ExitMass // ExitMass == HeadMass - BackedgeMass @@ -358,7 +364,7 @@ // its exit mass will be zero. In this case, use an arbitrary scale for the // loop scale. Loop.Scale = - ExitMass.isEmpty() ? InifiniteLoopScale : ExitMass.toScaled().inverse(); + ExitMass.isEmpty() ? InfiniteLoopScale : ExitMass.toScaled().inverse(); DEBUG(dbgs() << " - exit-mass = " << ExitMass << " (" << BlockMass::getFull() << " - " << TotalBackedgeMass << ")\n" @@ -523,6 +529,28 @@ return 0; return Freqs[Node.Index].Integer; } + +Optional<uint64_t> +BlockFrequencyInfoImplBase::getBlockProfileCount(const Function &F, + const BlockNode &Node) const { + return getProfileCountFromFreq(F, getBlockFreq(Node).getFrequency()); +} + +Optional<uint64_t> +BlockFrequencyInfoImplBase::getProfileCountFromFreq(const Function &F, + uint64_t Freq) const { + auto EntryCount = F.getEntryCount(); + if (!EntryCount) + return None; + // Use 128 bit APInt to do the arithmetic to avoid overflow. + APInt BlockCount(128, EntryCount.getValue()); + APInt BlockFreq(128, Freq); + APInt EntryFreq(128, getEntryFreq()); + BlockCount *= BlockFreq; + BlockCount = BlockCount.udiv(EntryFreq); + return BlockCount.getLimitedValue(); +} + Scaled64 BlockFrequencyInfoImplBase::getFloatingBlockFreq(const BlockNode &Node) const { if (!Node.isValid()) @@ -541,6 +569,7 @@ BlockFrequencyInfoImplBase::getBlockName(const BlockNode &Node) const { return std::string(); } + std::string BlockFrequencyInfoImplBase::getLoopName(const LoopData &Loop) const { return getBlockName(Loop.getHeader()) + (Loop.isIrreducible() ? "**" : "*"); @@ -568,6 +597,7 @@ addNode(N); indexNodes(); } + void IrreducibleGraph::addNodesInFunction() { Start = 0; for (uint32_t Index = 0; Index < BFI.Working.size(); ++Index) @@ -575,10 +605,12 @@ addNode(Index); indexNodes(); } + void IrreducibleGraph::indexNodes() { for (auto &I : Nodes) Lookup[I.Node.Index] = &I; } + void IrreducibleGraph::addEdge(IrrNode &Irr, const BlockNode &Succ, const BFIBase::LoopData *OuterLoop) { if (OuterLoop && OuterLoop->isHeader(Succ)) @@ -596,16 +628,14 @@ template <> struct GraphTraits<IrreducibleGraph> { typedef bfi_detail::IrreducibleGraph GraphT; - typedef const GraphT::IrrNode NodeType; + typedef const GraphT::IrrNode *NodeRef; typedef GraphT::IrrNode::iterator ChildIteratorType; - static const NodeType *getEntryNode(const GraphT &G) { - return G.StartIrr; - } - static ChildIteratorType child_begin(NodeType *N) { return N->succ_begin(); } - static ChildIteratorType child_end(NodeType *N) { return N->succ_end(); } + static NodeRef getEntryNode(const GraphT &G) { return G.StartIrr; } + static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); } + static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); } }; -} +} // end namespace llvm /// \brief Find extra irreducible headers. ///