diff options
Diffstat (limited to 'lib/CodeGen/MachineTraceMetrics.cpp')
| -rw-r--r-- | lib/CodeGen/MachineTraceMetrics.cpp | 88 | 
1 files changed, 42 insertions, 46 deletions
diff --git a/lib/CodeGen/MachineTraceMetrics.cpp b/lib/CodeGen/MachineTraceMetrics.cpp index 6aa3f6796286..1bbf0ade6a58 100644 --- a/lib/CodeGen/MachineTraceMetrics.cpp +++ b/lib/CodeGen/MachineTraceMetrics.cpp @@ -7,7 +7,6 @@  //  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "machine-trace-metrics"  #include "llvm/CodeGen/MachineTraceMetrics.h"  #include "llvm/ADT/PostOrderIterator.h"  #include "llvm/ADT/SparseSet.h" @@ -26,6 +25,8 @@  using namespace llvm; +#define DEBUG_TYPE "machine-trace-metrics" +  char MachineTraceMetrics::ID = 0;  char &llvm::MachineTraceMetricsID = MachineTraceMetrics::ID; @@ -37,8 +38,9 @@ INITIALIZE_PASS_END(MachineTraceMetrics,                    "machine-trace-metrics", "Machine Trace Metrics", false, true)  MachineTraceMetrics::MachineTraceMetrics() -  : MachineFunctionPass(ID), MF(0), TII(0), TRI(0), MRI(0), Loops(0) { -  std::fill(Ensembles, array_endof(Ensembles), (Ensemble*)0); +  : MachineFunctionPass(ID), MF(nullptr), TII(nullptr), TRI(nullptr), +    MRI(nullptr), Loops(nullptr) { +  std::fill(std::begin(Ensembles), std::end(Ensembles), nullptr);  }  void MachineTraceMetrics::getAnalysisUsage(AnalysisUsage &AU) const { @@ -64,11 +66,11 @@ bool MachineTraceMetrics::runOnMachineFunction(MachineFunction &Func) {  }  void MachineTraceMetrics::releaseMemory() { -  MF = 0; +  MF = nullptr;    BlockInfo.clear();    for (unsigned i = 0; i != TS_NumStrategies; ++i) {      delete Ensembles[i]; -    Ensembles[i] = 0; +    Ensembles[i] = nullptr;    }  } @@ -95,19 +97,17 @@ MachineTraceMetrics::getResources(const MachineBasicBlock *MBB) {    unsigned PRKinds = SchedModel.getNumProcResourceKinds();    SmallVector<unsigned, 32> PRCycles(PRKinds); -  for (MachineBasicBlock::const_iterator I = MBB->begin(), E = MBB->end(); -       I != E; ++I) { -    const MachineInstr *MI = I; -    if (MI->isTransient()) +  for (const auto &MI : *MBB) { +    if (MI.isTransient())        continue;      ++InstrCount; -    if (MI->isCall()) +    if (MI.isCall())        FBI->HasCalls = true;      // Count processor resources used.      if (!SchedModel.hasInstrSchedModel())        continue; -    const MCSchedClassDesc *SC = SchedModel.resolveSchedClass(MI); +    const MCSchedClassDesc *SC = SchedModel.resolveSchedClass(&MI);      if (!SC->isValid())        continue; @@ -233,7 +233,7 @@ const MachineTraceMetrics::TraceBlockInfo*  MachineTraceMetrics::Ensemble::  getDepthResources(const MachineBasicBlock *MBB) const {    const TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()]; -  return TBI->hasValidDepth() ? TBI : 0; +  return TBI->hasValidDepth() ? TBI : nullptr;  }  // Check if height resources for MBB are valid and return the TBI. @@ -242,7 +242,7 @@ const MachineTraceMetrics::TraceBlockInfo*  MachineTraceMetrics::Ensemble::  getHeightResources(const MachineBasicBlock *MBB) const {    const TraceBlockInfo *TBI = &BlockInfo[MBB->getNumber()]; -  return TBI->hasValidHeight() ? TBI : 0; +  return TBI->hasValidHeight() ? TBI : nullptr;  }  /// Get an array of processor resource depths for MBB. Indexed by processor @@ -302,9 +302,9 @@ static bool isExitingLoop(const MachineLoop *From, const MachineLoop *To) {  // instructions.  namespace {  class MinInstrCountEnsemble : public MachineTraceMetrics::Ensemble { -  const char *getName() const { return "MinInstr"; } -  const MachineBasicBlock *pickTracePred(const MachineBasicBlock*); -  const MachineBasicBlock *pickTraceSucc(const MachineBasicBlock*); +  const char *getName() const override { return "MinInstr"; } +  const MachineBasicBlock *pickTracePred(const MachineBasicBlock*) override; +  const MachineBasicBlock *pickTraceSucc(const MachineBasicBlock*) override;  public:    MinInstrCountEnsemble(MachineTraceMetrics *mtm) @@ -316,13 +316,13 @@ public:  const MachineBasicBlock*  MinInstrCountEnsemble::pickTracePred(const MachineBasicBlock *MBB) {    if (MBB->pred_empty()) -    return 0; +    return nullptr;    const MachineLoop *CurLoop = getLoopFor(MBB);    // Don't leave loops, and never follow back-edges.    if (CurLoop && MBB == CurLoop->getHeader()) -    return 0; +    return nullptr;    unsigned CurCount = MTM.getResources(MBB)->InstrCount; -  const MachineBasicBlock *Best = 0; +  const MachineBasicBlock *Best = nullptr;    unsigned BestDepth = 0;    for (MachineBasicBlock::const_pred_iterator         I = MBB->pred_begin(), E = MBB->pred_end(); I != E; ++I) { @@ -344,9 +344,9 @@ MinInstrCountEnsemble::pickTracePred(const MachineBasicBlock *MBB) {  const MachineBasicBlock*  MinInstrCountEnsemble::pickTraceSucc(const MachineBasicBlock *MBB) {    if (MBB->pred_empty()) -    return 0; +    return nullptr;    const MachineLoop *CurLoop = getLoopFor(MBB); -  const MachineBasicBlock *Best = 0; +  const MachineBasicBlock *Best = nullptr;    unsigned BestHeight = 0;    for (MachineBasicBlock::const_succ_iterator         I = MBB->succ_begin(), E = MBB->succ_end(); I != E; ++I) { @@ -568,9 +568,8 @@ MachineTraceMetrics::Ensemble::invalidate(const MachineBasicBlock *BadMBB) {    // invalidated, but their instructions will stay the same, so there is no    // need to erase the Cycle entries. They will be overwritten when we    // recompute. -  for (MachineBasicBlock::const_iterator I = BadMBB->begin(), E = BadMBB->end(); -       I != E; ++I) -    Cycles.erase(I); +  for (const auto &I : *BadMBB) +    Cycles.erase(&I);  }  void MachineTraceMetrics::Ensemble::verify() const { @@ -627,7 +626,7 @@ struct DataDep {      assert(TargetRegisterInfo::isVirtualRegister(VirtReg));      MachineRegisterInfo::def_iterator DefI = MRI->def_begin(VirtReg);      assert(!DefI.atEnd() && "Register has no defs"); -    DefMI = &*DefI; +    DefMI = DefI->getParent();      DefOp = DefI.getOperandNo();      assert((++DefI).atEnd() && "Register has multiple defs");    } @@ -690,7 +689,7 @@ struct LiveRegUnit {    unsigned getSparseSetIndex() const { return RegUnit; } -  LiveRegUnit(unsigned RU) : RegUnit(RU), Cycle(0), MI(0), Op(0) {} +  LiveRegUnit(unsigned RU) : RegUnit(RU), Cycle(0), MI(nullptr), Op(0) {}  };  } @@ -828,16 +827,13 @@ computeInstrDepths(const MachineBasicBlock *MBB) {      if (TBI.HasValidInstrHeights)        TBI.CriticalPath = computeCrossBlockCriticalPath(TBI); -    for (MachineBasicBlock::const_iterator I = MBB->begin(), E = MBB->end(); -         I != E; ++I) { -      const MachineInstr *UseMI = I; - +    for (const auto &UseMI : *MBB) {        // Collect all data dependencies.        Deps.clear(); -      if (UseMI->isPHI()) -        getPHIDeps(UseMI, Deps, TBI.Pred, MTM.MRI); -      else if (getDataDeps(UseMI, Deps, MTM.MRI)) -        updatePhysDepsDownwards(UseMI, Deps, RegUnits, MTM.TRI); +      if (UseMI.isPHI()) +        getPHIDeps(&UseMI, Deps, TBI.Pred, MTM.MRI); +      else if (getDataDeps(&UseMI, Deps, MTM.MRI)) +        updatePhysDepsDownwards(&UseMI, Deps, RegUnits, MTM.TRI);        // Filter and process dependencies, computing the earliest issue cycle.        unsigned Cycle = 0; @@ -853,20 +849,20 @@ computeInstrDepths(const MachineBasicBlock *MBB) {          // Add latency if DefMI is a real instruction. Transients get latency 0.          if (!Dep.DefMI->isTransient())            DepCycle += MTM.SchedModel -            .computeOperandLatency(Dep.DefMI, Dep.DefOp, UseMI, Dep.UseOp); +            .computeOperandLatency(Dep.DefMI, Dep.DefOp, &UseMI, Dep.UseOp);          Cycle = std::max(Cycle, DepCycle);        }        // Remember the instruction depth. -      InstrCycles &MICycles = Cycles[UseMI]; +      InstrCycles &MICycles = Cycles[&UseMI];        MICycles.Depth = Cycle;        if (!TBI.HasValidInstrHeights) { -        DEBUG(dbgs() << Cycle << '\t' << *UseMI); +        DEBUG(dbgs() << Cycle << '\t' << UseMI);          continue;        }        // Update critical path length.        TBI.CriticalPath = std::max(TBI.CriticalPath, Cycle + MICycles.Height); -      DEBUG(dbgs() << TBI.CriticalPath << '\t' << Cycle << '\t' << *UseMI); +      DEBUG(dbgs() << TBI.CriticalPath << '\t' << Cycle << '\t' << UseMI);      }    }  } @@ -944,7 +940,7 @@ static bool pushDepHeight(const DataDep &Dep,    // Update Heights[DefMI] to be the maximum height seen.    MIHeightMap::iterator I;    bool New; -  tie(I, New) = Heights.insert(std::make_pair(Dep.DefMI, UseHeight)); +  std::tie(I, New) = Heights.insert(std::make_pair(Dep.DefMI, UseHeight));    if (New)      return true; @@ -1055,16 +1051,16 @@ computeInstrHeights(const MachineBasicBlock *MBB) {            Succ = Loop->getHeader();      if (Succ) { -      for (MachineBasicBlock::const_iterator I = Succ->begin(), E = Succ->end(); -           I != E && I->isPHI(); ++I) { -        const MachineInstr *PHI = I; +      for (const auto &PHI : *Succ) { +        if (!PHI.isPHI()) +          break;          Deps.clear(); -        getPHIDeps(PHI, Deps, MBB, MTM.MRI); +        getPHIDeps(&PHI, Deps, MBB, MTM.MRI);          if (!Deps.empty()) {            // Loop header PHI heights are all 0. -          unsigned Height = TBI.Succ ? Cycles.lookup(PHI).Height : 0; -          DEBUG(dbgs() << "pred\t" << Height << '\t' << *PHI); -          if (pushDepHeight(Deps.front(), PHI, Height, +          unsigned Height = TBI.Succ ? Cycles.lookup(&PHI).Height : 0; +          DEBUG(dbgs() << "pred\t" << Height << '\t' << PHI); +          if (pushDepHeight(Deps.front(), &PHI, Height,                              Heights, MTM.SchedModel, MTM.TII))              addLiveIns(Deps.front().DefMI, Deps.front().DefOp, Stack);          }  | 
