xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceTimerTree.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceTimerTree.h - Pass timer defs -------------*- C++ -*-===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker ///
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the TimerTree class, which allows flat and cumulative
12*03ce13f7SAndroid Build Coastguard Worker /// execution time collection of call chains.
13*03ce13f7SAndroid Build Coastguard Worker ///
14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*03ce13f7SAndroid Build Coastguard Worker 
16*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICETIMERTREE_H
17*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICETIMERTREE_H
18*03ce13f7SAndroid Build Coastguard Worker 
19*03ce13f7SAndroid Build Coastguard Worker // TODO(jpp): Refactor IceDefs.
20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceTimerTree.def"
22*03ce13f7SAndroid Build Coastguard Worker 
23*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker class TimerStack {
26*03ce13f7SAndroid Build Coastguard Worker   TimerStack() = delete;
27*03ce13f7SAndroid Build Coastguard Worker   TimerStack &operator=(const TimerStack &) = delete;
28*03ce13f7SAndroid Build Coastguard Worker 
29*03ce13f7SAndroid Build Coastguard Worker   /// Timer tree index type. A variable of this type is used to access an
30*03ce13f7SAndroid Build Coastguard Worker   /// interior, not-necessarily-leaf node of the tree.
31*03ce13f7SAndroid Build Coastguard Worker   using TTindex = std::vector<class TimerTreeNode>::size_type;
32*03ce13f7SAndroid Build Coastguard Worker   /// Representation of a path of leaf values leading to a particular node. The
33*03ce13f7SAndroid Build Coastguard Worker   /// representation happens to be in "reverse" order, i.e. from leaf/interior
34*03ce13f7SAndroid Build Coastguard Worker   /// to root, for implementation efficiency.
35*03ce13f7SAndroid Build Coastguard Worker   using PathType = llvm::SmallVector<TTindex, 8>;
36*03ce13f7SAndroid Build Coastguard Worker   /// Representation of a mapping of leaf node indexes from one timer stack to
37*03ce13f7SAndroid Build Coastguard Worker   /// another.
38*03ce13f7SAndroid Build Coastguard Worker   using TranslationType = std::vector<TimerIdT>;
39*03ce13f7SAndroid Build Coastguard Worker 
40*03ce13f7SAndroid Build Coastguard Worker   /// TimerTreeNode represents an interior or leaf node in the call tree. It
41*03ce13f7SAndroid Build Coastguard Worker   /// contains a list of children, a pointer to its parent, and the timer ID for
42*03ce13f7SAndroid Build Coastguard Worker   /// the node. It also holds the cumulative time spent at this node and below.
43*03ce13f7SAndroid Build Coastguard Worker   /// The children are always at a higher index in the TimerTreeNode::Nodes
44*03ce13f7SAndroid Build Coastguard Worker   /// array, and the parent is always at a lower index.
45*03ce13f7SAndroid Build Coastguard Worker   class TimerTreeNode {
46*03ce13f7SAndroid Build Coastguard Worker     TimerTreeNode &operator=(const TimerTreeNode &) = delete;
47*03ce13f7SAndroid Build Coastguard Worker 
48*03ce13f7SAndroid Build Coastguard Worker   public:
49*03ce13f7SAndroid Build Coastguard Worker     TimerTreeNode() = default;
50*03ce13f7SAndroid Build Coastguard Worker     TimerTreeNode(const TimerTreeNode &) = default;
51*03ce13f7SAndroid Build Coastguard Worker     std::vector<TTindex> Children; // indexed by TimerIdT
52*03ce13f7SAndroid Build Coastguard Worker     TTindex Parent = 0;
53*03ce13f7SAndroid Build Coastguard Worker     TimerIdT Interior = 0;
54*03ce13f7SAndroid Build Coastguard Worker     double Time = 0;
55*03ce13f7SAndroid Build Coastguard Worker     size_t UpdateCount = 0;
56*03ce13f7SAndroid Build Coastguard Worker   };
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker public:
59*03ce13f7SAndroid Build Coastguard Worker   enum TimerTag {
60*03ce13f7SAndroid Build Coastguard Worker #define X(tag) TT_##tag,
61*03ce13f7SAndroid Build Coastguard Worker     TIMERTREE_TABLE
62*03ce13f7SAndroid Build Coastguard Worker #undef X
63*03ce13f7SAndroid Build Coastguard Worker         TT__num
64*03ce13f7SAndroid Build Coastguard Worker   };
65*03ce13f7SAndroid Build Coastguard Worker   explicit TimerStack(const std::string &Name);
66*03ce13f7SAndroid Build Coastguard Worker   TimerStack(const TimerStack &) = default;
67*03ce13f7SAndroid Build Coastguard Worker   TimerIdT getTimerID(const std::string &Name);
68*03ce13f7SAndroid Build Coastguard Worker   void mergeFrom(const TimerStack &Src);
setName(const std::string & NewName)69*03ce13f7SAndroid Build Coastguard Worker   void setName(const std::string &NewName) { Name = NewName; }
getName()70*03ce13f7SAndroid Build Coastguard Worker   const std::string &getName() const { return Name; }
71*03ce13f7SAndroid Build Coastguard Worker   void push(TimerIdT ID);
72*03ce13f7SAndroid Build Coastguard Worker   void pop(TimerIdT ID);
73*03ce13f7SAndroid Build Coastguard Worker   void reset();
74*03ce13f7SAndroid Build Coastguard Worker   void dump(Ostream &Str, bool DumpCumulative);
75*03ce13f7SAndroid Build Coastguard Worker 
76*03ce13f7SAndroid Build Coastguard Worker private:
77*03ce13f7SAndroid Build Coastguard Worker   void update(bool UpdateCounts);
78*03ce13f7SAndroid Build Coastguard Worker   static double timestamp();
79*03ce13f7SAndroid Build Coastguard Worker   TranslationType translateIDsFrom(const TimerStack &Src);
80*03ce13f7SAndroid Build Coastguard Worker   PathType getPath(TTindex Index, const TranslationType &Mapping) const;
81*03ce13f7SAndroid Build Coastguard Worker   TTindex getChildIndex(TTindex Parent, TimerIdT ID);
82*03ce13f7SAndroid Build Coastguard Worker   TTindex findPath(const PathType &Path);
83*03ce13f7SAndroid Build Coastguard Worker   std::string Name;
84*03ce13f7SAndroid Build Coastguard Worker   double FirstTimestamp;
85*03ce13f7SAndroid Build Coastguard Worker   double LastTimestamp;
86*03ce13f7SAndroid Build Coastguard Worker   uint64_t StateChangeCount = 0;
87*03ce13f7SAndroid Build Coastguard Worker   /// IDsIndex maps a symbolic timer name to its integer ID.
88*03ce13f7SAndroid Build Coastguard Worker   std::map<std::string, TimerIdT> IDsIndex;
89*03ce13f7SAndroid Build Coastguard Worker   std::vector<std::string> IDs;     /// indexed by TimerIdT
90*03ce13f7SAndroid Build Coastguard Worker   std::vector<TimerTreeNode> Nodes; /// indexed by TTindex
91*03ce13f7SAndroid Build Coastguard Worker   std::vector<double> LeafTimes;    /// indexed by TimerIdT
92*03ce13f7SAndroid Build Coastguard Worker   std::vector<size_t> LeafCounts;   /// indexed by TimerIdT
93*03ce13f7SAndroid Build Coastguard Worker   TTindex StackTop = 0;
94*03ce13f7SAndroid Build Coastguard Worker };
95*03ce13f7SAndroid Build Coastguard Worker 
96*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
97*03ce13f7SAndroid Build Coastguard Worker 
98*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICETIMERTREE_H
99