blob: 98d335a44df22eba6db95c7dad2a356869dfdaf6 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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_GRAPH_TRIMMER_H_
6#define V8_COMPILER_GRAPH_TRIMMER_H_
7
8#include "src/compiler/node-marker.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
14// Forward declarations.
15class Graph;
16
17
18// Trims dead nodes from the node graph.
19class GraphTrimmer final {
20 public:
21 GraphTrimmer(Zone* zone, Graph* graph);
22 ~GraphTrimmer();
23
24 // Trim nodes in the {graph} that are not reachable from {graph->end()}.
25 void TrimGraph();
26
27 // Trim nodes in the {graph} that are not reachable from either {graph->end()}
28 // or any of the roots in the sequence [{begin},{end}[.
29 template <typename ForwardIterator>
30 void TrimGraph(ForwardIterator begin, ForwardIterator end) {
Ben Murdoch097c5b22016-05-18 11:27:45 +010031 while (begin != end) {
32 Node* const node = *begin++;
33 if (!node->IsDead()) MarkAsLive(node);
34 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035 TrimGraph();
36 }
37
38 private:
39 V8_INLINE bool IsLive(Node* const node) { return is_live_.Get(node); }
40 V8_INLINE void MarkAsLive(Node* const node) {
Ben Murdoch097c5b22016-05-18 11:27:45 +010041 DCHECK(!node->IsDead());
42 if (!IsLive(node)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 is_live_.Set(node, true);
44 live_.push_back(node);
45 }
46 }
47
48 Graph* graph() const { return graph_; }
49
50 Graph* const graph_;
51 NodeMarker<bool> is_live_;
52 NodeVector live_;
53
54 DISALLOW_COPY_AND_ASSIGN(GraphTrimmer);
55};
56
57} // namespace compiler
58} // namespace internal
59} // namespace v8
60
61#endif // V8_COMPILER_GRAPH_TRIMMER_H_