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