diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/llvm12/include/llvm/MCA/Pipeline.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/llvm12/include/llvm/MCA/Pipeline.h')
-rw-r--r-- | contrib/libs/llvm12/include/llvm/MCA/Pipeline.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/contrib/libs/llvm12/include/llvm/MCA/Pipeline.h b/contrib/libs/llvm12/include/llvm/MCA/Pipeline.h new file mode 100644 index 0000000000..ef4a82e0f6 --- /dev/null +++ b/contrib/libs/llvm12/include/llvm/MCA/Pipeline.h @@ -0,0 +1,87 @@ +#pragma once + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + +//===--------------------- Pipeline.h ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file implements an ordered container of stages that simulate the +/// pipeline of a hardware backend. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_MCA_PIPELINE_H +#define LLVM_MCA_PIPELINE_H + +#include "llvm/MCA/Stages/Stage.h" +#include "llvm/Support/Error.h" + +namespace llvm { +namespace mca { + +class HWEventListener; + +/// 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 { + Pipeline(const Pipeline &P) = delete; + Pipeline &operator=(const Pipeline &P) = delete; + + /// An ordered list of stages that define this instruction pipeline. + SmallVector<std::unique_ptr<Stage>, 8> Stages; + std::set<HWEventListener *> Listeners; + unsigned Cycles; + + Error runCycle(); + bool hasWorkToProcess(); + void notifyCycleBegin(); + void notifyCycleEnd(); + +public: + Pipeline() : Cycles(0) {} + void appendStage(std::unique_ptr<Stage> S); + + /// Returns the total number of simulated cycles. + Expected<unsigned> run(); + + void addEventListener(HWEventListener *Listener); +}; +} // namespace mca +} // namespace llvm + +#endif // LLVM_MCA_PIPELINE_H + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif |