blob: b53c7fd308338e1ab04a4433798ed0dbb7be5c77 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 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_GRAPH_H_
6#define V8_COMPILER_GRAPH_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/zone.h"
9#include "src/zone-containers.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010
11namespace v8 {
12namespace internal {
13namespace compiler {
14
Emily Bernierd0a1eb72015-03-24 16:35:39 -040015// Forward declarations.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000016class GraphDecorator;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017class Node;
18class Operator;
19
20
21// Marks are used during traversal of the graph to distinguish states of nodes.
22// Each node has a mark which is a monotonically increasing integer, and a
23// {NodeMarker} has a range of values that indicate states of a node.
24typedef uint32_t Mark;
25
26
27// NodeIds are identifying numbers for nodes that can be used to index auxiliary
28// out-of-line data associated with each node.
29typedef uint32_t NodeId;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000030
31
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032class Graph : public ZoneObject {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033 public:
34 explicit Graph(Zone* zone);
35
36 // Base implementation used by all factory methods.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037 Node* NewNodeUnchecked(const Operator* op, int input_count, Node** inputs,
38 bool incomplete = false);
39
40 // Factory that checks the input count.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040041 Node* NewNode(const Operator* op, int input_count, Node** inputs,
42 bool incomplete = false);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043
44 // Factories for nodes with static input counts.
45 Node* NewNode(const Operator* op) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040046 return NewNode(op, 0, static_cast<Node**>(nullptr));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000047 }
48 Node* NewNode(const Operator* op, Node* n1) { return NewNode(op, 1, &n1); }
49 Node* NewNode(const Operator* op, Node* n1, Node* n2) {
50 Node* nodes[] = {n1, n2};
51 return NewNode(op, arraysize(nodes), nodes);
52 }
53 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3) {
54 Node* nodes[] = {n1, n2, n3};
55 return NewNode(op, arraysize(nodes), nodes);
56 }
57 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4) {
58 Node* nodes[] = {n1, n2, n3, n4};
59 return NewNode(op, arraysize(nodes), nodes);
60 }
61 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
62 Node* n5) {
63 Node* nodes[] = {n1, n2, n3, n4, n5};
64 return NewNode(op, arraysize(nodes), nodes);
65 }
66 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
67 Node* n5, Node* n6) {
68 Node* nodes[] = {n1, n2, n3, n4, n5, n6};
69 return NewNode(op, arraysize(nodes), nodes);
70 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040071 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
72 Node* n5, Node* n6, Node* n7) {
73 Node* nodes[] = {n1, n2, n3, n4, n5, n6, n7};
74 return NewNode(op, arraysize(nodes), nodes);
75 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
77 Node* n5, Node* n6, Node* n7, Node* n8) {
78 Node* nodes[] = {n1, n2, n3, n4, n5, n6, n7, n8};
79 return NewNode(op, arraysize(nodes), nodes);
80 }
81 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4,
82 Node* n5, Node* n6, Node* n7, Node* n8, Node* n9) {
83 Node* nodes[] = {n1, n2, n3, n4, n5, n6, n7, n8, n9};
84 return NewNode(op, arraysize(nodes), nodes);
85 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000086
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087 // Clone the {node}, and assign a new node id to the copy.
88 Node* CloneNode(const Node* node);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000089
Emily Bernierd0a1eb72015-03-24 16:35:39 -040090 Zone* zone() const { return zone_; }
91 Node* start() const { return start_; }
92 Node* end() const { return end_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000093
Emily Bernierd0a1eb72015-03-24 16:35:39 -040094 void SetStart(Node* start) { start_ = start; }
95 void SetEnd(Node* end) { end_ = end; }
96
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097 size_t NodeCount() const { return next_node_id_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040098
99 void Decorate(Node* node);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000100 void AddDecorator(GraphDecorator* decorator);
101 void RemoveDecorator(GraphDecorator* decorator);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102
103 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000104 friend class NodeMarkerBase;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400105
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000106 inline NodeId NextNodeId();
107
108 Zone* const zone_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400109 Node* start_;
110 Node* end_;
111 Mark mark_max_;
112 NodeId next_node_id_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113 ZoneVector<GraphDecorator*> decorators_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400114
115 DISALLOW_COPY_AND_ASSIGN(Graph);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116};
117
118
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400119// A graph decorator can be used to add behavior to the creation of nodes
120// in a graph.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121class GraphDecorator : public ZoneObject {
122 public:
123 virtual ~GraphDecorator() {}
124 virtual void Decorate(Node* node) = 0;
125};
126
127} // namespace compiler
128} // namespace internal
129} // namespace v8
130
131#endif // V8_COMPILER_GRAPH_H_