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