diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp | 74 | 
1 files changed, 48 insertions, 26 deletions
| diff --git a/contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp b/contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp index ef7e525e8165..01391a1a0e50 100644 --- a/contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp +++ b/contrib/llvm/lib/CodeGen/MachineTraceMetrics.cpp @@ -1,4 +1,4 @@ -//===- lib/CodeGen/MachineTraceMetrics.cpp ----------------------*- C++ -*-===// +//===- lib/CodeGen/MachineTraceMetrics.cpp --------------------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -7,21 +7,35 @@  //  //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/MachineTraceMetrics.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/Optional.h"  #include "llvm/ADT/PostOrderIterator.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/SparseSet.h"  #include "llvm/CodeGen/MachineBasicBlock.h"  #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h"  #include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineOperand.h"  #include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/CodeGen/MachineTraceMetrics.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/Pass.h"  #include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/Format.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetInstrInfo.h"  #include "llvm/Target/TargetRegisterInfo.h"  #include "llvm/Target/TargetSubtargetInfo.h" +#include <algorithm> +#include <cassert> +#include <iterator> +#include <tuple> +#include <utility>  using namespace llvm; @@ -30,16 +44,14 @@ using namespace llvm;  char MachineTraceMetrics::ID = 0;  char &llvm::MachineTraceMetricsID = MachineTraceMetrics::ID; -INITIALIZE_PASS_BEGIN(MachineTraceMetrics, -                  "machine-trace-metrics", "Machine Trace Metrics", false, true) +INITIALIZE_PASS_BEGIN(MachineTraceMetrics, DEBUG_TYPE, +                      "Machine Trace Metrics", false, true)  INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)  INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo) -INITIALIZE_PASS_END(MachineTraceMetrics, -                  "machine-trace-metrics", "Machine Trace Metrics", false, true) +INITIALIZE_PASS_END(MachineTraceMetrics, DEBUG_TYPE, +                    "Machine Trace Metrics", false, true) -MachineTraceMetrics::MachineTraceMetrics() -  : MachineFunctionPass(ID), MF(nullptr), TII(nullptr), TRI(nullptr), -    MRI(nullptr), Loops(nullptr) { +MachineTraceMetrics::MachineTraceMetrics() : MachineFunctionPass(ID) {    std::fill(std::begin(Ensembles), std::end(Ensembles), nullptr);  } @@ -137,7 +149,6 @@ MachineTraceMetrics::getProcResourceCycles(unsigned MBBNum) const {    return makeArrayRef(ProcResourceCycles.data() + MBBNum * PRKinds, PRKinds);  } -  //===----------------------------------------------------------------------===//  //                         Ensemble utility functions  //===----------------------------------------------------------------------===// @@ -151,7 +162,7 @@ MachineTraceMetrics::Ensemble::Ensemble(MachineTraceMetrics *ct)  }  // Virtual destructor serves as an anchor. -MachineTraceMetrics::Ensemble::~Ensemble() {} +MachineTraceMetrics::Ensemble::~Ensemble() = default;  const MachineLoop*  MachineTraceMetrics::Ensemble::getLoopFor(const MachineBasicBlock *MBB) const { @@ -297,6 +308,7 @@ static bool isExitingLoop(const MachineLoop *From, const MachineLoop *To) {  // MinInstrCountEnsemble - Pick the trace that executes the least number of  // instructions.  namespace { +  class MinInstrCountEnsemble : public MachineTraceMetrics::Ensemble {    const char *getName() const override { return "MinInstr"; }    const MachineBasicBlock *pickTracePred(const MachineBasicBlock*) override; @@ -306,7 +318,8 @@ public:    MinInstrCountEnsemble(MachineTraceMetrics *mtm)      : MachineTraceMetrics::Ensemble(mtm) {}  }; -} + +} // end anonymous namespace  // Select the preferred predecessor for MBB.  const MachineBasicBlock* @@ -409,25 +422,30 @@ void MachineTraceMetrics::verifyAnalysis() const {  // revisit blocks.  namespace { +  struct LoopBounds {    MutableArrayRef<MachineTraceMetrics::TraceBlockInfo> Blocks;    SmallPtrSet<const MachineBasicBlock*, 8> Visited;    const MachineLoopInfo *Loops; -  bool Downward; +  bool Downward = false; +    LoopBounds(MutableArrayRef<MachineTraceMetrics::TraceBlockInfo> blocks, -             const MachineLoopInfo *loops) -    : Blocks(blocks), Loops(loops), Downward(false) {} +             const MachineLoopInfo *loops) : Blocks(blocks), Loops(loops) {}  }; -} + +} // end anonymous namespace  // Specialize po_iterator_storage in order to prune the post-order traversal so  // it is limited to the current loop and doesn't traverse the loop back edges.  namespace llvm { +  template<>  class po_iterator_storage<LoopBounds, true> {    LoopBounds &LB; +  public:    po_iterator_storage(LoopBounds &lb) : LB(lb) {} +    void finishPostorder(const MachineBasicBlock*) {}    bool insertEdge(Optional<const MachineBasicBlock *> From, @@ -452,7 +470,8 @@ public:      return LB.Visited.insert(To).second;    }  }; -} + +} // end namespace llvm  /// Compute the trace through MBB.  void MachineTraceMetrics::Ensemble::computeTrace(const MachineBasicBlock *MBB) { @@ -603,6 +622,7 @@ void MachineTraceMetrics::Ensemble::verify() const {  // A data dependency is represented as a defining MI and operand numbers on the  // defining and using MI.  namespace { +  struct DataDep {    const MachineInstr *DefMI;    unsigned DefOp; @@ -622,7 +642,8 @@ struct DataDep {      assert((++DefI).atEnd() && "Register has multiple defs");    }  }; -} + +} // end anonymous namespace  // Get the input data dependencies that must be ready before UseMI can issue.  // Return true if UseMI has any physreg operands. @@ -678,17 +699,19 @@ static void getPHIDeps(const MachineInstr &UseMI,  // direction instructions are scanned, it could be the operand that defined the  // regunit, or the highest operand to read the regunit.  namespace { +  struct LiveRegUnit {    unsigned RegUnit; -  unsigned Cycle; -  const MachineInstr *MI; -  unsigned Op; +  unsigned Cycle = 0; +  const MachineInstr *MI = nullptr; +  unsigned Op = 0;    unsigned getSparseSetIndex() const { return RegUnit; } -  LiveRegUnit(unsigned RU) : RegUnit(RU), Cycle(0), MI(nullptr), Op(0) {} +  LiveRegUnit(unsigned RU) : RegUnit(RU) {}  }; -} + +} // end anonymous namespace  // Identify physreg dependencies for UseMI, and update the live regunit  // tracking set when scanning instructions downwards. @@ -922,7 +945,6 @@ static unsigned updatePhysDepsUpwards(const MachineInstr &MI, unsigned Height,    return Height;  } -  typedef DenseMap<const MachineInstr *, unsigned> MIHeightMap;  // Push the height of DefMI upwards if required to match UseMI. | 
