| //===----------------------- HWEventListener.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 defines the main interface for hardware event listeners. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TOOLS_LLVM_MCA_HWEVENTLISTENER_H |
| #define LLVM_TOOLS_LLVM_MCA_HWEVENTLISTENER_H |
| |
| #include "Instruction.h" |
| #include "llvm/ADT/ArrayRef.h" |
| #include <utility> |
| |
| namespace mca { |
| |
| // An HWInstructionEvent represents state changes of instructions that |
| // listeners might be interested in. Listeners can choose to ignore any event |
| // they are not interested in. |
| class HWInstructionEvent { |
| public: |
| // This is the list of event types that are shared by all targets, that |
| // generic subtarget-agnostic classes (e.g., Pipeline, HWInstructionEvent, |
| // ...) and generic Views can manipulate. |
| // Subtargets are free to define additional event types, that are goin to be |
| // handled by generic components as opaque values, but can still be |
| // emitted by subtarget-specific pipeline stages (e.g., ExecuteStage, |
| // DispatchStage, ...) and interpreted by subtarget-specific EventListener |
| // implementations. |
| enum GenericEventType { |
| Invalid = 0, |
| // Events generated by the Retire Control Unit. |
| Retired, |
| // Events generated by the Scheduler. |
| Ready, |
| Issued, |
| Executed, |
| // Events generated by the Dispatch logic. |
| Dispatched, |
| |
| LastGenericEventType, |
| }; |
| |
| HWInstructionEvent(unsigned type, const InstRef &Inst) |
| : Type(type), IR(Inst) {} |
| |
| // The event type. The exact meaning depends on the subtarget. |
| const unsigned Type; |
| |
| // The instruction this event was generated for. |
| const InstRef &IR; |
| }; |
| |
| class HWInstructionIssuedEvent : public HWInstructionEvent { |
| public: |
| using ResourceRef = std::pair<uint64_t, uint64_t>; |
| HWInstructionIssuedEvent(const InstRef &IR, |
| llvm::ArrayRef<std::pair<ResourceRef, double>> UR) |
| : HWInstructionEvent(HWInstructionEvent::Issued, IR), UsedResources(UR) {} |
| |
| llvm::ArrayRef<std::pair<ResourceRef, double>> UsedResources; |
| }; |
| |
| class HWInstructionDispatchedEvent : public HWInstructionEvent { |
| public: |
| HWInstructionDispatchedEvent(const InstRef &IR, llvm::ArrayRef<unsigned> Regs) |
| : HWInstructionEvent(HWInstructionEvent::Dispatched, IR), |
| UsedPhysRegs(Regs) {} |
| // Number of physical register allocated for this instruction. There is one |
| // entry per register file. |
| llvm::ArrayRef<unsigned> UsedPhysRegs; |
| }; |
| |
| class HWInstructionRetiredEvent : public HWInstructionEvent { |
| public: |
| HWInstructionRetiredEvent(const InstRef &IR, llvm::ArrayRef<unsigned> Regs) |
| : HWInstructionEvent(HWInstructionEvent::Retired, IR), |
| FreedPhysRegs(Regs) {} |
| // Number of register writes that have been architecturally committed. There |
| // is one entry per register file. |
| llvm::ArrayRef<unsigned> FreedPhysRegs; |
| }; |
| |
| // A HWStallEvent represents a pipeline stall caused by the lack of hardware |
| // resources. |
| class HWStallEvent { |
| public: |
| enum GenericEventType { |
| Invalid = 0, |
| // Generic stall events generated by the DispatchStage. |
| RegisterFileStall, |
| RetireControlUnitStall, |
| // Generic stall events generated by the Scheduler. |
| DispatchGroupStall, |
| SchedulerQueueFull, |
| LoadQueueFull, |
| StoreQueueFull, |
| LastGenericEvent |
| }; |
| |
| HWStallEvent(unsigned type, const InstRef &Inst) : Type(type), IR(Inst) {} |
| |
| // The exact meaning of the stall event type depends on the subtarget. |
| const unsigned Type; |
| |
| // The instruction this event was generated for. |
| const InstRef &IR; |
| }; |
| |
| class HWEventListener { |
| public: |
| // Generic events generated by the pipeline. |
| virtual void onCycleBegin() {} |
| virtual void onCycleEnd() {} |
| |
| virtual void onEvent(const HWInstructionEvent &Event) {} |
| virtual void onEvent(const HWStallEvent &Event) {} |
| |
| using ResourceRef = std::pair<uint64_t, uint64_t>; |
| virtual void onResourceAvailable(const ResourceRef &RRef) {} |
| |
| // Events generated by the Scheduler when buffered resources are |
| // consumed/freed. |
| virtual void onReservedBuffers(llvm::ArrayRef<unsigned> Buffers) {} |
| virtual void onReleasedBuffers(llvm::ArrayRef<unsigned> Buffers) {} |
| |
| virtual ~HWEventListener() {} |
| |
| private: |
| virtual void anchor(); |
| }; |
| } // namespace mca |
| |
| #endif |