summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/tools/llvm-mca/Backend.h3
-rw-r--r--llvm/tools/llvm-mca/Scheduler.cpp20
-rw-r--r--llvm/tools/llvm-mca/Scheduler.h5
-rw-r--r--llvm/tools/llvm-mca/SummaryView.cpp41
-rw-r--r--llvm/tools/llvm-mca/SummaryView.h19
-rw-r--r--llvm/tools/llvm-mca/llvm-mca.cpp4
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) {
OpenPOWER on IntegriCloud