summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-mca/BackendPrinter.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-mca/BackendPrinter.h')
-rw-r--r--llvm/tools/llvm-mca/BackendPrinter.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/llvm/tools/llvm-mca/BackendPrinter.h b/llvm/tools/llvm-mca/BackendPrinter.h
new file mode 100644
index 00000000000..b4793b61ac2
--- /dev/null
+++ b/llvm/tools/llvm-mca/BackendPrinter.h
@@ -0,0 +1,102 @@
+//===--------------------- BackendPrinter.h ---------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+/// \file
+///
+/// This file implements class BackendPrinter.
+/// BackendPrinter is able to collect statistics related to the code executed
+/// by the Backend class. Information is then printed out with the help of
+/// a MCInstPrinter (to pretty print MCInst objects) and other helper classes.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVM_MCA_BACKENDPRINTER_H
+#define LLVM_TOOLS_LLVM_MCA_BACKENDPRINTER_H
+
+#include "Backend.h"
+#include "BackendStatistics.h"
+#include "ResourcePressureView.h"
+#include "TimelineView.h"
+#include "llvm/MC/MCInstPrinter.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/ToolOutputFile.h"
+
+#define DEBUG_TYPE "llvm-mca"
+
+namespace mca {
+
+class ResourcePressureView;
+class TimelineView;
+
+/// \brief A printer class that knows how to collects statistics on the
+/// code analyzed by the llvm-mca tool.
+///
+/// This class knows how to print out the analysis information collected
+/// during the execution of the code. Internally, it delegates to other
+/// classes the task of printing out timeline information as well as
+/// resource pressure.
+class BackendPrinter {
+ Backend &B;
+ bool EnableVerboseOutput;
+
+ std::unique_ptr<llvm::MCInstPrinter> MCIP;
+ std::unique_ptr<llvm::ToolOutputFile> File;
+
+ std::unique_ptr<ResourcePressureView> RPV;
+ std::unique_ptr<TimelineView> TV;
+ std::unique_ptr<BackendStatistics> BS;
+
+ using Histogram = std::map<unsigned, unsigned>;
+ void printDUStatistics(const Histogram &Stats, unsigned Cycles) const;
+ void printDispatchStalls(unsigned RATStalls, unsigned RCUStalls,
+ unsigned SQStalls, unsigned LDQStalls,
+ unsigned STQStalls, unsigned DGStalls) const;
+ void printRATStatistics(unsigned Mappings, unsigned MaxUsedMappings) const;
+ void printRCUStatistics(const Histogram &Histogram, unsigned Cycles) const;
+ void printIssuePerCycle(const Histogram &IssuePerCycle,
+ unsigned TotalCycles) const;
+ void printSchedulerUsage(const llvm::MCSchedModel &SM,
+ const llvm::ArrayRef<BufferUsageEntry> &Usage) const;
+ void printGeneralStatistics(unsigned Iterations, unsigned Cycles,
+ unsigned Instructions,
+ unsigned DispatchWidth) const;
+ void printInstructionInfo() const;
+
+ std::unique_ptr<llvm::ToolOutputFile> getOutputStream(std::string OutputFile);
+ void initialize(std::string OputputFileName);
+
+public:
+ BackendPrinter(Backend &backend, std::string OutputFileName,
+ std::unique_ptr<llvm::MCInstPrinter> IP, bool EnableVerbose)
+ : B(backend), EnableVerboseOutput(EnableVerbose), MCIP(std::move(IP)) {
+ initialize(OutputFileName);
+ }
+
+ ~BackendPrinter() {
+ if (File)
+ File->keep();
+ }
+
+ bool isFileValid() const { return File.get(); }
+ llvm::raw_ostream &getOStream() const {
+ assert(isFileValid());
+ return File->os();
+ }
+
+ llvm::MCInstPrinter &getMCInstPrinter() const { return *MCIP; }
+
+ void addResourcePressureView();
+ void addTimelineView(unsigned MaxIterations = 3, unsigned MaxCycles = 80);
+
+ void printReport() const;
+};
+
+} // namespace mca
+
+#endif
OpenPOWER on IntegriCloud