| Index: src/compiler/graph-reducer.h
|
| diff --git a/src/compiler/graph-reducer.h b/src/compiler/graph-reducer.h
|
| index a6cc1f2d94b0b14974907cd37b83ac7d8d81a448..1c90b3018babceb2fe657307a9d3b341d35dd86f 100644
|
| --- a/src/compiler/graph-reducer.h
|
| +++ b/src/compiler/graph-reducer.h
|
| @@ -17,13 +17,18 @@ class Graph;
|
| class Node;
|
|
|
|
|
| +// NodeIds are identifying numbers for nodes that can be used to index auxiliary
|
| +// out-of-line data associated with each node.
|
| +typedef int32_t NodeId;
|
| +
|
| +
|
| // Represents the result of trying to reduce a node in the graph.
|
| class Reduction final {
|
| public:
|
| - explicit Reduction(Node* replacement = NULL) : replacement_(replacement) {}
|
| + explicit Reduction(Node* replacement = nullptr) : replacement_(replacement) {}
|
|
|
| Node* replacement() const { return replacement_; }
|
| - bool Changed() const { return replacement() != NULL; }
|
| + bool Changed() const { return replacement() != nullptr; }
|
|
|
| private:
|
| Node* replacement_;
|
| @@ -37,26 +42,66 @@ class Reduction final {
|
| // phase.
|
| class Reducer {
|
| public:
|
| - Reducer() {}
|
| virtual ~Reducer() {}
|
|
|
| // Try to reduce a node if possible.
|
| virtual Reduction Reduce(Node* node) = 0;
|
|
|
| + // Ask this reducer to finish operation, returns {true} if the reducer is
|
| + // done, while {false} indicates that the graph might need to be reduced
|
| + // again.
|
| + // TODO(turbofan): Remove this once the dead node trimming is in the
|
| + // GraphReducer.
|
| + virtual bool Finish();
|
| +
|
| // Helper functions for subclasses to produce reductions for a node.
|
| static Reduction NoChange() { return Reduction(); }
|
| static Reduction Replace(Node* node) { return Reduction(node); }
|
| static Reduction Changed(Node* node) { return Reduction(node); }
|
| +};
|
| +
|
| +
|
| +// An advanced reducer can also edit the graphs by changing and replacing nodes
|
| +// other than the one currently being reduced.
|
| +class AdvancedReducer : public Reducer {
|
| + public:
|
| + // Observe the actions of this reducer.
|
| + class Editor {
|
| + public:
|
| + virtual ~Editor() {}
|
| +
|
| + // Replace {node} with {replacement}.
|
| + virtual void Replace(Node* node, Node* replacement) = 0;
|
| + // Revisit the {node} again later.
|
| + virtual void Revisit(Node* node) = 0;
|
| + };
|
| +
|
| + explicit AdvancedReducer(Editor* editor) : editor_(editor) {}
|
| +
|
| + protected:
|
| + // Helper functions for subclasses to produce reductions for a node.
|
| + static Reduction Replace(Node* node) { return Reducer::Replace(node); }
|
| +
|
| + // Helper functions for subclasses to edit the graph.
|
| + void Replace(Node* node, Node* replacement) {
|
| + DCHECK_NOT_NULL(editor_);
|
| + editor_->Replace(node, replacement);
|
| + }
|
| + void Revisit(Node* node) {
|
| + DCHECK_NOT_NULL(editor_);
|
| + editor_->Revisit(node);
|
| + }
|
|
|
| private:
|
| - DISALLOW_COPY_AND_ASSIGN(Reducer);
|
| + Editor* const editor_;
|
| };
|
|
|
|
|
| // Performs an iterative reduction of a node graph.
|
| -class GraphReducer final {
|
| +class GraphReducer final : public AdvancedReducer::Editor {
|
| public:
|
| GraphReducer(Graph* graph, Zone* zone);
|
| + ~GraphReducer() final;
|
|
|
| Graph* graph() const { return graph_; }
|
|
|
| @@ -79,15 +124,22 @@ class GraphReducer final {
|
| // Reduce the node on top of the stack.
|
| void ReduceTop();
|
|
|
| + // Replace {node} with {replacement}.
|
| + void Replace(Node* node, Node* replacement) final;
|
| + // Replace all uses of {node} with {replacement} if the id of {replacement} is
|
| + // less than or equal to {max_id}. Otherwise, replace all uses of {node} whose
|
| + // id is less than or equal to {max_id} with the {replacement}.
|
| + void Replace(Node* node, Node* replacement, NodeId max_id);
|
| +
|
| // Node stack operations.
|
| void Pop();
|
| void Push(Node* node);
|
|
|
| // Revisit queue operations.
|
| bool Recurse(Node* node);
|
| - void Revisit(Node* node);
|
| + void Revisit(Node* node) final;
|
|
|
| - Graph* graph_;
|
| + Graph* const graph_;
|
| NodeMarker<State> state_;
|
| ZoneVector<Reducer*> reducers_;
|
| ZoneStack<Node*> revisit_;
|
|
|