Index: src/compiler/control-reducer.cc |
diff --git a/src/compiler/control-reducer.cc b/src/compiler/control-reducer.cc |
index 0c260623763fb8fb9ab53a0f642e4b8e4c159e9d..7f4bf317496270ce723f3adf46bd3b5a7e5d02e6 100644 |
--- a/src/compiler/control-reducer.cc |
+++ b/src/compiler/control-reducer.cc |
@@ -357,8 +357,10 @@ class ControlReducerImpl { |
// Reduce branches, phis, and merges. |
switch (node->opcode()) { |
- case IrOpcode::kBranch: |
- return ReduceBranch(node); |
+ case IrOpcode::kIfTrue: |
+ return ReduceIfTrue(node); |
+ case IrOpcode::kIfFalse: |
+ return ReduceIfFalse(node); |
case IrOpcode::kLoop: |
case IrOpcode::kMerge: |
return ReduceMerge(node); |
@@ -480,30 +482,31 @@ class ControlReducerImpl { |
} |
// Reduce branches if they have constant inputs. |
- Node* ReduceBranch(Node* node) { |
- Decision result = DecideCondition(node->InputAt(0)); |
- if (result == kUnknown) return node; |
- |
- TRACE(("BranchReduce: #%d:%s = %s\n", node->id(), node->op()->mnemonic(), |
- (result == kTrue) ? "true" : "false")); |
- |
- // Replace IfTrue and IfFalse projections from this branch. |
- Node* control = NodeProperties::GetControlInput(node); |
- for (Edge edge : node->use_edges()) { |
- Node* use = edge.from(); |
- if (use->opcode() == IrOpcode::kIfTrue) { |
- TRACE((" IfTrue: #%d:%s\n", use->id(), use->op()->mnemonic())); |
- edge.UpdateTo(NULL); |
- ReplaceNode(use, (result == kTrue) ? control : dead()); |
- control = NodeProperties::GetControlInput(node); // Could change! |
- } else if (use->opcode() == IrOpcode::kIfFalse) { |
- TRACE((" IfFalse: #%d:%s\n", use->id(), use->op()->mnemonic())); |
- edge.UpdateTo(NULL); |
- ReplaceNode(use, (result == kTrue) ? dead() : control); |
- control = NodeProperties::GetControlInput(node); // Could change! |
- } |
+ Node* ReduceIfTrue(Node* node) { |
+ Node* branch = node->InputAt(0); |
+ DCHECK_EQ(IrOpcode::kBranch, branch->opcode()); |
+ Decision result = DecideCondition(branch->InputAt(0)); |
+ if (result == kTrue) { |
+ // fold a true branch by replacing IfTrue with the branch control. |
+ TRACE(("BranchReduce: #%d:%s => #%d:%s\n", branch->id(), |
+ branch->op()->mnemonic(), node->id(), node->op()->mnemonic())); |
+ return branch->InputAt(1); |
+ } |
+ return result == kUnknown ? node : dead(); |
+ } |
+ |
+ // Reduce branches if they have constant inputs. |
+ Node* ReduceIfFalse(Node* node) { |
+ Node* branch = node->InputAt(0); |
+ DCHECK_EQ(IrOpcode::kBranch, branch->opcode()); |
+ Decision result = DecideCondition(branch->InputAt(0)); |
+ if (result == kFalse) { |
+ // fold a false branch by replacing IfFalse with the branch control. |
+ TRACE(("BranchReduce: #%d:%s => #%d:%s\n", branch->id(), |
+ branch->op()->mnemonic(), node->id(), node->op()->mnemonic())); |
+ return branch->InputAt(1); |
} |
- return control; |
+ return result == kUnknown ? node : dead(); |
} |
// Remove inputs to {node} corresponding to the dead inputs to {merge} |
@@ -578,12 +581,19 @@ Node* ControlReducer::ReduceMergeForTesting(JSGraph* jsgraph, |
} |
-Node* ControlReducer::ReduceBranchForTesting(JSGraph* jsgraph, |
+Node* ControlReducer::ReduceIfNodeForTesting(JSGraph* jsgraph, |
CommonOperatorBuilder* common, |
Node* node) { |
Zone zone; |
ControlReducerImpl impl(&zone, jsgraph, common); |
- return impl.ReduceBranch(node); |
+ switch (node->opcode()) { |
+ case IrOpcode::kIfTrue: |
+ return impl.ReduceIfTrue(node); |
+ case IrOpcode::kIfFalse: |
+ return impl.ReduceIfFalse(node); |
+ default: |
+ return node; |
+ } |
} |
} |
} |