diff options
Diffstat (limited to 'llvm/tools/llvm-mca/Views/ResourcePressureView.cpp')
-rw-r--r-- | llvm/tools/llvm-mca/Views/ResourcePressureView.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/tools/llvm-mca/Views/ResourcePressureView.cpp b/llvm/tools/llvm-mca/Views/ResourcePressureView.cpp index e71825b07c7..e7943252206 100644 --- a/llvm/tools/llvm-mca/Views/ResourcePressureView.cpp +++ b/llvm/tools/llvm-mca/Views/ResourcePressureView.cpp @@ -21,9 +21,9 @@ namespace mca { using namespace llvm; ResourcePressureView::ResourcePressureView(const llvm::MCSubtargetInfo &sti, - llvm::MCInstPrinter &Printer, - const SourceMgr &Sequence) - : STI(sti), MCIP(Printer), Source(Sequence) { + MCInstPrinter &Printer, + ArrayRef<MCInst> S) + : STI(sti), MCIP(Printer), Source(S), LastInstructionIdx(0) { // Populate the map of resource descriptors. unsigned R2VIndex = 0; const MCSchedModel &SM = STI.getSchedModel(); @@ -44,9 +44,15 @@ ResourcePressureView::ResourcePressureView(const llvm::MCSubtargetInfo &sti, } void ResourcePressureView::onEvent(const HWInstructionEvent &Event) { + if (Event.Type == HWInstructionEvent::Dispatched) { + LastInstructionIdx = Event.IR.getSourceIndex(); + return; + } + // We're only interested in Issue events. if (Event.Type != HWInstructionEvent::Issued) return; + const auto &IssueEvent = static_cast<const HWInstructionIssuedEvent &>(Event); const unsigned SourceIdx = Event.IR.getSourceIndex() % Source.size(); for (const std::pair<ResourceRef, ResourceCycles> &Use : @@ -128,7 +134,7 @@ void ResourcePressureView::printResourcePressurePerIter(raw_ostream &OS) const { FOS << '\n'; FOS.flush(); - const unsigned Executions = Source.getNumIterations(); + const unsigned Executions = LastInstructionIdx / Source.size() + 1; for (unsigned I = 0, E = NumResourceUnits; I < E; ++I) { double Usage = ResourceUsage[I + Source.size() * E]; printResourcePressure(FOS, Usage / Executions, (I + 1) * 7); @@ -151,7 +157,7 @@ void ResourcePressureView::printResourcePressurePerInst(raw_ostream &OS) const { raw_string_ostream InstrStream(Instruction); unsigned InstrIndex = 0; - const unsigned Executions = Source.getNumIterations(); + const unsigned Executions = LastInstructionIdx / Source.size() + 1; for (const MCInst &MCI : Source) { unsigned BaseEltIdx = InstrIndex * NumResourceUnits; for (unsigned J = 0; J < NumResourceUnits; ++J) { |