1// 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#include "src/compiler/graph-trimmer.h"
6
7#include "src/compiler/graph.h"
8
9namespace v8 {
10namespace internal {
11namespace compiler {
12
13GraphTrimmer::GraphTrimmer(Zone* zone, Graph* graph)
14    : graph_(graph), is_live_(graph, 2), live_(zone) {
15  live_.reserve(graph->NodeCount());
16}
17
18
19GraphTrimmer::~GraphTrimmer() = default;
20
21
22void GraphTrimmer::TrimGraph() {
23  // Mark end node as live.
24  MarkAsLive(graph()->end());
25  // Compute transitive closure of live nodes.
26  for (size_t i = 0; i < live_.size(); ++i) {
27    Node* const live = live_[i];
28    for (Node* const input : live->inputs()) MarkAsLive(input);
29  }
30  // Remove dead->live edges.
31  for (Node* const live : live_) {
32    DCHECK(IsLive(live));
33    for (Edge edge : live->use_edges()) {
34      Node* const user = edge.from();
35      if (!IsLive(user)) {
36        if (FLAG_trace_turbo_trimming) {
37          StdoutStream{} << "DeadLink: " << *user << "(" << edge.index()
38                         << ") -> " << *live << std::endl;
39        }
40        edge.UpdateTo(nullptr);
41      }
42    }
43  }
44}
45
46}  // namespace compiler
47}  // namespace internal
48}  // namespace v8
49