| 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-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 if (result == kFalse) return fvalue; | 396 if (result == kFalse) return fvalue; |
| 397 return node; | 397 return node; |
| 398 } | 398 } |
| 399 | 399 |
| 400 // Reduce redundant phis. | 400 // Reduce redundant phis. |
| 401 Node* ReducePhi(Node* node) { | 401 Node* ReducePhi(Node* node) { |
| 402 int n = node->InputCount(); | 402 int n = node->InputCount(); |
| 403 if (n <= 1) return dead(); // No non-control inputs. | 403 if (n <= 1) return dead(); // No non-control inputs. |
| 404 if (n == 2) return node->InputAt(0); // Only one non-control input. | 404 if (n == 2) return node->InputAt(0); // Only one non-control input. |
| 405 | 405 |
| 406 // Never remove an effect phi from a (potentially non-terminating) loop. |
| 407 // Otherwise, we might end up eliminating effect nodes, such as calls, |
| 408 // before the loop. |
| 409 if (node->opcode() == IrOpcode::kEffectPhi && |
| 410 NodeProperties::GetControlInput(node)->opcode() == IrOpcode::kLoop) { |
| 411 return node; |
| 412 } |
| 413 |
| 406 Node* replacement = NULL; | 414 Node* replacement = NULL; |
| 407 Node::Inputs inputs = node->inputs(); | 415 Node::Inputs inputs = node->inputs(); |
| 408 for (InputIter it = inputs.begin(); n > 1; --n, ++it) { | 416 for (InputIter it = inputs.begin(); n > 1; --n, ++it) { |
| 409 Node* input = *it; | 417 Node* input = *it; |
| 410 if (input->opcode() == IrOpcode::kDead) continue; // ignore dead inputs. | 418 if (input->opcode() == IrOpcode::kDead) continue; // ignore dead inputs. |
| 411 if (input != node && input != replacement) { // non-redundant input. | 419 if (input != node && input != replacement) { // non-redundant input. |
| 412 if (replacement != NULL) return node; | 420 if (replacement != NULL) return node; |
| 413 replacement = input; | 421 replacement = input; |
| 414 } | 422 } |
| 415 } | 423 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, | 577 Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, |
| 570 CommonOperatorBuilder* common, | 578 CommonOperatorBuilder* common, |
| 571 Node* node) { | 579 Node* node) { |
| 572 Zone zone(jsgraph->graph()->zone()->isolate()); | 580 Zone zone(jsgraph->graph()->zone()->isolate()); |
| 573 ControlReducerImpl impl(&zone, jsgraph, common); | 581 ControlReducerImpl impl(&zone, jsgraph, common); |
| 574 return impl.ReduceBranch(node); | 582 return impl.ReduceBranch(node); |
| 575 } | 583 } |
| 576 } | 584 } |
| 577 } | 585 } |
| 578 } // namespace v8::internal::compiler | 586 } // namespace v8::internal::compiler |
| OLD | NEW |