]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/llvm-mca/DispatchStatistics.h
MFC r345805: Unify SCSI_STATUS_BUSY retry handling with other cases.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / llvm-mca / DispatchStatistics.h
1 //===--------------------- DispatchStatistics.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 implements a view that prints a few statistics related to the
12 /// dispatch logic. It collects and analyzes instruction dispatch events as
13 /// well as static/dynamic dispatch stall events.
14 ///
15 /// Example:
16 /// ========
17 ///
18 /// Dynamic Dispatch Stall Cycles:
19 /// RAT     - Register unavailable:                      0
20 /// RCU     - Retire tokens unavailable:                 0
21 /// SCHEDQ  - Scheduler full:                            42
22 /// LQ      - Load queue full:                           0
23 /// SQ      - Store queue full:                          0
24 /// GROUP   - Static restrictions on the dispatch group: 0
25 ///
26 ///
27 /// Dispatch Logic - number of cycles where we saw N instructions dispatched:
28 /// [# dispatched], [# cycles]
29 ///  0,              15  (11.5%)
30 ///  2,              4  (3.1%)
31 ///
32 //===----------------------------------------------------------------------===//
33
34 #ifndef LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
35 #define LLVM_TOOLS_LLVM_MCA_DISPATCHVIEW_H
36
37 #include "View.h"
38 #include "llvm/ADT/SmallVector.h"
39 #include "llvm/MC/MCSubtargetInfo.h"
40 #include <map>
41
42 namespace mca {
43
44 class DispatchStatistics : public View {
45   unsigned NumDispatched;
46   unsigned NumCycles;
47
48   // Counts dispatch stall events caused by unavailability of resources.  There
49   // is one counter for every generic stall kind (see class HWStallEvent).
50   llvm::SmallVector<unsigned, 8> HWStalls;
51
52   using Histogram = std::map<unsigned, unsigned>;
53   Histogram DispatchGroupSizePerCycle;
54
55   void updateHistograms() {
56     DispatchGroupSizePerCycle[NumDispatched]++;
57     NumDispatched = 0;
58   }
59
60   void printDispatchHistogram(llvm::raw_ostream &OS) const;
61
62   void printDispatchStalls(llvm::raw_ostream &OS) const;
63
64 public:
65   DispatchStatistics()
66       : NumDispatched(0), NumCycles(0),
67         HWStalls(HWStallEvent::LastGenericEvent) {}
68
69   void onEvent(const HWStallEvent &Event) override;
70
71   void onEvent(const HWInstructionEvent &Event) override;
72
73   void onCycleBegin() override { NumCycles++; }
74
75   void onCycleEnd() override { updateHistograms(); }
76
77   void printView(llvm::raw_ostream &OS) const override {
78     printDispatchStalls(OS);
79     printDispatchHistogram(OS);
80   }
81 };
82 } // namespace mca
83
84 #endif