// Copyright 2015 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_TRIMMER_H_
|
#define V8_COMPILER_GRAPH_TRIMMER_H_
|
|
#include "src/compiler/node-marker.h"
|
#include "src/globals.h"
|
|
namespace v8 {
|
namespace internal {
|
namespace compiler {
|
|
// Forward declarations.
|
class Graph;
|
|
// Trims dead nodes from the node graph.
|
class V8_EXPORT_PRIVATE GraphTrimmer final {
|
public:
|
GraphTrimmer(Zone* zone, Graph* graph);
|
~GraphTrimmer();
|
|
// Trim nodes in the {graph} that are not reachable from {graph->end()}.
|
void TrimGraph();
|
|
// Trim nodes in the {graph} that are not reachable from either {graph->end()}
|
// or any of the roots in the sequence [{begin},{end}[.
|
template <typename ForwardIterator>
|
void TrimGraph(ForwardIterator begin, ForwardIterator end) {
|
while (begin != end) {
|
Node* const node = *begin++;
|
if (!node->IsDead()) MarkAsLive(node);
|
}
|
TrimGraph();
|
}
|
|
private:
|
V8_INLINE bool IsLive(Node* const node) { return is_live_.Get(node); }
|
V8_INLINE void MarkAsLive(Node* const node) {
|
DCHECK(!node->IsDead());
|
if (!IsLive(node)) {
|
is_live_.Set(node, true);
|
live_.push_back(node);
|
}
|
}
|
|
Graph* graph() const { return graph_; }
|
|
Graph* const graph_;
|
NodeMarker<bool> is_live_;
|
NodeVector live_;
|
|
DISALLOW_COPY_AND_ASSIGN(GraphTrimmer);
|
};
|
|
} // namespace compiler
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_COMPILER_GRAPH_TRIMMER_H_
|