| 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 "src/compiler/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/control-reducer.h" | 6 #include "src/compiler/control-reducer.h" |
| 7 #include "src/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
| 8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
| 9 #include "src/compiler/node-marker.h" | 9 #include "src/compiler/node-marker.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 void ReduceTop() { | 275 void ReduceTop() { |
| 276 size_t height = stack_.size(); | 276 size_t height = stack_.size(); |
| 277 Node* node = stack_.back(); | 277 Node* node = stack_.back(); |
| 278 | 278 |
| 279 if (node->IsDead()) return Pop(); // Node was killed while on stack. | 279 if (node->IsDead()) return Pop(); // Node was killed while on stack. |
| 280 | 280 |
| 281 TRACE(("ControlReduce: #%d:%s\n", node->id(), node->op()->mnemonic())); | 281 TRACE(("ControlReduce: #%d:%s\n", node->id(), node->op()->mnemonic())); |
| 282 | 282 |
| 283 // Recurse on an input if necessary. | 283 // Recurse on an input if necessary. |
| 284 for (Node* const input : node->inputs()) { | 284 for (Node* const input : node->inputs()) { |
| 285 CHECK_NE(NULL, input); |
| 285 if (Recurse(input)) return; | 286 if (Recurse(input)) return; |
| 286 } | 287 } |
| 287 | 288 |
| 288 // All inputs should be visited or on stack. Apply reductions to node. | 289 // All inputs should be visited or on stack. Apply reductions to node. |
| 289 Node* replacement = ReduceNode(node); | 290 Node* replacement = ReduceNode(node); |
| 290 if (replacement != node) ReplaceNode(node, replacement); | 291 if (replacement != node) ReplaceNode(node, replacement); |
| 291 | 292 |
| 292 // After reducing the node, pop it off the stack. | 293 // After reducing the node, pop it off the stack. |
| 293 CHECK_EQ(static_cast<int>(height), static_cast<int>(stack_.size())); | 294 CHECK_EQ(static_cast<int>(height), static_cast<int>(stack_.size())); |
| 294 Pop(); | 295 Pop(); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 (result == kTrue) ? "true" : "false")); | 490 (result == kTrue) ? "true" : "false")); |
| 490 | 491 |
| 491 // Replace IfTrue and IfFalse projections from this branch. | 492 // Replace IfTrue and IfFalse projections from this branch. |
| 492 Node* control = NodeProperties::GetControlInput(node); | 493 Node* control = NodeProperties::GetControlInput(node); |
| 493 for (Edge edge : node->use_edges()) { | 494 for (Edge edge : node->use_edges()) { |
| 494 Node* use = edge.from(); | 495 Node* use = edge.from(); |
| 495 if (use->opcode() == IrOpcode::kIfTrue) { | 496 if (use->opcode() == IrOpcode::kIfTrue) { |
| 496 TRACE((" IfTrue: #%d:%s\n", use->id(), use->op()->mnemonic())); | 497 TRACE((" IfTrue: #%d:%s\n", use->id(), use->op()->mnemonic())); |
| 497 edge.UpdateTo(NULL); | 498 edge.UpdateTo(NULL); |
| 498 ReplaceNode(use, (result == kTrue) ? control : dead()); | 499 ReplaceNode(use, (result == kTrue) ? control : dead()); |
| 500 control = NodeProperties::GetControlInput(node); // Could change! |
| 499 } else if (use->opcode() == IrOpcode::kIfFalse) { | 501 } else if (use->opcode() == IrOpcode::kIfFalse) { |
| 500 TRACE((" IfFalse: #%d:%s\n", use->id(), use->op()->mnemonic())); | 502 TRACE((" IfFalse: #%d:%s\n", use->id(), use->op()->mnemonic())); |
| 501 edge.UpdateTo(NULL); | 503 edge.UpdateTo(NULL); |
| 502 ReplaceNode(use, (result == kTrue) ? dead() : control); | 504 ReplaceNode(use, (result == kTrue) ? dead() : control); |
| 505 control = NodeProperties::GetControlInput(node); // Could change! |
| 503 } | 506 } |
| 504 } | 507 } |
| 505 return control; | 508 return control; |
| 506 } | 509 } |
| 507 | 510 |
| 508 // Remove inputs to {node} corresponding to the dead inputs to {merge} | 511 // Remove inputs to {node} corresponding to the dead inputs to {merge} |
| 509 // and compact the remaining inputs, updating the operator. | 512 // and compact the remaining inputs, updating the operator. |
| 510 void RemoveDeadInputs(Node* merge, Node* node) { | 513 void RemoveDeadInputs(Node* merge, Node* node) { |
| 511 int pos = 0; | 514 int pos = 0; |
| 512 for (int i = 0; i < node->InputCount(); i++) { | 515 for (int i = 0; i < node->InputCount(); i++) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, | 587 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, |
| 585 CommonOperatorBuilder* common, | 588 CommonOperatorBuilder* common, |
| 586 Node* node) { | 589 Node* node) { |
| 587 Zone zone(jsgraph->graph()->zone()->isolate()); | 590 Zone zone(jsgraph->graph()->zone()->isolate()); |
| 588 ControlReducerImpl impl(&zone, jsgraph, common); | 591 ControlReducerImpl impl(&zone, jsgraph, common); |
| 589 return impl.ReduceBranch(node); | 592 return impl.ReduceBranch(node); |
| 590 } | 593 } |
| 591 } | 594 } |
| 592 } | 595 } |
| 593 } // namespace v8::internal::compiler | 596 } // namespace v8::internal::compiler |
| OLD | NEW |