• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_COMPILER_NODE_MARKER_H_
6 #define V8_COMPILER_NODE_MARKER_H_
7 
8 #include "src/compiler/node.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13 
14 // Forward declarations.
15 class Graph;
16 
17 
18 // Base class for templatized NodeMarkers.
19 class NodeMarkerBase {
20  public:
21   NodeMarkerBase(Graph* graph, uint32_t num_states);
22 
Get(Node * node)23   V8_INLINE Mark Get(Node* node) {
24     Mark mark = node->mark();
25     if (mark < mark_min_) {
26       mark = mark_min_;
27       node->set_mark(mark_min_);
28     }
29     DCHECK_LT(mark, mark_max_);
30     return mark - mark_min_;
31   }
Set(Node * node,Mark mark)32   V8_INLINE void Set(Node* node, Mark mark) {
33     DCHECK_LT(mark, mark_max_ - mark_min_);
34     DCHECK_LT(node->mark(), mark_max_);
35     node->set_mark(mark + mark_min_);
36   }
37 
38  private:
39   Mark const mark_min_;
40   Mark const mark_max_;
41 
42   DISALLOW_COPY_AND_ASSIGN(NodeMarkerBase);
43 };
44 
45 
46 // A NodeMarker uses monotonically increasing marks to assign local "states"
47 // to nodes. Only one NodeMarker per graph is valid at a given time.
48 template <typename State>
49 class NodeMarker : public NodeMarkerBase {
50  public:
NodeMarker(Graph * graph,uint32_t num_states)51   V8_INLINE NodeMarker(Graph* graph, uint32_t num_states)
52       : NodeMarkerBase(graph, num_states) {}
53 
Get(Node * node)54   V8_INLINE State Get(Node* node) {
55     return static_cast<State>(NodeMarkerBase::Get(node));
56   }
57 
Set(Node * node,State state)58   V8_INLINE void Set(Node* node, State state) {
59     NodeMarkerBase::Set(node, static_cast<Mark>(state));
60   }
61 };
62 
63 }  // namespace compiler
64 }  // namespace internal
65 }  // namespace v8
66 
67 #endif  // V8_COMPILER_NODE_MARKER_H_
68