1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
// Copyright 2013 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_COMPILER_GRAPH_H_
#define V8_COMPILER_GRAPH_H_
#include <array>
#include "src/base/compiler-specific.h"
#include "src/zone/zone-containers.h"
#include "src/zone/zone.h"
namespace v8 {
namespace internal {
namespace compiler {
// Forward declarations.
class GraphDecorator;
class Node;
class Operator;
// Marks are used during traversal of the graph to distinguish states of nodes.
// Each node has a mark which is a monotonically increasing integer, and a
// {NodeMarker} has a range of values that indicate states of a node.
using Mark = uint32_t;
// NodeIds are identifying numbers for nodes that can be used to index auxiliary
// out-of-line data associated with each node.
using NodeId = uint32_t;
class V8_EXPORT_PRIVATE Graph final : public NON_EXPORTED_BASE(ZoneObject) {
public:
explicit Graph(Zone* zone);
Graph(const Graph&) = delete;
Graph& operator=(const Graph&) = delete;
// Scope used when creating a subgraph for inlining. Automatically preserves
// the original start and end nodes of the graph, and resets them when you
// leave the scope.
class V8_NODISCARD SubgraphScope final {
public:
explicit SubgraphScope(Graph* graph)
: graph_(graph), start_(graph->start()), end_(graph->end()) {}
~SubgraphScope() {
graph_->SetStart(start_);
graph_->SetEnd(end_);
}
SubgraphScope(const SubgraphScope&) = delete;
SubgraphScope& operator=(const SubgraphScope&) = delete;
private:
Graph* const graph_;
Node* const start_;
Node* const end_;
};
// Base implementation used by all factory methods.
Node* NewNodeUnchecked(const Operator* op, int input_count,
Node* const* inputs, bool incomplete = false);
// Factory that checks the input count.
Node* NewNode(const Operator* op, int input_count, Node* const* inputs,
bool incomplete = false);
// Factory template for nodes with static input counts.
// Note: Template magic below is used to ensure this method is only considered
// for argument types convertible to Node* during overload resolution.
template <typename... Nodes,
typename = typename std::enable_if_t<
std::conjunction_v<std::is_convertible<Nodes, Node*>...>>>
Node* NewNode(const Operator* op, Nodes... nodes) {
std::array<Node*, sizeof...(nodes)> nodes_arr{
{static_cast<Node*>(nodes)...}};
return NewNode(op, nodes_arr.size(), nodes_arr.data());
}
// Clone the {node}, and assign a new node id to the copy.
Node* CloneNode(const Node* node);
Zone* zone() const { return zone_; }
Node* start() const { return start_; }
Node* end() const { return end_; }
void SetStart(Node* start) { start_ = start; }
void SetEnd(Node* end) { end_ = end; }
size_t NodeCount() const { return next_node_id_; }
void Decorate(Node* node);
void AddDecorator(GraphDecorator* decorator);
void RemoveDecorator(GraphDecorator* decorator);
// Very simple print API usable in a debugger.
void Print() const;
bool HasSimd() const { return has_simd_; }
void SetSimd(bool has_simd) { has_simd_ = has_simd; }
void RecordSimdStore(Node* store);
ZoneVector<Node*> const& GetSimdStoreNodes();
private:
friend class NodeMarkerBase;
inline NodeId NextNodeId();
Zone* const zone_;
Node* start_;
Node* end_;
Mark mark_max_;
NodeId next_node_id_;
ZoneVector<GraphDecorator*> decorators_;
bool has_simd_;
ZoneVector<Node*> simd_stores_;
};
// A graph decorator can be used to add behavior to the creation of nodes
// in a graph.
class GraphDecorator : public ZoneObject {
public:
virtual ~GraphDecorator() = default;
virtual void Decorate(Node* node) = 0;
};
} // namespace compiler
} // namespace internal
} // namespace v8
#endif // V8_COMPILER_GRAPH_H_
|