summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-03-13 17:24:32 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-03-13 17:24:32 +0000
commitb52297508ef8c6801c194b90407479e093a00ed5 (patch)
tree4aa388b8f64a76f80ac0711025f5cda71b08eff9
parent9855b3938093eb4a3663474a42a1a694327816c0 (diff)
downloadbcm5719-llvm-b52297508ef8c6801c194b90407479e093a00ed5.tar.gz
bcm5719-llvm-b52297508ef8c6801c194b90407479e093a00ed5.zip
[llvm-mca] Remove the logic that computes the reciprocal throughput, and make the SummaryView independent from the Backend. NFCI
Since r327420, the tool can query the MCSchedModel interface to obtain the reciprocal throughput information. As a consequence, method `ResourceManager::getRThroughput`, and method `Backend::getRThroughput` are no longer needed. This patch simplifies the code by removing the custom RThroughput computation. This patch also refactors class SummaryView by removing the dependency with the Backend object. No functional change intended. llvm-svn: 327425
-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