Index: include/llvm/Analysis/BlockFrequencyInfoImpl.h =================================================================== --- include/llvm/Analysis/BlockFrequencyInfoImpl.h +++ include/llvm/Analysis/BlockFrequencyInfoImpl.h @@ -22,6 +22,7 @@ #include "llvm/Support/BlockFrequency.h" #include "llvm/Support/BranchProbability.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Format.h" #include "llvm/Support/ScaledNumber.h" #include "llvm/Support/raw_ostream.h" #include @@ -1129,6 +1130,7 @@ void BlockFrequencyInfoImpl::computeStartTerm( GeometricMeanInfo &HeaderData, LoopData *Loop, SCCLoopVecTy &SubLoops, NodeVecTy &LeftSCCs, std::list::iterator Insert) { + DEBUG(dbgs() << "compute start terms\n"); for (auto &S : SubLoops) { // First propagate mass on subloop's dependence nodes. for (const auto Node : S.second) @@ -1171,12 +1173,16 @@ auto &HeaderNode = Loop->Nodes[H]; auto &HeaderMass = Working[HeaderNode.Index].getMass(); HeaderData[HeaderNode].first = HeaderMass; + DEBUG(dbgs() << "header start term mass = " << HeaderMass << " [" + << HeaderMass.toScaled() << "] (" << getBlockName(HeaderNode) + << ")\n"); } } template void BlockFrequencyInfoImpl::computeGeometricRatio( GeometricMeanInfo &HeaderData, LoopData &Loop) { + DEBUG(dbgs() << "compute geometric ratio\n"); Loop.Scale = BlockMass::getFull().toScaled(); LoopData::NodeList SortedNodes = Loop.Nodes; std::sort(SortedNodes.begin(), SortedNodes.end()); @@ -1205,6 +1211,8 @@ // to use a/(1-r). BlockMass LeftMass = BlockMass::getFull() - HeaderData[HeaderNode].second; Scaled64 S = LeftMass.toScaled().inverse(); + DEBUG(dbgs() << "header ratio = " << S << " (" << getBlockName(HeaderNode) + << ")\n"); if (S > Loop.Scale) Loop.Scale = S; } @@ -1276,6 +1284,14 @@ GeometricMeanInfo HeaderData; // Distribute mass among headers according to their input relative weight. + DEBUG(dbgs() << "distribute full mass among headers\n"); + for (const Weight &W : Dist.Weights) + DEBUG(dbgs() << " header weight = " + << format("%*" PRIu64, + std::snprintf(nullptr, 0, "%" PRIu64, + std::numeric_limits::max()), + W.Amount) + << " (" << getBlockName(W.TargetNode) << ")\n"); distributeMass(BlockMass::getFull(), nullptr, Dist); computeStartTerm(HeaderData, Loop, SubLoops, LeftSCCs, Insert); Index: lib/Analysis/BlockFrequencyInfoImpl.cpp =================================================================== --- lib/Analysis/BlockFrequencyInfoImpl.cpp +++ lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -381,7 +381,7 @@ for (const BlockNode &M : Loop.Nodes) { if (auto *Loop = Working[M.Index].getPackagedLoop()) Loop->Exits.clear(); - DEBUG(dbgs() << " - node: " << getBlockName(M.Index) << "\n"); + DEBUG(dbgs() << " *- node: " << getBlockName(M.Index) << "\n"); } Loop.IsPackaged = true; } @@ -670,6 +670,7 @@ DEBUG(dbgs() << " => entry = " << BFI.getBlockName(Irr.Node) << "\n"); } else { Others.push_back(Irr.Node); + DEBUG(dbgs() << " => other = " << BFI.getBlockName(Irr.Node) << "\n"); } } assert(Headers.size() >= 2 && @@ -750,6 +751,8 @@ for (auto I = scc_begin(G); !I.isAtEnd(); ++I) if (I->size() < 2) { assert(I->size() == 1); + DEBUG(dbgs() << " - found-trivial-scc " << getBlockName((*I)[0]->Node) + << "\n"); SingleSCCs.insert(SingleSCCs.begin(), (*I)[0]->Node); } else { // Translate the SCC into RPO.