 Chromium Code Reviews
 Chromium Code Reviews Issue 1361893006:
  [turbofan] In GraphReducer::Replace, check uses to not misuse the replacement.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1361893006:
  [turbofan] In GraphReducer::Replace, check uses to not misuse the replacement.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/compiler/graph-reducer.cc | 
| diff --git a/src/compiler/graph-reducer.cc b/src/compiler/graph-reducer.cc | 
| index 80b40a7d9ac516f56aef21b6081d2f789ac329e2..cd4822d8a34bd98cbcfde69af64788d66e3b4378 100644 | 
| --- a/src/compiler/graph-reducer.cc | 
| +++ b/src/compiler/graph-reducer.cc | 
| @@ -159,6 +159,22 @@ void GraphReducer::Replace(Node* node, Node* replacement) { | 
| } | 
| +namespace { | 
| + | 
| + | 
| +void VerifyUseReplacement(const Edge& edge, const Node* replacement) { | 
| 
Michael Starzinger
2015/09/25 10:54:18
suggestion: We could move this verification method
 | 
| + // Check that the user does not misuse the replacement. | 
| + DCHECK(!NodeProperties::IsControlEdge(edge) || | 
| + replacement->op()->ControlOutputCount() > 0); | 
| + DCHECK(!NodeProperties::IsEffectEdge(edge) || | 
| + replacement->op()->EffectOutputCount() > 0); | 
| + DCHECK(!NodeProperties::IsFrameStateEdge(edge) || | 
| + replacement->opcode() == IrOpcode::kFrameState); | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| + | 
| void GraphReducer::Replace(Node* node, Node* replacement, NodeId max_id) { | 
| if (node == graph()->start()) graph()->SetStart(replacement); | 
| if (node == graph()->end()) graph()->SetEnd(replacement); | 
| @@ -167,6 +183,7 @@ void GraphReducer::Replace(Node* node, Node* replacement, NodeId max_id) { | 
| // {replacement} was already reduced and finish. | 
| for (Edge edge : node->use_edges()) { | 
| Node* const user = edge.from(); | 
| + VerifyUseReplacement(edge, replacement); | 
| edge.UpdateTo(replacement); | 
| // Don't revisit this node if it refers to itself. | 
| if (user != node) Revisit(user); |