// 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_