blob: ff1a17ef3ea9457d79843f5406395e9538cf8a6c [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#include "src/compiler/graph.h"
6
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007#include <algorithm>
8
9#include "src/base/bits.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010#include "src/compiler/node.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#include "src/compiler/node-properties.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012#include "src/compiler/verifier.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013
14namespace v8 {
15namespace internal {
16namespace compiler {
17
Emily Bernierd0a1eb72015-03-24 16:35:39 -040018Graph::Graph(Zone* zone)
19 : zone_(zone),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020 start_(nullptr),
21 end_(nullptr),
Emily Bernierd0a1eb72015-03-24 16:35:39 -040022 mark_max_(0),
23 next_node_id_(0),
24 decorators_(zone) {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025
26
Emily Bernierd0a1eb72015-03-24 16:35:39 -040027void Graph::Decorate(Node* node) {
Ben Murdochda12d292016-06-02 14:46:10 +010028 for (GraphDecorator* const decorator : decorators_) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000029 decorator->Decorate(node);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040030 }
31}
32
33
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034void Graph::AddDecorator(GraphDecorator* decorator) {
35 decorators_.push_back(decorator);
36}
37
38
39void Graph::RemoveDecorator(GraphDecorator* decorator) {
40 auto const it = std::find(decorators_.begin(), decorators_.end(), decorator);
41 DCHECK(it != decorators_.end());
42 decorators_.erase(it);
43}
44
Ben Murdoch097c5b22016-05-18 11:27:45 +010045Node* Graph::NewNode(const Operator* op, int input_count, Node* const* inputs,
Emily Bernierd0a1eb72015-03-24 16:35:39 -040046 bool incomplete) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 Node* node = NewNodeUnchecked(op, input_count, inputs, incomplete);
48 Verifier::VerifyNode(node);
49 return node;
50}
51
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052Node* Graph::NewNodeUnchecked(const Operator* op, int input_count,
Ben Murdoch097c5b22016-05-18 11:27:45 +010053 Node* const* inputs, bool incomplete) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054 Node* const node =
55 Node::New(zone(), NextNodeId(), op, input_count, inputs, incomplete);
56 Decorate(node);
57 return node;
58}
59
60
61Node* Graph::CloneNode(const Node* node) {
62 DCHECK_NOT_NULL(node);
63 Node* const clone = Node::Clone(zone(), NextNodeId(), node);
64 Decorate(clone);
65 return clone;
66}
67
68
69NodeId Graph::NextNodeId() {
70 NodeId const id = next_node_id_;
71 CHECK(!base::bits::UnsignedAddOverflow32(id, 1, &next_node_id_));
72 return id;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000073}
74
75} // namespace compiler
76} // namespace internal
77} // namespace v8