LCOV - code coverage report
Current view: top level - lib/CodeGen - MachineTraceMetrics.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 478 535 89.3 %
Date: 2018-02-23 05:02:05 Functions: 44 50 88.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- lib/CodeGen/MachineTraceMetrics.cpp --------------------------------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm/CodeGen/MachineTraceMetrics.h"
      11             : #include "llvm/ADT/ArrayRef.h"
      12             : #include "llvm/ADT/DenseMap.h"
      13             : #include "llvm/ADT/Optional.h"
      14             : #include "llvm/ADT/PostOrderIterator.h"
      15             : #include "llvm/ADT/SmallPtrSet.h"
      16             : #include "llvm/ADT/SmallVector.h"
      17             : #include "llvm/ADT/SparseSet.h"
      18             : #include "llvm/CodeGen/MachineBasicBlock.h"
      19             : #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
      20             : #include "llvm/CodeGen/MachineFunction.h"
      21             : #include "llvm/CodeGen/MachineInstr.h"
      22             : #include "llvm/CodeGen/MachineLoopInfo.h"
      23             : #include "llvm/CodeGen/MachineOperand.h"
      24             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      25             : #include "llvm/CodeGen/TargetRegisterInfo.h"
      26             : #include "llvm/CodeGen/TargetSchedule.h"
      27             : #include "llvm/CodeGen/TargetSubtargetInfo.h"
      28             : #include "llvm/MC/MCRegisterInfo.h"
      29             : #include "llvm/Pass.h"
      30             : #include "llvm/Support/Debug.h"
      31             : #include "llvm/Support/ErrorHandling.h"
      32             : #include "llvm/Support/Format.h"
      33             : #include "llvm/Support/raw_ostream.h"
      34             : #include <algorithm>
      35             : #include <cassert>
      36             : #include <iterator>
      37             : #include <tuple>
      38             : #include <utility>
      39             : 
      40             : using namespace llvm;
      41             : 
      42             : #define DEBUG_TYPE "machine-trace-metrics"
      43             : 
      44             : char MachineTraceMetrics::ID = 0;
      45             : 
      46             : char &llvm::MachineTraceMetricsID = MachineTraceMetrics::ID;
      47             : 
      48       59659 : INITIALIZE_PASS_BEGIN(MachineTraceMetrics, DEBUG_TYPE,
      49             :                       "Machine Trace Metrics", false, true)
      50       59659 : INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
      51       59659 : INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
      52      327522 : INITIALIZE_PASS_END(MachineTraceMetrics, DEBUG_TYPE,
      53             :                     "Machine Trace Metrics", false, true)
      54             : 
      55       11260 : MachineTraceMetrics::MachineTraceMetrics() : MachineFunctionPass(ID) {
      56       11260 :   std::fill(std::begin(Ensembles), std::end(Ensembles), nullptr);
      57       11260 : }
      58             : 
      59       11260 : void MachineTraceMetrics::getAnalysisUsage(AnalysisUsage &AU) const {
      60             :   AU.setPreservesAll();
      61             :   AU.addRequired<MachineBranchProbabilityInfo>();
      62             :   AU.addRequired<MachineLoopInfo>();
      63       11260 :   MachineFunctionPass::getAnalysisUsage(AU);
      64       11260 : }
      65             : 
      66      125949 : bool MachineTraceMetrics::runOnMachineFunction(MachineFunction &Func) {
      67      125949 :   MF = &Func;
      68      125949 :   const TargetSubtargetInfo &ST = MF->getSubtarget();
      69      125949 :   TII = ST.getInstrInfo();
      70      125949 :   TRI = ST.getRegisterInfo();
      71      125949 :   MRI = &MF->getRegInfo();
      72      125949 :   Loops = &getAnalysis<MachineLoopInfo>();
      73      125949 :   SchedModel.init(ST.getSchedModel(), &ST, TII);
      74      251898 :   BlockInfo.resize(MF->getNumBlockIDs());
      75      251898 :   ProcResourceCycles.resize(MF->getNumBlockIDs() *
      76             :                             SchedModel.getNumProcResourceKinds());
      77      125949 :   return false;
      78             : }
      79             : 
      80      125974 : void MachineTraceMetrics::releaseMemory() {
      81      125974 :   MF = nullptr;
      82             :   BlockInfo.clear();
      83      377922 :   for (unsigned i = 0; i != TS_NumStrategies; ++i) {
      84      125974 :     delete Ensembles[i];
      85      125974 :     Ensembles[i] = nullptr;
      86             :   }
      87      125974 : }
      88             : 
      89             : //===----------------------------------------------------------------------===//
      90             : //                          Fixed block information
      91             : //===----------------------------------------------------------------------===//
      92             : //
      93             : // The number of instructions in a basic block and the CPU resources used by
      94             : // those instructions don't depend on any given trace strategy.
      95             : 
      96             : /// Compute the resource usage in basic block MBB.
      97             : const MachineTraceMetrics::FixedBlockInfo*
      98        2056 : MachineTraceMetrics::getResources(const MachineBasicBlock *MBB) {
      99             :   assert(MBB && "No basic block");
     100        2056 :   FixedBlockInfo *FBI = &BlockInfo[MBB->getNumber()];
     101        2056 :   if (FBI->hasResources())
     102             :     return FBI;
     103             : 
     104             :   // Compute resource usage in the block.
     105        1019 :   FBI->HasCalls = false;
     106             :   unsigned InstrCount = 0;
     107             : 
     108             :   // Add up per-processor resource cycles as well.
     109             :   unsigned PRKinds = SchedModel.getNumProcResourceKinds();
     110        2038 :   SmallVector<unsigned, 32> PRCycles(PRKinds);
     111             : 
     112       12771 :   for (const auto &MI : *MBB) {
     113        5126 :     if (MI.isTransient())
     114        5126 :       continue;
     115        5607 :     ++InstrCount;
     116        5607 :     if (MI.isCall())
     117         142 :       FBI->HasCalls = true;
     118             : 
     119             :     // Count processor resources used.
     120        5607 :     if (!SchedModel.hasInstrSchedModel())
     121         952 :       continue;
     122        4655 :     const MCSchedClassDesc *SC = SchedModel.resolveSchedClass(&MI);
     123        4655 :     if (!SC->isValid())
     124          74 :       continue;
     125             : 
     126       18426 :     for (TargetSchedModel::ProcResIter
     127        4581 :          PI = SchedModel.getWriteProcResBegin(SC),
     128       23007 :          PE = SchedModel.getWriteProcResEnd(SC); PI != PE; ++PI) {
     129             :       assert(PI->ProcResourceIdx < PRKinds && "Bad processor resource kind");
     130       36852 :       PRCycles[PI->ProcResourceIdx] += PI->Cycles;
     131             :     }
     132             :   }
     133        1019 :   FBI->InstrCount = InstrCount;
     134             : 
     135             :   // Scale the resource cycles so they are comparable.
     136        1019 :   unsigned PROffset = MBB->getNumber() * PRKinds;
     137       24861 :   for (unsigned K = 0; K != PRKinds; ++K)
     138       23842 :     ProcResourceCycles[PROffset + K] =
     139       35763 :       PRCycles[K] * SchedModel.getResourceFactor(K);
     140             : 
     141             :   return FBI;
     142             : }
     143             : 
     144             : ArrayRef<unsigned>
     145       10359 : MachineTraceMetrics::getProcResourceCycles(unsigned MBBNum) const {
     146             :   assert(BlockInfo[MBBNum].hasResources() &&
     147             :          "getResources() must be called before getProcResourceCycles()");
     148             :   unsigned PRKinds = SchedModel.getNumProcResourceKinds();
     149             :   assert((MBBNum+1) * PRKinds <= ProcResourceCycles.size());
     150       10359 :   return makeArrayRef(ProcResourceCycles.data() + MBBNum * PRKinds, PRKinds);
     151             : }
     152             : 
     153             : //===----------------------------------------------------------------------===//
     154             : //                         Ensemble utility functions
     155             : //===----------------------------------------------------------------------===//
     156             : 
     157      106893 : MachineTraceMetrics::Ensemble::Ensemble(MachineTraceMetrics *ct)
     158      213786 :   : MTM(*ct) {
     159      213786 :   BlockInfo.resize(MTM.BlockInfo.size());
     160      106893 :   unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
     161      213786 :   ProcResourceDepths.resize(MTM.BlockInfo.size() * PRKinds);
     162      213786 :   ProcResourceHeights.resize(MTM.BlockInfo.size() * PRKinds);
     163      106893 : }
     164             : 
     165             : // Virtual destructor serves as an anchor.
     166             : MachineTraceMetrics::Ensemble::~Ensemble() = default;
     167             : 
     168             : const MachineLoop*
     169        1686 : MachineTraceMetrics::Ensemble::getLoopFor(const MachineBasicBlock *MBB) const {
     170        3372 :   return MTM.Loops->getLoopFor(MBB);
     171             : }
     172             : 
     173             : // Update resource-related information in the TraceBlockInfo for MBB.
     174             : // Only update resources related to the trace above MBB.
     175         881 : void MachineTraceMetrics::Ensemble::
     176             : computeDepthResources(const MachineBasicBlock *MBB) {
     177         881 :   TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()];
     178         881 :   unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
     179         881 :   unsigned PROffset = MBB->getNumber() * PRKinds;
     180             : 
     181             :   // Compute resources from trace above. The top block is simple.
     182         881 :   if (!TBI->Pred) {
     183         676 :     TBI->InstrDepth = 0;
     184         676 :     TBI->Head = MBB->getNumber();
     185         676 :     std::fill(ProcResourceDepths.begin() + PROffset,
     186         676 :               ProcResourceDepths.begin() + PROffset + PRKinds, 0);
     187         676 :     return;
     188             :   }
     189             : 
     190             :   // Compute from the block above. A post-order traversal ensures the
     191             :   // predecessor is always computed first.
     192         205 :   unsigned PredNum = TBI->Pred->getNumber();
     193         205 :   TraceBlockInfo *PredTBI = &BlockInfo[PredNum];
     194             :   assert(PredTBI->hasValidDepth() && "Trace above has not been computed yet");
     195         205 :   const FixedBlockInfo *PredFBI = MTM.getResources(TBI->Pred);
     196         205 :   TBI->InstrDepth = PredTBI->InstrDepth + PredFBI->InstrCount;
     197         205 :   TBI->Head = PredTBI->Head;
     198             : 
     199             :   // Compute per-resource depths.
     200         205 :   ArrayRef<unsigned> PredPRDepths = getProcResourceDepths(PredNum);
     201         205 :   ArrayRef<unsigned> PredPRCycles = MTM.getProcResourceCycles(PredNum);
     202        1653 :   for (unsigned K = 0; K != PRKinds; ++K)
     203        2896 :     ProcResourceDepths[PROffset + K] = PredPRDepths[K] + PredPRCycles[K];
     204             : }
     205             : 
     206             : // Update resource-related information in the TraceBlockInfo for MBB.
     207             : // Only update resources related to the trace below MBB.
     208         984 : void MachineTraceMetrics::Ensemble::
     209             : computeHeightResources(const MachineBasicBlock *MBB) {
     210         984 :   TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()];
     211         984 :   unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
     212         984 :   unsigned PROffset = MBB->getNumber() * PRKinds;
     213             : 
     214             :   // Compute resources for the current block.
     215         984 :   TBI->InstrHeight = MTM.getResources(MBB)->InstrCount;
     216         984 :   ArrayRef<unsigned> PRCycles = MTM.getProcResourceCycles(MBB->getNumber());
     217             : 
     218             :   // The trace tail is done.
     219         984 :   if (!TBI->Succ) {
     220         750 :     TBI->Tail = MBB->getNumber();
     221         750 :     std::copy(PRCycles.begin(), PRCycles.end(),
     222         750 :               ProcResourceHeights.begin() + PROffset);
     223         750 :     return;
     224             :   }
     225             : 
     226             :   // Compute from the block below. A post-order traversal ensures the
     227             :   // predecessor is always computed first.
     228         234 :   unsigned SuccNum = TBI->Succ->getNumber();
     229         234 :   TraceBlockInfo *SuccTBI = &BlockInfo[SuccNum];
     230             :   assert(SuccTBI->hasValidHeight() && "Trace below has not been computed yet");
     231         234 :   TBI->InstrHeight += SuccTBI->InstrHeight;
     232         234 :   TBI->Tail = SuccTBI->Tail;
     233             : 
     234             :   // Compute per-resource heights.
     235         234 :   ArrayRef<unsigned> SuccPRHeights = getProcResourceHeights(SuccNum);
     236        3178 :   for (unsigned K = 0; K != PRKinds; ++K)
     237        5888 :     ProcResourceHeights[PROffset + K] = SuccPRHeights[K] + PRCycles[K];
     238             : }
     239             : 
     240             : // Check if depth resources for MBB are valid and return the TBI.
     241             : // Return NULL if the resources have been invalidated.
     242             : const MachineTraceMetrics::TraceBlockInfo*
     243         267 : MachineTraceMetrics::Ensemble::
     244             : getDepthResources(const MachineBasicBlock *MBB) const {
     245         267 :   const TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()];
     246         267 :   return TBI->hasValidDepth() ? TBI : nullptr;
     247             : }
     248             : 
     249             : // Check if height resources for MBB are valid and return the TBI.
     250             : // Return NULL if the resources have been invalidated.
     251             : const MachineTraceMetrics::TraceBlockInfo*
     252         337 : MachineTraceMetrics::Ensemble::
     253             : getHeightResources(const MachineBasicBlock *MBB) const {
     254         337 :   const TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()];
     255         337 :   return TBI->hasValidHeight() ? TBI : nullptr;
     256             : }
     257             : 
     258             : /// Get an array of processor resource depths for MBB. Indexed by processor
     259             : /// resource kind, this array contains the scaled processor resources consumed
     260             : /// by all blocks preceding MBB in its trace. It does not include instructions
     261             : /// in MBB.
     262             : ///
     263             : /// Compare TraceBlockInfo::InstrDepth.
     264             : ArrayRef<unsigned>
     265         960 : MachineTraceMetrics::Ensemble::
     266             : getProcResourceDepths(unsigned MBBNum) const {
     267         960 :   unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
     268             :   assert((MBBNum+1) * PRKinds <= ProcResourceDepths.size());
     269         960 :   return makeArrayRef(ProcResourceDepths.data() + MBBNum * PRKinds, PRKinds);
     270             : }
     271             : 
     272             : /// Get an array of processor resource heights for MBB. Indexed by processor
     273             : /// resource kind, this array contains the scaled processor resources consumed
     274             : /// by this block and all blocks following it in its trace.
     275             : ///
     276             : /// Compare TraceBlockInfo::InstrHeight.
     277             : ArrayRef<unsigned>
     278         970 : MachineTraceMetrics::Ensemble::
     279             : getProcResourceHeights(unsigned MBBNum) const {
     280         970 :   unsigned PRKinds = MTM.SchedModel.getNumProcResourceKinds();
     281             :   assert((MBBNum+1) * PRKinds <= ProcResourceHeights.size());
     282         970 :   return makeArrayRef(ProcResourceHeights.data() + MBBNum * PRKinds, PRKinds);
     283             : }
     284             : 
     285             : //===----------------------------------------------------------------------===//
     286             : //                         Trace Selection Strategies
     287             : //===----------------------------------------------------------------------===//
     288             : //
     289             : // A trace selection strategy is implemented as a sub-class of Ensemble. The
     290             : // trace through a block B is computed by two DFS traversals of the CFG
     291             : // starting from B. One upwards, and one downwards. During the upwards DFS,
     292             : // pickTracePred() is called on the post-ordered blocks. During the downwards
     293             : // DFS, pickTraceSucc() is called in a post-order.
     294             : //
     295             : 
     296             : // We never allow traces that leave loops, but we do allow traces to enter
     297             : // nested loops. We also never allow traces to contain back-edges.
     298             : //
     299             : // This means that a loop header can never appear above the center block of a
     300             : // trace, except as the trace head. Below the center block, loop exiting edges
     301             : // are banned.
     302             : //
     303             : // Return true if an edge from the From loop to the To loop is leaving a loop.
     304             : // Either of To and From can be null.
     305             : static bool isExitingLoop(const MachineLoop *From, const MachineLoop *To) {
     306         906 :   return From && !From->contains(To);
     307             : }
     308             : 
     309             : // MinInstrCountEnsemble - Pick the trace that executes the least number of
     310             : // instructions.
     311             : namespace {
     312             : 
     313      106893 : class MinInstrCountEnsemble : public MachineTraceMetrics::Ensemble {
     314           0 :   const char *getName() const override { return "MinInstr"; }
     315             :   const MachineBasicBlock *pickTracePred(const MachineBasicBlock*) override;
     316             :   const MachineBasicBlock *pickTraceSucc(const MachineBasicBlock*) override;
     317             : 
     318             : public:
     319             :   MinInstrCountEnsemble(MachineTraceMetrics *mtm)
     320      106893 :     : MachineTraceMetrics::Ensemble(mtm) {}
     321             : };
     322             : 
     323             : } // end anonymous namespace
     324             : 
     325             : // Select the preferred predecessor for MBB.
     326             : const MachineBasicBlock*
     327         881 : MinInstrCountEnsemble::pickTracePred(const MachineBasicBlock *MBB) {
     328         881 :   if (MBB->pred_empty())
     329             :     return nullptr;
     330         227 :   const MachineLoop *CurLoop = getLoopFor(MBB);
     331             :   // Don't leave loops, and never follow back-edges.
     332         299 :   if (CurLoop && MBB == CurLoop->getHeader())
     333             :     return nullptr;
     334         205 :   unsigned CurCount = MTM.getResources(MBB)->InstrCount;
     335             :   const MachineBasicBlock *Best = nullptr;
     336             :   unsigned BestDepth = 0;
     337         472 :   for (const MachineBasicBlock *Pred : MBB->predecessors()) {
     338             :     const MachineTraceMetrics::TraceBlockInfo *PredTBI =
     339         267 :       getDepthResources(Pred);
     340             :     // Ignore cycles that aren't natural loops.
     341         267 :     if (!PredTBI)
     342           1 :       continue;
     343             :     // Pick the predecessor that would give this block the smallest InstrDepth.
     344         266 :     unsigned Depth = PredTBI->InstrDepth + CurCount;
     345         266 :     if (!Best || Depth < BestDepth) {
     346             :       Best = Pred;
     347             :       BestDepth = Depth;
     348             :     }
     349             :   }
     350             :   return Best;
     351             : }
     352             : 
     353             : // Select the preferred successor for MBB.
     354             : const MachineBasicBlock*
     355         984 : MinInstrCountEnsemble::pickTraceSucc(const MachineBasicBlock *MBB) {
     356         984 :   if (MBB->pred_empty())
     357             :     return nullptr;
     358         353 :   const MachineLoop *CurLoop = getLoopFor(MBB);
     359             :   const MachineBasicBlock *Best = nullptr;
     360             :   unsigned BestHeight = 0;
     361         783 :   for (const MachineBasicBlock *Succ : MBB->successors()) {
     362             :     // Don't consider back-edges.
     363         658 :     if (CurLoop && Succ == CurLoop->getHeader())
     364          42 :       continue;
     365             :     // Don't consider successors exiting CurLoop.
     366         439 :     if (isExitingLoop(CurLoop, getLoopFor(Succ)))
     367          51 :       continue;
     368             :     const MachineTraceMetrics::TraceBlockInfo *SuccTBI =
     369         337 :       getHeightResources(Succ);
     370             :     // Ignore cycles that aren't natural loops.
     371         337 :     if (!SuccTBI)
     372           1 :       continue;
     373             :     // Pick the successor that would give this block the smallest InstrHeight.
     374         336 :     unsigned Height = SuccTBI->InstrHeight;
     375         336 :     if (!Best || Height < BestHeight) {
     376             :       Best = Succ;
     377             :       BestHeight = Height;
     378             :     }
     379             :   }
     380             :   return Best;
     381             : }
     382             : 
     383             : // Get an Ensemble sub-class for the requested trace strategy.
     384             : MachineTraceMetrics::Ensemble *
     385      106921 : MachineTraceMetrics::getEnsemble(MachineTraceMetrics::Strategy strategy) {
     386             :   assert(strategy < TS_NumStrategies && "Invalid trace strategy enum");
     387      106921 :   Ensemble *&E = Ensembles[strategy];
     388      106921 :   if (E)
     389             :     return E;
     390             : 
     391             :   // Allocate new Ensemble on demand.
     392      106893 :   switch (strategy) {
     393      213786 :   case TS_MinInstrCount: return (E = new MinInstrCountEnsemble(this));
     394           0 :   default: llvm_unreachable("Invalid trace strategy enum");
     395             :   }
     396             : }
     397             : 
     398         396 : void MachineTraceMetrics::invalidate(const MachineBasicBlock *MBB) {
     399             :   DEBUG(dbgs() << "Invalidate traces through " << printMBBReference(*MBB)
     400             :                << '\n');
     401         396 :   BlockInfo[MBB->getNumber()].invalidate();
     402         792 :   for (unsigned i = 0; i != TS_NumStrategies; ++i)
     403         396 :     if (Ensembles[i])
     404         256 :       Ensembles[i]->invalidate(MBB);
     405         396 : }
     406             : 
     407        1440 : void MachineTraceMetrics::verifyAnalysis() const {
     408             :   if (!MF)
     409             :     return;
     410             : #ifndef NDEBUG
     411             :   assert(BlockInfo.size() == MF->getNumBlockIDs() && "Outdated BlockInfo size");
     412             :   for (unsigned i = 0; i != TS_NumStrategies; ++i)
     413             :     if (Ensembles[i])
     414             :       Ensembles[i]->verify();
     415             : #endif
     416             : }
     417             : 
     418             : //===----------------------------------------------------------------------===//
     419             : //                               Trace building
     420             : //===----------------------------------------------------------------------===//
     421             : //
     422             : // Traces are built by two CFG traversals. To avoid recomputing too much, use a
     423             : // set abstraction that confines the search to the current loop, and doesn't
     424             : // revisit blocks.
     425             : 
     426             : namespace {
     427             : 
     428             : struct LoopBounds {
     429             :   MutableArrayRef<MachineTraceMetrics::TraceBlockInfo> Blocks;
     430             :   SmallPtrSet<const MachineBasicBlock*, 8> Visited;
     431             :   const MachineLoopInfo *Loops;
     432             :   bool Downward = false;
     433             : 
     434             :   LoopBounds(MutableArrayRef<MachineTraceMetrics::TraceBlockInfo> blocks,
     435        1580 :              const MachineLoopInfo *loops) : Blocks(blocks), Loops(loops) {}
     436             : };
     437             : 
     438             : } // end anonymous namespace
     439             : 
     440             : // Specialize po_iterator_storage in order to prune the post-order traversal so
     441             : // it is limited to the current loop and doesn't traverse the loop back edges.
     442             : namespace llvm {
     443             : 
     444             : template<>
     445             : class po_iterator_storage<LoopBounds, true> {
     446             :   LoopBounds &LB;
     447             : 
     448             : public:
     449        3160 :   po_iterator_storage(LoopBounds &lb) : LB(lb) {}
     450             : 
     451             :   void finishPostorder(const MachineBasicBlock*) {}
     452             : 
     453        2413 :   bool insertEdge(Optional<const MachineBasicBlock *> From,
     454             :                   const MachineBasicBlock *To) {
     455             :     // Skip already visited To blocks.
     456        2413 :     MachineTraceMetrics::TraceBlockInfo &TBI = LB.Blocks[To->getNumber()];
     457        5932 :     if (LB.Downward ? TBI.hasValidHeight() : TBI.hasValidDepth())
     458             :       return false;
     459             :     // From is null once when To is the trace center block.
     460        1992 :     if (From) {
     461         775 :       if (const MachineLoop *FromLoop = LB.Loops->getLoopFor(*From)) {
     462             :         // Don't follow backedges, don't leave FromLoop when going upwards.
     463         514 :         if ((LB.Downward ? To : *From) == FromLoop->getHeader())
     464             :           return false;
     465             :         // Don't leave FromLoop.
     466         166 :         if (isExitingLoop(FromLoop, LB.Loops->getLoopFor(To)))
     467             :           return false;
     468             :       }
     469             :     }
     470             :     // To is a new block. Mark the block as visited in case the CFG has cycles
     471             :     // that MachineLoopInfo didn't recognize as a natural loop.
     472        1867 :     return LB.Visited.insert(To).second;
     473             :   }
     474             : };
     475             : 
     476             : } // end namespace llvm
     477             : 
     478             : /// Compute the trace through MBB.
     479         790 : void MachineTraceMetrics::Ensemble::computeTrace(const MachineBasicBlock *MBB) {
     480             :   DEBUG(dbgs() << "Computing " << getName() << " trace through "
     481             :                << printMBBReference(*MBB) << '\n');
     482             :   // Set up loop bounds for the backwards post-order traversal.
     483         790 :   LoopBounds Bounds(BlockInfo, MTM.Loops);
     484             : 
     485             :   // Run an upwards post-order search for the trace start.
     486             :   Bounds.Downward = false;
     487         790 :   Bounds.Visited.clear();
     488        4132 :   for (auto I : inverse_post_order_ext(MBB, Bounds)) {
     489             :     DEBUG(dbgs() << "  pred for " << printMBBReference(*I) << ": ");
     490         881 :     TraceBlockInfo &TBI = BlockInfo[I->getNumber()];
     491             :     // All the predecessors have been visited, pick the preferred one.
     492         881 :     TBI.Pred = pickTracePred(I);
     493             :     DEBUG({
     494             :       if (TBI.Pred)
     495             :         dbgs() << printMBBReference(*TBI.Pred) << '\n';
     496             :       else
     497             :         dbgs() << "null\n";
     498             :     });
     499             :     // The trace leading to I is now known, compute the depth resources.
     500         881 :     computeDepthResources(I);
     501             :   }
     502             : 
     503             :   // Run a downwards post-order search for the trace end.
     504         790 :   Bounds.Downward = true;
     505         790 :   Bounds.Visited.clear();
     506        4338 :   for (auto I : post_order_ext(MBB, Bounds)) {
     507             :     DEBUG(dbgs() << "  succ for " << printMBBReference(*I) << ": ");
     508         984 :     TraceBlockInfo &TBI = BlockInfo[I->getNumber()];
     509             :     // All the successors have been visited, pick the preferred one.
     510         984 :     TBI.Succ = pickTraceSucc(I);
     511             :     DEBUG({
     512             :       if (TBI.Succ)
     513             :         dbgs() << printMBBReference(*TBI.Succ) << '\n';
     514             :       else
     515             :         dbgs() << "null\n";
     516             :     });
     517             :     // The trace leaving I is now known, compute the height resources.
     518         984 :     computeHeightResources(I);
     519             :   }
     520         790 : }
     521             : 
     522             : /// Invalidate traces through BadMBB.
     523             : void
     524        2256 : MachineTraceMetrics::Ensemble::invalidate(const MachineBasicBlock *BadMBB) {
     525             :   SmallVector<const MachineBasicBlock*, 16> WorkList;
     526        2256 :   TraceBlockInfo &BadTBI = BlockInfo[BadMBB->getNumber()];
     527             : 
     528             :   // Invalidate height resources of blocks above MBB.
     529        2256 :   if (BadTBI.hasValidHeight()) {
     530             :     BadTBI.invalidateHeight();
     531         413 :     WorkList.push_back(BadMBB);
     532             :     do {
     533             :       const MachineBasicBlock *MBB = WorkList.pop_back_val();
     534             :       DEBUG(dbgs() << "Invalidate " << printMBBReference(*MBB) << ' '
     535             :                    << getName() << " height.\n");
     536             :       // Find any MBB predecessors that have MBB as their preferred successor.
     537             :       // They are the only ones that need to be invalidated.
     538         639 :       for (const MachineBasicBlock *Pred : MBB->predecessors()) {
     539         177 :         TraceBlockInfo &TBI = BlockInfo[Pred->getNumber()];
     540         177 :         if (!TBI.hasValidHeight())
     541         122 :           continue;
     542         104 :         if (TBI.Succ == MBB) {
     543             :           TBI.invalidateHeight();
     544          49 :           WorkList.push_back(Pred);
     545          49 :           continue;
     546             :         }
     547             :         // Verify that TBI.Succ is actually a *I successor.
     548             :         assert((!TBI.Succ || Pred->isSuccessor(TBI.Succ)) && "CFG changed");
     549             :       }
     550         462 :     } while (!WorkList.empty());
     551             :   }
     552             : 
     553             :   // Invalidate depth resources of blocks below MBB.
     554        2256 :   if (BadTBI.hasValidDepth()) {
     555             :     BadTBI.invalidateDepth();
     556         369 :     WorkList.push_back(BadMBB);
     557             :     do {
     558             :       const MachineBasicBlock *MBB = WorkList.pop_back_val();
     559             :       DEBUG(dbgs() << "Invalidate " << printMBBReference(*MBB) << ' '
     560             :                    << getName() << " depth.\n");
     561             :       // Find any MBB successors that have MBB as their preferred predecessor.
     562             :       // They are the only ones that need to be invalidated.
     563         643 :       for (const MachineBasicBlock *Succ : MBB->successors()) {
     564         181 :         TraceBlockInfo &TBI = BlockInfo[Succ->getNumber()];
     565         181 :         if (!TBI.hasValidDepth())
     566          78 :           continue;
     567         196 :         if (TBI.Pred == MBB) {
     568             :           TBI.invalidateDepth();
     569          93 :           WorkList.push_back(Succ);
     570          93 :           continue;
     571             :         }
     572             :         // Verify that TBI.Pred is actually a *I predecessor.
     573             :         assert((!TBI.Pred || Succ->isPredecessor(TBI.Pred)) && "CFG changed");
     574             :       }
     575         462 :     } while (!WorkList.empty());
     576             :   }
     577             : 
     578             :   // Clear any per-instruction data. We only have to do this for BadMBB itself
     579             :   // because the instructions in that block may change. Other blocks may be
     580             :   // invalidated, but their instructions will stay the same, so there is no
     581             :   // need to erase the Cycle entries. They will be overwritten when we
     582             :   // recompute.
     583      478843 :   for (const auto &I : *BadMBB)
     584      472075 :     Cycles.erase(&I);
     585        2256 : }
     586             : 
     587           0 : void MachineTraceMetrics::Ensemble::verify() const {
     588             : #ifndef NDEBUG
     589             :   assert(BlockInfo.size() == MTM.MF->getNumBlockIDs() &&
     590             :          "Outdated BlockInfo size");
     591             :   for (unsigned Num = 0, e = BlockInfo.size(); Num != e; ++Num) {
     592             :     const TraceBlockInfo &TBI = BlockInfo[Num];
     593             :     if (TBI.hasValidDepth() && TBI.Pred) {
     594             :       const MachineBasicBlock *MBB = MTM.MF->getBlockNumbered(Num);
     595             :       assert(MBB->isPredecessor(TBI.Pred) && "CFG doesn't match trace");
     596             :       assert(BlockInfo[TBI.Pred->getNumber()].hasValidDepth() &&
     597             :              "Trace is broken, depth should have been invalidated.");
     598             :       const MachineLoop *Loop = getLoopFor(MBB);
     599             :       assert(!(Loop && MBB == Loop->getHeader()) && "Trace contains backedge");
     600             :     }
     601             :     if (TBI.hasValidHeight() && TBI.Succ) {
     602             :       const MachineBasicBlock *MBB = MTM.MF->getBlockNumbered(Num);
     603             :       assert(MBB->isSuccessor(TBI.Succ) && "CFG doesn't match trace");
     604             :       assert(BlockInfo[TBI.Succ->getNumber()].hasValidHeight() &&
     605             :              "Trace is broken, height should have been invalidated.");
     606             :       const MachineLoop *Loop = getLoopFor(MBB);
     607             :       const MachineLoop *SuccLoop = getLoopFor(TBI.Succ);
     608             :       assert(!(Loop && Loop == SuccLoop && TBI.Succ == Loop->getHeader()) &&
     609             :              "Trace contains backedge");
     610             :     }
     611             :   }
     612             : #endif
     613           0 : }
     614             : 
     615             : //===----------------------------------------------------------------------===//
     616             : //                             Data Dependencies
     617             : //===----------------------------------------------------------------------===//
     618             : //
     619             : // Compute the depth and height of each instruction based on data dependencies
     620             : // and instruction latencies. These cycle numbers assume that the CPU can issue
     621             : // an infinite number of instructions per cycle as long as their dependencies
     622             : // are ready.
     623             : 
     624             : // A data dependency is represented as a defining MI and operand numbers on the
     625             : // defining and using MI.
     626             : namespace {
     627             : 
     628             : struct DataDep {
     629             :   const MachineInstr *DefMI;
     630             :   unsigned DefOp;
     631             :   unsigned UseOp;
     632             : 
     633             :   DataDep(const MachineInstr *DefMI, unsigned DefOp, unsigned UseOp)
     634        1220 :     : DefMI(DefMI), DefOp(DefOp), UseOp(UseOp) {}
     635             : 
     636             :   /// Create a DataDep from an SSA form virtual register.
     637             :   DataDep(const MachineRegisterInfo *MRI, unsigned VirtReg, unsigned UseOp)
     638       20669 :     : UseOp(UseOp) {
     639             :     assert(TargetRegisterInfo::isVirtualRegister(VirtReg));
     640       20669 :     MachineRegisterInfo::def_iterator DefI = MRI->def_begin(VirtReg);
     641             :     assert(!DefI.atEnd() && "Register has no defs");
     642       20669 :     DefMI = DefI->getParent();
     643       20669 :     DefOp = DefI.getOperandNo();
     644             :     assert((++DefI).atEnd() && "Register has multiple defs");
     645             :   }
     646             : };
     647             : 
     648             : } // end anonymous namespace
     649             : 
     650             : // Get the input data dependencies that must be ready before UseMI can issue.
     651             : // Return true if UseMI has any physreg operands.
     652       20501 : static bool getDataDeps(const MachineInstr &UseMI,
     653             :                         SmallVectorImpl<DataDep> &Deps,
     654             :                         const MachineRegisterInfo *MRI) {
     655             :   // Debug values should not be included in any calculations.
     656       20501 :   if (UseMI.isDebugValue())
     657             :     return false;
     658             :   
     659             :   bool HasPhysRegs = false;
     660       77094 :   for (MachineInstr::const_mop_iterator I = UseMI.operands_begin(),
     661       97489 :        E = UseMI.operands_end(); I != E; ++I) {
     662             :     const MachineOperand &MO = *I;
     663       56699 :     if (!MO.isReg())
     664        7047 :       continue;
     665       49652 :     unsigned Reg = MO.getReg();
     666       49652 :     if (!Reg)
     667         433 :       continue;
     668       49219 :     if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
     669             :       HasPhysRegs = true;
     670       12687 :       continue;
     671             :     }
     672             :     // Collect virtual register reads.
     673             :     if (MO.readsReg())
     674       40726 :       Deps.push_back(DataDep(MRI, Reg, UseMI.getOperandNo(I)));
     675             :   }
     676             :   return HasPhysRegs;
     677             : }
     678             : 
     679             : // Get the input data dependencies of a PHI instruction, using Pred as the
     680             : // preferred predecessor.
     681             : // This will add at most one dependency to Deps.
     682         349 : static void getPHIDeps(const MachineInstr &UseMI,
     683             :                        SmallVectorImpl<DataDep> &Deps,
     684             :                        const MachineBasicBlock *Pred,
     685             :                        const MachineRegisterInfo *MRI) {
     686             :   // No predecessor at the beginning of a trace. Ignore dependencies.
     687         349 :   if (!Pred)
     688             :     return;
     689             :   assert(UseMI.isPHI() && UseMI.getNumOperands() % 2 && "Bad PHI");
     690         794 :   for (unsigned i = 1; i != UseMI.getNumOperands(); i += 2) {
     691        1100 :     if (UseMI.getOperand(i + 1).getMBB() == Pred) {
     692         306 :       unsigned Reg = UseMI.getOperand(i).getReg();
     693         612 :       Deps.push_back(DataDep(MRI, Reg, i));
     694         306 :       return;
     695             :     }
     696             :   }
     697             : }
     698             : 
     699             : // Identify physreg dependencies for UseMI, and update the live regunit
     700             : // tracking set when scanning instructions downwards.
     701        5159 : static void updatePhysDepsDownwards(const MachineInstr *UseMI,
     702             :                                     SmallVectorImpl<DataDep> &Deps,
     703             :                                     SparseSet<LiveRegUnit> &RegUnits,
     704             :                                     const TargetRegisterInfo *TRI) {
     705             :   SmallVector<unsigned, 8> Kills;
     706             :   SmallVector<unsigned, 8> LiveDefOps;
     707             : 
     708       19183 :   for (MachineInstr::const_mop_iterator MI = UseMI->operands_begin(),
     709       24342 :        ME = UseMI->operands_end(); MI != ME; ++MI) {
     710             :     const MachineOperand &MO = *MI;
     711       14024 :     if (!MO.isReg())
     712       11493 :       continue;
     713       12073 :     unsigned Reg = MO.getReg();
     714       12073 :     if (!TargetRegisterInfo::isPhysicalRegister(Reg))
     715        5357 :       continue;
     716             :     // Track live defs and kills for updating RegUnits.
     717        6716 :     if (MO.isDef()) {
     718        2233 :       if (MO.isDead())
     719         977 :         Kills.push_back(Reg);
     720             :       else
     721        1256 :         LiveDefOps.push_back(UseMI->getOperandNo(MI));
     722        4483 :     } else if (MO.isKill())
     723           1 :       Kills.push_back(Reg);
     724             :     // Identify dependencies.
     725        2234 :     if (!MO.readsReg())
     726        2234 :       continue;
     727       12382 :     for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {
     728             :       SparseSet<LiveRegUnit>::iterator I = RegUnits.find(*Units);
     729        4638 :       if (I == RegUnits.end())
     730             :         continue;
     731        3660 :       Deps.push_back(DataDep(I->MI, I->Op, UseMI->getOperandNo(MI)));
     732        1220 :       break;
     733             :     }
     734             :   }
     735             : 
     736             :   // Update RegUnits to reflect live registers after UseMI.
     737             :   // First kills.
     738        7115 :   for (unsigned Kill : Kills)
     739        2934 :     for (MCRegUnitIterator Units(Kill, TRI); Units.isValid(); ++Units)
     740         978 :       RegUnits.erase(*Units);
     741             : 
     742             :   // Second, live defs.
     743        7671 :   for (unsigned DefOp : LiveDefOps) {
     744        2512 :     for (MCRegUnitIterator Units(UseMI->getOperand(DefOp).getReg(), TRI);
     745        2622 :          Units.isValid(); ++Units) {
     746             :       LiveRegUnit &LRU = RegUnits[*Units];
     747        1366 :       LRU.MI = UseMI;
     748        1366 :       LRU.Op = DefOp;
     749             :     }
     750             :   }
     751        5159 : }
     752             : 
     753             : /// The length of the critical path through a trace is the maximum of two path
     754             : /// lengths:
     755             : ///
     756             : /// 1. The maximum height+depth over all instructions in the trace center block.
     757             : ///
     758             : /// 2. The longest cross-block dependency chain. For small blocks, it is
     759             : ///    possible that the critical path through the trace doesn't include any
     760             : ///    instructions in the block.
     761             : ///
     762             : /// This function computes the second number from the live-in list of the
     763             : /// center block.
     764         792 : unsigned MachineTraceMetrics::Ensemble::
     765             : computeCrossBlockCriticalPath(const TraceBlockInfo &TBI) {
     766             :   assert(TBI.HasValidInstrDepths && "Missing depth info");
     767             :   assert(TBI.HasValidInstrHeights && "Missing height info");
     768         792 :   unsigned MaxLen = 0;
     769        6644 :   for (const LiveInReg &LIR : TBI.LiveIns) {
     770        5852 :     if (!TargetRegisterInfo::isVirtualRegister(LIR.Reg))
     771        5520 :       continue;
     772         173 :     const MachineInstr *DefMI = MTM.MRI->getVRegDef(LIR.Reg);
     773             :     // Ignore dependencies outside the current trace.
     774         173 :     const TraceBlockInfo &DefTBI = BlockInfo[DefMI->getParent()->getNumber()];
     775          14 :     if (!DefTBI.isUsefulDominator(TBI))
     776          14 :       continue;
     777         318 :     unsigned Len = LIR.Height + Cycles[DefMI].Depth;
     778         159 :     MaxLen = std::max(MaxLen, Len);
     779             :   }
     780         792 :   return MaxLen;
     781             : }
     782             : 
     783       10786 : void MachineTraceMetrics::Ensemble::
     784             : updateDepth(MachineTraceMetrics::TraceBlockInfo &TBI, const MachineInstr &UseMI,
     785             :             SparseSet<LiveRegUnit> &RegUnits) {
     786             :   SmallVector<DataDep, 8> Deps;
     787             :   // Collect all data dependencies.
     788             :   if (UseMI.isPHI())
     789         101 :     getPHIDeps(UseMI, Deps, TBI.Pred, MTM.MRI);
     790       10685 :   else if (getDataDeps(UseMI, Deps, MTM.MRI))
     791        5159 :     updatePhysDepsDownwards(&UseMI, Deps, RegUnits, MTM.TRI);
     792             : 
     793             :   // Filter and process dependencies, computing the earliest issue cycle.
     794       10786 :   unsigned Cycle = 0;
     795       34606 :   for (const DataDep &Dep : Deps) {
     796             :     const TraceBlockInfo&DepTBI =
     797       11910 :       BlockInfo[Dep.DefMI->getParent()->getNumber()];
     798             :     // Ignore dependencies from outside the current trace.
     799          27 :     if (!DepTBI.isUsefulDominator(TBI))
     800          27 :       continue;
     801             :     assert(DepTBI.HasValidInstrDepths && "Inconsistent dependency");
     802       11883 :     unsigned DepCycle = Cycles.lookup(Dep.DefMI).Depth;
     803             :     // Add latency if DefMI is a real instruction. Transients get latency 0.
     804       11883 :     if (!Dep.DefMI->isTransient())
     805       10832 :       DepCycle += MTM.SchedModel
     806        5416 :         .computeOperandLatency(Dep.DefMI, Dep.DefOp, &UseMI, Dep.UseOp);
     807       11883 :     Cycle = std::max(Cycle, DepCycle);
     808             :   }
     809             :   // Remember the instruction depth.
     810       21572 :   InstrCycles &MICycles = Cycles[&UseMI];
     811       10786 :   MICycles.Depth = Cycle;
     812             : 
     813       10786 :   if (TBI.HasValidInstrHeights) {
     814             :     // Update critical path length.
     815        1524 :     TBI.CriticalPath = std::max(TBI.CriticalPath, Cycle + MICycles.Height);
     816             :     DEBUG(dbgs() << TBI.CriticalPath << '\t' << Cycle << '\t' << UseMI);
     817             :   } else {
     818             :     DEBUG(dbgs() << Cycle << '\t' << UseMI);
     819             :   }
     820       10786 : }
     821             : 
     822         492 : void MachineTraceMetrics::Ensemble::
     823             : updateDepth(const MachineBasicBlock *MBB, const MachineInstr &UseMI,
     824             :             SparseSet<LiveRegUnit> &RegUnits) {
     825         984 :   updateDepth(BlockInfo[MBB->getNumber()], UseMI, RegUnits);
     826         492 : }
     827             : 
     828          68 : void MachineTraceMetrics::Ensemble::
     829             : updateDepths(MachineBasicBlock::iterator Start,
     830             :              MachineBasicBlock::iterator End,
     831             :              SparseSet<LiveRegUnit> &RegUnits) {
     832         334 :     for (; Start != End; Start++)
     833         266 :       updateDepth(Start->getParent(), *Start, RegUnits);
     834          68 : }
     835             : 
     836             : /// Compute instruction depths for all instructions above or in MBB in its
     837             : /// trace. This assumes that the trace through MBB has already been computed.
     838         777 : void MachineTraceMetrics::Ensemble::
     839             : computeInstrDepths(const MachineBasicBlock *MBB) {
     840             :   // The top of the trace may already be computed, and HasValidInstrDepths
     841             :   // implies Head->HasValidInstrDepths, so we only need to start from the first
     842             :   // block in the trace that needs to be recomputed.
     843             :   SmallVector<const MachineBasicBlock*, 8> Stack;
     844             :   do {
     845         961 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
     846             :     assert(TBI.hasValidDepth() && "Incomplete trace");
     847         961 :     if (TBI.HasValidInstrDepths)
     848             :       break;
     849         858 :     Stack.push_back(MBB);
     850         858 :     MBB = TBI.Pred;
     851         858 :   } while (MBB);
     852             : 
     853             :   // FIXME: If MBB is non-null at this point, it is the last pre-computed block
     854             :   // in the trace. We should track any live-out physregs that were defined in
     855             :   // the trace. This is quite rare in SSA form, typically created by CSE
     856             :   // hoisting a compare.
     857         777 :   SparseSet<LiveRegUnit> RegUnits;
     858         777 :   RegUnits.setUniverse(MTM.TRI->getNumRegUnits());
     859             : 
     860             :   // Go through trace blocks in top-down order, stopping after the center block.
     861        2493 :   while (!Stack.empty()) {
     862         858 :     MBB = Stack.pop_back_val();
     863             :     DEBUG(dbgs() << "\nDepths for " << printMBBReference(*MBB) << ":\n");
     864         858 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
     865         858 :     TBI.HasValidInstrDepths = true;
     866         858 :     TBI.CriticalPath = 0;
     867             : 
     868             :     // Print out resource depths here as well.
     869             :     DEBUG({
     870             :       dbgs() << format("%7u Instructions\n", TBI.InstrDepth);
     871             :       ArrayRef<unsigned> PRDepths = getProcResourceDepths(MBB->getNumber());
     872             :       for (unsigned K = 0; K != PRDepths.size(); ++K)
     873             :         if (PRDepths[K]) {
     874             :           unsigned Factor = MTM.SchedModel.getResourceFactor(K);
     875             :           dbgs() << format("%6uc @ ", MTM.getCycles(PRDepths[K]))
     876             :                  << MTM.SchedModel.getProcResource(K)->Name << " ("
     877             :                  << PRDepths[K]/Factor << " ops x" << Factor << ")\n";
     878             :         }
     879             :     });
     880             : 
     881             :     // Also compute the critical path length through MBB when possible.
     882         858 :     if (TBI.HasValidInstrHeights)
     883          49 :       TBI.CriticalPath = computeCrossBlockCriticalPath(TBI);
     884             : 
     885       12868 :     for (const auto &UseMI : *MBB) {
     886       10294 :       updateDepth(TBI, UseMI, RegUnits);
     887             :     }
     888             :   }
     889         777 : }
     890             : 
     891             : // Identify physreg dependencies for MI when scanning instructions upwards.
     892             : // Return the issue height of MI after considering any live regunits.
     893             : // Height is the issue height computed from virtual register dependencies alone.
     894        4805 : static unsigned updatePhysDepsUpwards(const MachineInstr &MI, unsigned Height,
     895             :                                       SparseSet<LiveRegUnit> &RegUnits,
     896             :                                       const TargetSchedModel &SchedModel,
     897             :                                       const TargetInstrInfo *TII,
     898             :                                       const TargetRegisterInfo *TRI) {
     899             :   SmallVector<unsigned, 8> ReadOps;
     900             : 
     901       17311 :   for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(),
     902        4805 :                                         MOE = MI.operands_end();
     903       17311 :        MOI != MOE; ++MOI) {
     904             :     const MachineOperand &MO = *MOI;
     905       12506 :     if (!MO.isReg())
     906             :       continue;
     907       10859 :     unsigned Reg = MO.getReg();
     908       10859 :     if (!TargetRegisterInfo::isPhysicalRegister(Reg))
     909             :       continue;
     910             :     if (MO.readsReg())
     911        4165 :       ReadOps.push_back(MI.getOperandNo(MOI));
     912        5971 :     if (!MO.isDef())
     913             :       continue;
     914             :     // This is a def of Reg. Remove corresponding entries from RegUnits, and
     915             :     // update MI Height to consider the physreg dependencies.
     916        5501 :     for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {
     917             :       SparseSet<LiveRegUnit>::iterator I = RegUnits.find(*Units);
     918        1891 :       if (I == RegUnits.end())
     919         470 :         continue;
     920        1421 :       unsigned DepHeight = I->Cycle;
     921             :       if (!MI.isTransient()) {
     922             :         // We may not know the UseMI of this dependency, if it came from the
     923             :         // live-in list. SchedModel can handle a NULL UseMI.
     924        1276 :         DepHeight += SchedModel.computeOperandLatency(&MI, MI.getOperandNo(MOI),
     925             :                                                       I->MI, I->Op);
     926             :       }
     927        1421 :       Height = std::max(Height, DepHeight);
     928             :       // This regunit is dead above MI.
     929             :       RegUnits.erase(I);
     930             :     }
     931             :   }
     932             : 
     933             :   // Now we know the height of MI. Update any regunits read.
     934        8970 :   for (unsigned i = 0, e = ReadOps.size(); i != e; ++i) {
     935       12495 :     unsigned Reg = MI.getOperand(ReadOps[i]).getReg();
     936       12729 :     for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) {
     937             :       LiveRegUnit &LRU = RegUnits[*Units];
     938             :       // Set the height to the highest reader of the unit.
     939        4399 :       if (LRU.Cycle <= Height && LRU.MI != &MI) {
     940        4392 :         LRU.Cycle = Height;
     941        4392 :         LRU.MI = &MI;
     942        4392 :         LRU.Op = ReadOps[i];
     943             :       }
     944             :     }
     945             :   }
     946             : 
     947        9610 :   return Height;
     948             : }
     949             : 
     950             : using MIHeightMap = DenseMap<const MachineInstr *, unsigned>;
     951             : 
     952             : // Push the height of DefMI upwards if required to match UseMI.
     953             : // Return true if this is the first time DefMI was seen.
     954        9870 : static bool pushDepHeight(const DataDep &Dep, const MachineInstr &UseMI,
     955             :                           unsigned UseHeight, MIHeightMap &Heights,
     956             :                           const TargetSchedModel &SchedModel,
     957             :                           const TargetInstrInfo *TII) {
     958             :   // Adjust height by Dep.DefMI latency.
     959        9870 :   if (!Dep.DefMI->isTransient())
     960        4444 :     UseHeight += SchedModel.computeOperandLatency(Dep.DefMI, Dep.DefOp, &UseMI,
     961        4444 :                                                   Dep.UseOp);
     962             : 
     963             :   // Update Heights[DefMI] to be the maximum height seen.
     964             :   MIHeightMap::iterator I;
     965             :   bool New;
     966       19740 :   std::tie(I, New) = Heights.insert(std::make_pair(Dep.DefMI, UseHeight));
     967        9870 :   if (New)
     968             :     return true;
     969             : 
     970             :   // DefMI has been pushed before. Give it the max height.
     971        1987 :   if (I->second < UseHeight)
     972         644 :     I->second = UseHeight;
     973             :   return false;
     974             : }
     975             : 
     976             : /// Assuming that the virtual register defined by DefMI:DefOp was used by
     977             : /// Trace.back(), add it to the live-in lists of all the blocks in Trace. Stop
     978             : /// when reaching the block that contains DefMI.
     979        7883 : void MachineTraceMetrics::Ensemble::
     980             : addLiveIns(const MachineInstr *DefMI, unsigned DefOp,
     981             :            ArrayRef<const MachineBasicBlock*> Trace) {
     982             :   assert(!Trace.empty() && "Trace should contain at least one block");
     983       15766 :   unsigned Reg = DefMI->getOperand(DefOp).getReg();
     984             :   assert(TargetRegisterInfo::isVirtualRegister(Reg));
     985        7883 :   const MachineBasicBlock *DefMBB = DefMI->getParent();
     986             : 
     987             :   // Reg is live-in to all blocks in Trace that follow DefMBB.
     988        8079 :   for (unsigned i = Trace.size(); i; --i) {
     989       15856 :     const MachineBasicBlock *MBB = Trace[i-1];
     990        7928 :     if (MBB == DefMBB)
     991             :       return;
     992         196 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
     993             :     // Just add the register. The height will be updated later.
     994         392 :     TBI.LiveIns.push_back(Reg);
     995             :   }
     996             : }
     997             : 
     998             : /// Compute instruction heights in the trace through MBB. This updates MBB and
     999             : /// the blocks below it in the trace. It is assumed that the trace has already
    1000             : /// been computed.
    1001         743 : void MachineTraceMetrics::Ensemble::
    1002             : computeInstrHeights(const MachineBasicBlock *MBB) {
    1003             :   // The bottom of the trace may already be computed.
    1004             :   // Find the blocks that need updating.
    1005             :   SmallVector<const MachineBasicBlock*, 8> Stack;
    1006             :   do {
    1007         854 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
    1008             :     assert(TBI.hasValidHeight() && "Incomplete trace");
    1009         854 :     if (TBI.HasValidInstrHeights)
    1010             :       break;
    1011         829 :     Stack.push_back(MBB);
    1012             :     TBI.LiveIns.clear();
    1013         829 :     MBB = TBI.Succ;
    1014         829 :   } while (MBB);
    1015             : 
    1016             :   // As we move upwards in the trace, keep track of instructions that are
    1017             :   // required by deeper trace instructions. Map MI -> height required so far.
    1018             :   MIHeightMap Heights;
    1019             : 
    1020             :   // For physregs, the def isn't known when we see the use.
    1021             :   // Instead, keep track of the highest use of each regunit.
    1022         743 :   SparseSet<LiveRegUnit> RegUnits;
    1023         743 :   RegUnits.setUniverse(MTM.TRI->getNumRegUnits());
    1024             : 
    1025             :   // If the bottom of the trace was already precomputed, initialize heights
    1026             :   // from its live-in list.
    1027             :   // MBB is the highest precomputed block in the trace.
    1028         743 :   if (MBB) {
    1029          25 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
    1030         113 :     for (LiveInReg &LI : TBI.LiveIns) {
    1031          88 :       if (TargetRegisterInfo::isVirtualRegister(LI.Reg)) {
    1032             :         // For virtual registers, the def latency is included.
    1033          44 :         unsigned &Height = Heights[MTM.MRI->getVRegDef(LI.Reg)];
    1034          22 :         if (Height < LI.Height)
    1035          16 :           Height = LI.Height;
    1036             :       } else {
    1037             :         // For register units, the def latency is not included because we don't
    1038             :         // know the def yet.
    1039          22 :         RegUnits[LI.Reg].Cycle = LI.Height;
    1040             :       }
    1041             :     }
    1042             :   }
    1043             : 
    1044             :   // Go through the trace blocks in bottom-up order.
    1045             :   SmallVector<DataDep, 8> Deps;
    1046        1572 :   for (;!Stack.empty(); Stack.pop_back()) {
    1047         829 :     MBB = Stack.back();
    1048             :     DEBUG(dbgs() << "Heights for " << printMBBReference(*MBB) << ":\n");
    1049         829 :     TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
    1050         829 :     TBI.HasValidInstrHeights = true;
    1051         829 :     TBI.CriticalPath = 0;
    1052             : 
    1053             :     DEBUG({
    1054             :       dbgs() << format("%7u Instructions\n", TBI.InstrHeight);
    1055             :       ArrayRef<unsigned> PRHeights = getProcResourceHeights(MBB->getNumber());
    1056             :       for (unsigned K = 0; K != PRHeights.size(); ++K)
    1057             :         if (PRHeights[K]) {
    1058             :           unsigned Factor = MTM.SchedModel.getResourceFactor(K);
    1059             :           dbgs() << format("%6uc @ ", MTM.getCycles(PRHeights[K]))
    1060             :                  << MTM.SchedModel.getProcResource(K)->Name << " ("
    1061             :                  << PRHeights[K]/Factor << " ops x" << Factor << ")\n";
    1062             :         }
    1063             :     });
    1064             : 
    1065             :     // Get dependencies from PHIs in the trace successor.
    1066         829 :     const MachineBasicBlock *Succ = TBI.Succ;
    1067             :     // If MBB is the last block in the trace, and it has a back-edge to the
    1068             :     // loop header, get loop-carried dependencies from PHIs in the header. For
    1069             :     // that purpose, pretend that all the loop header PHIs have height 0.
    1070         829 :     if (!Succ)
    1071         718 :       if (const MachineLoop *Loop = getLoopFor(MBB))
    1072          50 :         if (MBB->isSuccessor(Loop->getHeader()))
    1073             :           Succ = Loop->getHeader();
    1074             : 
    1075         829 :     if (Succ) {
    1076         411 :       for (const auto &PHI : *Succ) {
    1077             :         if (!PHI.isPHI())
    1078             :           break;
    1079             :         Deps.clear();
    1080         139 :         getPHIDeps(PHI, Deps, MBB, MTM.MRI);
    1081         139 :         if (!Deps.empty()) {
    1082             :           // Loop header PHI heights are all 0.
    1083         139 :           unsigned Height = TBI.Succ ? Cycles.lookup(&PHI).Height : 0;
    1084             :           DEBUG(dbgs() << "pred\t" << Height << '\t' << PHI);
    1085         139 :           if (pushDepHeight(Deps.front(), PHI, Height, Heights, MTM.SchedModel,
    1086         139 :                             MTM.TII))
    1087         130 :             addLiveIns(Deps.front().DefMI, Deps.front().DefOp, Stack);
    1088             :         }
    1089             :       }
    1090             :     }
    1091             : 
    1092             :     // Go through the block backwards.
    1093        1658 :     for (MachineBasicBlock::const_iterator BI = MBB->end(), BB = MBB->begin();
    1094       10748 :          BI != BB;) {
    1095             :       const MachineInstr &MI = *--BI;
    1096             : 
    1097             :       // Find the MI height as determined by virtual register uses in the
    1098             :       // trace below.
    1099             :       unsigned Cycle = 0;
    1100        9919 :       MIHeightMap::iterator HeightI = Heights.find(&MI);
    1101        9919 :       if (HeightI != Heights.end()) {
    1102        7736 :         Cycle = HeightI->second;
    1103             :         // We won't be seeing any more MI uses.
    1104             :         Heights.erase(HeightI);
    1105             :       }
    1106             : 
    1107             :       // Don't process PHI deps. They depend on the specific predecessor, and
    1108             :       // we'll get them when visiting the predecessor.
    1109             :       Deps.clear();
    1110        9816 :       bool HasPhysRegs = !MI.isPHI() && getDataDeps(MI, Deps, MTM.MRI);
    1111             : 
    1112             :       // There may also be regunit dependencies to include in the height.
    1113             :       if (HasPhysRegs)
    1114        4805 :         Cycle = updatePhysDepsUpwards(MI, Cycle, RegUnits, MTM.SchedModel,
    1115        4805 :                                       MTM.TII, MTM.TRI);
    1116             : 
    1117             :       // Update the required height of any virtual registers read by MI.
    1118       29381 :       for (const DataDep &Dep : Deps)
    1119        9731 :         if (pushDepHeight(Dep, MI, Cycle, Heights, MTM.SchedModel, MTM.TII))
    1120        7753 :           addLiveIns(Dep.DefMI, Dep.DefOp, Stack);
    1121             : 
    1122       19838 :       InstrCycles &MICycles = Cycles[&MI];
    1123        9919 :       MICycles.Height = Cycle;
    1124        9919 :       if (!TBI.HasValidInstrDepths) {
    1125             :         DEBUG(dbgs() << Cycle << '\t' << MI);
    1126         405 :         continue;
    1127             :       }
    1128             :       // Update critical path length.
    1129       19028 :       TBI.CriticalPath = std::max(TBI.CriticalPath, Cycle + MICycles.Depth);
    1130             :       DEBUG(dbgs() << TBI.CriticalPath << '\t' << Cycle << '\t' << MI);
    1131             :     }
    1132             : 
    1133             :     // Update virtual live-in heights. They were added by addLiveIns() with a 0
    1134             :     // height because the final height isn't known until now.
    1135             :     DEBUG(dbgs() << printMBBReference(*MBB) << " Live-ins:");
    1136        1221 :     for (LiveInReg &LIR : TBI.LiveIns) {
    1137         196 :       const MachineInstr *DefMI = MTM.MRI->getVRegDef(LIR.Reg);
    1138         196 :       LIR.Height = Heights.lookup(DefMI);
    1139             :       DEBUG(dbgs() << ' ' << printReg(LIR.Reg) << '@' << LIR.Height);
    1140             :     }
    1141             : 
    1142             :     // Transfer the live regunits to the live-in list.
    1143        2773 :     for (SparseSet<LiveRegUnit>::const_iterator
    1144        3602 :          RI = RegUnits.begin(), RE = RegUnits.end(); RI != RE; ++RI) {
    1145        5546 :       TBI.LiveIns.push_back(LiveInReg(RI->RegUnit, RI->Cycle));
    1146             :       DEBUG(dbgs() << ' ' << printRegUnit(RI->RegUnit, MTM.TRI)
    1147             :                    << '@' << RI->Cycle);
    1148             :     }
    1149             :     DEBUG(dbgs() << '\n');
    1150             : 
    1151         829 :     if (!TBI.HasValidInstrDepths)
    1152          86 :       continue;
    1153             :     // Add live-ins to the critical path length.
    1154         743 :     TBI.CriticalPath = std::max(TBI.CriticalPath,
    1155        1486 :                                 computeCrossBlockCriticalPath(TBI));
    1156             :     DEBUG(dbgs() << "Critical path: " << TBI.CriticalPath << '\n');
    1157             :   }
    1158         743 : }
    1159             : 
    1160             : MachineTraceMetrics::Trace
    1161        1888 : MachineTraceMetrics::Ensemble::getTrace(const MachineBasicBlock *MBB) {
    1162        1888 :   TraceBlockInfo &TBI = BlockInfo[MBB->getNumber()];
    1163             : 
    1164        1888 :   if (!TBI.hasValidDepth() || !TBI.hasValidHeight())
    1165         790 :     computeTrace(MBB);
    1166        1888 :   if (!TBI.HasValidInstrDepths)
    1167         777 :     computeInstrDepths(MBB);
    1168        1888 :   if (!TBI.HasValidInstrHeights)
    1169         743 :     computeInstrHeights(MBB);
    1170             :   
    1171        1888 :   return Trace(*this, TBI);
    1172             : }
    1173             : 
    1174             : unsigned
    1175          97 : MachineTraceMetrics::Trace::getInstrSlack(const MachineInstr &MI) const {
    1176             :   assert(getBlockNum() == unsigned(MI.getParent()->getNumber()) &&
    1177             :          "MI must be in the trace center block");
    1178          97 :   InstrCycles Cyc = getInstrCycles(MI);
    1179         194 :   return getCriticalPath() - (Cyc.Depth + Cyc.Height);
    1180             : }
    1181             : 
    1182             : unsigned
    1183         109 : MachineTraceMetrics::Trace::getPHIDepth(const MachineInstr &PHI) const {
    1184         109 :   const MachineBasicBlock *MBB = TE.MTM.MF->getBlockNumbered(getBlockNum());
    1185             :   SmallVector<DataDep, 1> Deps;
    1186         109 :   getPHIDeps(PHI, Deps, MBB, TE.MTM.MRI);
    1187             :   assert(Deps.size() == 1 && "PHI doesn't have MBB as a predecessor");
    1188         109 :   DataDep &Dep = Deps.front();
    1189         109 :   unsigned DepCycle = getInstrCycles(*Dep.DefMI).Depth;
    1190             :   // Add latency if DefMI is a real instruction. Transients get latency 0.
    1191         109 :   if (!Dep.DefMI->isTransient())
    1192          46 :     DepCycle += TE.MTM.SchedModel.computeOperandLatency(Dep.DefMI, Dep.DefOp,
    1193             :                                                         &PHI, Dep.UseOp);
    1194         109 :   return DepCycle;
    1195             : }
    1196             : 
    1197             : /// When bottom is set include instructions in current block in estimate.
    1198          19 : unsigned MachineTraceMetrics::Trace::getResourceDepth(bool Bottom) const {
    1199             :   // Find the limiting processor resource.
    1200             :   // Numbers have been pre-scaled to be comparable.
    1201          19 :   unsigned PRMax = 0;
    1202          38 :   ArrayRef<unsigned> PRDepths = TE.getProcResourceDepths(getBlockNum());
    1203          19 :   if (Bottom) {
    1204          38 :     ArrayRef<unsigned> PRCycles = TE.MTM.getProcResourceCycles(getBlockNum());
    1205          55 :     for (unsigned K = 0; K != PRDepths.size(); ++K)
    1206          54 :       PRMax = std::max(PRMax, PRDepths[K] + PRCycles[K]);
    1207             :   } else {
    1208           0 :     for (unsigned K = 0; K != PRDepths.size(); ++K)
    1209           0 :       PRMax = std::max(PRMax, PRDepths[K]);
    1210             :   }
    1211             :   // Convert to cycle count.
    1212          38 :   PRMax = TE.MTM.getCycles(PRMax);
    1213             : 
    1214             :   /// All instructions before current block
    1215          19 :   unsigned Instrs = TBI.InstrDepth;
    1216             :   // plus instructions in current block
    1217          19 :   if (Bottom)
    1218          38 :     Instrs += TE.MTM.BlockInfo[getBlockNum()].InstrCount;
    1219          19 :   if (unsigned IW = TE.MTM.SchedModel.getIssueWidth())
    1220          19 :     Instrs /= IW;
    1221             :   // Assume issue width 1 without a schedule model.
    1222          19 :   return std::max(Instrs, PRMax);
    1223             : }
    1224             : 
    1225         736 : unsigned MachineTraceMetrics::Trace::getResourceLength(
    1226             :     ArrayRef<const MachineBasicBlock *> Extrablocks,
    1227             :     ArrayRef<const MCSchedClassDesc *> ExtraInstrs,
    1228             :     ArrayRef<const MCSchedClassDesc *> RemoveInstrs) const {
    1229             :   // Add up resources above and below the center block.
    1230        1472 :   ArrayRef<unsigned> PRDepths = TE.getProcResourceDepths(getBlockNum());
    1231        1472 :   ArrayRef<unsigned> PRHeights = TE.getProcResourceHeights(getBlockNum());
    1232         736 :   unsigned PRMax = 0;
    1233             : 
    1234             :   // Capture computing cycles from extra instructions
    1235             :   auto extraCycles = [this](ArrayRef<const MCSchedClassDesc *> Instrs,
    1236             :                             unsigned ResourceIdx)
    1237       37309 :                          ->unsigned {
    1238             :     unsigned Cycles = 0;
    1239       55264 :     for (const MCSchedClassDesc *SC : Instrs) {
    1240       17955 :       if (!SC->isValid())
    1241           0 :         continue;
    1242       61894 :       for (TargetSchedModel::ProcResIter
    1243       17955 :                PI = TE.MTM.SchedModel.getWriteProcResBegin(SC),
    1244             :                PE = TE.MTM.SchedModel.getWriteProcResEnd(SC);
    1245       79849 :            PI != PE; ++PI) {
    1246       61894 :         if (PI->ProcResourceIdx != ResourceIdx)
    1247       57407 :           continue;
    1248        4487 :         Cycles +=
    1249        8974 :             (PI->Cycles * TE.MTM.SchedModel.getResourceFactor(ResourceIdx));
    1250             :       }
    1251             :     }
    1252       19354 :     return Cycles;
    1253         736 :   };
    1254             : 
    1255       20090 :   for (unsigned K = 0; K != PRDepths.size(); ++K) {
    1256       29031 :     unsigned PRCycles = PRDepths[K] + PRHeights[K];
    1257       27979 :     for (const MachineBasicBlock *MBB : Extrablocks)
    1258       18302 :       PRCycles += TE.MTM.getProcResourceCycles(MBB->getNumber())[K];
    1259        9677 :     PRCycles += extraCycles(ExtraInstrs, K);
    1260        9677 :     PRCycles -= extraCycles(RemoveInstrs, K);
    1261        9677 :     PRMax = std::max(PRMax, PRCycles);
    1262             :   }
    1263             :   // Convert to cycle count.
    1264        1472 :   PRMax = TE.MTM.getCycles(PRMax);
    1265             : 
    1266             :   // Instrs: #instructions in current trace outside current block.
    1267         736 :   unsigned Instrs = TBI.InstrDepth + TBI.InstrHeight;
    1268             :   // Add instruction count from the extra blocks.
    1269        2060 :   for (const MachineBasicBlock *MBB : Extrablocks)
    1270         662 :     Instrs += TE.MTM.getResources(MBB)->InstrCount;
    1271         736 :   Instrs += ExtraInstrs.size();
    1272         736 :   Instrs -= RemoveInstrs.size();
    1273         736 :   if (unsigned IW = TE.MTM.SchedModel.getIssueWidth())
    1274         736 :     Instrs /= IW;
    1275             :   // Assume issue width 1 without a schedule model.
    1276         736 :   return std::max(Instrs, PRMax);
    1277             : }
    1278             : 
    1279         400 : bool MachineTraceMetrics::Trace::isDepInTrace(const MachineInstr &DefMI,
    1280             :                                               const MachineInstr &UseMI) const {
    1281         400 :   if (DefMI.getParent() == UseMI.getParent())
    1282             :     return true;
    1283             : 
    1284           1 :   const TraceBlockInfo &DepTBI = TE.BlockInfo[DefMI.getParent()->getNumber()];
    1285           1 :   const TraceBlockInfo &TBI = TE.BlockInfo[UseMI.getParent()->getNumber()];
    1286             : 
    1287             :   return DepTBI.isUsefulDominator(TBI);
    1288             : }
    1289             : 
    1290           0 : void MachineTraceMetrics::Ensemble::print(raw_ostream &OS) const {
    1291           0 :   OS << getName() << " ensemble:\n";
    1292           0 :   for (unsigned i = 0, e = BlockInfo.size(); i != e; ++i) {
    1293           0 :     OS << "  %bb." << i << '\t';
    1294           0 :     BlockInfo[i].print(OS);
    1295             :     OS << '\n';
    1296             :   }
    1297           0 : }
    1298             : 
    1299           0 : void MachineTraceMetrics::TraceBlockInfo::print(raw_ostream &OS) const {
    1300           0 :   if (hasValidDepth()) {
    1301           0 :     OS << "depth=" << InstrDepth;
    1302           0 :     if (Pred)
    1303           0 :       OS << " pred=" << printMBBReference(*Pred);
    1304             :     else
    1305           0 :       OS << " pred=null";
    1306           0 :     OS << " head=%bb." << Head;
    1307           0 :     if (HasValidInstrDepths)
    1308           0 :       OS << " +instrs";
    1309             :   } else
    1310           0 :     OS << "depth invalid";
    1311           0 :   OS << ", ";
    1312           0 :   if (hasValidHeight()) {
    1313           0 :     OS << "height=" << InstrHeight;
    1314           0 :     if (Succ)
    1315           0 :       OS << " succ=" << printMBBReference(*Succ);
    1316             :     else
    1317           0 :       OS << " succ=null";
    1318           0 :     OS << " tail=%bb." << Tail;
    1319           0 :     if (HasValidInstrHeights)
    1320           0 :       OS << " +instrs";
    1321             :   } else
    1322           0 :     OS << "height invalid";
    1323           0 :   if (HasValidInstrDepths && HasValidInstrHeights)
    1324           0 :     OS << ", crit=" << CriticalPath;
    1325           0 : }
    1326             : 
    1327           0 : void MachineTraceMetrics::Trace::print(raw_ostream &OS) const {
    1328           0 :   unsigned MBBNum = &TBI - &TE.BlockInfo[0];
    1329             : 
    1330           0 :   OS << TE.getName() << " trace %bb." << TBI.Head << " --> %bb." << MBBNum
    1331           0 :      << " --> %bb." << TBI.Tail << ':';
    1332           0 :   if (TBI.hasValidHeight() && TBI.hasValidDepth())
    1333           0 :     OS << ' ' << getInstrCount() << " instrs.";
    1334           0 :   if (TBI.HasValidInstrDepths && TBI.HasValidInstrHeights)
    1335           0 :     OS << ' ' << TBI.CriticalPath << " cycles.";
    1336             : 
    1337           0 :   const MachineTraceMetrics::TraceBlockInfo *Block = &TBI;
    1338           0 :   OS << "\n%bb." << MBBNum;
    1339           0 :   while (Block->hasValidDepth() && Block->Pred) {
    1340           0 :     unsigned Num = Block->Pred->getNumber();
    1341           0 :     OS << " <- " << printMBBReference(*Block->Pred);
    1342           0 :     Block = &TE.BlockInfo[Num];
    1343             :   }
    1344             : 
    1345           0 :   Block = &TBI;
    1346           0 :   OS << "\n    ";
    1347           0 :   while (Block->hasValidHeight() && Block->Succ) {
    1348           0 :     unsigned Num = Block->Succ->getNumber();
    1349           0 :     OS << " -> " << printMBBReference(*Block->Succ);
    1350           0 :     Block = &TE.BlockInfo[Num];
    1351             :   }
    1352             :   OS << '\n';
    1353           0 : }

Generated by: LCOV version 1.13