1 // Copyright 2014 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_REDUCER_H_ 6 #define V8_COMPILER_GRAPH_REDUCER_H_ 7 8 #include "src/zone-containers.h" 9 10 namespace v8 { 11 namespace internal { 12 namespace compiler { 13 14 // Forward declarations. 15 class Graph; 16 class Node; 17 18 19 // Represents the result of trying to reduce a node in the graph. 20 class Reduction FINAL { 21 public: replacement_(replacement)22 explicit Reduction(Node* replacement = NULL) : replacement_(replacement) {} 23 replacement()24 Node* replacement() const { return replacement_; } Changed()25 bool Changed() const { return replacement() != NULL; } 26 27 private: 28 Node* replacement_; 29 }; 30 31 32 // A reducer can reduce or simplify a given node based on its operator and 33 // inputs. This class functions as an extension point for the graph reducer for 34 // language-specific reductions (e.g. reduction based on types or constant 35 // folding of low-level operators) can be integrated into the graph reduction 36 // phase. 37 class Reducer { 38 public: Reducer()39 Reducer() {} ~Reducer()40 virtual ~Reducer() {} 41 42 // Try to reduce a node if possible. 43 virtual Reduction Reduce(Node* node) = 0; 44 45 // Helper functions for subclasses to produce reductions for a node. NoChange()46 static Reduction NoChange() { return Reduction(); } Replace(Node * node)47 static Reduction Replace(Node* node) { return Reduction(node); } Changed(Node * node)48 static Reduction Changed(Node* node) { return Reduction(node); } 49 50 private: 51 DISALLOW_COPY_AND_ASSIGN(Reducer); 52 }; 53 54 55 // Performs an iterative reduction of a node graph. 56 class GraphReducer FINAL { 57 public: 58 explicit GraphReducer(Graph* graph); 59 graph()60 Graph* graph() const { return graph_; } 61 AddReducer(Reducer * reducer)62 void AddReducer(Reducer* reducer) { reducers_.push_back(reducer); } 63 64 // Reduce a single node. 65 void ReduceNode(Node* node); 66 // Reduce the whole graph. 67 void ReduceGraph(); 68 69 private: 70 Graph* graph_; 71 ZoneVector<Reducer*> reducers_; 72 73 DISALLOW_COPY_AND_ASSIGN(GraphReducer); 74 }; 75 76 } // namespace compiler 77 } // namespace internal 78 } // namespace v8 79 80 #endif // V8_COMPILER_GRAPH_REDUCER_H_ 81