Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: src/compiler/graph-reducer.h

Issue 1168693002: [turbofan] Allow ReplaceWithValue to kill control. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/control-reducer.cc ('k') | src/compiler/graph-reducer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_COMPILER_GRAPH_REDUCER_H_ 5 #ifndef V8_COMPILER_GRAPH_REDUCER_H_
6 #define V8_COMPILER_GRAPH_REDUCER_H_ 6 #define V8_COMPILER_GRAPH_REDUCER_H_
7 7
8 #include "src/compiler/node-marker.h" 8 #include "src/compiler/node-marker.h"
9 #include "src/zone-containers.h" 9 #include "src/zone-containers.h"
10 10
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 public: 70 public:
71 virtual ~Editor() {} 71 virtual ~Editor() {}
72 72
73 // Replace {node} with {replacement}. 73 // Replace {node} with {replacement}.
74 virtual void Replace(Node* node, Node* replacement) = 0; 74 virtual void Replace(Node* node, Node* replacement) = 0;
75 // Revisit the {node} again later. 75 // Revisit the {node} again later.
76 virtual void Revisit(Node* node) = 0; 76 virtual void Revisit(Node* node) = 0;
77 // Replace value uses of {node} with {value} and effect uses of {node} with 77 // Replace value uses of {node} with {value} and effect uses of {node} with
78 // {effect}. If {effect == NULL}, then use the effect input to {node}. All 78 // {effect}. If {effect == NULL}, then use the effect input to {node}. All
79 // control uses will be relaxed assuming {node} cannot throw. 79 // control uses will be relaxed assuming {node} cannot throw.
80 virtual void ReplaceWithValue(Node* node, Node* value, 80 virtual void ReplaceWithValue(Node* node, Node* value, Node* effect,
81 Node* effect = nullptr, 81 Node* control) = 0;
82 Node* control = nullptr) = 0;
83 }; 82 };
84 83
85 explicit AdvancedReducer(Editor* editor) : editor_(editor) {} 84 explicit AdvancedReducer(Editor* editor) : editor_(editor) {}
86 85
87 protected: 86 protected:
88 // Helper functions for subclasses to produce reductions for a node. 87 // Helper functions for subclasses to produce reductions for a node.
89 static Reduction Replace(Node* node) { return Reducer::Replace(node); } 88 static Reduction Replace(Node* node) { return Reducer::Replace(node); }
90 89
91 // Helper functions for subclasses to edit the graph. 90 // Helper functions for subclasses to edit the graph.
92 void Replace(Node* node, Node* replacement) { 91 void Replace(Node* node, Node* replacement) {
93 DCHECK_NOT_NULL(editor_); 92 DCHECK_NOT_NULL(editor_);
94 editor_->Replace(node, replacement); 93 editor_->Replace(node, replacement);
95 } 94 }
96 void Revisit(Node* node) { 95 void Revisit(Node* node) {
97 DCHECK_NOT_NULL(editor_); 96 DCHECK_NOT_NULL(editor_);
98 editor_->Revisit(node); 97 editor_->Revisit(node);
99 } 98 }
100 void ReplaceWithValue(Node* node, Node* value, Node* effect = nullptr, 99 void ReplaceWithValue(Node* node, Node* value, Node* effect = nullptr,
101 Node* control = nullptr) { 100 Node* control = nullptr) {
102 DCHECK_NOT_NULL(editor_); 101 DCHECK_NOT_NULL(editor_);
103 editor_->ReplaceWithValue(node, value, effect, control); 102 editor_->ReplaceWithValue(node, value, effect, control);
104 } 103 }
105 104
106 // Relax the effects of {node} by immediately replacing effect and control 105 // Relax the effects of {node} by immediately replacing effect and control
107 // uses of {node} with the effect and control input to {node}. 106 // uses of {node} with the effect and control input to {node}.
108 // TODO(turbofan): replace the effect input to {node} with {graph->start()}. 107 // TODO(turbofan): replace the effect input to {node} with {graph->start()}.
109 void RelaxEffectsAndControls(Node* node) { 108 void RelaxEffectsAndControls(Node* node) {
110 DCHECK_NOT_NULL(editor_); 109 ReplaceWithValue(node, node, nullptr, nullptr);
111 editor_->ReplaceWithValue(node, node, nullptr, nullptr);
112 } 110 }
113 111
114 // Relax the control uses of {node} by immediately replacing them with the 112 // Relax the control uses of {node} by immediately replacing them with the
115 // control input to {node}. 113 // control input to {node}.
116 void RelaxControls(Node* node) { 114 void RelaxControls(Node* node) {
117 DCHECK_NOT_NULL(editor_); 115 ReplaceWithValue(node, node, node, nullptr);
118 editor_->ReplaceWithValue(node, node, node, nullptr);
119 } 116 }
120 117
121 private: 118 private:
122 Editor* const editor_; 119 Editor* const editor_;
123 }; 120 };
124 121
125 122
126 // Performs an iterative reduction of a node graph. 123 // Performs an iterative reduction of a node graph.
127 class GraphReducer final : public AdvancedReducer::Editor { 124 class GraphReducer : public AdvancedReducer::Editor {
128 public: 125 public:
129 GraphReducer(Graph* graph, Zone* zone); 126 GraphReducer(Zone* zone, Graph* graph, Node* dead_value = nullptr,
130 ~GraphReducer() final; 127 Node* dead_control = nullptr);
128 ~GraphReducer();
131 129
132 Graph* graph() const { return graph_; } 130 Graph* graph() const { return graph_; }
133 131
134 void AddReducer(Reducer* reducer); 132 void AddReducer(Reducer* reducer);
135 133
136 // Reduce a single node. 134 // Reduce a single node.
137 void ReduceNode(Node* const); 135 void ReduceNode(Node* const);
138 // Reduce the whole graph. 136 // Reduce the whole graph.
139 void ReduceGraph(); 137 void ReduceGraph();
140 138
141 private: 139 private:
142 enum class State : uint8_t; 140 enum class State : uint8_t;
143 struct NodeState { 141 struct NodeState {
144 Node* node; 142 Node* node;
145 int input_index; 143 int input_index;
146 }; 144 };
147 145
148 // Reduce a single node. 146 // Reduce a single node.
149 Reduction Reduce(Node* const); 147 Reduction Reduce(Node* const);
150 // Reduce the node on top of the stack. 148 // Reduce the node on top of the stack.
151 void ReduceTop(); 149 void ReduceTop();
152 150
153 // Replace {node} with {replacement}. 151 // Replace {node} with {replacement}.
154 void Replace(Node* node, Node* replacement) final; 152 void Replace(Node* node, Node* replacement) final;
155 153
156 // Replace value uses of {node} with {value} and effect uses of {node} with 154 // Replace value uses of {node} with {value} and effect uses of {node} with
157 // {effect}. If {effect == NULL}, then use the effect input to {node}. All 155 // {effect}. If {effect == NULL}, then use the effect input to {node}. All
158 // control uses will be relaxed assuming {node} cannot throw. 156 // control uses will be relaxed assuming {node} cannot throw.
159 void ReplaceWithValue(Node* node, Node* value, Node* effect = nullptr, 157 void ReplaceWithValue(Node* node, Node* value, Node* effect,
160 Node* control = nullptr) final; 158 Node* control) final;
161 159
162 // Replace all uses of {node} with {replacement} if the id of {replacement} is 160 // Replace all uses of {node} with {replacement} if the id of {replacement} is
163 // less than or equal to {max_id}. Otherwise, replace all uses of {node} whose 161 // less than or equal to {max_id}. Otherwise, replace all uses of {node} whose
164 // id is less than or equal to {max_id} with the {replacement}. 162 // id is less than or equal to {max_id} with the {replacement}.
165 void Replace(Node* node, Node* replacement, NodeId max_id); 163 void Replace(Node* node, Node* replacement, NodeId max_id);
166 164
167 // Node stack operations. 165 // Node stack operations.
168 void Pop(); 166 void Pop();
169 void Push(Node* node); 167 void Push(Node* node);
170 168
171 // Revisit queue operations. 169 // Revisit queue operations.
172 bool Recurse(Node* node); 170 bool Recurse(Node* node);
173 void Revisit(Node* node) final; 171 void Revisit(Node* node) final;
174 172
175 Graph* const graph_; 173 Graph* const graph_;
174 Node* dead_value_;
175 Node* dead_control_;
176 NodeMarker<State> state_; 176 NodeMarker<State> state_;
177 ZoneVector<Reducer*> reducers_; 177 ZoneVector<Reducer*> reducers_;
178 ZoneStack<Node*> revisit_; 178 ZoneStack<Node*> revisit_;
179 ZoneStack<NodeState> stack_; 179 ZoneStack<NodeState> stack_;
180 180
181 DISALLOW_COPY_AND_ASSIGN(GraphReducer); 181 DISALLOW_COPY_AND_ASSIGN(GraphReducer);
182 }; 182 };
183 183
184 } // namespace compiler 184 } // namespace compiler
185 } // namespace internal 185 } // namespace internal
186 } // namespace v8 186 } // namespace v8
187 187
188 #endif // V8_COMPILER_GRAPH_REDUCER_H_ 188 #endif // V8_COMPILER_GRAPH_REDUCER_H_
OLDNEW
« no previous file with comments | « src/compiler/control-reducer.cc ('k') | src/compiler/graph-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698