| OLD | NEW |
| 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 #include <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/graph-reducer.h" | 9 #include "src/compiler/graph-reducer.h" |
| 10 #include "src/compiler/node.h" | 10 #include "src/compiler/node.h" |
| 11 #include "src/compiler/node-properties.h" | 11 #include "src/compiler/node-properties.h" |
| 12 #include "src/compiler/verifier.h" |
| 12 | 13 |
| 13 namespace v8 { | 14 namespace v8 { |
| 14 namespace internal { | 15 namespace internal { |
| 15 namespace compiler { | 16 namespace compiler { |
| 16 | 17 |
| 17 enum class GraphReducer::State : uint8_t { | 18 enum class GraphReducer::State : uint8_t { |
| 18 kUnvisited, | 19 kUnvisited, |
| 19 kRevisit, | 20 kRevisit, |
| 20 kOnStack, | 21 kOnStack, |
| 21 kVisited | 22 kVisited |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } | 153 } |
| 153 } | 154 } |
| 154 } | 155 } |
| 155 | 156 |
| 156 | 157 |
| 157 void GraphReducer::Replace(Node* node, Node* replacement) { | 158 void GraphReducer::Replace(Node* node, Node* replacement) { |
| 158 Replace(node, replacement, std::numeric_limits<NodeId>::max()); | 159 Replace(node, replacement, std::numeric_limits<NodeId>::max()); |
| 159 } | 160 } |
| 160 | 161 |
| 161 | 162 |
| 162 namespace { | |
| 163 | |
| 164 | |
| 165 void VerifyUseReplacement(const Edge& edge, const Node* replacement) { | |
| 166 // Check that the user does not misuse the replacement. | |
| 167 DCHECK(!NodeProperties::IsControlEdge(edge) || | |
| 168 replacement->op()->ControlOutputCount() > 0); | |
| 169 DCHECK(!NodeProperties::IsEffectEdge(edge) || | |
| 170 replacement->op()->EffectOutputCount() > 0); | |
| 171 DCHECK(!NodeProperties::IsFrameStateEdge(edge) || | |
| 172 replacement->opcode() == IrOpcode::kFrameState); | |
| 173 } | |
| 174 | |
| 175 } // namespace | |
| 176 | |
| 177 | |
| 178 void GraphReducer::Replace(Node* node, Node* replacement, NodeId max_id) { | 163 void GraphReducer::Replace(Node* node, Node* replacement, NodeId max_id) { |
| 179 if (node == graph()->start()) graph()->SetStart(replacement); | 164 if (node == graph()->start()) graph()->SetStart(replacement); |
| 180 if (node == graph()->end()) graph()->SetEnd(replacement); | 165 if (node == graph()->end()) graph()->SetEnd(replacement); |
| 181 if (replacement->id() <= max_id) { | 166 if (replacement->id() <= max_id) { |
| 182 // {replacement} is an old node, so unlink {node} and assume that | 167 // {replacement} is an old node, so unlink {node} and assume that |
| 183 // {replacement} was already reduced and finish. | 168 // {replacement} was already reduced and finish. |
| 184 for (Edge edge : node->use_edges()) { | 169 for (Edge edge : node->use_edges()) { |
| 185 Node* const user = edge.from(); | 170 Node* const user = edge.from(); |
| 186 VerifyUseReplacement(edge, replacement); | 171 Verifier::VerifyEdgeInputReplacement(edge, replacement); |
| 187 edge.UpdateTo(replacement); | 172 edge.UpdateTo(replacement); |
| 188 // Don't revisit this node if it refers to itself. | 173 // Don't revisit this node if it refers to itself. |
| 189 if (user != node) Revisit(user); | 174 if (user != node) Revisit(user); |
| 190 } | 175 } |
| 191 node->Kill(); | 176 node->Kill(); |
| 192 } else { | 177 } else { |
| 193 // Replace all old uses of {node} with {replacement}, but allow new nodes | 178 // Replace all old uses of {node} with {replacement}, but allow new nodes |
| 194 // created by this reduction to use {node}. | 179 // created by this reduction to use {node}. |
| 195 for (Edge edge : node->use_edges()) { | 180 for (Edge edge : node->use_edges()) { |
| 196 Node* const user = edge.from(); | 181 Node* const user = edge.from(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 void GraphReducer::Revisit(Node* node) { | 254 void GraphReducer::Revisit(Node* node) { |
| 270 if (state_.Get(node) == State::kVisited) { | 255 if (state_.Get(node) == State::kVisited) { |
| 271 state_.Set(node, State::kRevisit); | 256 state_.Set(node, State::kRevisit); |
| 272 revisit_.push(node); | 257 revisit_.push(node); |
| 273 } | 258 } |
| 274 } | 259 } |
| 275 | 260 |
| 276 } // namespace compiler | 261 } // namespace compiler |
| 277 } // namespace internal | 262 } // namespace internal |
| 278 } // namespace v8 | 263 } // namespace v8 |
| OLD | NEW |