summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-mca/Pipeline.h
diff options
context:
space:
mode:
authorMatt Davis <Matthew.Davis@sony.com>2018-06-25 16:53:00 +0000
committerMatt Davis <Matthew.Davis@sony.com>2018-06-25 16:53:00 +0000
commitdea343d2b3248901e51cd5cbbd7584969f308b3f (patch)
tree9895cf72a8bb829da2414d373f30bfd5569cafa2 /llvm/tools/llvm-mca/Pipeline.h
parent742553da13dd079f1428f7cba6ee6e64ff9f40a8 (diff)
downloadbcm5719-llvm-dea343d2b3248901e51cd5cbbd7584969f308b3f.tar.gz
bcm5719-llvm-dea343d2b3248901e51cd5cbbd7584969f308b3f.zip
[llvm-mca] Rename Backend to Pipeline. NFC.
Summary: This change renames the Backend and BackendPrinter to Pipeline and PipelinePrinter respectively. Variables and comments have also been updated to reflect this change. The reason for this rename, is to be slightly more correct about what MCA is modeling. MCA models a Pipeline, which implies some logical sequence of stages. Reviewers: andreadb, courbet, RKSimon Reviewed By: andreadb, courbet Subscribers: mgorny, javed.absar, tschuett, gbedwell, llvm-commits Differential Revision: https://reviews.llvm.org/D48496 llvm-svn: 335496
Diffstat (limited to 'llvm/tools/llvm-mca/Pipeline.h')
-rw-r--r--llvm/tools/llvm-mca/Pipeline.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/llvm/tools/llvm-mca/Pipeline.h b/llvm/tools/llvm-mca/Pipeline.h
new file mode 100644
index 00000000000..3ff4f152624
--- /dev/null
+++ b/llvm/tools/llvm-mca/Pipeline.h
@@ -0,0 +1,82 @@
+//===--------------------- Pipeline.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 an ordered container of stages that simulate the
+/// pipeline of a hardware backend.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVM_MCA_PIPELINE_H
+#define LLVM_TOOLS_LLVM_MCA_PIPELINE_H
+
+#include "Scheduler.h"
+#include "Stage.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace mca {
+
+class HWEventListener;
+class HWInstructionEvent;
+class HWStallEvent;
+
+/// A pipeline for a specific subtarget.
+///
+/// It emulates an out-of-order execution of instructions. Instructions are
+/// fetched from a MCInst sequence managed by an initial 'Fetch' stage.
+/// Instructions are firstly fetched, then dispatched to the schedulers, and
+/// then executed.
+///
+/// This class tracks the lifetime of an instruction from the moment where
+/// it gets dispatched to the schedulers, to the moment where it finishes
+/// executing and register writes are architecturally committed.
+/// In particular, it monitors changes in the state of every instruction
+/// in flight.
+///
+/// Instructions are executed in a loop of iterations. The number of iterations
+/// is defined by the SourceMgr object, which is managed by the initial stage
+/// of the instruction pipeline.
+///
+/// The Pipeline entry point is method 'run()' which executes cycles in a loop
+/// until there are new instructions to dispatch, and not every instruction
+/// has been retired.
+///
+/// Internally, the Pipeline collects statistical information in the form of
+/// histograms. For example, it tracks how the dispatch group size changes
+/// over time.
+class Pipeline {
+ /// An ordered list of stages that define this instruction pipeline.
+ llvm::SmallVector<std::unique_ptr<Stage>, 8> Stages;
+ std::set<HWEventListener *> Listeners;
+ unsigned Cycles;
+
+ bool executeStages(InstRef &IR);
+ void postExecuteStages(const InstRef &IR);
+ bool hasWorkToProcess();
+ void runCycle(unsigned Cycle);
+
+public:
+ Pipeline(unsigned DispatchWidth = 0, unsigned RegisterFileSize = 0,
+ unsigned LoadQueueSize = 0, unsigned StoreQueueSize = 0,
+ bool AssumeNoAlias = false)
+ : Cycles(0) {}
+ void appendStage(std::unique_ptr<Stage> S) { Stages.push_back(std::move(S)); }
+ void run();
+ void addEventListener(HWEventListener *Listener);
+ void notifyCycleBegin(unsigned Cycle);
+ void notifyInstructionEvent(const HWInstructionEvent &Event);
+ void notifyStallEvent(const HWStallEvent &Event);
+ void notifyResourceAvailable(const ResourceRef &RR);
+ void notifyReservedBuffers(llvm::ArrayRef<unsigned> Buffers);
+ void notifyReleasedBuffers(llvm::ArrayRef<unsigned> Buffers);
+ void notifyCycleEnd(unsigned Cycle);
+};
+} // namespace mca
+
+#endif // LLVM_TOOLS_LLVM_MCA_PIPELINE_H
OpenPOWER on IntegriCloud