HWEventListener.h revision 343171
1//===----------------------- HWEventListener.h ------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9/// \file
10///
11/// This file defines the main interface for hardware event listeners.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_MCA_HWEVENTLISTENER_H
16#define LLVM_MCA_HWEVENTLISTENER_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/MCA/Instruction.h"
20#include "llvm/MCA/Support.h"
21
22namespace llvm {
23namespace mca {
24
25// An HWInstructionEvent represents state changes of instructions that
26// listeners might be interested in. Listeners can choose to ignore any event
27// they are not interested in.
28class HWInstructionEvent {
29public:
30  // This is the list of event types that are shared by all targets, that
31  // generic subtarget-agnostic classes (e.g., Pipeline, HWInstructionEvent,
32  // ...) and generic Views can manipulate.
33  // Subtargets are free to define additional event types, that are goin to be
34  // handled by generic components as opaque values, but can still be
35  // emitted by subtarget-specific pipeline stages (e.g., ExecuteStage,
36  // DispatchStage, ...) and interpreted by subtarget-specific EventListener
37  // implementations.
38  enum GenericEventType {
39    Invalid = 0,
40    // Events generated by the Retire Control Unit.
41    Retired,
42    // Events generated by the Scheduler.
43    Ready,
44    Issued,
45    Executed,
46    // Events generated by the Dispatch logic.
47    Dispatched,
48
49    LastGenericEventType,
50  };
51
52  HWInstructionEvent(unsigned type, const InstRef &Inst)
53      : Type(type), IR(Inst) {}
54
55  // The event type. The exact meaning depends on the subtarget.
56  const unsigned Type;
57
58  // The instruction this event was generated for.
59  const InstRef &IR;
60};
61
62class HWInstructionIssuedEvent : public HWInstructionEvent {
63public:
64  using ResourceRef = std::pair<uint64_t, uint64_t>;
65  HWInstructionIssuedEvent(const InstRef &IR,
66                           ArrayRef<std::pair<ResourceRef, ResourceCycles>> UR)
67      : HWInstructionEvent(HWInstructionEvent::Issued, IR), UsedResources(UR) {}
68
69  ArrayRef<std::pair<ResourceRef, ResourceCycles>> UsedResources;
70};
71
72class HWInstructionDispatchedEvent : public HWInstructionEvent {
73public:
74  HWInstructionDispatchedEvent(const InstRef &IR, ArrayRef<unsigned> Regs,
75                               unsigned UOps)
76      : HWInstructionEvent(HWInstructionEvent::Dispatched, IR),
77        UsedPhysRegs(Regs), MicroOpcodes(UOps) {}
78  // Number of physical register allocated for this instruction. There is one
79  // entry per register file.
80  ArrayRef<unsigned> UsedPhysRegs;
81  // Number of micro opcodes dispatched.
82  // This field is often set to the total number of micro-opcodes specified by
83  // the instruction descriptor of IR.
84  // The only exception is when IR declares a number of micro opcodes
85  // which exceeds the processor DispatchWidth, and - by construction - it
86  // requires multiple cycles to be fully dispatched. In that particular case,
87  // the dispatch logic would generate more than one dispatch event (one per
88  // cycle), and each event would declare how many micro opcodes are effectively
89  // been dispatched to the schedulers.
90  unsigned MicroOpcodes;
91};
92
93class HWInstructionRetiredEvent : public HWInstructionEvent {
94public:
95  HWInstructionRetiredEvent(const InstRef &IR, ArrayRef<unsigned> Regs)
96      : HWInstructionEvent(HWInstructionEvent::Retired, IR),
97        FreedPhysRegs(Regs) {}
98  // Number of register writes that have been architecturally committed. There
99  // is one entry per register file.
100  ArrayRef<unsigned> FreedPhysRegs;
101};
102
103// A HWStallEvent represents a pipeline stall caused by the lack of hardware
104// resources.
105class HWStallEvent {
106public:
107  enum GenericEventType {
108    Invalid = 0,
109    // Generic stall events generated by the DispatchStage.
110    RegisterFileStall,
111    RetireControlUnitStall,
112    // Generic stall events generated by the Scheduler.
113    DispatchGroupStall,
114    SchedulerQueueFull,
115    LoadQueueFull,
116    StoreQueueFull,
117    LastGenericEvent
118  };
119
120  HWStallEvent(unsigned type, const InstRef &Inst) : Type(type), IR(Inst) {}
121
122  // The exact meaning of the stall event type depends on the subtarget.
123  const unsigned Type;
124
125  // The instruction this event was generated for.
126  const InstRef &IR;
127};
128
129class HWEventListener {
130public:
131  // Generic events generated by the pipeline.
132  virtual void onCycleBegin() {}
133  virtual void onCycleEnd() {}
134
135  virtual void onEvent(const HWInstructionEvent &Event) {}
136  virtual void onEvent(const HWStallEvent &Event) {}
137
138  using ResourceRef = std::pair<uint64_t, uint64_t>;
139  virtual void onResourceAvailable(const ResourceRef &RRef) {}
140
141  // Events generated by the Scheduler when buffered resources are
142  // consumed/freed for an instruction.
143  virtual void onReservedBuffers(const InstRef &Inst,
144                                 ArrayRef<unsigned> Buffers) {}
145  virtual void onReleasedBuffers(const InstRef &Inst,
146                                 ArrayRef<unsigned> Buffers) {}
147
148  virtual ~HWEventListener() {}
149
150private:
151  virtual void anchor();
152};
153} // namespace mca
154} // namespace llvm
155
156#endif // LLVM_MCA_HWEVENTLISTENER_H
157