diff options
-rw-r--r-- | llvm/tools/llvm-mca/Backend.h | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/Scheduler.cpp | 20 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/Scheduler.h | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/SummaryView.cpp | 41 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/SummaryView.h | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/llvm-mca.cpp | 4 |
6 files changed, 39 insertions, 53 deletions
diff --git a/llvm/tools/llvm-mca/Backend.h b/llvm/tools/llvm-mca/Backend.h index c01d01513ef..6e5f52d0556 100644 --- a/llvm/tools/llvm-mca/Backend.h +++ b/llvm/tools/llvm-mca/Backend.h @@ -103,9 +103,6 @@ public: return STI.getSchedModel(); } - double getRThroughput(const InstrDesc &ID) const { - return HWS->getRThroughput(ID); - } void getBuffersUsage(std::vector<BufferUsageEntry> &Usage) const { return HWS->getBuffersUsage(Usage); } diff --git a/llvm/tools/llvm-mca/Scheduler.cpp b/llvm/tools/llvm-mca/Scheduler.cpp index fb609917005..15f97831387 100644 --- a/llvm/tools/llvm-mca/Scheduler.cpp +++ b/llvm/tools/llvm-mca/Scheduler.cpp @@ -185,26 +185,6 @@ bool ResourceManager::mustIssueImmediately(const InstrDesc &Desc) { }); } -double ResourceManager::getRThroughput(const InstrDesc &ID) const { - double RThroughput = 0; - for (const std::pair<uint64_t, ResourceUsage> &Usage : ID.Resources) { - const CycleSegment &CS = Usage.second.CS; - assert(CS.begin() == 0); - - if (Usage.second.isReserved()) { - RThroughput = std::max(RThroughput, (double)CS.size()); - continue; - } - - unsigned Population = std::max(1U, countPopulation(Usage.first) - 1); - unsigned NumUnits = Population * getNumUnits(Usage.first); - NumUnits -= Usage.second.NumUnits - 1; - unsigned Cycles = CS.size(); - RThroughput = std::max(RThroughput, (double)Cycles / NumUnits); - } - return RThroughput; -} - void ResourceManager::issueInstruction( unsigned Index, const InstrDesc &Desc, SmallVectorImpl<std::pair<ResourceRef, unsigned>> &Pipes) { diff --git a/llvm/tools/llvm-mca/Scheduler.h b/llvm/tools/llvm-mca/Scheduler.h index 4a3d69e076d..69bd2bf9fc2 100644 --- a/llvm/tools/llvm-mca/Scheduler.h +++ b/llvm/tools/llvm-mca/Scheduler.h @@ -396,7 +396,6 @@ public: bool mustIssueImmediately(const InstrDesc &Desc); bool canBeIssued(const InstrDesc &Desc) const; - double getRThroughput(const InstrDesc &Desc) const; void issueInstruction( unsigned Index, const InstrDesc &Desc, @@ -532,10 +531,6 @@ public: Event canBeDispatched(const InstrDesc &Desc) const; Instruction *scheduleInstruction(unsigned Idx, Instruction *MCIS); - double getRThroughput(const InstrDesc &Desc) const { - return Resources->getRThroughput(Desc); - } - void cycleEvent(unsigned Cycle); void getBuffersUsage(std::vector<BufferUsageEntry> &Usage) const { diff --git a/llvm/tools/llvm-mca/SummaryView.cpp b/llvm/tools/llvm-mca/SummaryView.cpp index 7b1252ad057..ccc7e5de466 100644 --- a/llvm/tools/llvm-mca/SummaryView.cpp +++ b/llvm/tools/llvm-mca/SummaryView.cpp @@ -21,6 +21,8 @@ namespace mca { using namespace llvm; void SummaryView::printSummary(raw_ostream &OS) const { + unsigned Iterations = Source.getNumIterations(); + unsigned Instructions = Source.size(); unsigned TotalInstructions = Instructions * Iterations; double IPC = (double)TotalInstructions / TotalCycles; @@ -38,6 +40,8 @@ void SummaryView::printSummary(raw_ostream &OS) const { void SummaryView::printInstructionInfo(raw_ostream &OS) const { std::string Buffer; raw_string_ostream TempStream(Buffer); + const MCSchedModel &SM = STI.getSchedModel(); + unsigned Instructions = Source.size(); TempStream << "\n\nInstruction Info:\n"; TempStream << "[1]: #uOps\n[2]: Latency\n[3]: RThroughput\n" @@ -45,34 +49,41 @@ void SummaryView::printInstructionInfo(raw_ostream &OS) const { TempStream << "[1] [2] [3] [4] [5] [6]\tInstructions:\n"; for (unsigned I = 0, E = Instructions; I < E; ++I) { - const MCInst &Inst = B.getMCInstFromIndex(I); - const InstrDesc &ID = B.getInstrDesc(Inst); - unsigned NumMicroOpcodes = ID.NumMicroOps; - unsigned Latency = ID.MaxLatency; - double RThroughput = B.getRThroughput(ID); + const MCInst &Inst = Source.getMCInstFromIndex(I); + const MCInstrDesc &MCDesc = MCII.get(Inst.getOpcode()); + const MCSchedClassDesc &SCDesc = + *SM.getSchedClassDesc(MCDesc.getSchedClass()); + + unsigned NumMicroOpcodes = SCDesc.NumMicroOps; + unsigned Latency = MCSchedModel::computeInstrLatency(STI, SCDesc); + Optional<double> RThroughput = + MCSchedModel::getReciprocalThroughput(STI, SCDesc); + TempStream << ' ' << NumMicroOpcodes << " "; if (NumMicroOpcodes < 10) TempStream << " "; else if (NumMicroOpcodes < 100) TempStream << ' '; TempStream << Latency << " "; - if (Latency < 10.0) + if (Latency < 10) TempStream << " "; - else if (Latency < 100.0) + else if (Latency < 100) TempStream << ' '; - if (RThroughput) { - TempStream << format("%.2f", RThroughput) << ' '; - if (RThroughput < 10.0) + + if (RThroughput.hasValue()) { + double RT = RThroughput.getValue(); + TempStream << format("%.2f", RT) << ' '; + if (RT < 10.0) TempStream << " "; - else if (RThroughput < 100.0) + else if (RT < 100.0) TempStream << ' '; } else { TempStream << " - "; } - TempStream << (ID.MayLoad ? " * " : " "); - TempStream << (ID.MayStore ? " * " : " "); - TempStream << (ID.HasSideEffects ? " * " : " "); - MCIP.printInst(&Inst, TempStream, "", B.getSTI()); + TempStream << (MCDesc.mayLoad() ? " * " : " "); + TempStream << (MCDesc.mayStore() ? " * " : " "); + TempStream << (MCDesc.hasUnmodeledSideEffects() ? " * " : " "); + MCIP.printInst(&Inst, TempStream, "", STI); TempStream << '\n'; } diff --git a/llvm/tools/llvm-mca/SummaryView.h b/llvm/tools/llvm-mca/SummaryView.h index d42d60c6e69..db2d4c4b1b7 100644 --- a/llvm/tools/llvm-mca/SummaryView.h +++ b/llvm/tools/llvm-mca/SummaryView.h @@ -49,9 +49,11 @@ #ifndef LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H #define LLVM_TOOLS_LLVM_MCA_SUMMARYVIEW_H -#include "Backend.h" +#include "SourceMgr.h" #include "View.h" #include "llvm/MC/MCInstPrinter.h" +#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCInstrInfo.h" #include "llvm/Support/raw_ostream.h" #define DEBUG_TYPE "llvm-mca" @@ -66,10 +68,11 @@ namespace mca { /// classes the task of printing out timeline information as well as /// resource pressure. class SummaryView : public View { - const Backend &B; + const llvm::MCSubtargetInfo &STI; + const llvm::MCInstrInfo &MCII; + const SourceMgr &Source; llvm::MCInstPrinter &MCIP; - const unsigned Iterations; - const unsigned Instructions; + const unsigned DispatchWidth; unsigned TotalCycles; @@ -77,10 +80,10 @@ class SummaryView : public View { void printInstructionInfo(llvm::raw_ostream &OS) const; public: - SummaryView(const Backend &backend, llvm::MCInstPrinter &IP, - unsigned NumIterations, unsigned NumInstructions, unsigned Width) - : B(backend), MCIP(IP), Iterations(NumIterations), - Instructions(NumInstructions), DispatchWidth(Width), TotalCycles(0) {} + SummaryView(const llvm::MCSubtargetInfo &sti, const llvm::MCInstrInfo &mcii, + const SourceMgr &S, llvm::MCInstPrinter &IP, unsigned Width) + : STI(sti), MCII(mcii), Source(S), MCIP(IP), DispatchWidth(Width), + TotalCycles(0) {} void onCycleEnd(unsigned /* unused */) override { ++TotalCycles; } diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp index 9492e2d763e..8acfd46b1f0 100644 --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -324,8 +324,8 @@ int main(int argc, char **argv) { std::unique_ptr<mca::BackendPrinter> Printer = llvm::make_unique<mca::BackendPrinter>(*B); - std::unique_ptr<mca::SummaryView> SV = llvm::make_unique<mca::SummaryView>( - *B, *IP, S->getNumIterations(), S->size(), Width); + std::unique_ptr<mca::SummaryView> SV = + llvm::make_unique<mca::SummaryView>(*STI, *MCII, *S, *IP, Width); Printer->addView(std::move(SV)); if (PrintModeVerbose) { |